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

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

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

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

Метод 1. Использование групп колонок и Условного оформления

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

Шаг 1. Подготовка реквизитов

В объекте ДеревоЗначений создадим служебный реквизит (для таких задач отлично подходит добавление реквизитов и элементов формы на управляемые формы легко и просто без кодирования — поможет инструмент сборки адаптивных интерфейсов 1С), например, ТипСтроки (тип Число). Он будет служить индикатором: 1 — для родительских записей, 0 — для подчиненных. Также добавим все рабочие поля: Поле1, Поле2, Поле3 (для первого уровня) и Поле4, Поле5, Поле6 (для второго).

Шаг 2. Настройка элементов формы

  1. Перенесем все поля в элемент формы Таблица.
  2. Создадим две группы колонок. Первую назовем ГруппаУровень1, вторую — ГруппаУровень2.
  3. Поместим Поле1, Поле2, Поле3 в первую группу, а остальные — во вторую.
  4. Для групп установим свойство Отображение в значение Нет (или настроим так, чтобы они не имели заголовков, если это мешает дизайну).

Шаг 3. Реализация логики в коде

Теперь нам нужно настроить УсловноеОформление формы. Этот профессиональный прием условного оформления позволит «выключать» видимость ненужных полей в зависимости от значения реквизита ТипСтроки. Посмотрим на пример кода (для его оптимизации и упрощения пригодится программная модификация форм - текучий конструктор), который можно разместить в процедуре ПриСозданииНаСервере:


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

ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ДеревоПоле4");
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ДеревоПоле5");
// ... аналогично для других полей

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

Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

Важный нюанс: использование свойства Видимость в условном оформлении для колонок таблицы в управляемых формах иногда может вести себя нестабильно (скрывать колонку целиком). В таких случаях рекомендуем использовать параметр Текст (очищать его) или параметр ТолькоПросмотр вместе с ЦветТекста, чтобы визуально «погасить» нерелевантные ячейки.

Метод 2. «Виртуальные» или универсальные колонки

Выясним причину, почему разработчики часто выбирают этот путь: он позволяет избежать «раздувания» таблицы по ширине. Вместо создания 6 колонок мы создаем всего 3 универсальных (например, Колонка_А, Колонка_Б, Колонка_В), применяя на практике программный вывод произвольной таблицы значений на управляемую форму и работу с составными типами.

Проанализируем алгоритм работы:

  1. При заполнении дерева на сервере мы проверяем уровень иерархии.
  2. Если строка — «родитель», записываем данные из Поля 1 в Колонку_А.
  3. Если строка — «ребенок», записываем данные из Поля 4 в ту же Колонку_А.

Чтобы в одной колонке могли находиться данные разных типов (например, СправочникСсылка.Контрагенты и Число), при создании реквизита дерева необходимо указать составной тип данных или тип Произвольный.

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

Метод 3. Вертикальная группировка полей

Рассмотрим ситуацию, когда нам нужно расположить поля 4, 5, 6 физически под полями 1, 2, 3 внутри одной и той же иерархической ветки. Это достигается за счет настройки свойств групп колонок в элементе Таблица, используя сложные интерфейсы с вертикальными группами колонок, где часто применяется программное изменение форм.

Пошаговая настройка интерфейса:

  1. Создаем общую группу колонок с типом Группа колонок и вариантом группировки Вертикальная.
  2. Внутри нее создаем две подгруппы с вариантом группировки Горизонтальная.
  3. В первую подгруппу помещаем «родительские» реквизиты, во вторую — «дочерние».

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

Метод 4. Вывод данных через Табличный документ

Если задача заключается только в выводе сложной иерархии для анализа (без возможности прямого редактирования данных в ячейках), мы рекомендуем рассмотреть вывод иерархических структур через Табличный документ.

В отличие от стандартной таблицы формы, ТабличныйДокумент позволяет:

Этот метод сложнее в реализации, так как требует написания алгоритма вывода каждой строки через макет, но он дает 100% свободы в визуальном представлении «правильной» иерархии.

Практические советы по оптимизации

При реализации любого из этих методов обратите внимание на следующие моменты:

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

Мы надеемся, что эти методы, программное управление элементами формы, а также конструктор управляемых форм, помогут вам создать удобный и профессиональный интерфейс в ваших разработках на платформе 1С!

← На главную