новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Оператор "В ИЕРАРХИИ" в запросе

  • Добавить свою публикацию
  • для этого требуется регистрация

Начало

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

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

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

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

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

 

В тестовой базе справочник "Товары" имеет следующие тестовые данные:

Изображение

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

 

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

Изображение

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

 

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

За кулисами

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

  1. В качестве параметра "&Ссылка" передадим группу верхнего уровня "Группа 1" (как это мы сделали ранее).
  2. В параметр передадим ссылку на группу "Группа 1 - 1", вложенную в группу верхнего уровня "Группа 1".
Теперь по порядку. В первом случае платформа выполнит следующие действия на SQL-сервере:

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

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

Изображение
На скриншоте подробно прокомментирован текст SQL-запроса. Если кратко, то запрос позволяет выбрать подчиненные элементы для групп, ссылки на которые находятся во временной таблице. Остается вопрос: "Зачем запрос выполняется дважды?". Тут ответ простой: сначала запрос получает подчиненные элементы для групп первого уровня, которые уже содержатся во временной таблице (см. пункт 1). Затем второй запрос получает подчиненные элементы для подчиненных групп второго уровня. Поскольку на третьем уровне иерархии не присутствует ни одна группа справочника, то данный запрос более не выполняется.
 
В нашем случае, второй запрос вернет пустой результат, так как для записей, находящихся на 3-м уровне иерархии, нет подчиненных элементов (там нет ни одной группы). 
 
 3. Для получения конечного результата запроса платформа формирует следующий SQL-запрос:
Изображение
Результат именно этого запроса в дальнейшем может обрабатываться алгоритмами на встроенном языке платформы. Таким образом, записи во временной таблице '#tt1' используются для установки условия выборки из таблицы справочника "_Reference41".
 
 4. На последнем шаге платформа 1С:Предприятие 8.x удаляет временную таблицу '#tt1', поскольку в дальнейшем она уже не будет использоваться.
Изображение
На этом процесс выполнения оператора "В ИЕРАРХИИ" завершен. Напомню, что рассмотренная последовательность действий на SQL-сервере была выполнена, когда мы в запрос на стороне платформы передавали ссылку на группу верхнего уровня "Группа - 1". Но как поведется себя платформа, если мы в качестве параметра "&Ссылка" передадим ссылку на группу второго уровня "Группа - 1 - 1"? Все произойдет аналогичным образом, кроме следующего момента: выше, во втором этапе выполнения SQL-запросов платформой, было написано, что запрос для получения подчиненных элементов выполнялся дважды - в случае с получением подчиненных элементов для группы "Группа - 1 - 1" это не так. Запрос будет выполнен только один раз.
 
Дело в том, что количество запросов на получение подчиненных элементов зависит от количества групп в иерархии. Другими словами, если на уровне иерархии элементов содержится хотя бы одна группа, то будет выполнен запрос из пункта 2.

Влияние на производительность

Неправильное использование любого оператора в запросе может привести к неоптимальной работе системы. Рассматриваемый оператор "В ИЕРАРХИИ" не исключение. Его нужно применять с осторожностью, поскольку он намного усложняет алгоритм выполнения SQL-запросов к базе и тем самым увеличивает нагрузку на сервер СУБД. 

 

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

ВЫБРАТЬ
	Товары.Ссылка
ИЗ
	Справочник.Товары КАК Товары
ГДЕ
	(Товары.Ссылка В ИЕРАРХИИ (&Ссылка)
			ИЛИ Товары.Ссылка В ИЕРАРХИИ (&Ссылка1)
			ИЛИ Товары.Ссылка В ИЕРАРХИИ (&Ссылка2))

 

 Как можно догадаться, запрос приведет к формированию множества SQL-запросов, что повлечет за собой снижение производительности информационной системы.

Делайте выводы!

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

 

Ну и разумеется, при написании собственных механизмов обращайте внимание на оператор "В ИЕРАРХИИ". Очень удобный с одной стороны, и опасный с другой.

 
0
Читайте также
Как получить список всех документов или справочников в 1С:Предприятие 8х.
"Как выбрать все документы после перехода с 1С7.7"
Штрихкодирование печатных форм документов в 1С
Штрих-код можно встроить в 1С в любую печатную форму
Работа с хранилищем конфигурации
Хранилище конфигурации в 1С8
Разработки
Реестр документов .
Отчет на СКД
1С Пятнашки и Двойняшки
1С 8.2 с играми Пятнашкии Двойняшки
Анализ работы пользователей v 3.01
Отчет помогает анализировать работу пользователей
Еще от автора
≡ к списку статей