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