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