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