Часто при работе с чужим кодом или при изучении текстов запросов разработчики сталкиваются с необычной конструкцией: параметрами или целыми условиями, заключенными в фигурные скобки. Проанализируем типичный пример из виртуальной таблицы:
РегистрНакопления.ВзаиморасчетыПоСчетам.Обороты({(&ДатаНач)}, {(&ДатаКон)})
Разберем подробнее, что это за синтаксис, откуда он берется в тексте запроса, если на стандартных вкладках конструктора этих параметров не видно, и как правильно применять этот механизм на практике.
Конструкции в фигурных скобках представляют собой расширение языка запросов, предназначенное специально для Системы компоновки данных (СКД) и Построителя отчета.
Главная задача фигурных скобок — сделать определенные части текста запроса необязательными. При формировании отчета платформа 1С динамически анализирует пользовательские настройки. К ним относятся выбранные пользователем поля, установленные отборы и заполненные параметры.
Если параметр или поле, заключенные в фигурные скобки, не используются в текущем варианте отчета (пользователь их не выбрал или не заполнил), платформа «вырезает» их из итогового запроса перед его выполнением на сервере базы данных. Это позволяет избежать ошибок из-за пустых параметров и существенно оптимизирует работу СУБД, так как база данных не выполняет лишнюю работу по проверке пустых условий или соединению ненужных таблиц.
Выясним причину, почему данные параметры часто невозможно найти на привычных вкладках конструктора запроса (например, в параметрах виртуальной таблицы). Если вы откроете параметры таблицы, поля НачалоПериода и КонецПериода могут оказаться пустыми.
Дело в том, что инструкции для СКД настраиваются на отдельной вкладке. Посмотрим на шаги поиска:
Если вы просто скопируете такой запрос и вставите его в обычный конструктор (вне схемы компоновки данных), вкладка появится автоматически, чтобы сохранить этот специфический синтаксис.
Помимо параметров виртуальных таблиц, расширение можно использовать в различных секциях запроса. Рассмотрим проверенные способы применения конструкций с фигурными скобками.
1. Необязательные условия (Секция ГДЕ)
Позволяет накладывать условие только в том случае, если пользователь решил использовать соответствующий отбор:
ГДЕ
{Контрагент = &Контрагент}
Если пользователь в настройках СКД не задаст отбор по контрагенту, это условие будет просто проигнорировано при компоновке макета.
2. Необязательные поля (Секция ВЫБРАТЬ)
Позволяет явно описать поля, доступные для вывода, и не запрашивать их из базы без необходимости:
ВЫБРАТЬ
Номенклатура.Ссылка
{ВЫБРАТЬ Ссылка.*, Артикул}
Если пользователь не добавит поле Артикул в свои настройки, платформа не будет обращаться к этому полю при выборке данных.
3. Необязательные таблицы (Секция ИЗ)
Это один из самых мощных инструментов оптимизации. Позволяет присоединять тяжелые таблицы только тогда, когда из них требуются данные:
ИЗ
Документ.Реализация КАК Реализация
{ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки КАК Остатки ПО ...}
Таблица остатков будет присоединена к запросу только в том случае, если пользователь выберет для вывода хотя бы одно поле из этого регистра.
Проанализируем ограничения данного механизма. Важно понимать, что обычный объект Запрос при выполнении метода Запрос.Выполнить() программно (вне механизмов СКД) не умеет динамически адаптировать текст, ориентируясь на скобки.
В лучшем случае запрос выполнится так, как если бы скобок вообще не было. В худшем — платформа выдаст синтаксическую ошибку, если внутри скобок использован специфичный для СКД синтаксис (например, конструкция .*).
Если вам нужно реализовать необязательные условия в обычном программном запросе, используйте следующие подходы:
ГДЕ
(Документ.Дата >= &ДатаНач ИЛИ &ДатаНач = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
СтрЗаменить(), для динамической сборки свойства ТекстЗапроса. Нужные условия и соединения добавляются в строку только если пользователь заполнил соответствующие реквизиты на форме.