Как программно настроить условное оформление динамического списка на основе RGB-цветов из справочника

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

В разработке на платформе 1С:Предприятие 8.3 часто возникает задача визуального выделения строк в списках. Обычное статическое условное оформление, которое настраивается в конфигураторе, легко справляется с простыми условиями. Однако, если цвета оформления не фиксированы, а задаются пользователем в режиме «1С:Предприятие» (например, хранятся в виде составляющих Red, Green, Blue в справочнике категорий), нам потребуется программный подход. Рассмотрим, как реализовать такую задачу правильно и эффективно.

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

Представим ситуацию: у нас есть справочник Номенклатура и связанный с ним справочник КатегорииТоваров. В карточке категории пользователь может указать произвольный цвет, выбрав значения для трех реквизитов: Красный (Red), Зеленый (Green) и Синий (Blue). Нам нужно, чтобы в списке номенклатуры текст каждой строки окрашивался в цвет той категории, к которой принадлежит товар.

Разберем, почему стандартные подходы могут не сработать:

  1. Интерактивная настройка списка: В настройках динамического списка (закладка «Условное оформление») нельзя напрямую указать «взять цвет из реквизита объекта». Там можно лишь выбрать фиксированный цвет из палитры для конкретного условия.
  2. Событие ПриПолученииДанныхНаСервере: В управляемых формах это событие работает иначе, чем в обычных. Оно не позволяет напрямую обратиться к оформлению строки через Строка.Оформление для установки произвольного цвета RGB «на лету». Это событие чаще используется для дозаполнения текстовых данных, которых нет в основном запросе списка.

Оптимальным решением является программное формирование коллекции УсловноеОформление динамического списка в момент открытия формы или при изменении настроек категорий.

Программное создание правил условного оформления

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

Проанализируем пример кода, который решает эту задачу в модуле формы списка номенклатуры:


&НаСервере
Процедура НастроитьУсловноеОформлениеСписка()

    // 1. Очищаем старые правила оформления, чтобы избежать дублирования при повторном вызове
    Список.УсловноеОформление.Элементы.Очистить();
    
    // 2. Выбираем категории, для которых заданы цвета
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    КатегорииТоваров.Ссылка КАК Категория,
        |    КатегорииТоваров.Red,
        |    КатегорииТоваров.Green,
        |    КатегорииТоваров.Blue
        |ИЗ
        |    Справочник.КатегорииТоваров КАК КатегорииТоваров
        |ГДЕ
        |    НЕ (КатегорииТоваров.Red = 0 И КатегорииТоваров.Green = 0 И КатегорииТоваров.Blue = 0)"; // Пропускаем черные/пустые
        
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // 3. Создаем новый элемент оформления
        ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
        
        // 4. Устанавливаем само оформление (ЦветТекста)
        // Используем конструктор Новый Цвет(R, G, B)
        ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", 
            Новый Цвет(Выборка.Red, Выборка.Green, Выборка.Blue));
            
        // 5. Настраиваем отбор: когда применять это оформление
        // Мы хотим красить строку, если поле "Категория" в списке равно нашей категории из выборки
        ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Категория"); 
        ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.ПравоеЗначение = Выборка.Категория;
        ЭлементОтбора.Использование  = Истина;
        
        // 6. Указываем, какие именно поля (колонки) нужно раскрашивать
        // Если не добавить поля, раскрасится вся строка
        ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
        ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Наименование");
        ОформляемоеПоле.Использование = Истина;
        
    КонецЦикла;

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

Важные технические нюансы

При реализации данного метода выясним причины возможных ошибок и проанализируем важные детали:

  1. Сравнение по Ссылке, а не по Наименованию: Обратите внимание, что в ПравоеЗначение элемента отбора крайне важно передавать Выборка.Категория (Ссылку), а не текстовое наименование. Сравнение по строке работает медленнее и может привести к ошибкам при наличии дублей или переименовании.
  2. Имена полей: Параметр Новый ПолеКомпоновкиДанных("Категория") должен соответствовать имени колонки в динамическом списке. Если в вашем запросе динамического списка поле называется по-другому, например, ТоварнаяКатегория, то и в коде нужно указывать именно это имя.
  3. Производительность: Если в справочнике категорий тысячи элементов, создание тысяч правил условного оформления может замедлить работу формы. В этом случае рекомендуется ограничить количество оформляемых категорий или использовать другие методы (например, расчет индекса цвета в запросе и использование ограниченного набора стилей).
  4. Обновление оформления: Метод НастроитьУсловноеОформлениеСписка() следует вызывать в процедуре ПриСозданииНаСервере. Если пользователь может изменить цвета категорий, не закрывая форму списка номенклатуры, стоит предусмотреть кнопку «Обновить», которая перезапустит этот код.

Альтернативный подход: Цветовые индикаторы (картинки)

Если программное раскрашивание текста кажется слишком тяжелым для системы, рассмотрим альтернативу. Вы можете добавить в динамический список колонку с картинкой (маленьким цветным квадратом). В этом случае в запросе динамического списка используется конструкция ВЫБОР КОГДА..., а в коллекции картинок формы подготавливаются изображения соответствующих цветов. Этот метод работает быстрее, так как не перегружает механизм условного оформления платформы сложными RGB-вычислениями для каждой строки.

Тем не менее, для задач с произвольным выбором цвета пользователем, программное управление объектом УсловноеОформление, которое мы разобрали выше, остается самым гибким и мощным инструментом разработчика 1С.

← На главную