Перейти к основному содержимому

Запросы

Общие сведения

При разработке запросов нужно следовать стандартам 1С:

Дополнительные правила

Именование вложенных запросов и временных таблиц

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

Излишнее индексирование временных таблиц

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

Использование "В" в секции "ГДЕ"

Заменять В() на внутреннее соединение. Тогда мы можем гарантировать использование индексов, мы можем управлять планом запросов, управлять тем, как это будет выполняться. И тем самым гарантировать стабильность — что это, по крайней мере, не деградирует.

Использовать «Выразить» для реквизитов составного типа в запросе

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

Используйте предопределенные значения в запросах

К примеру, вместо создания параметра передающего пустую ссылку используйте выражение ЗНАЧЕНИЕ(Справочник.ИмяТаблицы.ПустаяСсылка).

Получение излишних данных в запросе

Не выбирать данные в запросе, которые в дальнейшем не будут использоваться.

Строковые константы в тексте запроса

Не использовать строковые константы в тексте запроса, когда значение можно передать параметром.

Вместо строкового литерала в тексте запроса:

... ГДЕ Контрагенты.Наименование <> "TestName"

использовать параметр запроса:

... ГДЕ Контрагенты.Наименование <> &НаименованиеИсключения

Сравнение ТИПЗНАЧЕНИЯ()=ТИП() в запросе

Сравнение ТИПЗНАЧЕНИЯ()=ТИП() не используем, преобразуйте в стандартный метод ССЫЛКА.

Учитывать RLS при написании запросов

При включении RLS должны работать все запросы поэтому не забывайте использовать РАЗРЕШЕННЫЕ при обращении к таблицам. Также не забывайте про ограничения на использование описанные в стандарте.

Вычисления полей делать в секции ВЫБРАТЬ

Все вычисляемые поля предварительно рассчитывать в секции ВЫБРАТЬ, не использовать отборы по вычисляемым полям. Даже когда есть какие-то математические операции, сначала их лучше во временной таблице выбрать и вычислить в секции ВЫБРАТЬ, проиндексировать, если нужно. И потом уже отберем по ним. Это работает быстрее, чем сразу вычислять в условиях, потому что при вычислении в условиях вычисление происходит для каждой строки, что крайне долго.

Явные связи между таблицами

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

Разделение условий соединения и фильтрации

Условия соединения таблиц должны размещаться в секции ПО, а условия отбора данных — в секции ГДЕ. Не смешивайте эти контексты без необходимости: запрос становится сложнее читать, а при последующих изменениях повышается риск изменить смысл выборки.

Правильно:

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Настройки КАК Настройки
ПО Настройки.Объект = Объекты.Ссылка
ГДЕ Объекты.ПометкаУдаления = ЛОЖЬ

Излишнее разыменование в условии ГДЕ

Использование более N точек в запросе может привести к понижению производительности.

АВТОНОМЕРЗАПИСИ

Не забывать про особенность, что порядок не гарантируется с единицы:

1

Формирование текста запроса

Не собирать текст запроса конкатенацией «кусочков условий» внутри бизнес-логики.

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

Программное изменение текста запроса

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

Допустимый подход:

  1. базовый текст запроса остается читаемым и открывается в конструкторе;
  2. изменяемый фрагмент имеет явную метку или отдельный метод формирования;
  3. каждый вариант итогового запроса можно отладить отдельно;
  4. имена временных таблиц и полей не формируются динамически без необходимости.

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

Размещение длинных текстов запросов

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

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапросаОстатков();
Запрос.УстановитьПараметр("Организация", Организация);

Порядок установки текста и параметров

Текст запроса должен быть установлен до передачи параметров запроса. Сначала Запрос.Текст, затем Запрос.УстановитьПараметр(...).

Проверка пустого результата

Не выполняйте отдельную проверку РезультатЗапроса.Пустой() перед обычным обходом результата, если достаточно проверить первую запись выборки. Лишняя проверка усложняет код и дублирует ветвления.

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Если Выборка.Следующий() Тогда
// Обработка найденной записи.
Иначе
// Обработка отсутствия данных.
КонецЕсли;

Булевы выражения в запросе

Для булевых полей-результатов в запросах предпочтительно использовать булеву алгебру, а не конструкцию ВЫБОР ... КОГДА ....

Неправильно:

ВЫБОР
КОГДА Товары.Количество > 0
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЕстьОстаток

Правильно:

Товары.Количество > 0 КАК ЕстьОстаток