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

Получение полей через "точку" в запросе

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

Пишем простой запрос

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

Изображение

Чтобы проанализировать действия платформы напишем два простых запроса. Первый запрос будет производить выборку ссылки, а также поля "Номенклатура" и "ЕдиницаИзмерения" из документа "Продажи":

 ТекстЗапроса = "ВЫБРАТЬ 
				|	Продажа.Ссылка, 
				|	Продажа.Номенклатура, 
				|	Продажа.ЕдиницаИзмерения
				|ИЗ 
				|	Документ.Продажа КАК Продажа"

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

 ТекстЗапроса = "ВЫБРАТЬ 
				|	Продажа.Ссылка, 
				|	Продажа.Номенклатура, 
				|	Продажа.ЕдиницаИзмерения, 
				|	Продажа.ЕдиницаИзмерения.БазоваяЕдиница КАК БазоваяЕдиница, 
				|	Продажа.ЕдиницаИзмерения.БазоваяЕдиница.Код КАК КодБазовойЕдиницы, 
				|	Продажа.ЕдиницаИзмерения.БазоваяЕдиница.Наименование КАК ИмяБазовойЕдиницы
				|ИЗ
				| Документ.Продажа КАК Продажа"

 Результаты выполнения обоих запросов в соответствии с тестовыми данными выглядят следующим образом:

Изображение

Как мы видим, оба запроса отлично работают. Теперь рассмотрим поведение платформы 1С:Предприятие 8.x, а именно формирование SQL-запроса к СУБД при использовании обращения к полям через "точку" в запросе.

Что делает платформа?

При выполнении первого запроса, 1С:Предприятие формирует достаточно простой SQL-запрос:

   	 querySQL = "SELECT 
				|	T1._IDRRef, // Ссылка
				|	T1._Fld30RRef, // Номенклатура
				|	T1._Fld31RRef // ЕдиницаИзмерения
				|FROM 
				|	_Document28 T1 WITH(NOLOCK)"

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

	 querySQL = "SELECT
				|	T1._IDRRef, // Ссылка 
				|	T1._Fld30RRef, // Номенклатура
				|	T1._Fld31RRef, // Единица измерения 
				|	T2._Fld29RRef, // Базовая единица
				|	T3._Code,	 // Код базовой единицы
				|	T3._Description // Наименование базовой единицы
				|FROM 
				|	_Document28 T1 WITH(NOLOCK) // Таблица документа "Продажа"
				|		LEFT OUTER JOIN 
				|	_Reference26 T2 WITH(NOLOCK)ON T1._Fld31RRef = T2._IDRRef // Присоединение спр. "Единицы измерения" для получения базовой единицы
				|		LEFT OUTER JOIN 
				|	_Reference27 T3 WITH(NOLOCK)ON T2._Fld29RRef = T3._IDRRef //Присоединение спр. "Базовые единицы" для получения наименования и кода
				|"

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

Плюсы и минусы

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

 

Но есть и другая сторона. Избыточное использование подобной возможности в запросах может значительно повысить нагрузку на сервер СУБД. Все будет зависеть от конкретного запроса. Можно лишь сказать, что нужно стремиться получать выборки данных более оптимальным образом из меньшего количества таблиц.

Небольшой итог

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

 

При умелом обращении с данным механизмом отрицательное влияние на производительность будет сводиться к нулю. Поэтому не использовать его будет просто не рациональным шагом.

 

По ссылке Вы можете скачать конфигурацию со всеми примерами из статьи.

 
0
Читайте также
Настройка отказоустойчивой системы
"Отказоустойчивая система, настройка настройка MS SQL"
Комбинаторный взрыв в 1С:Предприятие версии 8
1С Предприяние 8 Комбинаторный взрыв
Разработки
Консоль компоновки данных
Обработка состоит их запросов, СКД и объектов
Печать ценников. ТиС 9.2х
Обработка для печати ценников для ТИС9.2
Нарушая запреты (Доступ к VBA из 1С)
Макрос в обход системы СБОП
Еще от автора
≡ к списку статей