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