При разработке управляемых форм часто возникает задача визуального выделения данных в табличной части (ТЧ) документа. Например, если цвет строки или ячейки должен зависеть от статуса объекта, выбранного в этой строке. Рассмотрим, как реализовать механизм условного оформления программно, если настройки в конфигураторе недостаточно или данные для оформления хранятся в самом объекте.
Для того чтобы гибко управлять цветом, удобно хранить его значение в реквизите справочника. Поскольку тип Цвет в 1С напрямую не сохраняется в строковых полях базы данных, мы используем механизм сериализации СериализаторXDTO. Это позволяет сохранить цвет в формате XML и корректно считать его при открытии формы.
Основной механизм оформления в управляемых формах — это коллекция УсловноеОформление. Чтобы применить его программно, нам нужно выполнить следующие шаги:
УсловноеОформление.Элементы.ПолеКомпоновкиДанных.ЦветФона).Представим, что у нас есть табличная часть Запасы, в которой есть реквизит ИНФ_Черновик (ссылка на справочник). У элемента этого справочника есть реквизит ЦветXML. Мы хотим, чтобы колонка ИНФ_Черновик закрашивалась в цвет, заданный в справочнике.
Рассмотрим код, который мы размещаем в обработчике ПриСозданииНаСервере:
Для Каждого Стр Из Объект.Запасы Цикл
Элемент = УсловноеОформление.Элементы.Добавить();
// Указываем, какую колонку красим
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ЗапасыИНФ_Черновик");
// Указываем условие, при котором красим
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Запасы.ИНФ_Черновик");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Стр.ИНФ_Черновик;
ОтборЭлемента.Использование = Истина;
// Получаем цвет из XML
ЦветXML = Стр.ИНФ_Черновик.ЦветXML;
Если ПустаяСтрока(ЦветXML) Тогда
ЦветЧерновика = Новый Цвет; // Цвет по умолчанию
Иначе
ЦветЧерновика = СериализаторXDTO.XMLЗначение(Тип("Цвет"), ЦветXML);
КонецЕсли;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветЧерновика);
КонецЦикла;
Важно понимать, что создание элемента условного оформления для каждой строки табличной части — ресурсоемкая операция. Если в табличной части 1000 строк, создание 1000 элементов УсловноеОформление приведет к заметным «тормозам» при открытии формы.
Чтобы ускорить работу, используйте подход с группировкой:
УсловноеОформление до количества уникальных цветов, а не до количества строк в таблице.Помните, что УсловноеОформление работает наиболее эффективно, когда оно настроено один раз при инициализации формы. Избегайте вызова логики по добавлению элементов в циклах при каждом изменении данных в ТЧ. Если данные в табличной части меняются динамически, лучше предусмотреть структуру данных так, чтобы условия оформления были максимально статичными или использовать ОформлениеСтроки в тех редких случаях, когда это применимо.
Использование СериализаторXDTO для работы с цветами — это надежный способ интеграции визуальных настроек справочников в программную логику форм, позволяющий избежать жесткого кодирования цветов в конфигураторе.