При построении аналитических отчетов часто возникает необходимость сгруппировать данные оборотов по корневым категориям справочника (папкам верхнего уровня), исключая промежуточные уровни вложенности. Рассмотрим, с какими ограничениями платформы 1С можно столкнуться при решении этой задачи и какими способами можно получить корректные итоги.
Проанализируем специфику работы с иерархическими справочниками в языке запросов платформы 1С:
В ИЕРАРХИИ не применяется в секции соединения: Конструкция ПО при использовании ЛЕВОЕ СОЕДИНЕНИЕ не поддерживает иерархические связи. Данный оператор можно использовать только в секции фильтрации ГДЕ или ИМЕЮЩИЕ.Выясним, какие существующие подходы помогают обойти эти ограничения на практике.
Если отчет формируется на базе СКД, самым простым и производительным решением будет использование штатного механизма иерархических группировок с отбором по уровню.
Разберем порядок настройки СКД по шагам:
Номенклатура.СистемныеПоля.Уровень равно 1 (или 2, в зависимости от того, считается ли корнем сам справочник или его первые папки).При таком подходе платформа 1С автоматически сворачивает промежуточные уровни и выводит суммарные показатели только по верхним группам.
Если глубина дерева справочника заранее ограничена (например, не превышает 3–5 уровней), можно сопоставить каждую номенклатуру с ее корневым родителем непосредственно в запросе.
Посмотрим на пример поля запроса с проверкой заполнения родителей:
ВЫБОР
КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА Номенклатура.Ссылка
КОГДА Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА Номенклатура.Родитель
КОГДА Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА Номенклатура.Родитель.Родитель
ИНАЧЕ Номенклатура.Родитель.Родитель.Родитель
КОНЕЦ КАК ВерхняяГруппа
Полученное поле ВерхняяГруппа далее используем в секции СГРУППИРОВАТЬ ПО или для построения сводной таблицы.
Когда глубина иерархии заранее неизвестна, эффективным решением будет программная сборка таблицы связей перед выполнением основного запроса.
Рассмотрим алгоритм реализации:
Пока ЗначениеЗаполнено(ТекущийРодитель.Родитель).ТаблицаЗначений со столбцами Номенклатура и ВерхняяГруппа.МенеджерВременныхТаблиц и соединяем с виртуальной таблицей оборотов.При работе с большими объемами данных и частом формировании подобных отчетов рекомендуется внести изменения в структуру справочника:
Номенклатура новый реквизит КорневаяГруппа с типом СправочникСсылка.Номенклатура.ПередЗаписью модуля объекта справочника прописываем автоматическое вычисление и заполнение этого реквизита при сохранении элемента или группы.Номенклатура.КорневаяГруппа без сложных каскадных проверок.Это обеспечивает максимальное быстродействие базы данных, так как исключает дополнительные вычисления во время выполнения запросов.