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