К статье
Практический материал

Отчеты и Аналитика · 11 мин

Как указать период в СКД 1С: полное руководство

Как указать период в СКД 1С: стандартный период, параметры НачалоПериода и КонецПериода, настройка в конструкторе, отборе и коде. Примеры и ошибки.

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

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

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

Как СКД работает с параметрами периода

Когда в запросе набора данных вы пишете условие вида ГДЕ Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода, СКД автоматически создаёт одноимённые параметры на закладке «Параметры» макета компоновки. Эти параметры — мост между запросом и настройками, которые видит пользователь.

Для виртуальных таблиц регистров (Остатки, Обороты, ОстаткиИОбороты) период задаётся иначе — через параметры самой виртуальной таблицы в фигурных скобках или в её конструкторе: РегистрНакопления.Товары.Обороты(&НачалоПериода, &КонецПериода, , ). Это эффективнее, чем фильтрация в ГДЕ, потому что отбор выполняется на уровне выборки виртуальной таблицы.

Важно понимать разницу: параметр запроса фильтрует данные, а параметр СКД — это то, что можно вывести пользователю, заполнить выражением или связать с отбором. Если параметр есть в запросе, но не настроен в СКД, отчёт при формировании потребует его значение и выдаст ошибку «Не задано значение параметра».

Способ 1. Параметры НачалоПериода и КонецПериода в запросе

Классический подход — объявить два параметра типа «Дата» и использовать их в условии запроса. Откройте схему компоновки, закладку «Наборы данных», и в тексте запроса добавьте условие:

ВЫБРАТЬ

Продажи.Номенклатура,

Продажи.Количество

ИЗ

РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи

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

Частая тонкость: дата конца периода по умолчанию содержит время 00:00:00, то есть документы за последний день не попадут в отчёт. Решение — обернуть параметр в выражение: КонецПериода(&КонецПериода, День) в запросе либо использовать виртуальную таблицу, где платформа сама корректно обрабатывает границы при указании вида периода.

bsl
// Заполнение параметров программно
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Параметры.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Параметры.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));

Способ 2. Стандартный период одним полем

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

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

Альтернатива без кода: в типовых отчётах на управляемых формах период часто выводится автоматически, если параметры названы стандартно (НачалоПериода, КонецПериода) — библиотека стандартных подсистем подхватывает их и рисует единое поле периода. В самописных отчётах надёжнее настроить связь через стандартный период вручную.

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

Вывод периода в пользовательские настройки

Параметр, созданный в схеме, по умолчанию не виден пользователю в режиме «Ещё → Изменить вариант». Чтобы даты можно было менять перед формированием, на закладке «Параметры» схемы компоновки включите для параметров периода флажок «Включать в пользовательские настройки» и при необходимости задайте представление — например, «Начало периода» вместо технического имени.

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

В управляемых формах пользовательские настройки выводятся в шапку отчёта, если у параметра стоит режим редактирования «Быстрый доступ». Это делается в настройках варианта: выделите параметр и в свойствах пользовательской настройки выберите отображение в шапке.

Период через отбор вместо параметров запроса

Не всегда нужно править запрос. Если набор данных выбирает поле Период (например, из таблицы документов или физической таблицы регистра), ограничить диапазон можно отбором СКД: на закладке «Настройки» → «Отбор» добавьте условие «Период» с видом сравнения «В диапазоне» или два условия «Больше или равно» / «Меньше или равно» со ссылками на параметры.

Этот способ гибче: пользователь сам может менять условие отбора. Но он медленнее для больших таблиц — отбор применяется после выборки, а не внутри виртуальной таблицы. Для регистров накопления всегда предпочтительнее передавать период в параметры виртуальной таблицы Обороты или ОстаткиИОбороты.

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

Способы задать период в СКД

Параметры виртуальной таблицы

Самый быстрый для регистров: отбор на уровне СУБД. Ограничение — работает только с виртуальными таблицами регистров.

Параметры в условии ГДЕ

Универсально для любых запросов, включая соединения таблиц. Требует аккуратности с границами дат (время 00:00:00).

Отбор в настройках СКД

