Работа с иерархическими справочниками в 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С:ERP) запрос может возвращать устаревшие версии групп. Всегда добавляйте условие ПометкаУдаления = ЛОЖЬ И ЭтоГруппа = ИСТИНА, чтобы исключить удаленные объекты.
ВЫБРАТЬ t.Ссылка ИЗ Справочник.Номенклатура КАК t ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ ЭтоГруппа = ИСТИНА) КАК g ПО t.Ссылка = g.Ссылка
Это часто ускоряет выполнение на 20-30%.-->
FAQ: Частые вопросы по выборке групп в 1С
Как выбрать группы вместе с количеством элементов в каждой?
Используйте подзапрос с функцией ВЫБРАТЬ РАЗЛИЧНЫЕ и КОЛИЧЕСТВО():
ВЫБРАТЬ
Группы.Ссылка КАК Группа,
(ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Элементы.Ссылка)
ИЗ Справочник.Номенклатура КАК Элементы
ГДЕ Элементы.Родитель = Группы.Ссылка) КАК КоличествоЭлементов
ИЗ
Справочник.Номенклатура КАК Группы
ГДЕ
Группы.ЭтоГруппа = ИСТИНА
Можно ли в одном запросе получить и группы, и элементы, но с пометкой типа?
Да, добавьте вычисляемое поле:
ВЫБРАТЬ
Объект.Ссылка КАК Ссылка,
ВЫБОР
КОГДА Объект.ЭтоГруппа = ИСТИНА
ТОГДА "Группа"
ИНАЧЕ "Элемент"
КОНЕЦ КАК ТипОбъекта
ИЗ
Справочник.Номенклатура КАК Объект
Почему в запросе к регистру сведений не работает фильтр по ЭтоГруппа?
Реквизит ЭтоГруппа относится к справочникам, а не к записям регистров. Для фильтрации групп в регистрах используйте соединение со справочником:
ВЫБРАТЬ
Регистр.Период,
Регистр.Номенклатура КАК Номенклатура
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Регистр
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНом
ПО Регистр.Номенклатура = СпрНом.Ссылка
ГДЕ
СпрНом.ЭтоГруппа = ИСТИНА
Как выбрать группы, в которых есть хотя бы один элемент?
Используйте условие СУЩЕСТВУЕТ:
ВЫБРАТЬ
Группы.Ссылка КАК Группа
ИЗ
Справочник.Номенклатура КАК Группы
ГДЕ
Группы.ЭтоГруппа = ИСТИНА
И СУЩЕСТВУЕТ (
ВЫБРАТЬ 1
ИЗ Справочник.Номенклатура КАК Элементы
ГДЕ Элементы.Родитель = Группы.Ссылка
)
Работает ли фильтрация по ЭтоГруппа в мобильном приложении 1С?
Да, но с ограничениями: в мобильной платформе 1С:Предприятие некоторые сложные запросы (например, с рекурсией или большим количеством соединений) могут выполняться медленнее. Для мобильных решений рекомендуется:
- Использовать простые условия (
ЭтоГруппа = ИСТИНА). - Избегать вложенных подзапросов.
- Тестировать производительность на целевом устройстве.