Как в СКД автоматически ограничить дату окончания отчета текущей датой?

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

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

Разбор основной ошибки в выражениях СКД

Частая проблема, с которой сталкиваются новички при работе с параметрами — попытка использовать конструкцию присваивания внутри выражения. Многие пытаются записать условие в виде ВЫБОР КОГДА &Дата > ТекущаяДата() ТОГДА &Дата = ТекущаяДата(). Важно помнить, что в СКД ВЫБОР работает как функция, возвращающая значение. Знак равенства внутри ВЫБОР недопустим — после слова ТОГДА должно сразу идти значение, которое будет возвращено.

Решение задачи с использованием параметра и выражения

Давайте разберем по шагам, как правильно настроить параметры для достижения поставленной цели:

  1. Создадим параметр Период с типом СтандартныйПериод. Это позволит пользователю удобно выбирать интервал в интерфейсе.
  2. Добавим два дополнительных параметра для самого запроса: НачалоПериода и КонецПериода (тип Дата).
  3. В поле «Выражение» для параметра НачалоПериода укажем: &Период.ДатаНачала.
  4. Для параметра КонецПериода воспользуемся конструкцией ВЫБОР, чтобы сравнить выбранную дату с текущей.

Для корректной работы с временем рекомендуется использовать функцию КонецПериода(), которая приводит дату к концу дня (23:59:59). Это исключает погрешности, когда отчет может «не захватить» данные за текущий день из-за разницы во времени.

Пример правильного кода для выражения параметра КонецПериода:


ВЫБОР
    КОГДА КонецПериода(ТекущаяДата(), "День") < &Период.ДатаОкончания
    ТОГДА КонецПериода(ТекущаяДата(), "День")
    ИНАЧЕ &Период.ДатаОкончания
КОНЕЦ

Почему это может не работать с «Дополнением» периода

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

Альтернативные способы реализации

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

1. Программная установка в модуле отчета

Самый надежный способ — использовать обработчик события ПриКомпоновкеРезультата в модуле отчета. В этом методе мы имеем полный контроль над значениями параметров перед началом построения отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    ПараметрКонец = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));
    Если ПараметрКонец.Значение > ТекущаяДата() Тогда
        ПараметрКонец.Значение = ТекущаяДата();
        ПараметрКонец.Использование = Истина;
    КонецЕсли;
КонецПроцедуры

2. Использование виртуальных таблиц в запросе

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


ВЫБРАТЬ
    Остатки.СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(&Начало, ВЫБОР 
        КОГДА &Конец > ТекущаяДата() ТОГДА ТекущаяДата() 
        ИНАЧЕ &Конец 
    КОНЕЦ) КАК Остатки

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

← На главную