Гибко для пользователя, не требует правки запроса. Медленнее на больших объёмах, т.к. фильтрация после выборки.

Стандартный период

Удобный интерфейс выбора. Требует связать выражениями с параметрами запроса.

Программная установка периода из кода формы

Когда отчёт открывается из документа или обработки, период часто нужно подставить автоматически. Для этого используется объект настроек компоновщика. В модуле формы отчёта:

&НаСервере

Процедура УстановитьПериод(ДатаНачала, ДатаОкончания)

Настройки = Отчет.КомпоновщикНастроек.Настройки;

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", ДатаНачала);

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецДня(ДатаОкончания));

КонецПроцедуры

Если отчёт формируется полностью программно (без формы), используйте объекты СхемаКомпоновкиДанных, КомпоновщикНастроекКомпоновкиДанных и КомпоновщикМакетаКомпоновкиДанных. Параметры устанавливаются тем же методом УстановитьЗначениеПараметра до вызова Выполнить компоновщика макета.

Для фонового формирования или регламентных заданий не забудьте, что ТекущаяДатаСеанса на сервере может отличаться от ожиданий пользователя в другом часовом поясе — при необходимости передавайте даты явно.

Типичные ошибки при работе с периодом в СКД
01
Дата окончания без времени: документы последнего дня не попадают в отчёт. Решение — КонецПериода() в запросе или КонецДня() в коде.
02
Параметр в запросе не выведен в пользовательские настройки: пользователь не может изменить период и получает данные за значение по умолчанию.
03
Отбор по периоду в настройках вместо параметров виртуальной таблицы: отчёт по большому регистру формируется в разы дольше.
04
Пустое значение параметра: ошибка «Не задано значение параметра» при формировании.
05
Дублирование условий: период задан и в параметрах виртуальной таблицы, и в ГДЕ с разными границами — данные теряются без видимой причины.

Проверка результата и частые проблемы

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

Если данные не соответствуют ожиданиям, откройте сформированный отчёт и через «Ещё → Изменить вариант» посмотрите фактические значения параметров. Также полезно временно вывести параметры в заголовок отчёта через ресурсы или макет — сразу видно, с какими датами реально выполнялся запрос.

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

Контрольные точки

Как проверить, что период настроен правильно

Поле периода в шапке отчёта
Норма

Пользователь видит и меняет даты перед формированием

Тревожный признак

Поля нет, период меняется только в режиме изменения варианта

Данные за последний день периода
Норма

Документы последнего дня присутствуют в отчёте

Тревожный признак

Последний день пуст — обрезка по времени 00:00:00

Скорость формирования
Норма

Отчёт по регистру формируется за секунды

Тревожный признак

Долгое формирование — период задан отбором, а не параметром виртуальной таблицы

FAQ

Как сделать, чтобы период по умолчанию был текущим месяцем?

На закладке «Параметры» схемы задайте для параметров выражения НачалоМесяца(ТекущаяДатаСеанса()) и КонецМесяца(ТекущаяДатаСеанса()) в колонке «Выражение» значения по умолчанию, либо установите их программно в событии ПриКомпоновкеРезультата модуля отчёта.

Почему отчёт не видит документы за последний день периода?

Дата окончания содержит время 00:00:00, поэтому документы позже начала этого дня отсекаются. Используйте КонецПериода(&КонецПериода, День) в запросе, КонецДня() в коде или передавайте период в параметры виртуальной таблицы — платформа сама учтёт границу.

Можно ли задать период без изменения запроса?

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

Как связать один стандартный период с двумя параметрами запроса?

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

Что делать при ошибке «Не задано значение параметра»?

Параметр используется в запросе, но его значение пустое. Задайте значение по умолчанию в схеме компоновки, в настройках варианта отчёта или установите программно через УстановитьЗначениеПараметра перед формированием.

Как запретить пользователю менять период?

Снимите у параметров флажок «Включать в пользовательские настройки» и уберите их из настроек варианта. Значения задайте выражением или программно — отчёт всегда будет формироваться за фиксированный диапазон.

Итог

Что важно запомнить

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