Как реализовать группировку списка справочника с помощью иерархии в обычных формах 1С?

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

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

Использование элемента управления «Дерево значений»

Первый и самый распространенный способ реализации иерархии в обычных формах — это использование объекта ДеревоЗначений. В отличие от автоматических списков, дерево значений является объектом, который мы наполняем программно. Давайте разберем по шагам, как это реализовать:

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

Посмотрим на упрощенный пример того, как может выглядеть программное наполнение дерева:


// Предположим, Запрос уже выполнен и получен РезультатЗапроса
Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
    СтрокаРодитель = ЭлементыФормы.ДеревоНаВиде.Значение.Строки.Добавить();
    СтрокаРодитель.Наименование = Выборка.Товар;
    
    ВыборкаВариантов = Выборка.Выбрать();
    Пока ВыборкаВариантов.Следующий() Цикл
        СтрокаВариант = СтрокаРодитель.Строки.Добавить();
        СтрокаВариант.Наименование = ВыборкаВариантов.Вариант;
    КонецЦикла;
КонецЦикла;

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

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

Если специфика вашей задачи позволяет, самым современным и эффективным решением будет перевод этой конкретной формы на управляемый интерфейс. Платформа 1С позволяет использовать управляемые формы даже в рамках обычного приложения. Это дает вам преимущество в виде стандартного ДинамическогоСписка, который поддерживает иерархический вывод без необходимости написания сложного программного кода по обходу выборок.

Чтобы это реализовать:

  1. Создайте новую форму с типом «Управляемая».
  2. Разместите на ней ДинамическийСписок.
  3. В настройках списка включите свойство ИерархическийПросмотр.
  4. Настройте запрос списка таким образом, чтобы он возвращал данные с учетом связи «Основная номенклатура — Вариант».

Архитектурный подход: использование Характеристик номенклатуры

Прежде чем приступать к написанию кода для группировки в форме, проанализируйте саму задачу. Часто создание дополнительных табличных частей для хранения вариантов товаров является «костыльным» решением, которое в будущем усложнит отчетность и работу с остатками.

Рекомендуем рассмотреть использование штатного механизма Характеристик номенклатуры (через ПланВидовХарактеристик). Этот механизм:

Итоги и рекомендации

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

Разбирая каждый случай, всегда оценивайте объем данных: дерево значений хранит данные в памяти клиента, поэтому при работе с сотнями тысяч записей этот метод может существенно замедлить открытие формы. В таких случаях всегда лучше отдавать предпочтение запросам к базе данных через ДинамическийСписок на управляемых формах.

← На главную