Что означают фигурные скобки {} в запросе 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

РегистрНакопления.ВзаиморасчетыПоСчетам.Обороты({(&ДатаНач)}, {(&ДатаКон)})

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

Суть механизма: расширение языка запросов

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

Главная задача фигурных скобок — сделать определенные части текста запроса необязательными. При формировании отчета платформа 1С динамически анализирует пользовательские настройки. К ним относятся выбранные пользователем поля, установленные отборы и заполненные параметры.

Если параметр или поле, заключенные в фигурные скобки, не используются в текущем варианте отчета (пользователь их не выбрал или не заполнил), платформа «вырезает» их из итогового запроса перед его выполнением на сервере базы данных. Это позволяет избежать ошибок из-за пустых параметров и существенно оптимизирует работу СУБД, так как база данных не выполняет лишнюю работу по проверке пустых условий или соединению ненужных таблиц.

Где найти настройку в Конструкторе запросов?

Выясним причину, почему данные параметры часто невозможно найти на привычных вкладках конструктора запроса (например, в параметрах виртуальной таблицы). Если вы откроете параметры таблицы, поля НачалоПериода и КонецПериода могут оказаться пустыми.

Дело в том, что инструкции для СКД настраиваются на отдельной вкладке. Посмотрим на шаги поиска:

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

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

Где применяется расширение (примеры использования)

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

1. Необязательные условия (Секция ГДЕ)

Позволяет накладывать условие только в том случае, если пользователь решил использовать соответствующий отбор:


ГДЕ 
    {Контрагент = &Контрагент}

Если пользователь в настройках СКД не задаст отбор по контрагенту, это условие будет просто проигнорировано при компоновке макета.

2. Необязательные поля (Секция ВЫБРАТЬ)

Позволяет явно описать поля, доступные для вывода, и не запрашивать их из базы без необходимости:


ВЫБРАТЬ 
    Номенклатура.Ссылка 
    {ВЫБРАТЬ Ссылка.*, Артикул}

Если пользователь не добавит поле Артикул в свои настройки, платформа не будет обращаться к этому полю при выборке данных.

3. Необязательные таблицы (Секция ИЗ)

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


ИЗ 
    Документ.Реализация КАК Реализация 
    {ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки КАК Остатки ПО ...}

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

Ограничения и альтернативные подходы

Проанализируем ограничения данного механизма. Важно понимать, что обычный объект Запрос при выполнении метода Запрос.Выполнить() программно (вне механизмов СКД) не умеет динамически адаптировать текст, ориентируясь на скобки.

В лучшем случае запрос выполнится так, как если бы скобок вообще не было. В худшем — платформа выдаст синтаксическую ошибку, если внутри скобок использован специфичный для СКД синтаксис (например, конструкция .*).

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

  1. Логика внутри условия ГДЕ: Использование жестких параметров с проверкой на «пустое» значение непосредственно в SQL-подобном синтаксисе.
    
    ГДЕ 
        (Документ.Дата >= &ДатаНач ИЛИ &ДатаНач = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
    
  2. Программная модификация текста: Использование строковых функций платформы, например СтрЗаменить(), для динамической сборки свойства ТекстЗапроса. Нужные условия и соединения добавляются в строку только если пользователь заполнил соответствующие реквизиты на форме.
← На главную