Как раскрасить дерево значений на управляемых формах в 1С

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

При работе с управляемыми формами разработчики часто сталкиваются с задачей визуального выделения данных в иерархических списках — поможет пример раскраски строк по статусам и условиям. В отличие от динамического списка, у элемента формы типа «Поле таблицы» с видом Дерево значений нет собственной настройки условного оформления в палитре свойств. Однако это не означает, что раскрасить дерево невозможно. Рассмотрим, как реализовать эту задачу, используя механизмы платформы 1С.

Основная концепция условного оформления

Для начала проанализируем важный архитектурный момент: в управляемом приложении механизм Условного оформления существует не только для динамических списков, но и для всей Формы в целом. Это глобальная коллекция правил, которая применяется ко всем элементам формы, связанным с данными (кроме динамических списков, у которых свой независимый механизм).

Посмотрим, как это работает на практике. Чтобы раскрасить строки дерева, нам нужно добавить элемент в коллекцию УсловноеОформление, которая доступна как в конфигураторе, так и программно через код модуля формы.

Программная настройка оформления

Разберем по шагам, как добавить правило раскраски программно. Это особенно полезно, когда условия оформления зависят от логики приложения или меняются в процессе работы. Обычно такой код размещают в процедуре ПриСозданииНаСервере.

Рассмотрим пример, где нам нужно выделить жирным шрифтом строки дерева, у которых установлен флаг ФлагГруппы.


// 1. Создаем новый элемент условного оформления
ЭлементУО = УсловноеОформление.Элементы.Добавить();

// 2. Устанавливаем само оформление (что именно меняем: цвет, шрифт, видимость)
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Делаем текст жирным
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийТекст);

// 3. Настраиваем условие (отбор), при котором сработает оформление
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дерево.ФлагГруппы");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;

// 4. Указываем, какие именно колонки на форме нужно оформить
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ДеревоНоменклатура");
ОформляемоеПоле.Использование = Истина;

Проанализируем этот код. Здесь крайне важно не допустить ошибку в именовании полей, иначе оформление просто «не взлетит» — поможет инструментарий для отладки кода и запросов.

Критически важный нюанс: различие имен полей

Многие разработчики совершают ошибку, указывая везде одинаковые имена. Выясним причину, почему это не работает. В системе компоновки данных (СКД), на которой базируется условное оформление, используются разные пространства имен для условий и для визуальных элементов:

  1. В Отборе (ЛевоеЗначение): Мы указываем путь к данным реквизита формы. Если ваше дерево — это реквизит ДеревоОбъектов, а колонка в нем — Статус, то путь будет выглядеть так: ДеревоОбъектов.Статус.
  2. В Оформляемых полях (Поле): Мы указываем имя элемента формы (колонки), как оно задано в дереве элементов формы. Часто платформа при перетаскивании реквизита на форму называет колонку по шаблону ИмяДереваИмяРеквизита, например: ДеревоОбъектовСтатус.

Запомните: Условие смотрит в данные (реквизит), а поле оформления указывает на визуальный объект (элемент формы).

Интерактивная настройка в конфигураторе

Если правила оформления статичны, их проще настроить в окне свойств формы без написания кода:

  1. Откройте форму в конфигураторе.
  2. В окне свойств формы (справа) найдите строку Условное оформление и нажмите «Открыть».
  3. В появившемся окне добавьте новый элемент.
  4. На вкладке Оформление выберите нужные параметры (например, Цвет фона).
  5. На вкладке Условие задайте правило (например, Объект.Дерево.Сумма Больше 1000).
  6. На вкладке Оформляемые поля выберите конкретные колонки вашего дерева, которые должны изменить цвет. Если ничего не выбирать, раскрасится вся строка целиком.

Раскраска уровней иерархии

Часто требуется выделить цветом уровни вложенности: например, корневые узлы — синим, а подчиненные элементы — черным. Платформа не предоставляет прямой доступ к методу Уровень() внутри условного оформления. Рассмотрим эффективный способ решения этой задачи.

Поскольку условное оформление работает только с данными, нам необходимо подготовить эти данные заранее. Добавим в дерево значений служебную колонку Уровень (тип Число) и сделаем ее невидимой. При заполнении дерева на сервере будем записывать в эту колонку индекс вложенности строки.

Затем настроим правило оформления: если Уровень Равно 0 — применяем один стиль, если Уровень Равно 1 — другой. Этот подход гарантирует высокую производительность, так как системе не нужно вычислять уровень иерархии «на лету» при каждой перерисовке интерфейса.

Оформление групп и строк с подчиненными элементами

Чтобы визуально отделить «папки» от «листьев», проанализируем структуру дерева при его обходе. Мы можем добавить булев реквизит ЭтоГруппа. При формировании дерева программно проверяйте наличие строк в коллекции Строки текущего узла. Если строки есть — устанавливайте флаг в Истина. Это позволит вам через условное оформление сделать все узлы-родители, например, подчеркнутыми или изменить их иконку.

Советы по производительности и работе со строками

Рассмотрим несколько практических рекомендаций, которые помогут избежать проблем при эксплуатации:

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

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

← На главную