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