Как вывести итоги только по верхним группам справочника в 1С

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

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

Ограничения языка запросов 1С при работе с иерархией

Проанализируем специфику работы с иерархическими справочниками в языке запросов платформы 1С:

  1. Оператор В ИЕРАРХИИ не применяется в секции соединения: Конструкция ПО при использовании ЛЕВОЕ СОЕДИНЕНИЕ не поддерживает иерархические связи. Данный оператор можно использовать только в секции фильтрации ГДЕ или ИМЕЮЩИЕ.
  2. Отсутствие рекурсивных запросов: В языке запросов 1С нет поддержки рекурсивных CTE, из-за чего невозможно одним легким запросом подняться до вершины иерархии с произвольной глубиной вложенности.

Выясним, какие существующие подходы помогают обойти эти ограничения на практике.

Вариант 1. Настройка иерархической группировки в Системе компоновки данных (СКД)

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

Разберем порядок настройки СКД по шагам:

  1. В схеме компоновки данных добавляем группировку по полю Номенклатура.
  2. Тип группировки устанавливаем в значение Только иерархия.
  3. В настройках отбора для этой группировки задаем условие по системному полю СистемныеПоля.Уровень равно 1 (или 2, в зависимости от того, считается ли корнем сам справочник или его первые папки).

При таком подходе платформа 1С автоматически сворачивает промежуточные уровни и выводит суммарные показатели только по верхним группам.

Вариант 2. Фиксированная проверка вложенности через конструкцию ВЫБОР

Если глубина дерева справочника заранее ограничена (например, не превышает 3–5 уровней), можно сопоставить каждую номенклатуру с ее корневым родителем непосредственно в запросе.

Посмотрим на пример поля запроса с проверкой заполнения родителей:


ВЫБОР
	КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА Номенклатура.Ссылка
	КОГДА Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА Номенклатура.Родитель
	КОГДА Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА Номенклатура.Родитель.Родитель
	ИНАЧЕ Номенклатура.Родитель.Родитель.Родитель
КОНЕЦ КАК ВерхняяГруппа

Полученное поле ВерхняяГруппа далее используем в секции СГРУППИРОВАТЬ ПО или для построения сводной таблицы.

Вариант 3. Подготовка таблицы соответствия в коде 1С

Когда глубина иерархии заранее неизвестна, эффективным решением будет программная сборка таблицы связей перед выполнением основного запроса.

Рассмотрим алгоритм реализации:

  1. Первым запросом выбираем все уникальные ссылки номенклатуры, по которым есть движения в анализируемом периоде.
  2. Обходим результат выборки в цикле и для каждого элемента определяем его верхнего родителя с помощью цикла Пока ЗначениеЗаполнено(ТекущийРодитель.Родитель).
  3. Формируем ТаблицаЗначений со столбцами Номенклатура и ВерхняяГруппа.
  4. Передаем полученную таблицу в качестве параметра в основной запрос, помещаем ее во временную таблицу через МенеджерВременныхТаблиц и соединяем с виртуальной таблицей оборотов.

Вариант 4. Архитектурное решение (добавление реквизита в справочник)

При работе с большими объемами данных и частом формировании подобных отчетов рекомендуется внести изменения в структуру справочника:

  1. Добавляем в справочник Номенклатура новый реквизит КорневаяГруппа с типом СправочникСсылка.Номенклатура.
  2. В обработчике ПередЗаписью модуля объекта справочника прописываем автоматическое вычисление и заполнение этого реквизита при сохранении элемента или группы.
  3. В отчетах соединяем данные оборотов непосредственно с реквизитом Номенклатура.КорневаяГруппа без сложных каскадных проверок.

Это обеспечивает максимальное быстродействие базы данных, так как исключает дополнительные вычисления во время выполнения запросов.

← На главную