В процессе разработки интерфейсов на управляемых формах 1С часто возникает задача визуального выделения строк в таблицах или деревьях значений. Классический пример — раскрасить строки дерева в зависимости от статуса документа или заявки (например, «Закрыта» — зеленый, «В работе» — желтый, «Отменена» — красный).
Начинающие разработчики часто сталкиваются с трудностями при реализации этой задачи и выбирают неочевидные решения, которые впоследствии превращаются в «бомбы замедленного действия» для поддержки конфигурации. В этой статье мы подробно разберем, как реализовать раскраску дерева значений правильно, избежав типичных ошибок проектирования.
Рассмотрим ситуацию, с которой часто начинают: разработчик пытается раскрасить дерево значений по статусам, но сталкивается с тем, что напрямую связать условие оформления со статусом внутри ссылки не получается. В качестве быстрого решения создается вспомогательный реквизит дерева значений с типом Число (например, ДляРаскраски).
При заполнении дерева на сервере пишется код сопоставления статусов числам:
Если Строка.Заявка.СтатусЗаявки = Перечисления.СтатусыЗаявок.Закрыт Тогда
Строка.ДляРаскраски = 1; // Зеленый
ИначеЕсли Строка.Заявка.СтатусЗаявки = Перечисления.СтатусыЗаявок.ЗакрытБухгалтером Тогда
Строка.ДляРаскраски = 2; // Салатовый
КонецЕсли;
Затем в условном оформлении управляемой формы настраиваются статические правила: «Если ДляРаскраски Равно 1, тогда ЦветФона = Зеленый».
Почему этот подход считается плохой практикой?
Выясним причину, почему разработчики вообще прибегают к числовым колонкам, и разберем правильные методы решения этой задачи.
---
Первопричина создания числовых колонок кроется в ограничении платформы 1С. На управляемых формах условное оформление для табличных частей и деревьев значений (в отличие от динамических списков) не умеет разыменовывать ссылки на клиенте. Это значит, что вы не можете напрямую обратиться через точку к реквизиту ссылки в условиях оформления (например, написать условие Дерево.Заявка.СтатусЗаявки = ...).
Проанализируем, как обойти это ограничение правильно, сохранив типизацию данных:
Статус. Тип этой колонки должен строго соответствовать типу статуса вашей заявки (например, ПеречислениеСсылка.СтатусыЗаявок или СправочникСсылка.СтатусыЗаявок). Делать эту колонку видимой для пользователя не обязательно — ее можно скрыть.
// При обходе дерева на сервере
Строка.Статус = Строка.Заявка.СтатусЗаявки;
ДеревоЗаявок.Статус, вид сравнения — Равно, а в качестве правого значения выбираем предопределенное значение перечисления (например, ПредопределенноеЗначение("Перечисление.СтатусыЗаявок.Закрыт")).Этот подход гораздо надежнее: мы избавились от «магических чисел», код стал задокументированным и понятным, а условное оформление теперь привязано к реальным объектам метаданных.
---
В крупных, тиражных или корпоративных решениях даже статический выбор цвета в конфигураторе считается плохим тоном. Требования бизнеса могут измениться: сегодня руководителю нравится зеленый цвет закрытых заявок, а завтра бухгалтерия потребует выделить их серым. Чтобы не переписывать код при каждом капризе пользователей, настройку цветов переносят непосредственно в режим «1С:Предприятие».
Рассмотрим, как реализовать полностью динамическую раскраску:
СтатусыЗаявок добавим новый реквизит ЦветСтроки (тип Строка, длина 11 символов). В нем мы будем хранить компоненты цвета в формате RGB (например, "255,230,230" для нежно-красного).Разберем по шагам программный код настройки оформления в модуле формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализируем программную настройку цветов
НастроитьДинамическоеОформлениеСтатусов();
КонецПроцедуры
&НаСервере
Процедура НастроитьДинамическоеОформлениеСтатусов()
// Выбираем все активные статусы и настроенные для них цвета
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Статусы.Ссылка КАК Статус,
| Статусы.ЦветСтроки КАК ЦветСтроки
|ИЗ
| Справочник.СтатусыЗаявок КАК Статусы
|ГДЕ
| НЕ Статусы.ПометкаУдаления
| И Статусы.ЦветСтроки <> """""; // Берем только те, для которых настроен цвет
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Разбираем строку RGB в реальный объект Цвет
МассивКомпонент = СтрРазделить(Выборка.ЦветСтроки, ",");
Если МассивКомпонент.Количество() <> 3 Тогда
Продолжить; // Пропускаем некорректно заполненные цвета
КонецЕсли;
Попытка
R = Число(СокрЛП(МассивКомпонент[0]));
G = Число(СокрЛП(МассивКомпонент[1]));
B = Число(СокрЛП(МассивКомпонент[2]));
НовыйЦвет = Новый Цвет(R, G, B);
Исключение
Продолжить;
КонецПопытки;
// Создаем новый элемент условного оформления на форме
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// 1. Настраиваем оформление (Цвет фона)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", НовыйЦвет);
// 2. Указываем оформляемое поле (всю строку нашего дерева)
ПолеОформления = ЭлементОформления.Поля.Eлементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДеревоЗаявок"); // Имя таблицы на форме
// 3. Добавляем условие отбора (ДеревоЗаявок.Статус = ТекущийСтатус)
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ДеревоЗаявок.Статус");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Выборка.Статус;
КонецЦикла;
КонецПроцедуры
Благодаря этому решению код конфигурации становится полностью независимым от конкретных цветов и списка статусов. Пользователи могут самостоятельно добавлять новые статусы, менять их расцветку, и все это начнет работать сразу без привлечения программиста и обновления базы данных.
---
Почему нельзя использовать функции в Условном оформлении?
В среде разработчиков часто звучит вопрос: «Почему платформа не позволяет написать функцию встроенного языка в качестве условия оформления строки?». Ответ кроется в производительности интерфейса.
Условное оформление 1С отрабатывает на клиенте во время отрисовки (рендеринга) ячеек на экране. Если бы платформа позволяла вызывать тяжелые серверные функции для каждой строки при каждой прокрутке таблицы, интерфейс программы моментально бы завис. Декларативные правила условного оформления оптимизированы на уровне платформы и работают максимально быстро.
Ограничения по объему правил:
Не рекомендуется создавать сотни динамических правил оформления для одной формы. Оптимальное количество правил — до 20-30 штук. Если у вас справочник статусов разрастется до 100 элементов и для каждого будет назначен свой уникальный цвет, отрисовка дерева на клиенте может начать визуально притормаживать при быстрой прокрутке.
Особенности иерархии в деревьях значений:
Помните, что условное оформление в 1С оценивает каждую строку дерева независимо от её положения в иерархии. Если вам необходимо, чтобы подчиненные строки дерева перенимали цвет родительской строки (даже если у них самих нет статуса), вам придется транслировать статус родителя вниз по иерархии во вспомогательную колонку при заполнении дерева на сервере.