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

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

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

Подготовка данных: хранение цвета в справочнике

Для того чтобы гибко управлять цветом, удобно хранить его значение в реквизите справочника. Поскольку тип Цвет в 1С напрямую не сохраняется в строковых полях базы данных, мы используем механизм сериализации СериализаторXDTO. Это позволяет сохранить цвет в формате XML и корректно считать его при открытии формы.

Реализация через Условное оформление

Основной механизм оформления в управляемых формах — это коллекция УсловноеОформление. Чтобы применить его программно, нам нужно выполнить следующие шаги:

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

Пример программной настройки оформления

Представим, что у нас есть табличная часть Запасы, в которой есть реквизит ИНФ_Черновик (ссылка на справочник). У элемента этого справочника есть реквизит ЦветXML. Мы хотим, чтобы колонка ИНФ_Черновик закрашивалась в цвет, заданный в справочнике.

Рассмотрим код, который мы размещаем в обработчике ПриСозданииНаСервере:


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

Оптимизация производительности

Важно понимать, что создание элемента условного оформления для каждой строки табличной части — ресурсоемкая операция. Если в табличной части 1000 строк, создание 1000 элементов УсловноеОформление приведет к заметным «тормозам» при открытии формы.

Чтобы ускорить работу, используйте подход с группировкой:

Советы по разработке

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

Использование СериализаторXDTO для работы с цветами — это надежный способ интеграции визуальных настроек справочников в программную логику форм, позволяющий избежать жесткого кодирования цветов в конфигураторе.

← На главную