Почему не работает функция ТекущаяДата() в параметрах СКД?

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

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

Выясним причину ошибки

Основная проблема кроется в том, что функция ТекущаяДата() возвращает значение типа Дата, которое содержит не только день, месяц и год, но и точное время (часы, минуты, секунды) на момент выполнения кода. В контексте СКД, если ваш параметр настроен на работу с типом Дата (без времени), наличие временной составляющей может приводить к конфликтам при сравнении значений в запросе.

Например, если вы пытаетесь отфильтровать данные за конкретный день, а в параметре передается время (скажем, 14:35:20), то условия отбора, работающие с границами периода, могут отсекать записи текущего дня, так как они интерпретируются как «будущие» или «прошлые» относительно текущей секунды.

Разберем правильное решение

Чтобы отчет всегда корректно воспринимал текущую дату как начало календарного дня, необходимо использовать функцию приведения даты к нужному формату. Наиболее универсальным и правильным способом является использование функции НачалоПериода().

Вместо простого вызова ТекущаяДата() в поле Выражение параметра СКД, используйте следующую конструкцию:

НачалоПериода(ТекущаяДата(), "День")

Это выражение гарантирует, что временная составляющая будет обнулена (установлена в 00:00:00), что позволит системе правильно сопоставлять данные за текущие сутки.

Альтернативные подходы при настройке параметров

Иногда требуется более гибкая логика, например, возможность пользователя самостоятельно выбрать дату, если автоматическое заполнение не требуется. Рассмотрим основные рекомендации:

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

Итоги

Мы выяснили, что ТекущаяДата() сама по себе не является ошибкой, но она требует осторожного обращения из-за наличия времени. Использование функции НачалоПериода() является стандартом де-факто при разработке отчетов в СКД. Применяя этот подход, вы обеспечите стабильную работу отчета независимо от времени его запуска в течение рабочего дня.

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

← На главную