Как в СКД сделать период необязательным для вывода всех данных?

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

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

Попытка решить эту задачу с помощью стандартной конструкции ВЫБОР КОГДА непосредственно в секции ГДЕ основного запроса приводит к ошибкам. Разберем причины возникновения проблемы и правильные способы реализации необязательного периода в СКД.

Почему не работает условие ВЫБОР КОГДА в основном запросе

Проанализируем типичную попытку разработчика обойти обязательность параметров через проверку на пустую дату ДАТАВРЕМЯ(1, 1, 1):


ГДЕ
    ВЫБОР
        КОГДА &КонПериода = ДАТАВРЕМЯ(1, 1, 1) И &НачПериода = ДАТАВРЕМЯ(1, 1, 1)
            ТОГДА ИСТИНА
        ИНАЧЕ РегСвед.Период МЕЖДУ &НачПериода И &КонПериода
    КОНЕЦ

При таком подходе возникают следующие проблемы:

  1. Ошибка «Параметр не задан» при отключении флажка в настройках: если параметр прописан в тексте запроса без специального синтаксиса СКД, платформа считает его строго обязательным. Если пользователь снимает флаг активности параметра в пользовательских настройках, система выдает ошибку выполнения, так как значение в запрос не передается вообще.
  2. Проблема частичного заполнения: если пользователь указывает только одну дату (например, дату начала), то вторая дата остается пустой (0001-01-01). В результате условие МЕЖДУ проверяет диапазон от выбранной даты до 1 года нашей эры, и запрос возвращает пустой результат.
  3. Потеря времени в конечной дате: при передаче даты без времени значение устанавливается на начало суток (00:00:00), что исключает движения, сделанные в течение последнего дня периода.

Способ 1. Использование расширения языка запросов СКД (Рекомендуемый)

Рассмотрим основной и самый надежный способ решения проблемы. В системе компоновки данных существует специальное расширение языка запросов — инструкции, заключенные в фигурные скобки {...}. Все условия, помещенные внутри фигурных скобок, становятся динамическими: СКД автоматически добавляет их в итоговый SQL-запрос только тогда, когда соответствующий параметр или отбор включен пользователем.

Разберем по шагам, как переписать запрос:

  1. Открываем схему компоновки данных и переходим к редактированию текста запроса.
  2. Вместо жесткого условия ГДЕ добавляем расширение языка запросов, разделяя проверку начала и окончания периода на два независимых условия:

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

Посмотрим, как это работает на практике: если пользователь не указывает параметр &НачПериода или снимает с него флажок, СКД просто исключает условие РегСвед.Период >= &НачПериода из результирующего запроса. Если не указаны оба параметра — запрос вернет все строки таблицы без лишней нагрузки на СУБД.

Способ 2. Настройка периода через параметр «СтандартныйПериод»

Чтобы предоставить пользователю удобный выбор интервалов (например, «Этот месяц», «Прошлый квартал», «Этот год») и гарантировать корректное включение границ суток, применим связку стандартного периода и параметров запроса.

Разберем настройку по шагам:

  1. На вкладке Параметры схемы СКД создаем новый параметр ПериодОтчета с типом СтандартныйПериод.
  2. Для параметров НачПериода и КонПериода устанавливаем флаг Ограничение доступности, чтобы скрыть их из прямого редактирования пользователем.
  3. В колонке Выражение для параметра НачПериода пишем: &ПериодОтчета.ДатаНачала
  4. В колонке Выражение для параметра КонПериода пишем: КонецПериода(&ПериодОтчета.ДатаОкончания, "День")
  5. В тексте запроса используем параметры внутри фигурных скобок {ГДЕ ...}, как было описано в первом способе.

Способ 3. Использование стандартных отборов СКД

Если нет необходимости жестко связывать даты с параметрами отчета, можно полностью отказаться от параметров периода в запросе и перенести фильтрацию на механизм отборов:

  1. В тексте запроса выбираем поле Период без каких-либо условий в секции ГДЕ.
  2. На вкладке Настройки в секции Отбор добавляем поле Период.
  3. Указываем нужный вид сравнения (например, В интервале или Больше или равно / Меньше или равно) и включаем этот отбор в Пользовательские настройки.

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

← На главную