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

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

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

Проблема жесткой фильтрации в запросе

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


ГДЕ
    СогласованиеДоговоров.НачалоДействияДоговора >= &НачалоДействияДоговора
    И СогласованиеДоговоров.ОкончаниеДействияДоговора <= &ОкончаниеДействияДоговора

Если пользователь оставит поля НачалоДействияДоговора и ОкончаниеДействияДоговора пустыми, платформа подставит в них значение 0001-01-01. В результате условие превратится в поиск договоров, которые закончились раньше начала времен, что приведет к пустому результату. Наша задача — модифицировать запрос так, чтобы при незаполненных параметрах условие просто не применялось.

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

Это самый профессиональный и правильный метод работы в 1С. Система компоновки данных умеет динамически изменять текст итогового SQL-запроса перед его выполнением. Если мы заключим условие в фигурные скобки {}, СКД включит его в выполнение только в том случае, если параметр был установлен пользователем в настройках отчета.

Проанализируем, как должен выглядеть запрос с использованием этого механизма:


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

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

Способ 2. Логическое условие в тексте запроса (ВЫБОР КОГДА)

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

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


ГДЕ
    ВЫБОР
        КОГДА &НачалоДействияДоговора = ДАТАВРЕМЯ(1, 1, 1)
            ТОГДА ИСТИНА
        ИНАЧЕ СогласованиеДоговоров.НачалоДействияДоговора >= &НачалоДействияДоговора
    КОНЕЦ
    И ВЫБОР
        КОГДА &ОкончаниеДействияДоговора = ДАТАВРЕМЯ(1, 1, 1)
            ТОГДА ИСТИНА
        ИНАЧЕ СогласованиеДоговоров.ОкончаниеДействияДоговора <= &ОкончаниеДействияДоговора
    КОНЕЦ

Этот код работает безотказно: при пустых датах условие превращается в ИСТИНА И ИСТИНА, что позволяет выбрать абсолютно все записи из таблицы. Однако стоит помнить, что такие конструкции могут усложнять построение плана запроса СУБД, поэтому для больших объемов данных лучше использовать первый способ.

Способ 3. Настройка параметров на вкладке «Компоновка данных»

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

Выполним следующие шаги:

  1. Откроем конструктор запроса в схеме компоновки данных.
  2. Перейдем на закладку «Компоновка данных» -> «Условия».
  3. Добавим поля НачалоДействияДоговора и ОкончаниеДействияДоговора.
  4. В колонке «Условие» пропишем нужные операторы сравнения.

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

Способ 4. Работа со стандартным периодом

Для удобства пользователей рекомендуется использовать тип данных СтандартныйПериод вместо двух отдельных дат. Это позволяет выбирать периоды вроде «Этот месяц» или «Прошлый год» одним кликом. Рассмотрим, как сделать такой период необязательным.

В схеме СКД на закладке «Параметры» создадим один параметр ПериодОтчета. Для параметров запроса &НачалоПериода и &КонецПериода установим ограничение доступности и пропишем выражения:

В тексте запроса используем конструкцию расширения:


{ГДЕ
    (СогласованиеДоговоров.Дата МЕЖДУ &НачалоПериода И &КонецПериода)}

Важный нюанс: Чтобы отчет корректно работал при пустом периоде, в выражении параметров можно использовать функцию ЕстьNULL или проверку на пустую дату, чтобы подставить значения «начала времен» (01.01.0001) или «конца времен» (31.12.3999). Например:

ВЫБОР КОГДА &ПериодОтчета.ДатаОкончания = ДАТАВРЕМЯ(1,1,1) ТОГДА ДАТАВРЕМЯ(3999,12,31) ИНАЧЕ &ПериодОтчета.ДатаОкончания КОНЕЦ

Заключение

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

← На главную