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

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

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

Шаг 1. Настройка текста запроса

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

Проанализируем ситуацию на примере запроса из сообщения пользователя. Изначально запрос выбирает данные из документа МаршрутноеЗадание, но не содержит инструкции ГДЕ. Чтобы исправить это, нам необходимо добавить условие фильтрации. Рассмотрим два варианта реализации:

Вариант А: Жесткое условие. Мы добавляем конструкцию ГДЕ перед оператором СГРУППИРОВАТЬ ПО. В этом случае отчет потребует обязательного заполнения дат, иначе он выдаст ошибку.


ВЫБРАТЬ
    МаршрутноеЗадание.Ссылка,
    МаршрутноеЗадание.Дата,
    МаршрутноеЗадание.Водитель
ИЗ
    Документ.МаршрутноеЗадание КАК МаршрутноеЗадание
ГДЕ
    МаршрутноеЗадание.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

Вариант Б: Использование расширений языка запросов СКД. Это более профессиональный подход. Мы заключаем условие в фигурные скобки {}. Это позволяет СКД динамически управлять фильтром: если пользователь не укажет даты, условие просто будет проигнорировано платформой, и отчет выведет все данные без ошибки.


ВЫБРАТЬ
    МаршрутноеЗадание.Ссылка,
    МаршрутноеЗадание.Дата,
    МаршрутноеЗадание.Водитель
ИЗ
    Документ.МаршрутноеЗадание КАК МаршрутноеЗадание
{ГДЕ
    (МаршрутноеЗадание.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания)}

Шаг 2. Решение проблемы «границы окончания дня»

Выясним причину, по которой документы за последний день периода часто не попадают в отчет. В 1С тип Дата содержит время. Если пользователь выбирает дату окончания, например, 31.12.2023, то система подставляет 31.12.2023 00:00:00. Таким образом, все документы, созданные в течение этого дня (например, в 12:00), окажутся «старше» границы периода и не попадут в выборку.

Рассмотрим, как это исправить программно на уровне настроек СКД. Перейдем на вкладку «Параметры» и для параметра ДатаОкончания в колонке «Выражение» пропишем специальную функцию:

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

Это гарантирует, что поиск будет идти до последней секунды выбранного дня (23:59:59), и ни один документ не будет потерян.

Шаг 3. Использование «Стандартного периода» для удобства пользователя

Пользователю неудобно вводить две даты вручную. Гораздо приятнее выбрать «Этот месяц», «Прошлый квартал» или «Вчера» из выпадающего списка. Для этого мы задействуем тип данных СтандартныйПериод.

Разберем алгоритм настройки:

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

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

Шаг 4. Оптимизация запроса (борьба с разыменованием ссылок)

Посмотрим на пример кода из сообщения №5. Там часто встречается обращение через несколько точек: Заявка.МаршрутноеЗадание.ДатаДоставки. Проанализируем ситуацию: каждое такое обращение в языке запросов 1С превращается в левое соединение (LEFT JOIN) на уровне SQL-сервера.

Почему это плохо: Если в отчете тысячи строк, такие «цепочки» точек заставляют базу данных выполнять огромное количество лишних операций. Отчет начинает «тормозить».

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

Шаг 5. Индексация полей

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

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

← На главную