Работа с иерархическими справочниками в 1С:Предприятие часто требует выгрузки не всех элементов, а только групп — будь то для отчетов, обработок или интеграций. Однако стандартный запрос ВЫБРАТЬ * ИЗ Справочник.Номенклатура вернет и группы, и элементы, что не всегда удобно. Эта статья раскрывает все актуальные способы отфильтровать группы в запросах, включая нюансы для разных конфигураций (УТ 11, БП 3.0, ЗУП 3.1) и версий платформы (8.3.20+).

Мы разберем не только классический метод с проверкой реквизита ЭтотОбъект.ЭтоГруппа, но и альтернативные подходы: использование виртуальных таблиц, конструкции ПОМЕСТИТЬ для оптимизации, а также работу с иерархией через рекурсивные запросы. Особое внимание уделено типичным ошибкам, которые приводят к попаданию элементов в выборку, и способам их избежать. Если вы когда-либо получали лишние строки в результате запроса — здесь вы найдете решение.

1. Базовый метод: проверка реквизита «ЭтоГруппа»

Самый очевидный и универсальный способ отфильтровать группы — использовать системный реквизит ЭтоГруппа, доступный во всех справочниках. Этот реквизит принимает значение true для групп и false для элементов. Синтаксис прост:

ВЫБРАТЬ

Справочник.Номенклатура.Ссылка КАК Ссылка,

Справочник.Номенклатура.Наименование КАК Наименование

ИЗ

Справочник.Номенклатура КАК Справочник.Номенклатура

ГДЕ

Справочник.Номенклатура.ЭтоГруппа = ИСТИНА

Этот метод работает во всех конфигурациях на базе 1С:Предприятие 8.3, включая Управление торговлей 11, Бухгалтерию 3.0 и Зарплату и управление персоналом 3.1. Однако есть нюансы:

  • 🔹 В некоторых справочниках (например, ФизическиеЛица в ЗУП) реквизит ЭтоГруппа может отсутствовать — там группы не предусмотрены архитектурой.
  • 🔹 Для справочников с подчиненными объектами (например, Контрагенты в БП) проверка ЭтоГруппа вернет только родительские группы, но не подгруппы.
  • 🔹 В запросах к регистрам сведений или накопления этот метод не применим — там используется другая логика.
⚠️ Внимание: В конфигурациях с включенным режимом управляемого приложения (например, 1С:ERP) некоторые справочники могут иметь дополнительные уровни иерархии. Проверьте структуру справочника в конфигураторе, если запрос возвращает неожиданные результаты.

2. Альтернативный подход: использование виртуальной таблицы «Иерархия»

Если вам нужны не только группы первого уровня, но и все подгруппы (включая вложенные), удобнее использовать виртуальную таблицу Иерархия. Она автоматически строит дерево подчинения и позволяет гибко фильтровать узлы. Пример запроса для справочника Номенклатура:

ВЫБРАТЬ

ИерархияНоменклатуры.Ссылка КАК Ссылка,

ИерархияНоменклатуры.Уровень КАК Уровень,

ИерархияНоменклатуры.ЭтоГруппа КАК ЭтоГруппа

ИЗ

Справочник.Номенклатура.Иерархия КАК ИерархияНоменклатуры

ГДЕ

ИерархияНоменклатуры.ЭтоГруппа = ИСТИНА

Преимущества этого метода:

  • 📌 Возвращает все уровни вложенности групп, а не только верхний.
  • 📌 Позволяет сортировать по Уровню для построения древовидных отчетов.
  • 📌 Работает быстрее на больших справочниках (более 10 000 записей) за счет оптимизированной структуры виртуальной таблицы.

Ограничение: виртуальная таблица Иерархия доступна только для справочников с включенной иерархией. Если в настройках справочника отключен флаг Иерархический, этот метод не сработает.

📊 Какой метод выборки групп вы используете чаще?
Проверка ЭтоГруппа
Виртуальная таблица Иерархия
Рекурсивные запросы
Другие способы

3. Фильтрация по типу объекта (для сложных конфигураций)

В некоторых случаях, особенно при работе с расширенными справочниками или объектами, наследуемыми от СправочникОбъект, стандартный реквизит ЭтоГруппа может быть недоступен. Тогда на помощь приходит проверка типа объекта через функцию ТИПЗНАЧ():

ВЫБРАТЬ

