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

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

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

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

Принцип работы условного оформления в управляемых формах

Программное создание элементов условного оформления выполняется через коллекцию УсловноеОформление, которая доступна только в серверном контексте формы (например, в процедуре ПриСозданииНаСервере или специальных серверных процедурах формирования колонок).

Каждый элемент условного оформления состоит из трех ключевых составляющих:

  1. Оформляемые поля (Поля): список элементов формы, к которым будет применен стиль (цвет фона, шрифт, цвет текста и т.д.). Важно: здесь указывается именно имя элемента формы.
  2. Условие (Отбор): правило, определяющее, в каких строках сработает оформление. Важно: в левом значении отбора указывается полный путь к данным через точку (например, ТаблицаДанных.ИмяКолонки).
  3. Параметры оформления (Оформление): визуальные свойства, которые нужно изменить (например, ЦветФона, ЦветТекста, Шрифт, Видимость, Доступность).

Типичная ошибка: разница между именем элемента и путем к данным

Проанализируем основную проблему, с которой сталкиваются разработчики при программном создании правил. Если правило не применяется или окрашивает всю колонку целиком независимо от значения в строке, причина кроется в некорректно сформированных объектах ПолеКомпоновкиДанных.

Разберем различия:

  1. Для свойства ОформляемоеПоле.Поле передается имя элемента таблицы формы, то есть имя визуального поля (например, ТаблицаДанныхЦена или имя, переданное первым параметром в Элементы.Добавить()).
  2. Для свойства ЭлементОтбора.ЛевоеЗначение передается путь к данным реквизита строки (например, "ТаблицаДанных.Цена" или значение свойства НовыйЭлемент.ПутьКДанным).

Если в ЭлементОтбора.ЛевоеЗначение ошибочно указать имя элемента формы без пути к таблице данных (или продублировать имя через точку), платформа не сможет сопоставить значение строки с условием отбора и правило либо проигнорируется, либо применится ко всей колонке.

Пошаговое создание динамических колонок и условного оформления

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


&НаСервере
Процедура ДобавитьДинамическиеКолонкиИОформление()

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

КонецПроцедуры

Универсальная процедура добавления условного оформления

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


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

Важные рекомендации при работе с динамическим оформлением

  1. Очистка правил при повторном формировании: если таблица перестраивается динамически несколько раз за сеанс работы формы, перед добавлением новых колонок и правил обязательно очищайте коллекцию командой УсловноеОформление.Элементы.Очистить(), чтобы не накапливать недействительные правила и не снижать производительность.
  2. Оптимизация при большом количестве колонок: создание сотен индивидуальных элементов оформления замедляет отрисовку формы на клиенте. Если ячейки раскрашиваются по ограниченному набору статусов, эффективнее завести служебную колонку с кодом состояния (например, КодЦвета) и привязать к одному правилу сразу группу оформляемых колонок.
  3. Альтернатива для сложных матриц: если требуется выводить произвольную кросс-таблицу с уникальным цветом для каждой ячейки (например, тепловую карту или интерактивную шахматку), более производительным решением может стать использование элемента формы ПолеТабличногоДокумента, где форматирование каждой ячейки задается напрямую через свойства области таблицы.
← На главную