При разработке интерактивных рабочих мест и обработок часто возникает задача визуального выделения данных. Например, в таблицу загружаются данные нескольких поставщиков, система автоматически подсвечивает минимальные цены, а оператор должен иметь возможность вручную переключить выбор на другую ячейку (строку), кликнув по ней. При этом оформление должно измениться, а выбранные значения — корректно обрабатываться алгоритмами (например, для подсчета итоговых сумм).
Разберем, почему попытка красить ячейку напрямую в событии активации является ошибочной, и подробно рассмотрим правильные механизмы реализации для обычных и управляемых форм.
Проанализируем распространенное заблуждение начинающих разработчиков. В платформе 1С объект ТаблицаЗначений сам по себе является коллекцией данных в оперативной памяти и не содержит свойств цвета, шрифта или других параметров отображения. Визуальным представлением таблицы на форме управляет элемент управления (табличное поле или таблица формы).
Если мы попытаемся привязать логику программы к цвету ячейки (например, обходить таблицу и проверять цвет оформления), код станет нестабильным и платформозависимым. Правильный подход строится на двух правилах:
В обычных формах для динамического управления цветом строк и отдельных ячеек используется обработчик события ПриПолученииДанных табличного поля. Это событие вызывается платформой пакетом для видимой части строк, что обеспечивает максимальную производительность.
Рассмотрим реализацию задачи по шагам:
ВыбраннаяКолонка (или булевы реквизиты выбора).ПриАктивизацииЯчейки для фиксации выбора, так как оно срабатывает при любой навигации стрелками клавиатуры. Лучше использовать событие Выбор (двойной клик/Enter) или отдельный флажок.ОбновитьСтроки().ПриПолученииДанных установим цвет текста или фона для нужной ячейки.Посмотрим на пример реализации кода в модуле обычной формы:
// Обработчик интерактивного выбора ячейки пользователем
Процедура ТабличноеПолеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Проверяем, что кликнули по одной из колонок с ценами
Если Поле.Имя = "ЦенаПоставщика1" Или Поле.Имя = "ЦенаПоставщика2" Тогда
// Запоминаем имя выбранной колонки в данных строки
ВыбраннаяСтрока.ВыбраннаяКолонка = Поле.Имя;
// Перерисовываем видимые строки таблицы
ЭлементыФормы.ТабличноеПоле.ОбновитьСтроки();
КонецЕсли;
КонецПроцедуры
// Обработчик визуального оформления ячеек
Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
Если ДанныеСтроки = Неопределено Тогда
Продолжить;
КонецЕсли;
// Сбрасываем стандартный цвет и красим выбранную ячейку
Если ДанныеСтроки.ВыбраннаяКолонка = "ЦенаПоставщика1" Тогда
ОформлениеСтроки.Ячейки.ЦенаПоставщика1.ЦветТекста = WebЦвета.Красный;
ОформлениеСтроки.Ячейки.ЦенаПоставщика1.ЦветВыделенногоТекста = WebЦвета.Красный;
ОформлениеСтроки.Ячейки.ЦенаПоставщика2.ЦветТекста = WebЦвета.Черный;
ИначеЕсли ДанныеСтроки.ВыбраннаяКолонка = "ЦенаПоставщика2" Тогда
ОформлениеСтроки.Ячейки.ЦенаПоставщика2.ЦветТекста = WebЦвета.Красный;
ОформлениеСтроки.Ячейки.ЦенаПоставщика2.ЦветВыделенногоТекста = WebЦвета.Красный;
ОформлениеСтроки.Ячейки.ЦенаПоставщика1.ЦветТекста = WebЦвета.Черный;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обратите внимание: когда фокус находится на ячейке, системное выделение может перекрывать стандартный ЦветТекста. Чтобы цвет сохранялся даже при активном фокусе, необходимо обязательно указывать свойство ЦветВыделенногоТекста у объекта ОформлениеЯчейки.
В управляемом интерфейсе прямого доступа к ячейкам через события отрисовки нет. Вся раскраска выполняется через механизм УсловноеОформление формы. При этом нет необходимости создавать правила динамически при каждом клике — достаточно один раз настроить правила условного оформления при создании формы, связав их с колонкой-признаком.
Разберем по шагам создание правил условного оформления программным способом в событии ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Настройка оформления для первой колонки цены
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// 1. Указываем оформляемое поле
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаДанныхЦенаПоставщика1");
// 2. Устанавливаем условие (когда колонка ВыбраннаяКолонка = 1)
ОтборОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТаблицаДанных.ВыбраннаяКолонка");
ОтборОформления.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборОформления.ПравоеЗначение = 1;
// 3. Задаем параметры оформления (цвет текста или цвет фона)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
КонецПроцедуры
При таком подходе на клиенте в обработчике события Выбор или через флаг достаточно изменить значение реквизита строки на клиенте:
&НаКлиенте
Процедура ТаблицаДанныхВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекСтрока = Элементы.ТаблицаДанных.ТекущиеДанные;
Если ТекСтрока <> Неопределено Тогда
Если Поле.Имя = "ТаблицаДанныхЦенаПоставщика1" Тогда
ТекСтрока.ВыбраннаяКолонка = 1;
ИначеЕсли Поле.Имя = "ТаблицаДанныхЦенаПоставщика2" Тогда
ТекСтрока.ВыбраннаяКолонка = 2;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Платформа мгновенно применит правило условного оформления без дополнительных серверных вызовов и перерисует ячейку нужным цветом.
Когда пользователь завершит анализ и выбор данных, итоговый обход таблицы значений выполняется максимально просто и быстро, так как мы проверяем значение реквизита, а не цвет оформления:
ИтогоСумма = 0;
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
Если СтрокаТЗ.ВыбраннаяКолонка = 1 Тогда
ИтогоСумма = ИтогоСумма + СтрокаТЗ.ЦенаПоставщика1;
ИначеЕсли СтрокаТЗ.ВыбраннаяКолонка = 2 Тогда
ИтогоСумма = ИтогоСумма + СтрокаТЗ.ЦенаПоставщика2;
КонецЕсли;
КонецЦикла;
Такой подход гарантирует устойчивость кода при любых изменениях внешнего вида формы, смене тем оформления или сортировке колонок таблицы.