Столкнулся, как и многие, с темой выделения активной строки в управляемых формах. А именно -- с невозможностью програмным образом на это голубое "чудо" повлиять. Те кто знают - те поймут, для тех кто не знает: при выделении строки таблицы формы (управляемой) платформа 8.2 заливает все ячейки, кроме выделенной (зависит конечно от режима выделения строки, поставите другой и все ячейки зальёт тёмно-синим), нежно-голубым цветом, ноу-хау дизайна блин... Повлиять как-то на эту выделенную строку кроме как
никак не получается. Но это далеко не комильфо: когда надо вводить данные в ячейки, смежные ячйки по строке будут заливаться голубым цветом, убирая при этом любую раскраску ячеек и строк.
Кто сталкивался? Подняли лапы! : ) Давайте придумаем вместе как этого зверя побороть. Возможно, я конечно незнаю, и есть "чудо-решение" в виде 1 строки кода... Но Максим Радченко в своё время на другом форуме писал, что-то в стиле: "проблема известна, не решена, над ней работают".
Есть идеи следующего рода:
1. Найти виндовую библиотеку, которая юзается для отрисовки форм (скорее всего gdi32.dll)
2. Найти методы которые вызываются, и чем вызываются (вызываются скорее всего frames.dll от 1с)
3. Написать какую-нить софтину, которая будет перехватывать запросы к чему-то от 1с при выделении строки и менять режим выделения скажем на полупрозрачный хотя-бы.
Заинтересовал метод SetBkColor библиотеки gdi.dll. По идее от устанавливает фон на отрисованных "квадратах" формы.... но я не уверен, что именно он используется при выделении строки.
Народ, отзовись ))
Элементы.ТаблицаФормы.ТекущаяСтрока = Неопределено;
никак не получается. Но это далеко не комильфо: когда надо вводить данные в ячейки, смежные ячйки по строке будут заливаться голубым цветом, убирая при этом любую раскраску ячеек и строк.
Кто сталкивался? Подняли лапы! : ) Давайте придумаем вместе как этого зверя побороть. Возможно, я конечно незнаю, и есть "чудо-решение" в виде 1 строки кода... Но Максим Радченко в своё время на другом форуме писал, что-то в стиле: "проблема известна, не решена, над ней работают".
Есть идеи следующего рода:
1. Найти виндовую библиотеку, которая юзается для отрисовки форм (скорее всего gdi32.dll)
2. Найти методы которые вызываются, и чем вызываются (вызываются скорее всего frames.dll от 1с)
3. Написать какую-нить софтину, которая будет перехватывать запросы к чему-то от 1с при выделении строки и менять режим выделения скажем на полупрозрачный хотя-бы.
Заинтересовал метод SetBkColor библиотеки gdi.dll. По идее от устанавливает фон на отрисованных "квадратах" формы.... но я не уверен, что именно он используется при выделении строки.
Народ, отзовись ))
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Поделюсь своей реализацией:
Есть таблица Данные (дерево значений). Добавл в него новую колонку ИдСтроки (число).
При заполнении дерева делаем:
Добавляем на форму два реквизита ТекущаяКолонка (строка) и ИдентификаторТекущейСтроки (число).
Заполняем первый так (заодно и очищаем выделение):
И второй:
В При создании добавляем УФ один общий и по одному элементу для каждой колонки дерева:
Обращаю внимание, что элементы УФ добавляются не в конец, а вставляюся ("Вставить(...)"). Это нужно для того, что бы они не перекрывали раскраску ячеек.
З.Ы. цвета взяты стандартные для 8.2.19.130, упр. формы в обычном приложении, режим совместимости 8.1.
Есть таблица Данные (дерево значений). Добавл в него новую колонку ИдСтроки (число).
При заполнении дерева делаем:
НСтр = ДанныеЭлементы.Добавить();
НСтр.ИдСтроки = НСтр.ПолучитьИдентификатор();
Добавляем на форму два реквизита ТекущаяКолонка (строка) и ИдентификаторТекущейСтроки (число).
Заполняем первый так (заодно и очищаем выделение):
&НаКлиенте
Процедура ДанныеПриАктивизацииЯчейки(Элемент)
ТекущаяКолонка = Элементы.Данные.ТекущийЭлемент.Имя;
Элементы.Данные.ВыделенныеСтроки.Очистить();
КонецПроцедуры
И второй:
&НаКлиенте
Процедура ДанныеПриАктивизацииСтроки(Элемент)
ИдентификаторТекущейСтроки = Элементы.Данные.ТекущаяСтрока;
КонецПроцедуры
В При создании добавляем УФ один общий и по одному элементу для каждой колонки дерева:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Общий элемент УФ для всей строки
ТекОф = Новый Структура("ЦветФона", Новый Цвет(205, 230, 255));
ТекПредставление = "Цвет выделенной строки. Общий";
УсловноеОформление.Элементы.Вставить(2).Представление = ТекПредставление;
ТекОтбор = Новый Соответствие;
ТекОтбор.Вставить("Данные.ИдСтроки", Новый ПолеКомпоновкиДанных("ИдентификаторТекущейСтроки"));
УправляемыеФормыКлиентСервер.ИзменитьЭлементУсловногоОформления(УсловноеОформление, ТекОтбор, ТекОф, "Данные", ТекПредставление);
// Отдельное УФ для каждой ячейки
ТекОф = Новый Структура("ЦветФона, ЦветТекста", Новый Цвет(0, 0, 131), WebЦвета.Белый);
Для каждого Эл Из Элементы.Данные.ПодчиненныеЭлементы Цикл
ТекПредставление = "Цвет выделенной ячейки: " + Эл.Имя;
УсловноеОформление.Элементы.Вставить(3).Представление = ТекПредставление;
ТекОтбор = Новый Соответствие;
ТекОтбор.Вставить("ТекущаяКолонка", Эл.Имя);
ТекОтбор.Вставить("Данные.ИдСтроки", Новый ПолеКомпоновкиДанных("ИдентификаторТекущейСтроки"));
УправляемыеФормыКлиентСервер.ИзменитьЭлементУсловногоОформления(УсловноеОформление, ТекОтбор, ТекОф, Эл.Имя, ТекПредставление); // Ищет по представдению и устанавливает значения
КонецЦикла;
КонецПроцедуры
ПоказатьОбращаю внимание, что элементы УФ добавляются не в конец, а вставляюся ("Вставить(...)"). Это нужно для того, что бы они не перекрывали раскраску ячеек.
З.Ы. цвета взяты стандартные для 8.2.19.130, упр. формы в обычном приложении, режим совместимости 8.1.
(18) Resha,
Я тоже почти так и делал, у меня была табл/часть документа.
Доп. колонок я не добавлял, т.к. можно было привязаться к номеру строки,
а усл/оформление добавлено сразу в конфигураторе.
Два реквизита (строка, ячейка), два события и оформление для колонок.
Но тогда это был Толстый клиент, а вот тут пару дней назад бился с
"голубым / желтым (8.3) чудом" упр. приложение (тонкий) - вышло не сразу.
Одна таблица - главная и две - зависимые, т.е. в главной выбираем документ,
а зависимые показывают нужную инфу, идет установка параметров дин/списков.
Если делать два серверных вызова - то все работает как-то не очень, то снимет
выделение, то нет.
Когда переделал на один - то стало нормально.
Но одна загвоздка осталась до сих пор - не могу убрать "чудо" при открытии формы.
Я тоже почти так и делал, у меня была табл/часть документа.
Доп. колонок я не добавлял, т.к. можно было привязаться к номеру строки,
а усл/оформление добавлено сразу в конфигураторе.
Два реквизита (строка, ячейка), два события и оформление для колонок.
Но тогда это был Толстый клиент, а вот тут пару дней назад бился с
"голубым / желтым (8.3) чудом" упр. приложение (тонкий) - вышло не сразу.
Одна таблица - главная и две - зависимые, т.е. в главной выбираем документ,
а зависимые показывают нужную инфу, идет установка параметров дин/списков.
Если делать два серверных вызова - то все работает как-то не очень, то снимет
выделение, то нет.
Когда переделал на один - то стало нормально.
Но одна загвоздка осталась до сих пор - не могу убрать "чудо" при открытии формы.
(19) Vlad_2008,
Иногда бывает полезно сделать "отложенные действия" Т.е. в ПриАкитивизации сделать все, что надо, и последней строкой повесить обработчик ожидания с задержкой 0.1 или 0.2 сек. Это не сильно заметно для пользователя, но даст платформе перед выполнением обработчика сделать все необходимые обновления списков. (если я вообще правильно понял о чём речь :-) )
Не очень понял проблему. Может есть скрин? Тоже интересно.
Если делать два серверных вызова - то все работает как-то не очень, то снимет
выделение, то нет
выделение, то нет
Иногда бывает полезно сделать "отложенные действия" Т.е. в ПриАкитивизации сделать все, что надо, и последней строкой повесить обработчик ожидания с задержкой 0.1 или 0.2 сек. Это не сильно заметно для пользователя, но даст платформе перед выполнением обработчика сделать все необходимые обновления списков. (если я вообще правильно понял о чём речь :-) )
Но одна загвоздка осталась до сих пор - не могу убрать "чудо" при открытии формы.
Не очень понял проблему. Может есть скрин? Тоже интересно.
А в вебморде, интерестно, те же кактусы? Там вроде как можно это решить средсвами погибче, чем ковыряние в системных библиотеках тем паче что много чего будет зависеть от версии ОС... так что в управляемом приложении это делать, ИМХО, даже не стоить и рыпаться.. лучше додавить Нуриева чтоб обработчик на смену рабочих областей повесил, это полезней..
(5) djmarat2,
Пользоваться можно,
НО
- перестает работать "стандартное" удаление строки и событие "ПередУдалением"
(т.е. делаем руками)
- слетает выделение текущей ячейки (можно поправить через "УсловноеОформление")
Больше странностей пока не заметил, но при появлении нового релиза платформы
какая-нибудь "гадость" и выскочит.
За победу на "голубым чудом", однозначно плюс!
Пользоваться можно,
НО
- перестает работать "стандартное" удаление строки и событие "ПередУдалением"
(т.е. делаем руками)
- слетает выделение текущей ячейки (можно поправить через "УсловноеОформление")
Больше странностей пока не заметил, но при появлении нового релиза платформы
какая-нибудь "гадость" и выскочит.
За победу на "голубым чудом", однозначно плюс!
- слетает выделение текущей ячейки (можно поправить через "УсловноеОформление")
Что-то не нашел возможности поправить это через условное оформление...
Может быть подскажете как это сделать? Что с чем сравнить?
Или это поправлять только программно в событии ПриАктивизацииЯчейки ?
Но за способ конечно +
Иногда очень нужно
Ага, ты правильно понял, я так уже попробовал.
Все-таки изврат, сейчас ищу другой вариант.
Только ожидание я вешал в "ПриОткрытии", однократное, т.к.
потом все срабатывает нормально.
Проблема в том, что при открытии срабатывает "ПриАктивизации...", но выделение не пропадает. Потом перехожу на след. строчку - все ок.
Скрин позже добавлю.
Все-таки изврат, сейчас ищу другой вариант.
Только ожидание я вешал в "ПриОткрытии", однократное, т.к.
потом все срабатывает нормально.
Проблема в том, что при открытии срабатывает "ПриАктивизации...", но выделение не пропадает. Потом перехожу на след. строчку - все ок.
Скрин позже добавлю.
Вот два нужных списка: Заказы и Товары.
Надо чтоб было так:
- если ходим в списке Заказы, то в списке Товары выделение должно исчезать
- если ходим в списке Товары, то выделение должно быть штатное, как обычно
Если имеем в модуле только процедуру "ПриАктивизацииСтроки" для списка Заказы,
то все работает нормально, кроме момента после открытия формы, в товарах остается подсветка строки.
С обработкой ожидания работает, но сделал по другому:
- добавил процедуру "ПриАкт..Ячейки" для списка Товары
- добавил переменную модуля (клиентская)
В процедуре "ПриАкт..Ячейки" проверяем состояние переменной, если Неопределено, то очищаем выделенные
строки, а переменной присваиваем значение, т.е. сработает только один раз, а больше и не надо )).

