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

Справочники и Данные · 9 мин

1С: как выбрать номенклатуру из группы

Как выбрать номенклатуру из группы в 1С: отбор в списке, подбор в документы и запрос с учётом иерархии. Примеры кода, проверка результата, типичные ошибки.

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

Главная тонкость — иерархия справочника «Номенклатура». Группа может содержать не только элементы, лежащие в ней напрямую, но и целое дерево подгрупп. Если отобрать только по прямому родителю, часть позиций «потеряется», и отчёты с документами разойдутся. Ниже разобраны рабочие способы для типовых конфигураций (УТ, ERP, Бухгалтерия, УНФ) и примеры кода с контролем результата.

Как устроена иерархия номенклатуры и почему это важно

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

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

Выбор группы в списке номенклатуры (пользовательский режим)

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

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

Для точного отбора используйте настройку списка: «Ещё → Настроить список» (в Бухгалтерии — кнопка «Ещё → Настроить список» или панель отбора). Добавьте условие «Родитель» → вид сравнения «В группе» или «В иерархии» → укажите нужную папку. Такой отбор сохраняется и работает независимо от видимости дерева.

Отбор по группе в списке
  1. 1
    Откройте справочник «Номенклатура» через раздел «Справочники» или «НСИ и администрирование».
  2. 2
    Если дерево групп скрыто, включите его командой показа иерархии.
  3. 3
    Щёлкните по нужной группе — справа появятся её позиции.
  4. 4
    Для строгого отбора откройте «Ещё → Настроить список», добавьте условие по полю «Родитель» с видом сравнения «В группе».
  5. 5
    Проверьте, попали ли в список позиции из вложенных подгрупп.

Подбор номенклатуры из группы в документ

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

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

Если группа большая, комбинируйте отбор по группе с поиском по наименованию или артикулу: сначала выберите папку, затем введите часть названия в строку поиска. Это быстрее, чем листать сотни позиций.

Выбор номенклатуры из группы запросом

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

ВЫБРАТЬ

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

Номенклатура.Родитель КАК Группа

ИЗ

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

ГДЕ

Номенклатура.Родитель В ИЕРАРХИИ(&Группа)

И НЕ Номенклатура.ПометкаУдаления

Параметр «&Группа» передаётся как ссылка на элемент справочника: Запрос.УстановитьПараметр("Группа", ГруппаСсылка);. Если нужны только элементы, лежащие непосредственно в папке без подгрупп, замените условие на Номенклатура.Родитель = &Группа.

Частая ошибка — сравнивать саму номенклатуру с группой через «В ИЕРАРХИИ»: условие Номенклатура.Ссылка В ИЕРАРХИИ(&Группа) тоже работает и захватывает подгруппы, но по полю «Родитель» запрос обычно читабельнее. Дополнительно отсекайте помеченные на удаление позиции, иначе они попадут в отчёт и исказят итоги.

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

Программный перебор без запроса

Если запрос избыточен (например, нужно просто обойти элементы папки в обработке), используйте метод Выбрать() менеджера справочника:

Выборка = Справочники.Номенклатура.Выбрать(ГруппаСсылка);

Пока Выборка.Следующий() Цикл

Если Выборка.ЭтоГруппа Тогда

Продолжить;

КонецЕсли;

// работа с элементом

КонецЦикла;

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

Способы выбора — что использовать

Отбор списка / подбор

Для ручной работы пользователя. Не требует кода, но не подходит для автоматизации и отчётов.

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

Для отчётов и обработок. Захватывает подгруппы, работает быстро, но требует правильного параметра-ссылки.

Справочники.Номенклатура.Выбрать()

Для простого перебора в коде. Только прямые потомки, нужна проверка ЭтоГруппа и рекурсия для подгрупп.

Проверка результата и типичные ошибки

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

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

Отдельный риск — дубли групп. Если справочник вели неаккуратно, папок «Материалы» может быть несколько, и товары размазаны между ними. Перед массовой обработкой найдите дубли по наименованию и объедините их штатной обработкой поиска и удаления дублей, иначе любой отбор будет неполным.

Особые случаи: отбор по нескольким группам и по свойствам

Если нужна номенклатура из нескольких групп сразу, передайте в параметр список значений или массив ссылок и оставьте условие «В ИЕРАРХИИ(&Группы)» — запрос корректно обработает список. В настройке списка то же самое делается видом сравнения «В списке» с перечислением папок.

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

Итог

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

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

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

Почему запрос «В ИЕРАРХИИ» возвращает пустой результат?

Чаще всего в параметр передана строка с названием группы вместо ссылки на элемент справочника, либо ссылка указывает на элемент, а не на группу. Проверьте тип параметра и убедитесь, что группа не пуста: откройте её в списке и посмотрите наличие позиций.

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

Используйте условие «Номенклатура.Родитель = &ПустаяГруппа», где параметр — пустая ссылка справочника: Справочники.Номенклатура.ПустаяСсылка(). В настройке списка выберите вид сравнения «Не заполнено» для поля «Родитель».

Можно ли в подборе документа видеть остатки только по своему складу?

Да, в типовых формах подбора есть отбор по складу и настройка показа остатков. Откройте панель отборов формы подбора, укажите склад и включите отображение только позиций с остатками. Состав настроек зависит от конфигурации.

Как перенести все позиции из одной группы в другую?

Выделите нужные элементы в списке (Ctrl+A после установки отбора по группе) и используйте команду перемещения в группу — обычно через «Ещё» или контекстное меню. Перед массовым переносом сделайте резервную копию базы: вернуть прежнюю структуру вручную трудоёмко.

Отчёт по группе и отбор в списке дают разное количество позиций. Почему?

Скорее всего, отчёт использует «В ИЕРАРХИИ» (с подгруппами), а список показывает только прямые элементы, либо в одном из вариантов не отфильтрованы помеченные на удаление. Сравните условия отбора и проверьте наличие дублей групп с одинаковым названием.