Критерии отбора 'изнутри'

01 апреля 2013

Тестовая база с примером

Предисловие

Критерий отбора

В прошлой статье "Критерии отбора на простом примере" был рассмотрен простой пример настройки и использования объекта конфигурации "критерий отбора". Подробнее узнать информацию о нем Вы можете в синтаксис-помощнике или на официальном сайте

Сегодня в статье рассмотрим закулисную работу платформы 1С:Предприятие с СУБД при использовании критериев отбора. В примере будет использоваться Microsoft® SQL Server® 2008 Express with Advanced Services.

Что у нас есть?

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

Связь между объектами метаданных

Также добавлен критерий отбора "СвязанныеЭлементы", настройки типов данных которого представлены на следующем скриншоте:

Типы данных критерия отбора

В его состав включены следующие объекты с реквизитами, выбранными в соответствии со связями между объектами метаданных.

Состав критерия отбора

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

Использование критерия отбора. Список документов, в которых используется ссылка на текущий элемент справочника.

Критерии отбора возможно использовать в запросах. Рассмотрим небольшой пример.

В запросе

Для каждого критерия отбора создается виртуальная таблица, в которой имеется единственный  параметр "Значение". В параметр передается ссылка на элемент, для которого нужно получить связанные элементы.

Виртуальная таблица критерия отбора

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

"За кулисами"

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

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

Запрос из 1С:Предприятия

то платформа сформирует следующий SQL-запрос к СУБД:

SQL-запрос платформы при использовании критерия отбора

На скриншоте выше подробно рассмотрен SQL-запрос, формируемый платформой. Наш пример усложнен тем, что для элемента справочника "Товары" ищутся документы по наличию ссылки на этот товар в их табличных частях. Поэтому в SQL-запросе присутствует конструкция "EXIST" для проверки наличия хотя бы одной ссылки на товар в табличной части документа.

Для каждой таблицы документа формируется отдельный SELECT. После результаты объединяются с помощью конструкции "UNION ALL". Из полученной таблицы во вложенном запросе получают все ссылки на документы, в табличных частях которых присутствует искомый элемент справочника.

При создании критерия отбора, как уже говорилось выше, никаких отдельных таблиц в структуре информационной базы не создается. Но некоторые изменения в структуре таблиц все же имеются. Для реквизитов, используемых в критерии отбора, создается индекс для тех объектов, которые содержат эти реквизиты и входят в его состав.

Подобные SQL-запросы платформа формирует для всех случаев использования критерия отбора в конфигурации. 

Выводы

Таким образом, критерий отбора - это механизм платформы, который выступает в качестве инструкции платформе для формирования SQL-запросов к базе данных на получения ссылок на связанные объекты информационной базы. В противном случае разработчику пришлось бы самостоятельно писать такие запросы и настраивать индексы для реквизитов объектов.

В типовых конфигурация критерий отбора используется, например, для получения структуры подчиненности документа. 

Влияние на производительность с их стороны незначительная. Из-за создания дополнительных индексов может увеличиться время записи, так как появляется необходимость в обновлении индекса при помещении данных в информационную базу.


comments powered by Disqus