Объект.Ссылка КАК Ссылка

ИЗ

Справочник.ДокументыКонтрагентов КАК Объект

ГДЕ

ТИПЗНАЧ(Объект.Ссылка) = ТИП("СправочникСсылка.ДокументыКонтрагентов.Группа")

Этот метод актуален для:

  • 🛠️ Конфигураций с кастомизированными справочниками, где логика групп реализована нестандартно.
  • 🛠️ Систем, где группы и элементы хранятся в разных таблицах (например, в некоторых отраслевых решениях).
  • 🛠️ Запросов к объединенным справочникам (через ОБЪЕДИНИТЬ), где нужно явное указание типа.
⚠️ Внимание: Функция ТИПЗНАЧ() чувствительна к версии платформы. В 1С:Предприятие 8.3.20+ она работает стабильно, но в более ранних версиях (8.3.10 и ниже) могут возникать ошибки при проверке сложных типов. Тестируйте запрос на целевой базе!

4. Оптимизация запросов: конструкция «ПОМЕСТИТЬ»

Если вам нужно многократно использовать выборку групп в одном запросе (например, для соединения с другими таблицами), целесообразно вынести фильтрацию в временную таблицу с помощью ПОМЕСТИТЬ. Это сокращает время выполнения и упрощает поддержку кода:

ВЫБРАТЬ

ГруппыНоменклатуры.Ссылка КАК СсылкаГруппы,

Товары.Количество КАК КоличествоТоваров

ИЗ

(ВЫБРАТЬ

Справочник.Номенклатура.Ссылка КАК Ссылка

ИЗ

Справочник.Номенклатура

ГДЕ

Справочник.Номенклатура.ЭтоГруппа = ИСТИНА

) КАК ГруппыНоменклатуры

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК Товары

ПО ГруппыНоменклатуры.Ссылка = Товары.Номенклатура.Родитель

Преимущества подхода:

  • ⚡ Уменьшает нагрузку на сервер за счет однократной фильтрации.
  • ⚡ Позволяет переиспользовать выборку групп в нескольких соединениях.
  • ⚡ Упрощает чтение кода: логика фильтрации групп вынесена в отдельный блок.

Минус: временные таблицы занимают оперативную память. Не злоупотребляйте ПОМЕСТИТЬ в запросах, которые выполняются в циклах или обработках с большим количеством итераций.

Проверьте наличие индексов на реквизите ЭтоГруппа|

Используйте ПОМЕСТИТЬ для повторяющихся фильтров|

Ограничьте выборку полей (избегайте SELECT *)|

Тестируйте запрос на больших объемах данных-->

5. Работа с реквизитами групп: примеры для УТ 11 и БП 3.0

Группы в справочниках часто содержат дополнительные реквизиты, которые можно использовать для более точной фильтрации. Например, в Управлении торговлей 11 у групп номенклатуры есть реквизит ВидНоменклатуры, а в Бухгалтерии 3.0ВидКонтрагента. Примеры:

Конфигурация Справочник Реквизит группы Пример запроса
УТ 11 Номенклатура ВидНоменклатуры ГДЕ ЭтоГруппа = ИСТИНА И ВидНоменклатуры = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Товары)
БП 3.0 Контрагенты ВидКонтрагента ГДЕ ЭтоГруппа = ИСТИНА И ВидКонтрагента = ЗНАЧЕНИЕ(Справочник.ВидыКонтрагентов.Покупатель)
ЗУП 3.1 Подразделения ВидПодразделения ГДЕ ЭтоГруппа = ИСТИНА И ВидПодразделения = ЗНАЧЕНИЕ(Справочник.ВидыПодразделений.Отдел)

Использование реквизитов групп позволяет:

  • 🎯 Сузить выборку до конкретных типов групп (например, только группы товаров, исключая услуги).
  • 🎯 Создавать динамические отчеты с фильтрацией по атрибутам групп.
  • 🎯 Избегать ошибок при интеграции, когда нужны группы только определенного вида.
Как узнать доступные реквизиты группы?

Откройте справочник в конфигураторе (F11 → Объекты → Справочники → [нужный справочник]).

Перейдите на закладку "Реквизиты" и найдите реквизиты, у которых в колонке "Группа" стоит галочка.

Альтернативно: в режиме 1С:Предприятие откройте справочник, выделите группу и нажмите "Все действия → Изменить форму" → просмотрите доступные поля.

