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