Конструкция "В ИЕРАРХИИ" в запросах 1С:Предприятия 8.x позволяет получить подчиненные элементы иерархического объекта конфигурации по заданному отбору. Сегодня в статье рассмотрим пример ее использования, а также действия платформы на стороне СУБД и ее влияние на производительность.
Рассмотрим простой пример использования конструкции "В ИЕРАРХИИ". При выполнении следующего запроса будут получены подчиненные элементы иерархического справочника "Товары" для переданного значения переменной "Ссылка".
ТекстЗапроса = "ВЫБРАТЬ | Товары.Ссылка, | Товары.Артикул |ИЗ | Справочник.Товары КАК Товары |ГДЕ | Товары.Ссылка В ИЕРАРХИИ(&Ссылка)"
В качестве параметра "&Ссылка" передается ссылка на группу справочника. Пример выполняем на тестовой базе, ссылка для загрузки на которую доступна в конце статьи.
В тестовой базе справочник "Товары" имеет следующие тестовые данные:
Конечно, на изображении показаны не все записи справочника. Скриншот показывает лишь структуру хранения данных в иерархическом справочнике. В таблице справочника хранятся 10 групп верхнего уровня, в каждой из них содержится 5 вложенных групп с 200 элементами в каждой.
Вернемся к тестовому запросу. Передадим в параметр "&Ссылка" ссылку на группу "Группа - 1" (см. скриншот выше). Тогда результат выполнения запроса будет выглядеть следующим образом:
Как мы видим, запрос вернул ссылку на саму верхнюю группу (переданную параметром), а также вложенные группы с находящимися в них элементами. Таким образом, использование конструкции "В ИЕРАРХИИ" позволяет удобным образом получать иерархически подчиненные данные.
Синтаксис языка запросов 1C:Предприятия и классического SQL очень похожи в некоторых моментах. Но для выражения "В ИЕРАРХИИ" нет аналога в языке запросов SQL как, например, для выражения языка запросов платформы "В" есть аналогичный SQL-оператор "IN". Поэтому интересной является работа платформы с СУБД при использовании данного оператора.
Итак, приступим. Для примера будем использовать написанный ранее запрос к справочнику "Товары". Анализировать действия платформы будем для двух ситуация:
1. Сначала выполняется SQL-запрос на получение ссылки на группу справочника, переданную в качестве параметра, и всех подчиненных ей групп. Результат помещается во временную таблицу '#tt1'.
2. На втором этапе дважды выполняется одинаковый запрос:
Неправильное использование любого оператора в запросе может привести к неоптимальной работе системы. Рассматриваемый оператор "В ИЕРАРХИИ" не исключение. Его нужно применять с осторожностью, поскольку он намного усложняет алгоритм выполнения SQL-запросов к базе и тем самым увеличивает нагрузку на сервер СУБД.
Приведу пример неоптимального запроса, который может привести к названным выше печальным последствиям:
ВЫБРАТЬ Товары.Ссылка ИЗ Справочник.Товары КАК Товары ГДЕ (Товары.Ссылка В ИЕРАРХИИ (&Ссылка) ИЛИ Товары.Ссылка В ИЕРАРХИИ (&Ссылка1) ИЛИ Товары.Ссылка В ИЕРАРХИИ (&Ссылка2))
Как можно догадаться, запрос приведет к формированию множества SQL-запросов, что повлечет за собой снижение производительности информационной системы.
Выводы делать Вам. Скажу лишь, что оператор "В ИЕРАРХИИ" используется платформой для системы компоновки данных, когда в условиях отбора присутствуют "В ГРУППЕ", "В ГРУППЕ ИЗ СПИСКА" и прочие. Думаю не стоит объяснять, что при неправильных манипуляциях пользователи могу поставить очень сложный отбор и повысить нагрузку на сервер 1С и СУБД в несколько раз. Давайте изменять настройки только опытным пользователям.
Ну и разумеется, при написании собственных механизмов обращайте внимание на оператор "В ИЕРАРХИИ". Очень удобный с одной стороны, и опасный с другой.