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