Как правильно настроить период в отчете СКД, чтобы данные выводились корректно?

Программист 1С v8.3 (Обычные формы)
← На главную

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

Выясним причину: почему отчет пустой?

Основная причина отсутствия данных при установке периода кроется в специфике типа данных Дата в 1С. В платформе 1С дата всегда включает время. Если пользователь выбирает дату в календаре, например, 01.09.2023, то программа интерпретирует это как 01.09.2023 00:00:00. Если в качестве конца периода указана та же дата, то документы, созданные в течение этого дня (даже в 00:00:01), уже не попадут в выборку, так как они хронологически находятся позже границы периода.

Способ 1. Использование типа «СтандартныйПериод» и выражений СКД

Рассмотрим наиболее изящный и удобный для пользователя способ — использование встроенного типа СтандартныйПериод. Это позволяет пользователю выбирать не две отдельные даты, а использовать удобный интерфейс (выбор месяца, квартала, года или произвольного интервала одним кликом).

Разберем алгоритм настройки в конструкторе СКД:

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

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

Способ 2. Программная установка параметров в обычных формах

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

Рассмотрим пример кода, который необходимо разместить в модуле формы отчета (например, в обработчике нажатия кнопки «Сформировать» или перед выводом):


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

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

Автоматическая связь с виртуальными таблицами

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

Проанализируем важные нюансы:

Работа с остатками: тонкий момент с границей секунды

Если ваша задача — получить остатки на конец периода, помните, что остатки в 1С считаются «на начало» секунды. Чтобы отчет был корректным и включал движения, сделанные в последнюю секунду дня, профессионалы рекомендуют использовать следующую конструкцию в выражении параметра Период (для остатков):

ДобавитьКДате(КонецПериода(&ДатаОкончания, "День"), "Секунда", 1)

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

Подведем итоги

Для корректной работы периода в СКД необходимо:

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

Соблюдение этих правил обеспечит точность ваших отчетов и отсутствие пустых страниц при формировании данных за конкретные даты.

← На главную