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