При работе с управляемыми формами разработчики часто сталкиваются с задачей визуального выделения данных в иерархических списках — поможет пример раскраски строк по статусам и условиям. В отличие от динамического списка, у элемента формы типа «Поле таблицы» с видом Дерево значений нет собственной настройки условного оформления в палитре свойств. Однако это не означает, что раскрасить дерево невозможно. Рассмотрим, как реализовать эту задачу, используя механизмы платформы 1С.
Для начала проанализируем важный архитектурный момент: в управляемом приложении механизм Условного оформления существует не только для динамических списков, но и для всей Формы в целом. Это глобальная коллекция правил, которая применяется ко всем элементам формы, связанным с данными (кроме динамических списков, у которых свой независимый механизм).
Посмотрим, как это работает на практике. Чтобы раскрасить строки дерева, нам нужно добавить элемент в коллекцию УсловноеОформление, которая доступна как в конфигураторе, так и программно через код модуля формы.
Разберем по шагам, как добавить правило раскраски программно. Это особенно полезно, когда условия оформления зависят от логики приложения или меняются в процессе работы. Обычно такой код размещают в процедуре ПриСозданииНаСервере.
Рассмотрим пример, где нам нужно выделить жирным шрифтом строки дерева, у которых установлен флаг ФлагГруппы.
// 1. Создаем новый элемент условного оформления
ЭлементУО = УсловноеОформление.Элементы.Добавить();
// 2. Устанавливаем само оформление (что именно меняем: цвет, шрифт, видимость)
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Делаем текст жирным
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийТекст);
// 3. Настраиваем условие (отбор), при котором сработает оформление
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дерево.ФлагГруппы");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
// 4. Указываем, какие именно колонки на форме нужно оформить
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ДеревоНоменклатура");
ОформляемоеПоле.Использование = Истина;
Проанализируем этот код. Здесь крайне важно не допустить ошибку в именовании полей, иначе оформление просто «не взлетит» — поможет инструментарий для отладки кода и запросов.
Многие разработчики совершают ошибку, указывая везде одинаковые имена. Выясним причину, почему это не работает. В системе компоновки данных (СКД), на которой базируется условное оформление, используются разные пространства имен для условий и для визуальных элементов:
ДеревоОбъектов, а колонка в нем — Статус, то путь будет выглядеть так: ДеревоОбъектов.Статус.ИмяДереваИмяРеквизита, например: ДеревоОбъектовСтатус.Запомните: Условие смотрит в данные (реквизит), а поле оформления указывает на визуальный объект (элемент формы).
Если правила оформления статичны, их проще настроить в окне свойств формы без написания кода:
Цвет фона).Объект.Дерево.Сумма Больше 1000).Часто требуется выделить цветом уровни вложенности: например, корневые узлы — синим, а подчиненные элементы — черным. Платформа не предоставляет прямой доступ к методу Уровень() внутри условного оформления. Рассмотрим эффективный способ решения этой задачи.
Поскольку условное оформление работает только с данными, нам необходимо подготовить эти данные заранее. Добавим в дерево значений служебную колонку Уровень (тип Число) и сделаем ее невидимой. При заполнении дерева на сервере будем записывать в эту колонку индекс вложенности строки.
Затем настроим правило оформления: если Уровень Равно 0 — применяем один стиль, если Уровень Равно 1 — другой. Этот подход гарантирует высокую производительность, так как системе не нужно вычислять уровень иерархии «на лету» при каждой перерисовке интерфейса.
Чтобы визуально отделить «папки» от «листьев», проанализируем структуру дерева при его обходе. Мы можем добавить булев реквизит ЭтоГруппа. При формировании дерева программно проверяйте наличие строк в коллекции Строки текущего узла. Если строки есть — устанавливайте флаг в Истина. Это позволит вам через условное оформление сделать все узлы-родители, например, подчеркнутыми или изменить их иконку.
Рассмотрим несколько практических рекомендаций, которые помогут избежать проблем при эксплуатации:
Содержит вместо Равно.УсловноеОформление десятками сложных условий. Каждое правило проверяется при отрисовке строки на клиенте. Если дерево очень большое (тысячи строк), избыточное оформление может вызвать задержки (фризы) при прокрутке.НужноПодсветитьКритичным). В оформлении останется лишь простая проверка этой колонки.Используя эти методы, мы можем гибко управлять визуальным представлением дерева значений, делая интерфейс программы интуитивно понятным и удобным для конечного пользователя.