Как правильно добавить несколько групп в условие «В ИЕРАРХИИ» в запросе 1С?

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

При разработке отчетов или обработок на платформе 1С часто возникает необходимость отобрать данные по нескольким различным группам справочника одновременно. Начинающие разработчики нередко сталкиваются с проблемой, когда попытка соединить несколько условий В ИЕРАРХИИ приводит либо к «пустому» результату, либо к необоснованному увеличению выборки. Давайте разберем, как решить эту задачу профессионально и избежать распространенных ошибок.

Анализ проблемы: почему классические способы не работают?

Когда мы пишем условие в запросе, используя оператор И, мы требуем, чтобы объект удовлетворял обоим условиям одновременно. Если мы указываем Спр.Ссылка В ИЕРАРХИИ(&Группа1) И Спр.Ссылка В ИЕРАРХИИ(&Группа2), система ищет элементы, которые находятся в обеих группах сразу. Если эти группы не пересекаются (одна не является дочерней для другой), результат всегда будет равен 0, так как физически один элемент справочника (не являющийся группой-родителем) не может находиться в двух непересекающихся ветках иерархии.

При использовании оператора ИЛИ результат может стать избыточным, так как условия обрабатываются независимо, что часто приводит к дублированию или попаданию в выборку лишних данных, если структура иерархии в базе данных сложная или пересекающаяся.

Решение задачи: использование массива в параметре запроса

Наиболее эффективным и лаконичным способом объединения нескольких групп является использование параметра типа Массив. Когда мы передаем массив в условие В ИЕРАРХИИ, платформа 1С автоматически понимает, что нужно выбрать все элементы, входящие в любую из групп, указанных в этом массиве. Это работает быстрее и избавляет от громоздких логических конструкций в тексте запроса.

Рассмотрим по шагам, как реализовать этот подход на практике:

  1. Создайте массив в коде 1С:Предприятие.
  2. Добавьте в этот массив все необходимые ссылки на группы справочника.
  3. Передайте этот массив в запрос как один параметр.
  4. Используйте данный параметр в тексте запроса один раз.

Пример реализации кода

Давайте посмотрим, как это выглядит в модуле. Допустим, у нас есть две группы номенклатуры, и мы хотим получить все товары, которые в них входят.


// Создаем массив для хранения наших групп
МассивГрупп = Новый Массив;

// Добавляем ссылки на группы, которые нужно отфильтровать
МассивГрупп.Добавить(СсылкаНаГруппуЗПФ);
МассивГрупп.Добавить(СсылкаНаГруппуСопутствующиеТовары);

// Устанавливаем массив в качестве параметра запроса
Запрос.УстановитьПараметр("СписокГрупп", МассивГрупп);

Теперь в самом тексте запроса мы используем этот параметр максимально просто:


ВЫБРАТЬ
    Спр.Ссылка
ИЗ
    Справочник.Номенклатура КАК Спр
ГДЕ
    Спр.Ссылка В ИЕРАРХИИ(&СписокГрупп)

Преимущества использования массива

Разберем, почему данный метод является стандартом разработки в среде 1С:

Помните, что для корректной работы оператора В ИЕРАРХИИ все элементы в массиве должны соответствовать типу справочника, по которому идет выборка. Если вы передадите в массив ссылки на объекты другого типа (например, на документы вместо номенклатуры), система выдаст ошибку выполнения. Придерживайтесь этого простого правила, и ваши отчеты всегда будут работать корректно и быстро!

← На главную