Как программно вывести иерархию справочника в отчет или дерево значений 1С

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

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

Особенности построения запроса с иерархией

Прежде чем выводить данные на экран, их необходимо правильно извлечь из базы данных. Если мы просто выберем номенклатуру, мы получим плоский список. Чтобы система «понимала» родственные связи между элементами, в языке запросов 1С используется предложение ИТОГИ ПО ... ИЕРАРХИЯ. Разберем важный нюанс, упомянутый в обсуждении: работу с субконто на бухгалтерских счетах.

Поскольку Субконто — это поле составного типа, запрос не всегда может автоматически определить, по какому именно справочнику строить иерархию. В этом случае нам поможет оператор ВЫРАЗИТЬ. Проанализируем пример запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
    |   СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК Количество,
    |   СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК Сумма
    |ИЗ
    |   РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК ХозрасчетныйОстатки
    |ГДЕ
    |   ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура) ЕСТЬ НЕ NULL
    |СГРУППИРОВАТЬ ПО
    |   ХозрасчетныйОстатки.Субконто1
    |ИТОГИ
    |   СУММА(Количество),
    |   СУММА(Сумма)
    |ПО
    |   Номенклатура ИЕРАРХИЯ";

Использование ключевого слова ИЕРАРХИЯ заставляет систему добавить в результат запроса все родительские группы для найденных элементов, даже если по самим группам нет остатков. Это критически важно для построения корректного дерева.

Способ 1: Вывод данных в Дерево значений на форме

Если ваша задача — показать данные в интерактивном виде на управляемой форме, проще всего использовать реквизит с типом ДеревоЗначений. Рассмотрим по шагам, как заполнить его из результата запроса.

  1. Создайте на форме реквизит (например, с именем ДеревоОтчета) и установите ему тип ДеревоЗначений. Перетащите его на элементы формы.
  2. В коде выполните запрос и выгрузите результат специальным методом.

Проанализируем программный код выгрузки:


// Выполняем запрос
РезультатЗапроса = Запрос.Выполнить();

// Выгружаем результат с обходом по группировкам и иерархии
// Это создаст структуру дерева значений в памяти
тДерево = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

// Копируем данные из объекта "ДеревоЗначений" в реквизит формы
ЗначениеВРеквизитФормы(тДерево, "ДеревоОтчета");

Важный момент: Метод Выгрузить с параметром ОбходРезультатаЗапроса.ПоГруппировкамСИерархией автоматически создаст вложенные строки в дереве значений, соответствующие иерархии справочника. Вам не нужно писать рекурсию вручную — платформа сделает это за вас.

Способ 2: Вывод в Табличный документ с макетом

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

Рассмотрим алгоритм вывода:

  1. Включаем автогруппировку строк методом ТабДок.НачатьАвтогруппировкуСтрок().
  2. Используем метод Выбрать с тем же типом обхода ПоГруппировкамСИерархией.
  3. При выводе области макета передаем в метод Вывести уровень вложенности текущей записи.

Пример реализации процедуры вывода:


ТабДок.Очистить();
ТабДок.НачатьАвтогруппировкуСтрок();

Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

Пока Выборка.Следующий() Цикл
    // Получаем область из макета
    Если Выборка.Номенклатура.ЭтоГруппа Тогда
        Область = Макет.ПолучитьОбласть("Группа");
    Иначе
        Область = Макет.ПолучитьОбласть("Строка");
    КонецЕсли;
    
    // Заполняем параметры
    Область.Параметры.Заполнить(Выборка);
    
    // Выводим область, указывая уровень (начиная с 0)
    // Именно второй параметр метода Вывести() отвечает за создание "плюсиков"
    ТабДок.Вывести(Область, Выборка.Уровень());
КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.ОтображатьГруппировки = Истина;

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

Оформление и дополнительные настройки

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

Почему СКД — это лучший выбор?

Хотя мы рассмотрели ручные способы вывода, современные стандарты разработки в 1С рекомендуют использовать Систему компоновки данных (СКД). Это мощный инструмент, который берет на себя всю рутину по выводу иерархии.

Рассмотрим, как это настраивается в СКД:

  1. В запросе схемы компоновки не нужно писать ИТОГИ, достаточно простого ВЫБРАТЬ ... ИЗ ....
  2. На закладке Настройки добавьте группировку по нужному полю (например, Номенклатура).
  3. В поле Тип группировки вместо «Без иерархии» выберите «Иерархия».

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

Подводя итог, выбор метода зависит от задачи: для интерактивного списка на форме используйте ДеревоЗначений, для сложных печатных форм — программный вывод с НачатьАвтогруппировкуСтрок, а для стандартных отчетов всегда отдавайте предпочтение СКД.

← На главную