Каталог решений - Что делает "В ИЕРАРХИИ" в запросе?

Что делает "В ИЕРАРХИИ" в запросе?

Что делает "В ИЕРАРХИИ" в запросе?

В наличии

Описание действий платформы 1С при использовании конструкции «В ИЕРАРХИИ» в запросах.

Категория:

Описание

Начало

Конструкция "В ИЕРАРХИИ" в запросах позволяет получить подчиненные элементы иерархического объекта конфигурации по заданному отбору. Это может быть иерархический справочник, план счетов, план видов характеристик и др. Сегодня в статье рассмотрим пример использования, а также действия платформы на стороне СУБД, влияние на производительность.

Статья имеет больше обзорный характер. Главная цель — продемонстрировать принцип работы этой инструкции, чтобы точно понимать когда ее стоит использовать, а когда нет.

Использование

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

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

В качестве значения параметра "Ссылка" передается ссылка на группу справочника. Пример выполняем на "самописной" тестовой базе, но структура справочника "Номенклатура" очень напоминает урезанную версию из типовых конфигураций. Справочник содержит следующие данные:

Конечно, на изображении показаны не все записи справочника. Скриншот показывает лишь структуру хранения данных в иерархическом справочнике. В таблице хранятся 10 групп верхнего уровня, в каждой из них содержится 5 вложенных групп с 200 элементами в каждой.

Вернемся к тестовому запросу. Передадим в параметр "Ссылка" ссылку на группу "Группа — 1" (см. скриншот выше). Тогда результат выполнения запроса будет выглядеть следующим образом:

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

Синтаксис языка запросов 1C:Предприятия и классического SQL очень похожи во многих моментах. Но для выражения "В ИЕРАРХИИ" нет аналога в языке запросов SQL как, например, для выражения языка запросов платформы "В" есть аналогичный SQL-оператор "IN". Поэтому интересной является работа платформы с СУБД при использовании данного оператора.

За кулисами

Итак, приступим. Для примера будем использовать написанный ранее запрос к справочнику "Товары". Анализировать действия платформы будем для ситуации, когда в качестве параметра передана группа верхнего уровня "Группа 1", что мы уже сделали ранее.

Теперь по порядку. В первом случае платформа выполнит следующие действия на SQL-сервере:

1. Сначала выполняется запрос на получение ссылки на группу справочника, переданную в качестве параметра, и всех подчиненных ей групп и элементов. Результат помещается во временную таблицу ‘#tt1’.

2. На втором этапе дважды выполняется запрос:

На скриншоте подробно прокомментирован текст SQL-запроса. Если кратко, то запрос позволяет выбрать подчиненные элементы для групп, ссылки на которые находятся во временной таблице. Остается вопрос: "Зачем запрос выполняется дважды?". Тут ответ простой: сначала запрос получает подчиненные элементы для групп первого уровня, которые уже содержатся во временной таблице (см. пункт 1). Затем второй запрос получает подчиненные элементы для подчиненных групп второго уровня. Поскольку на третьем уровне иерархии не присутствует ни одна группа справочника, то данный запрос более не выполняется.

В нашем случае, второй запрос вернет пустой результат, так как для записей, находящихся на 3-м уровне иерархии, нет подчиненных элементов (там нет ни одной группы). 

3. Для получения конечного результата платформа формирует следующий SQL-запрос:

Результат именно этого запроса в дальнейшем может обрабатываться алгоритмами на встроенном языке платформы. Таким образом, записи во временной таблице ‘#tt1’ используются для установки условия выборки из таблицы справочника "_Reference41".

4. На последнем шаге платформа очищает и удаляет временную таблицу ‘#tt1’, поскольку в дальнейшем она уже не будет использоваться.

Пример посложнее

Рассмотрим пример посложнее, чем простой запрос к справочнику. Допустим, у нас есть запрос к регистру бухгалтерии "Хозрасчетный".

ВЫБРАТЬ
	ХозрасчетныйОстатки.Организация КАК Организация,
	ХозрасчетныйОстатки.Валюта КАК Валюта,
	ХозрасчетныйОстатки.Подразделение КАК Подразделение,
	ХозрасчетныйОстатки.Счет КАК Счет,
	ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
	ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
	ХозрасчетныйОстатки.Субконто3 КАК Субконто3,
	ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстатки

Условие по счету установлены с помощью инструкции "В ИЕРАРХИИ" по значению "10". На сервере СУБД платформа выполнит ряд запросов.

 

has been added to your cart:
Оформление заказа