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