Как правильно использовать необязательные параметры и условие ГДЕ в 1С СКД?

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

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

Анализ синтаксической ошибки при использовании фигурных скобок

Разберем типичную проблему, с которой сталкиваются при написании запросов в СКД. Зачастую в запросе указывают условия ограничения с явной ссылкой на параметр, но совершают ошибку в синтаксисе фигурных скобок и круглых скобок.

Посмотрим на пример запроса с ошибкой:


ВЫБРАТЬ
    РегСвед.Период,
    РегСвед.Сотрудник,
    РегСвед.Подразделение КАК Филиал
ИЗ
    РегистрСведений.ПодразделенияСотрудников КАК РегСвед
{ГДЕ
    (РегСвед.Сотрудник=&Сотрудник}

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


ВЫБРАТЬ
    РегСвед.Период,
    РегСвед.Сотрудник,
    РегСвед.Подразделение КАК Филиал
ИЗ
    РегистрСведений.ПодразделенияСотрудников КАК РегСвед
{ГДЕ
    РегСвед.Сотрудник = &Сотрудник}

При использовании данной записи конструкция в фигурных скобках {ГДЕ ...} будет включена платформой в итоговый запрос к СУБД только в том случае, если параметр &Сотрудник используется и установлен в настройках отчета.

Варианты синтаксиса расширения языка запросов

Рассмотрим по шагам основные способы объявления условий в секции фигурных скобок:

  1. Необязательное условие по конкретному параметру:

    Используется синтаксис {ГДЕ Поле = &Параметр}. Если параметр заполнен и включен в отборе, условие применяется на уровне СУБД. Если параметр выключен, условие полностью убирается из текста SQL-запроса.

  2. Объявление поля для стандартного отбора СКД:

    Можно просто перечислить доступное поле без указания конкретного параметра с помощью синтаксиса {ГДЕ РегСвед.Сотрудник} или с использованием псевдонима {ГДЕ РегСвед.Сотрудник.* КАК Сотрудник}. В этом случае компоновщик данных автоматически подставит требуемое условие в момент формирования итогового запроса на основе пользовательских отборов на закладке «Настройки».

В чем разница между передачей пустой ссылки и отключением параметра?

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

При работе с СКД критически важно различать два состояния параметра:

  1. Снятый флаг использования: Пользователь снял флажок напротив параметра/отбора в пользовательских настройках. В этом случае СКД исключает блок {ГДЕ ...} из итогового SQL-запроса, и данные выбираются по всем элементам.
  2. Передача пустой ссылки: Флажок использования установлен, но в значение передана пустая ссылка вида Справочник.Сотрудники.ПустаяСсылка. В такой ситуации СКД считает параметр задействованным и отправляет в СУБД запрос с явной фильтрацией по пустой ссылке. В результате выводятся только записи с пустым значением либо пустая таблица.

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


ГДЕ
    (&Сотрудник = ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка)
    ИЛИ РегСвед.Сотрудник = &Сотрудник)

Как СКД модифицирует запросы на сервере

Существует распространенное заблуждение, что отборы, добавленные на закладке «Настройки» в СКД без указания фигурных скобок в запросе, выполняются на стороне сервера 1С после получения всей таблицы данных.

Если включен флаг Автозаполнение на закладке «Наборы данных», компоновщик макета СКД анализирует наложенные пользователем отборы и динамически модифицирует исходный запрос. В текст запроса «на лету» подставляются секции ГДЕ, благодаря чему фильтрация всегда выполняется непосредственно на сервере СУБД, обеспечивая максимальную скорость работы.

Особенности применения условий в виртуальных таблицах

Если данные выбираются из виртуальных таблиц (например, СрезПоследних или Обороты), наложение условия через секцию {ГДЕ ...} после ключевого слова ИЗ является неоптимальным.

Посмотрим на разницу:

Неоптимальный вариант: Вся виртуальная таблица сначала формируется СУБД по всем сотрудникам, и только затем накладывается фильтр ГДЕ.

Оптимальный вариант: Фигурные скобки указываются непосредственно в параметрах самой виртуальной таблицы:


ВЫБРАТЬ
    Срез.Период,
    Срез.Сотрудник,
    Срез.Подразделение
ИЗ
    РегистрСведений.ПодразделенияСотрудников.СрезПоследних(&Период, {Сотрудник = &Сотрудник}) КАК Срез

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

← На главную