К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить группу номенклатуры в 1С

Как получить группу номенклатуры в 1С: через интерфейс, запросом на языке 1С, через Родителя и функцию ПринадлежитЭлементу. Примеры кода и типичные ошибки.

Группа номенклатуры в 1С — это элемент справочника «Номенклатура», у которого установлен признак иерархии: он не является товаром или услугой, а служит папкой для объединения позиций. Получить группу требуется в разных задачах: при выгрузке каталога на сайт, при формировании отчётов по категориям, при проверке прав заполнения карточек и при программной обработке данных.

Способ получения группы зависит от контекста. Пользователю достаточно интерфейса справочника, разработчику — запроса или обращения к свойству Родитель, а для проверки вхождения элемента в ветку иерархии используется оператор «В ИЕРАРХИИ». Ниже разобраны все рабочие варианты с примерами кода и проверкой результата.

Важно понимать различие конфигураций: в «1С:Бухгалтерии» группа — это просто папка справочника, а в «1С:Управление торговлей» и ERP существует ещё понятие «вид номенклатуры», которое часто путают с группой. Это разные сущности, и способы работы с ними отличаются.

Что такое группа номенклатуры и чем она отличается от вида

В справочнике «Номенклатура» включён иерархический режим «список и группы». Элемент с признаком ЭтоГруппа = Истина — это папка. У неё нет единицы измерения, ставки НДС и прочих товарных реквизитов: она нужна только для структурирования. Вложенность групп не ограничена прикладным кодом, поэтому дерево может быть многоуровневым.

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

Как найти группу номенклатуры в интерфейсе

Откройте раздел «Справочники» (в бухгалтерии — «Справочники → Номенклатура», в торговле — «НСИ и администрирование → Номенклатура»). В форме списка включите режим просмотра «Дерево» или «Иерархический список» через меню «Ещё → Режим просмотра». Группы отображаются значком папки и располагаются выше обычных элементов.

Чтобы узнать, в какой группе находится конкретная позиция, откройте карточку элемента: путь к группе виден в поле «Группа» или в заголовке навигации. Альтернатива — в списке включить отображение колонки «Родитель» через «Ещё → Изменить форму», тогда группа будет видна прямо в таблице без открытия карточек.

Если позиций много, используйте поиск по наименованию (Ctrl+F) с включённым поиском по всему дереву. Учтите: при режиме «Список» иерархия скрывается, и найти группу визуально не получится — переключитесь обратно в дерево.

Как получить группу элемента программно

В коде на встроенном языке группа элемента доступна через свойство Родитель. Если элемент лежит в корне справочника, родитель будет пустой ссылкой — это нужно обрабатывать, иначе дальнейшие обращения к реквизитам родителя дадут ошибку или пустые значения.

bsl
Группа = ЭлементНоменклатуры.Родитель;
Если Группа.Пустая() Тогда
    Сообщить("Позиция находится в корне справочника");
Иначе
    Сообщить("Группа: " + Группа.Наименование);
КонецЕсли;

Обращение ЭлементНоменклатуры.Родитель.Наименование через точку вызывает обращение к базе данных. В цикле по тысячам позиций такой код работает медленно — правильнее получать группу запросом сразу для всей выборки.

Чтобы получить не только непосредственную папку, но и всю цепочку родителей, пройдите вверх по иерархии в цикле: пока Родитель не пустой, сохраняйте значение и переходите к Родитель.Родитель. Каждая итерация — обращение к базе, поэтому для массовой обработки такой подход тоже заменяют запросом с итогами по иерархии.

Как получить список групп и элементов запросом

Запрос — основной инструмент для массовой работы. Чтобы получить все группы справочника, отберите записи с признаком ЭтоГруппа и без пометки удаления:

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|   Номенклатура.Ссылка КАК Группа,
|   Номенклатура.Наименование КАК Наименование
|ИЗ
|   Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|   Номенклатура.ЭтоГруппа
|   И НЕ Номенклатура.ПометкаУдаления
|
|УПОРЯДОЧИТЬ ПО
|   Наименование";
Результат = Запрос.Выполнить().Выгрузить();

Чтобы получить все позиции, входящие в конкретную группу с учётом вложенных подгрупп, используйте оператор В ИЕРАРХИИ. Он учитывает всю ветку дерева, а не только прямых потомков — это ключевое отличие от сравнения Родитель = &Группа, которое вернёт лишь элементы первого уровня вложенности.

bsl
Запрос.Текст =
"ВЫБРАТЬ
|   Номенклатура.Ссылка,
|   Номенклатура.Родитель КАК Группа
|ИЗ
|   Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|   Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
|   И НЕ Номенклатура.ЭтоГруппа";
Запрос.УстановитьПараметр("Группа", ГруппаСсылка);

Проверка принадлежности элемента группе в коде

Когда нужно проверить одну позицию без запроса, используйте метод ПринадлежитЭлементу. Он возвращает Истина, если элемент находится в указанной группе на любом уровне вложенности:

