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