13.06.2016

Оптимизация запросов 1С

Автор: Белозерских Евгений

Рассмотрим самые распространенные приемы для оптимизации запросов 1С.

> Обращение в запросе к реквизиту поля составного типа

"ВЫБРАТЬ
|	ЗначенияСвойствОбъектов.Объект.Код,
|	ЗначенияСвойствОбъектов.Свойство,
|	ЗначенияСвойствОбъектов.Значение
|ИЗ
|	РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов"
В данном случае измерение "Объект", поле составного типа (ссылка на элемент любого справочника, или любой документ в конфигурации).
Измерение составного типа
В такой ситуации необходимо использовать конструкцию"ВЫРАЗИТЬ" в запросе, вот таким образом:
"ВЫБРАТЬ
|	ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Объект КАК Справочник.Номенклатура).Код,
|	ЗначенияСвойствОбъектов.Свойство,
|	ЗначенияСвойствОбъектов.Значение
|ИЗ
|	РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов"

> Передача "Ссылок" в результате

      Правильно передавать "ПРЕДСТАВЛЕНИЕ()" объекта, т.к. ссылка будет подставлена для расшифровки.

> Использование фильтра в запросе "ГДЕ", вместо параметров виртуальных таблиц

"ВЫБРАТЬ
|	ВТ.Номенклатура,
|	ВТ.КоличествоОстаток,
|	ВТ.Склад
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки КАК ВТ
|ГДЕ
|	ВТ.Номенклатура В ИЕРАРХИИ(&Номенклатура)
|	И ВТ.Склад = &Склад"
Собственно можно сказать только одно. ТАК НЕ ДЕЛАТЬ )) ! При работе с виртуальными таблицами регистров, ВСЕГДА следует использовать параметры этих таблиц. И выше указанный запрос, следует переписать вот таким образом:
"ВЫБРАТЬ
|	ВТ.Номенклатура,
|	ВТ.КоличествоОстаток,
|	ВТ.Склад
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки(
|			,
|			Номенклатура В ИЕРАРХИИ (&Номенклатура)
|				И Склад = &Склад) КАК ВТ"

> Выполнение с ролями в которых применяется "RLS"

      Тоже самое что применение конструкции "ИЛИ" в отборе и соединении (т.е. не рекомендуется)

> Использование оператора "ИЛИ" в условиях отбора и соединениях

      Важно понимать, что в этом случае индексы работать НЕ будут. А это увеличивает время выполнения запроса. Можно например такое условие разделить на объединение двух запросов.

> Получение значений через "точку"

"ВЫБРАТЬ
	|	Взаиморасчеты.Контрагент,
	|	Взаиморасчеты.СуммаУпр,
	|	Взаиморасчеты.Контрагент.ОсновнойДоговорКонтрагента.Наименование КАК ДоговорКонтрагентаНаименование
	|ИЗ
	|	РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК Взаиморасчеты"
      В этом примере, при обращение к реквизиту основного договора, появляется неявное соединение с таблицей справочника "ДоговорыКонтрагентов"

> Функция от параметров запроса

Например в случае применения конструкции
НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)
СУБД не "поймет", что это постоянная со значением типа "Дата". Лучше передать в параметр уже вычисленное выражение.

> Соединение с виртуальными таблицами

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

> Конструкция "ДЛЯ ИЗМЕНЕНИЯ"

      Актуально ТОЛЬКО для автоматических блокировок. Для блокировки таблицы (например при проведении и проверке отрицательных остатков, последующего изменения) необходимо установить флаг "Блокировка для последующих изменений" на закладке "Дополнительно", и указать какие таблицы блокируются.

Другие статьи

NULL, ЕСТЬNULL() и ЕСТЬ NULL в запросах 1С

    Определяемся что же такое NULL в запросах 1С и как с таким значением работать

Оператор "ПОДОБНО" в запросе 1С

   В статье рассматривается использование оператора "ПОДОБНО" в запросах 1С, примеры и особенности поведения
 

Получение в запросе 1С, курса валюты на дату документа

     Пример запроса 1С, для получения курса валюты документа, на дату документа.

Остатки по дням запросом 1С

      Пример запроса, который выводит информацию по остаткам товаров на каждый день, даже если не было движений

Нумерация строк в запросе 1С

Один из способов пронумеровать строки в запросе 1С