bsl
Если ЭлементНоменклатуры.ПринадлежитЭлементу(ГруппаСсылка) Тогда
    // позиция входит в группу или её подгруппы
КонецЕсли;

Метод удобен в обработчиках проверки заполнения и подписках на события, но внутри цикла по большой выборке он выполняет обращение к базе на каждой итерации. Для пакетной проверки выгрузите соответствие «элемент → группа» одним запросом и работайте с ним в памяти.

Сравнение вариантов

Свойство Родитель

Подходит для разового получения группы одного элемента. Ограничение: медленно в циклах, даёт только прямого родителя.

Запрос с В ИЕРАРХИИ

Оптимален для отчётов и массовой обработки с учётом вложенных подгрупп. Требует передачи параметра-ссылки.

ПринадлежитЭлементу

Удобен для одиночной проверки в коде без запроса. Не подходит для пакетной обработки больших выборок.

Типичные ошибки и ограничения

Самая частая ошибка — попытка провести документ с группой в табличной части. Группа не является товарной позицией: в типовых конфигурациях проведение такого документа заблокировано или приведёт к некорректным движениям. При программном заполнении документов всегда фильтруйте выборку условием НЕ ЭтоГруппа.

Вторая ошибка — поиск группы по наименованию через НайтиПоНаименованию без указания родителя. Одинаковые названия папок в разных ветках встречаются постоянно, поэтому передавайте в метод параметр родителя или ищите по коду. И помните: поиск по наименованию чувствителен к точному совпадению строки.

Типичные ошибки
01
Сравнение Родитель = &Группа вместо В ИЕРАРХИИ — из отчёта выпадают позиции вложенных подгрупп.
02
Обращение к Родитель.Наименование в цикле по тысячам элементов — резкое падение производительности из-за запросов к базе на каждой итерации.
03
Отсутствие проверки Родитель.Пустая() — ошибка при обработке элементов корня справочника.
04
Путаница между группой и видом номенклатуры — в отчёт попадают не те позиции.

Как проверить результат

После программного получения группы сверьте результат с интерфейсом: откройте карточку элемента и убедитесь, что найденная группа совпадает с отображаемой в форме. Для запросов с В ИЕРАРХИИ проверьте на тестовой ветке с известным количеством позиций, включая элементы в подгруппах и элементы корня.

Контрольный признак корректной работы: количество позиций в выборке совпадает с количеством элементов, которые показывает список справочника при установке отбора по той же группе в режиме дерева. Расхождение обычно означает, что в запрос не попали помеченные на удаление позиции или, наоборот, лишние отфильтрованы.

Контрольные точки

Как проверить результат

Совпадение группы в коде и в карточке элемента
Норма

Наименование группы из запроса равно значению поля «Группа» в форме

Тревожный признак

Группа пустая или отличается — проверьте, не в корне ли элемент

Полнота выборки по В ИЕРАРХИИ
Норма

В выборку вошли позиции всех вложенных подгрупп

Тревожный признак

Присутствуют только элементы первого уровня — использовано сравнение по Родитель

Исключение групп из товарных выборок
Норма

В результате нет записей с ЭтоГруппа = Истина

Тревожный признак

В табличную часть документа попали папки

Частые вопросы

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

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

Чем группа отличается от вида номенклатуры?

Группа — папка в иерархии справочника, определяет только положение в дереве. Вид номенклатуры — реквизит в торговых конфигурациях, задающий тип позиции (товар, услуга, набор) и настройки учёта. Получить вид можно через реквизит ВидНоменклатуры элемента.

Почему запрос с условием по группе возвращает пустой результат?

Чаще всего в параметр передано наименование строкой вместо ссылки, либо группа помечена на удаление. Проверьте тип параметра — это должна быть СправочникСсылка.Номенклатура, полученная через НайтиПоНаименованию или НайтиПоКоду.

Как найти группу по наименованию, если таких папок несколько?

Используйте НайтиПоНаименованию с третьим параметром — ссылкой на родителя, чтобы искать внутри конкретной ветки. Либо выполните запрос с условием по наименованию и ЭтоГруппа, а затем выберите нужную группу по её родителю.

Можно ли получить группу в СКД без изменения запроса?

Да, если в наборе данных есть поле Родитель — добавьте его в выбранные поля отчёта. Для группировки по всей ветке иерархии включите у поля группировки тип «Иерархия» в настройках СКД.

Что вернёт свойство Родитель для элемента в корне справочника?

Пустую ссылку типа СправочникСсылка.Номенклатура. Перед обращением к реквизитам родителя проверяйте его методом Пустая(), иначе получите пустые значения или ошибку в зависимости от контекста выполнения.

Итог

Что важно запомнить

Группа элемента — это его Родитель, список групп получают условием ЭтоГруппа = Истина, а вхождение в ветку дерева — оператором В ИЕРАРХИИ. Для массовой обработки используйте запросы, а не обращения к свойствам в цикле, и всегда проверяйте родителя на пустую ссылку.