При настройке отчетов в Системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда использование стандартной функции ТекущаяДата() в поле Выражение параметра не приводит к ожидаемому результату. Отчет может не формироваться или формироваться с пустыми данными, хотя при подстановке конкретного значения даты все работает корректно. Давайте разберемся, в чем заключается причина такого поведения и как правильно настроить параметры.
Основная проблема кроется в том, что функция ТекущаяДата() возвращает значение типа Дата, которое содержит не только день, месяц и год, но и точное время (часы, минуты, секунды) на момент выполнения кода. В контексте СКД, если ваш параметр настроен на работу с типом Дата (без времени), наличие временной составляющей может приводить к конфликтам при сравнении значений в запросе.
Например, если вы пытаетесь отфильтровать данные за конкретный день, а в параметре передается время (скажем, 14:35:20), то условия отбора, работающие с границами периода, могут отсекать записи текущего дня, так как они интерпретируются как «будущие» или «прошлые» относительно текущей секунды.
Чтобы отчет всегда корректно воспринимал текущую дату как начало календарного дня, необходимо использовать функцию приведения даты к нужному формату. Наиболее универсальным и правильным способом является использование функции НачалоПериода().
Вместо простого вызова ТекущаяДата() в поле Выражение параметра СКД, используйте следующую конструкцию:
НачалоПериода(ТекущаяДата(), "День")
Это выражение гарантирует, что временная составляющая будет обнулена (установлена в 00:00:00), что позволит системе правильно сопоставлять данные за текущие сутки.
Иногда требуется более гибкая логика, например, возможность пользователя самостоятельно выбрать дату, если автоматическое заполнение не требуется. Рассмотрим основные рекомендации:
ВЫБОР.
ВЫБОР
КОГДА &МойПараметр = ДАТАВРЕМЯ(1, 1, 1) ТОГДА НачалоПериода(ТекущаяДата(), "День")
ИНАЧЕ &МойПараметр
КОНЕЦ
СтандартныйПериод. Это позволит пользователю выбирать варианты вроде «Сегодня», «Этот месяц» или «Текущий квартал», что избавляет от необходимости писать сложные выражения вручную.Мы выяснили, что ТекущаяДата() сама по себе не является ошибкой, но она требует осторожного обращения из-за наличия времени. Использование функции НачалоПериода() является стандартом де-факто при разработке отчетов в СКД. Применяя этот подход, вы обеспечите стабильную работу отчета независимо от времени его запуска в течение рабочего дня.
Всегда проверяйте состав типа данных в настройках параметра: если вы работаете с датами документов или периодами, старайтесь приводить их к началу или концу дня, чтобы избежать логических неточностей при формировании отчетов.