Как вывести иерархию номенклатуры в запросе, если данные находятся в таблице значений?

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

Часто перед разработчиками встает задача: у нас есть «плоская» таблица значений, в которой содержатся данные по номенклатуре и множество числовых показателей (например, 26 колонок с количествами), и нам необходимо вывести эти данные в отчет, сохранив иерархическую структуру номенклатуры с итогами по группам. Давайте разберем, как грамотно подойти к решению этой задачи.

Подход первый: использование запроса с иерархией

Самый прямой путь — это использовать возможности встроенного языка Запрос. Чтобы получить иерархию, нам недостаточно просто передать таблицу значений в запрос. Необходимо правильно связать данные вашей таблицы со справочником Номенклатура.

  1. Подготовка данных: Передайте вашу таблицу значений в запрос с помощью МенеджерВременныхТаблиц. Это позволит системе проиндексировать данные и эффективно объединить их с основной базой.
  2. Связи: Используйте ЛЕВОЕ СОЕДИНЕНИЕ вашей временной таблицы со справочником Номенклатура. Именно на этом этапе мы получаем возможность использовать иерархические свойства справочника.
  3. Использование итогов: В тексте запроса обязательно добавьте секцию ИТОГИ. Используйте конструкцию ИТОГИ ПО Номенклатура ИЕРАРХИЯ. Это заставит систему автоматически рассчитать суммы по всем числовым полям (вашим колонкам «Количество1» и т.д.) для каждого родительского элемента в иерархии.

Важно помнить: если в вашей исходной таблице присутствуют только конечные элементы (товары), запрос не «узнает» о группах, пока вы не обеспечите связь с иерархической структурой справочника. При выводе результата используйте метод Выборка.Уровень(), чтобы правильно оформлять отступы в табличном документе.

Подход второй: использование Системы Компоновки Данных (СКД)

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

  1. Набор данных: Передайте вашу таблицу значений в СКД как «Набор данных — объект».
  2. Группировки: В настройках отчета создайте группировку по полю Номенклатура. В свойствах этой группировки в поле «Тип иерархии» установите значение «Иерархия».
  3. Выбранные поля: Добавьте все 26 числовых колонок в список выбранных полей. СКД автоматически сгруппирует их и просуммирует по уровням иерархии, не требуя от вас ручного написания сложных ИТОГИ в запросе.

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

Рекомендации по реализации вывода

Независимо от выбранного способа, при выводе большого количества колонок в макет, следуйте этим советам:

Избегайте жесткой привязки: Не старайтесь создавать макет с 26 фиксированными ячейками. Мы рекомендуем использовать механизм параметров в макете. При обходе выборки передавайте значения колонок в соответствующие параметры.

Оптимизируйте данные: Если таблица содержит избыточно много строк, перед передачей в запрос примените метод ТЗ.Свернуть(). Это позволит значительно ускорить работу запроса и уменьшить потребление оперативной памяти.

Таким образом, мы видим, что задача вывода иерархии для плоской таблицы — это стандартная задача, которая решается либо через ИТОГИ ПО ИЕРАРХИЯ в классическом запросе, либо через СКД. Выбирайте СКД, если хотите сократить объем кода и избежать ошибок при формировании итогов, и классический запрос — если вам нужен полный контроль над каждым шагом формирования табличного документа.

← На главную