Как раскрасить строки табличной части в цвет состояния из ХранилищаЗначений в 1С

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

Анализ проблемы и ограничений платформы

Рассмотрим распространенную задачу: в справочнике состояний заказов цвет зафиксирован в реквизите с типом ХранилищеЗначений. Требуется динамически окрашивать текст или фон ячеек в табличной части управляемой формы в зависимости от выбранного состояния.

При реализации этой задачи разработчики часто сталкиваются со следующими особенностями и ограничениями платформы 1С:Предприятие:

  1. Невозможность прямого считывания в условном оформлении: Платформа 1С не может автоматически обращаться к реквизитам типа ХранилищеЗначений при расчете правил оформления. Объект Цвет необходимо извлекать вручную методом Получить() на сервере.
  2. Оформление табличной части: В отличие от динамического списка, где смену цвета можно повесить на встроенные функции БСП (например, УстановитьУсловноеОформлениеПоЦветамСостояний), для табличной части требуется настраивать свойство УсловноеОформление самой формы.
  3. Серверный контекст: Добавление элементов в коллекцию УсловноеОформление формы должно выполняться в серверном контексте.

Программное формирование условного оформления формы

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

Посмотрим на практический пример кода, который вызывается при инициализации или обновлении формы:


&НаСервере
Процедура НастроитьОформлениеСостоянийНаСервере()
    
    // Очищаем ранее созданные элементы оформления во избежание дублирования
    ЭтаФорма.УсловноеОформление.Элементы.Очистить();
    
    // Получаем выборку состояний и их цветов из справочника
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Состояния.Ссылка КАК Ссылка,
        |   Состояния.Цвет КАК ЦветХранилище
        |ИЗ
        |   Справочник.СостоянияЗаказовПокупателей КАК Состояния";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    НомерЭлемента = 0;
    Пока Выборка.Следующий() Цикл
        
        // Извлекаем значение цвета из ХранилищаЗначений
        ЦветСостояния = Выборка.ЦветХранилище.Получить();
        
        // Проверяем корректность полученного типа
        Если ТипЗнч(ЦветСостояния) <> Тип("Цвет") Тогда
            Продолжить;
        КонецЕсли;
        
        НомерЭлемента = НомерЭлемента + 1;
        
        // Добавляем новый элемент условного оформления
        ЭлементОформления = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
        
        // Задаем параметр оформления (например, ЦветТекста или ЦветФона)
        ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветСостояния);
        
        // Настраиваем условие отбора: колонка Состояние должна совпадать с текущей ссылкой
        ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ЗаказыНаДату.Состояние");
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.ПравоеЗначение = Выборка.Ссылка;
        
        // Обязательно указываем оформляемое поле формы
        ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
        ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ЗаказыНаДатуСостояние");
        ПолеОформления.Использование = Истина;
        
    КонецЦикла;

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

Проанализируем ключевые моменты представленного кода:

  1. Очистка правил: Предварительный вызов УсловноеОформление.Элементы.Очистить() гарантирует, что при перезаполнении таблицы или смене фильтров правила условного оформления не будут дублироваться.
  2. Проверка типа данных: Проверка ТипЗнч(ЦветСостояния) <> Тип("Цвет") исключает ошибки, если в ХранилищеЗначений хранится Неопределено или некорректные данные.
  3. Указание поля оформления: Обязательно нужно заполнять коллекцию Поля объекта ЭлементОформления через ПолеКомпоновкиДанных. Без указания конкретного поля оформления правило не применится к ячейкам таблицы.

Альтернативные варианты решения и оптимизация

Рассмотрим дополнительные подходы к решению задачи, которые помогут оптимизировать производительность системы:

  1. Кэширование цветов: Если элементов в справочнике состояний много, распаковка ХранилищеЗначений при каждом открытии формы может создавать лишнюю нагрузку. Извлечение соответствий "Состояние — Цвет" стоит вынести в повторно используемый модуль.
  2. Изменение структуры хранения цвета: Если есть возможность доработки конфигурации, цвет удобнее хранить в виде трех составляющих RGB (числа) или в виде строки HEX. Это позволит извлекать составляющие цвета напрямую через запрос.
  3. Использование динамического списка: Если таблица на форме предназначена только для просмотра и выбора данных, целесообразно заменить таблицу значений на ДинамическийСписок, поддерживающий стандартные механизмы оформления.
← На главную