6. Типичные ошибки и как их избежать

Даже опытные разработчики иногда сталкиваются с проблемами при фильтрации групп. Вот наиболее распространенные ошибки и способы их решения:

  1. Ошибка: Запрос возвращает элементы вместо групп. Причина: Опечатка в условии (ЭтоГруппа = ЛОЖЬ вместо ИСТИНА) или использование неверного реквизита. Решение: Проверьте синтаксис и убедитесь, что реквизит ЭтоГруппа существует в справочнике.
  2. Ошибка: В выборку попадают подгруппы, когда нужны только группы верхнего уровня. Причина: Отсутствует фильтр по Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка). Решение: Добавьте условие: ГДЕ ЭтоГруппа = ИСТИНА И Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка).
  3. Ошибка: Запрос выполняется слишком долго на больших справочниках. Причина: Отсутствуют индексы на реквизитах ЭтоГруппа или Родитель. Решение: Проверьте индексы в конфигураторе или используйте временные таблицы (ПОМЕСТИТЬ).

Критическая ошибка: В конфигурациях с включенной подсистемой "Версионирование данных" (например, 1С:ERP) запрос может возвращать устаревшие версии групп. Всегда добавляйте условие ПометкаУдаления = ЛОЖЬ И ЭтоГруппа = ИСТИНА, чтобы исключить удаленные объекты.

ВЫБРАТЬ t.Ссылка ИЗ Справочник.Номенклатура КАК t ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ ЭтоГруппа = ИСТИНА) КАК g ПО t.Ссылка = g.Ссылка

Это часто ускоряет выполнение на 20-30%.-->

FAQ: Частые вопросы по выборке групп в 1С

Как выбрать группы вместе с количеством элементов в каждой?

Используйте подзапрос с функцией ВЫБРАТЬ РАЗЛИЧНЫЕ и КОЛИЧЕСТВО():

ВЫБРАТЬ

Группы.Ссылка КАК Группа,

(ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Элементы.Ссылка)

ИЗ Справочник.Номенклатура КАК Элементы

ГДЕ Элементы.Родитель = Группы.Ссылка) КАК КоличествоЭлементов

ИЗ

Справочник.Номенклатура КАК Группы

ГДЕ

Группы.ЭтоГруппа = ИСТИНА

Можно ли в одном запросе получить и группы, и элементы, но с пометкой типа?

Да, добавьте вычисляемое поле:

ВЫБРАТЬ

Объект.Ссылка КАК Ссылка,

ВЫБОР

КОГДА Объект.ЭтоГруппа = ИСТИНА

ТОГДА "Группа"

ИНАЧЕ "Элемент"

КОНЕЦ КАК ТипОбъекта

ИЗ

Справочник.Номенклатура КАК Объект

Почему в запросе к регистру сведений не работает фильтр по ЭтоГруппа?

Реквизит ЭтоГруппа относится к справочникам, а не к записям регистров. Для фильтрации групп в регистрах используйте соединение со справочником:

ВЫБРАТЬ

Регистр.Период,

Регистр.Номенклатура КАК Номенклатура

ИЗ

РегистрСведений.ЦеныНоменклатуры КАК Регистр

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНом

ПО Регистр.Номенклатура = СпрНом.Ссылка

ГДЕ

СпрНом.ЭтоГруппа = ИСТИНА

Как выбрать группы, в которых есть хотя бы один элемент?

Используйте условие СУЩЕСТВУЕТ:

ВЫБРАТЬ

Группы.Ссылка КАК Группа

ИЗ

Справочник.Номенклатура КАК Группы

ГДЕ

Группы.ЭтоГруппа = ИСТИНА

И СУЩЕСТВУЕТ (

ВЫБРАТЬ 1

ИЗ Справочник.Номенклатура КАК Элементы

ГДЕ Элементы.Родитель = Группы.Ссылка

)

Работает ли фильтрация по ЭтоГруппа в мобильном приложении 1С?

Да, но с ограничениями: в мобильной платформе 1С:Предприятие некоторые сложные запросы (например, с рекурсией или большим количеством соединений) могут выполняться медленнее. Для мобильных решений рекомендуется:

  • Использовать простые условия (ЭтоГруппа = ИСТИНА).
  • Избегать вложенных подзапросов.
  • Тестировать производительность на целевом устройстве.