При изучении существующих отчетов или типовых конфигураций разработчики нередко сталкиваются с запросами, содержащими фрагменты, заключенные в фигурные скобки: {...}. Типичный пример можно наблюдать при обращении к виртуальным таблицам регистров:
РегистрБухгалтерии.Хозрасчетный.Обороты(
,
&КонецПериода {(&КонецПериода)},
,
,
Субконто1.Вид = ЗНАЧЕНИЕ(Перечисление.Виды.Затраты)
{(Организация).* КАК Организация},
,
) КАК Р
Выясним причину появления таких скобок, разберем по шагам правила их обработки платформой 1С:Предприятие и определим, какую практическую роль они играют в разработке отчетов.
Конструкции вида {...} представляют собой расширение языка запросов для Системы компоновки данных (СКД) и Построителя отчета. Стандартный SQL-подобный язык запросов 1С не поддерживает динамическое включение условий или полей на основе действий пользователя в интерфейсе. Именно для этого было создано специальное расширение.
Всё, что заключено в фигурные скобки, не является жестким требованием синтаксиса для СУБД. Эти инструкции предназначены исключительно для генератора отчетов (процессора компоновки или построителя). Они указывают, какие параметры, поля выборки и условия отбора могут динамически добавляться в итоговый текст запроса в зависимости от пользовательских настроек.
Проанализируем детально каждую из конструкций, представленных в исходном запросе.
Опциональный параметр периода: {(&КонецПериода)}
В параметрах виртуальной таблицы оборотов второе поле отвечает за дату окончания периода. Поместив параметр в фигурные скобки, мы делаем его необязательным для отчета. Если пользователь в пользовательских настройках СКД или построителя не заполнит дату окончания, платформа не станет вызывать исключение «Не задано значение параметра». Вместо этого будет подставлено пустое значение по умолчанию (пустая дата), и ограничение по периоду сверху просто не применится.
Динамический отбор виртуальной таблицы: {(Организация).* КАК Организация}
Рассмотрим подробнее этот фрагмент. В виртуальной таблице регистра бухгалтерии данный параметр отвечает за фильтрацию записей. Конструкция решает сразу три важные задачи:
Перенос отбора внутрь параметров виртуальной таблицы. Если пользователь наложит отбор по организации в настройках отчета, СКД встроит условие непосредственно в параметры таблицы оборотов, а не в итоговую секцию ГДЕ. Это критично для производительности СУБД, поскольку лишние данные отсекаются до расчета агрегатов и итогов.
Символ .* (точка-звездочка). Данный синтаксис разрешает пользователю устанавливать отбор не только по самому значению ссылки Организация, но и по любым ее дочерним реквизитам через точку (например, Организация.ИНН, Организация.ГоловнаяОрганизация и т. д.).
Конструкция КАК Организация. Задает псевдоним поля, под которым оно будет доступно пользователю в дереве полей компоновки и в окне настройки отборов.
Посмотрим на поведение платформы, если данный текст запроса передать обычному объекту Запрос в программном модуле:
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапросаСФигурнымиСкобками;
// Выполнение запроса
Выборка = Запрос.Выполнить().Выбрать();
Объект Запрос при синтаксическом разборе полностью игнорирует и вырезает все инструкции в фигурных скобках. Для него текст будет выглядеть так, будто фигурных скобок и их содержимого не существовало вовсе. Из этого следуют два важных вывода:
Субконто1.Вид = ЗНАЧЕНИЕ(...).&КонецПериода в примере продублирован перед фигурными скобками, платформа посчитает его обязательным. Если разработчик не вызовет метод Запрос.УстановитьПараметр("КонецПериода", Дата), выполнение завершится ошибкой.Разберем практические сценарии работы с расширением языка запросов:
Использование в схемах компоновки данных (СКД). При создании набора данных-запроса в СКД с активным флажком «Автозаполнение» платформа сама формирует доступные поля и условия. Однако если флажок снят для оптимизации или жесткого контроля полей, ручное написание фигурных скобок становится обязательным для вывода полей в отчет и настройки условий.
Формирование запросов в конструкторе. Конструкции расширения не обязательно вводить вручную. В Конструкторе запроса при работе в контексте СКД или Построителя отчета доступна вкладка «Компоновка данных» (или «Построитель»). Все настройки параметров, полей и условий, добавленные на этой вкладке, автоматически оборачиваются конструктором в фигурные скобки.
Использование в обычном коде без СКД. Если требуется сформировать динамический фильтр в обычном запросе, не следует оставлять фигурные скобки. В таких ситуациях запрос формируют программно, динамически конкатенируя строки с условиями или используя функцию СтрШаблон в зависимости от заполненности переменных формы.
Таким образом, фигурные скобки в тексте запроса 1С представляют собой декларативные директивы для генератора отчетов, позволяющие гибко управлять структурой итогового SQL-запроса при взаимодействии с пользователем.