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