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