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