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