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