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