Надо чтоб было так:
- если ходим в списке Заказы, то в списке Товары выделение должно исчезать
- если ходим в списке Товары, то выделение должно быть штатное, как обычно
Если имеем в модуле только процедуру "ПриАктивизацииСтроки" для списка Заказы,
то все работает нормально, кроме момента после открытия формы, в товарах остается подсветка строки.
С обработкой ожидания работает, но сделал по другому:
- добавил процедуру "ПриАкт..Ячейки" для списка Товары
- добавил переменную модуля (клиентская)
В процедуре "ПриАкт..Ячейки" проверяем состояние переменной, если Неопределено, то очищаем выделенные
строки, а переменной присваиваем значение, т.е. сработает только один раз, а больше и не надо )).
В табличной части есть колонка с ценами, которая в зависимости от условий окрашивает строки этой колонки в разные цвета. Как сделать так, чтобы если щелкнуть по какой-то строке в табличной части, эта строка не закрашивалась в желтый, тем самым перекрашивая мои настройки?
Самое главное правило при этом, скинуть текущую строку в неопределено для того списка, в котором мы НЕ хотим видеть "чудное" выделение, ес-но, событие при котором это возможно, у нас только одно, "При активизации ячейки" (того поля у которого мы хотим убрать "г" дробь "ж" чудо)
Т.е., если в Вашем случае, пользователь ходит в одном поле, и всю работу с данными он (пользователь) делает, именно в этом поле, то для него (это поле) и надо подключить обработчик для события "ПриАктивизацииЯчейки".
Но, только, надо понимать, что все "стандартные" (= штатные) действия с этим табличным полем "немного" изменятся, а именно, перестанет работать ВСЕ, удаление, копирование и прочее (потери относятся только к тем случаям когда "человек" (пользователь) умеет пользоваться клавиатурой, а мышку, конечно, можно и подменить).
Мне кажется, что я как-то сложно все описал, ммм, если есть вопросы - пишите, тут не давно пытался бороться с "г/ж" чудом - жуть, выложу мои страдания чуть позже.
Т.е., если в Вашем случае, пользователь ходит в одном поле, и всю работу с данными он (пользователь) делает, именно в этом поле, то для него (это поле) и надо подключить обработчик для события "ПриАктивизацииЯчейки".
Но, только, надо понимать, что все "стандартные" (= штатные) действия с этим табличным полем "немного" изменятся, а именно, перестанет работать ВСЕ, удаление, копирование и прочее (потери относятся только к тем случаям когда "человек" (пользователь) умеет пользоваться клавиатурой, а мышку, конечно, можно и подменить).
Мне кажется, что я как-то сложно все описал, ммм, если есть вопросы - пишите, тут не давно пытался бороться с "г/ж" чудом - жуть, выложу мои страдания чуть позже.
Для того что бы подсвечивался только фон выделенной ячейки делаю так :
1. Режим выделения строки -> "Ячейка"
2.
1. Режим выделения строки -> "Ячейка"
2.
&НаКлиенте
Перем ПрошлаяЯчейка,ПрошлыйФон;
&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
Если ПрошлаяЯчейка <> Неопределено И ПрошлаяЯчейка.ЦветФона <> ПрошлыйФон Тогда
ПрошлаяЯчейка.ЦветФона = ПрошлыйФон;
КонецЕсли;
Элементы.Список.ВыделенныеСтроки.Очистить();
ПрошлаяЯчейка = Элемент.ТекущиеДанные[Элемент.ТекущийЭлемент.Имя+"ОформлениеЯчейки"];
ПрошлыйФон = ПрошлаяЯчейка.ЦветФона;
ПрошлаяЯчейка.ЦветФона = Новый Цвет(201,226,255);
КонецПроцедуры
Показать
(26) Мне кажется что тут можно получить ошибку при Элемент.ТекущиеДанные = Неопределено.
Привычка, что в списке всегда есть строки, но при фильтрации поиском или при отборе может получиться пустой список, и, если отработает событие, то получим "красный крестикк" ))
Привычка, что в списке всегда есть строки, но при фильтрации поиском или при отборе может получиться пустой список, и, если отработает событие, то получим "красный крестикк" ))
Так точно, поправочка :
&НаКлиенте
Перем ПрошлаяЯчейка,ПрошлыйФон;
&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
Если ПрошлаяЯчейка <> Неопределено И ПрошлаяЯчейка.ЦветФона <> ПрошлыйФон Тогда
ПрошлаяЯчейка.ЦветФона = ПрошлыйФон;
КонецЕсли;
Элементы.Список.ВыделенныеСтроки.Очистить();
Если Элемент.ТекущиеДанные <> Неопределено Тогда
ПрошлаяЯчейка = Элемент.ТекущиеДанные[Элемент.ТекущийЭлемент.Имя+"ОформлениеЯчейки"];
ПрошлыйФон = ПрошлаяЯчейка.ЦветФона;
ПрошлаяЯчейка.ЦветФона = Новый Цвет(201,226,255);
КонецЕсли;
КонецПроцедуры
Показать
Помагает метод, прописанный в событии ПриАктивацииЯчейки для таблицы значений.
&НаКлиенте
Процедура ТаблицаЗначенийПриАктивизацииЯчейки(Элемент)
Элемент.ВыделенныеСтроки.Очистить();
КонецПроцедуры
При необходимости, можно в этом событии создать условие, при котором будет или не будет отменяться выделение строки
&НаКлиенте
Процедура ТаблицаЗначенийПриАктивизацииЯчейки(Элемент)
Элемент.ВыделенныеСтроки.Очистить();
КонецПроцедуры
При необходимости, можно в этом событии создать условие, при котором будет или не будет отменяться выделение строки
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот