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