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

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

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

Проблема 1: Почему запрос не видит товары внутри папки?

Рассмотрим первую ситуацию, с которой столкнулся автор темы. Изначально был написан следующий текст запроса:


ВЫБРАТЬ
	Номенклатура.Код КАК Код,
	Номенклатура.Наименование КАК Наименование,
	Номенклатура.ЭтоГруппа КАК ЭтоГруппа
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Родитель = &Группа

Давайте проанализируем логику работы этого кода. Условие ГДЕ Номенклатура.Родитель = &Группа означает строгий отбор по непосредственному родителю. Это сработает только для тех элементов, которые лежат прямо в корне выбранной папки.

Если структура вашего каталога многоуровневая (например, "Мебель" -> "Фурнитура" -> "Ручки"), и вы выберете группу "Мебель", то данный запрос вернет только папки "Фурнитура", но не вернет сами товары ("Ручки"), так как для "Ручек" родителем является "Фурнитура", а не "Мебель".

Решение: Использование оператора В ИЕРАРХИИ

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

Правильный текст запроса должен выглядеть так:


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

Обратите внимание на синтаксис: мы проверяем не поле Родитель, а саму Ссылка. Мы говорим системе: «Найди все ссылки, которые находятся в иерархии указанной группы».

Проблема 2: Почему я не могу выбрать папку в параметрах?

Вторая распространенная проблема, обсуждаемая в теме, — техническая сложность выбора группы в качестве значения параметра. Автор пишет: «...я не вижу группы, например, ожидаю увидеть Фурнитура... появляются не группы, а элементы справочника».

Это происходит из-за стандартного поведения форм выбора в 1С. У любого поля ввода, связанного со справочником, есть свойство, определяющее режим выбора.

Разберем причины и способы решения:

  1. Режим выбора "Элементы".

    По умолчанию в большинстве случаев (и в консоли запросов часто тоже) форма выбора настроена так, чтобы пользователь выбирал конечные элементы (товары). При двойном клике по папке система просто открывает её содержимое («проваливается» внутрь), ожидая, что вы выберете товар.

  2. Как выбрать папку в таком режиме?

    Даже если форма настроена на выбор элементов, выбрать папку все равно можно. Для этого:

    • В открывшемся окне списка выделите нужную папку (один клик).
    • Не нажимайте Enter и не делайте двойной клик.
    • Найдите в командной панели кнопку «Выбрать» (иногда она выглядит как зеленая галочка или папка со стрелкой) или нажмите сочетание клавиш (часто это Ctrl + Enter или F8, в зависимости от настроек платформы).

    Это принудительно вернет ссылку на группу в параметр запроса.

  3. Автоподбор текста.

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

Ошибочный путь: Поиск по наименованию

В попытках обойти проблему выбора группы, автор темы попытался использовать отбор по строковому наименованию:

ГДЕ Номенклатура.Родитель.Наименование = "Фурнитура"

Давайте разберем, почему это плохая практика и почему так делать не рекомендуется:

  1. Неуникальность. В справочнике может быть несколько папок с названием "Фурнитура" (например, "Фурнитура для дверей" и "Фурнитура для окон"). Запрос по строке "Фурнитура" может вернуть непредсказуемый результат или смешать данные из разных категорий.
  2. Изменение данных. Пользователь может в любой момент переименовать папку в "Фурнитура (Архив)" или исправить опечатку. Ваш запрос или отчет мгновенно перестанет работать, так как жестко привязан к строке.
  3. Производительность. Поиск по строковым полям (особенно через точку от ссылочного поля) работает медленнее и создает неявные соединения (LEFT JOIN) в SQL-запросе, что на больших базах может существенно снизить скорость работы.

Как правильно задать фиксированную группу в коде?

Если перед вами стоит задача сделать отчет, который всегда (без выбора пользователя) отбирает данные по конкретной группе (например, "Услуги"), лучше всего использовать механизм Предопределенных элементов.

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


ГДЕ
    Номенклатура.Ссылка В ИЕРАРХИИ (ЗНАЧЕНИЕ(Справочник.Номенклатура.Услуги))

Если предопределенного элемента нет, правильнее всего передавать ссылку через параметр &Группа, а значение параметра устанавливать в коде программы, находя нужную группу по уникальному идентификатору или (в крайнем случае) по коду/наименованию, но только один раз при инициализации.

Итоговое решение

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

1. Использовать правильный текст запроса:


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

2. При заполнении параметра &Группа в консоли запросов или пользовательском режиме, помнить об особенностях интерфейса: выделять папку одинарным кликом и нажимать кнопку выбора в панели инструментов окна, либо использовать сочетания клавиш (например, Ctrl + Enter).

← На главную