Как программно раскрасить строки и ячейки в таблице значений на управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с управляемыми формами программисты часто сталкиваются с задачей визуального выделения данных в таблицах. В отличие от обычных форм, где можно было напрямую управлять свойствами ячейки в событии ПриВыводеСтроки, в управляемом интерфейсе используется декларативный подход — Условное оформление. Рассмотрим подробно, как правильно настроить раскраску таблицы значений (ТЗ) программно, разберем типичные ошибки и проанализируем работающие примеры кода.

Основные принципы работы с условным оформлением

Прежде чем переходить к коду, проанализируем, из чего состоит элемент условного оформления на управляемой форме. Это коллекция, которая включает три ключевых блока:

  1. Отбор — определяет, для каких именно строк будет применяться оформление (условие).
  2. Оформление — определяет, что именно мы меняем (цвет фона, цвет текста, шрифт, видимость и т.д.).
  3. Поля — определяют, в каких конкретно колонках таблицы применится оформление. Если поля не заданы, оформление применяется ко всей строке целиком.

Решение 1: Базовый алгоритм раскраски всей строки

Рассмотрим пример, когда нам нужно выделить строку желтым цветом, если в колонке "Место" стоит значение 1. Разберем этот процесс по шагам.

Для начала создадим новый элемент оформления. Важно помнить, что код должен исполняться на сервере (например, в процедуре ПриСозданииНаСервере или при обновлении данных).


// 1. Добавляем новый элемент в коллекцию условного оформления формы
ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// 2. Настраиваем условие (Отбор)
// Допустим, у нас есть реквизит формы с именем "Таб", у которого есть колонка "Место"
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Таб.Место");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = 1;
ЭлементОтбора.Использование = Истина;

// 3. Устанавливаем само оформление (Цвета)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 255, 100)); // Желтый
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(255, 0, 0));  // Красный

// 4. Указываем область применения. 
// Если мы хотим раскрасить ВСЮ строку, то коллекцию "Поля" можно не заполнять 
// или добавить туда имя всей таблицы как элемента формы.
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Таб"); 
ПолеОформления.Использование = Истина;

ЭлементОформления.Использование = Истина;

Решение 2: Раскраска конкретной ячейки по условию

Часто возникает ситуация, когда нужно подсветить не всю строку, а только одно конкретное поле. Выясним, как изменить код для этой задачи. Допустим, нам нужно раскрасить колонку "Статус", если значение в колонке "Цвет" равно "Синий".

Обратите внимание на важный нюанс: в отборе мы используем Путь к данным реквизита, а в поле оформления — Имя элемента формы.


ЭлементУО = УсловноеОформление.Эelements.Добавить();

// Условие: колонка "Цвет" (реквизит формы тзТаб) равна "Синий"
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("тзТаб.Цвет");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "Синий";

// Оформление: устанавливаем синий фон
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(0, 0, 255));

// Поле: указываем конкретную колонку таблицы на форме
ПолеЭлемента = ЭлементУО.Поля.Элементы.Добавить();
// Используем имя элемента, как оно задано в дереве элементов формы
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("тзТабСтатус"); 

Разбор типичных ошибок и рекомендации

Проанализируем основные причины, по которым раскраска может не работать, даже если код написан без синтаксических ошибок:

  1. Смешивание понятий "Реквизит" и "Элемент". Это самая частая ошибка. В ЛевоеЗначение отбора всегда передается путь к данным (например, Объект.Товары.Цена). В Поле оформления передается имя колонки из дерева элементов формы (например, ТоварыЦена). Если эти имена различаются, оформление не сработает.
  2. Отсутствие флага Использование. Всегда проверяйте, что для элемента оформления, отбора и полей установлено свойство Использование = Истина. Хотя по умолчанию оно часто истинно, явное указание помогает избежать проблем при динамическом изменении кода.
  3. Типы данных в отборе. Если вы сравниваете значение колонки со строкой (например, "Синий"), убедитесь, что в данных нет лишних пробелов и регистр совпадает. Специалисты рекомендуют использовать для условий скрытые числовые колонки-статусы или перечисления. Это работает надежнее и быстрее.
  4. Очистка коллекции. Если вы добавляете оформление программно при каждом действии пользователя, обязательно вызывайте УсловноеОформление.Элементы.Очистить() в начале процедуры. В противном случае правила будут дублироваться, что приведет к "тормозам" формы и непредсказуемому наложению цветов.

Как раскрасить строки в разные цвета (несколько условий)

Если стоит задача раскрасить таблицу в несколько цветов (например, условие 1 — зеленый, условие 2 — красный), мы просто добавляем несколько элементов в коллекцию УсловноеОформление.Элементы. Рассмотрим, как это сделать правильно, чтобы правила не конфликтовали.

Важно: Платформа обрабатывает правила сверху вниз. Если строка подходит под два условия одновременно, применится то, которое было добавлено в список первым.


// Очистим старое оформление
УсловноеОформление.Элементы.Очистить();

// ПЕРВОЕ ПРАВИЛО: Зеленый для выполненных задач
Элемент1 = УсловноеОформление.Элементы.Добавить();
Отбор1 = Элемент1.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокЗадач.Статус");
Отбор1.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор1.ПравоеЗначение = "Выполнено";
Элемент1.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);

// ВТОРОЕ ПРАВИЛО: Красный для просроченных
Элемент2 = УсловноеОформление.Элементы.Добавить();
Отбор2 = Элемент2.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокЗадач.Просрочено");
Отбор2.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор2.ПравоеЗначение = Истина;
Элемент2.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоРозовый);

Таким образом, комбинируя программное создание элементов оформления, мы можем гибко управлять внешним видом таблиц значений, делая интерфейс приложения интуитивно понятным для пользователя. Помните, что большинство простых задач раскраски можно настроить и без кода — через свойства самой формы в конфигураторе, что является более предпочтительным с точки зрения производительности платформы.

← На главную