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