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