Отчеты и Аналитика · 11 мин
Как указать период в СКД 1С: полное руководство
Как указать период в СКД 1С: стандартный период, параметры НачалоПериода и КонецПериода, настройка в конструкторе, отборе и коде. Примеры и ошибки.
Период — самый частый параметр отчётов на системе компоновки данных (СКД) в 1С. Почти любой отчёт — по продажам, остаткам, движениям денег — требует ограничить данные диапазоном дат. При этом у разработчика есть несколько способов задать период: через стандартные даты виртуальных таблиц, через собственные параметры запроса, через настройки пользователя на закладке «Параметры» или программно из кода формы.
Ошибка на этом этапе приводит к типовым проблемам: отчёт формируется за всё время и «виснет», пользователь не видит поле выбора периода, либо параметр заполняется, но на данные не влияет. Все эти ситуации решаются правкой настроек СКД без изменения самого запроса — если понимать, как компоновка связывает параметры запроса с параметрами отчёта.
Материал рассчитан на разработчиков и продвинутых пользователей, работающих с конструктором СКД в конфигураторе 1С:Предприятие 8.3. Примеры применимы к большинству типовых и самописных конфигураций.
Как СКД работает с параметрами периода
Когда в запросе набора данных вы пишете условие вида ГДЕ Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода, СКД автоматически создаёт одноимённые параметры на закладке «Параметры» макета компоновки. Эти параметры — мост между запросом и настройками, которые видит пользователь.
Для виртуальных таблиц регистров (Остатки, Обороты, ОстаткиИОбороты) период задаётся иначе — через параметры самой виртуальной таблицы в фигурных скобках или в её конструкторе: РегистрНакопления.Товары.Обороты(&НачалоПериода, &КонецПериода, , ). Это эффективнее, чем фильтрация в ГДЕ, потому что отбор выполняется на уровне выборки виртуальной таблицы.
Важно понимать разницу: параметр запроса фильтрует данные, а параметр СКД — это то, что можно вывести пользователю, заполнить выражением или связать с отбором. Если параметр есть в запросе, но не настроен в СКД, отчёт при формировании потребует его значение и выдаст ошибку «Не задано значение параметра».
Способ 1. Параметры НачалоПериода и КонецПериода в запросе
Классический подход — объявить два параметра типа «Дата» и использовать их в условии запроса. Откройте схему компоновки, закладку «Наборы данных», и в тексте запроса добавьте условие:
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Количество
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
После этого перейдите на закладку «Параметры» и проверьте, что оба параметра появились в списке. Установите для них тип «Дата» с составом даты «Дата» (без времени — иначе конец периода 23:59:59 придётся учитывать отдельно, либо используйте функцию КонецПериода()).
Частая тонкость: дата конца периода по умолчанию содержит время 00:00:00, то есть документы за последний день не попадут в отчёт. Решение — обернуть параметр в выражение: КонецПериода(&КонецПериода, День) в запросе либо использовать виртуальную таблицу, где платформа сама корректно обрабатывает границы при указании вида периода.
// Заполнение параметров программно
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Параметры.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Параметры.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));Способ 2. Стандартный период одним полем
Два отдельных поля «Дата начала» и «Дата окончания» неудобны пользователю. Тип «Стандартный период» решает это: одно поле с выпадающим списком вариантов «Сегодня», «Этот месяц», «Произвольный период» и т.д.
Чтобы подключить стандартный период, добавьте в схеме компоновки параметр, например ПериодОтчета, с типом «СтандартныйПериод». Затем на закладке «Параметры» для параметров НачалоПериода и КонецПериода укажите в колонке «Выражение» соответственно &ПериодОтчета.ДатаНачала и &ПериодОтчета.ДатаОкончания и снимите у них флажок «Ограничение доступности» не трогая — главное, убрать их из пользовательских настроек, оставив только ПериодОтчета.
Альтернатива без кода: в типовых отчётах на управляемых формах период часто выводится автоматически, если параметры названы стандартно (НачалоПериода, КонецПериода) — библиотека стандартных подсистем подхватывает их и рисует единое поле периода. В самописных отчётах надёжнее настроить связь через стандартный период вручную.
- 1В запросе набора данных добавьте параметры &НачалоПериода и &КонецПериода в параметры виртуальной таблицы или в условие ГДЕ
- 2На закладке «Параметры» проверьте тип «Дата» и задайте значения по умолчанию
- 3Включите флажок «Включать в пользовательские настройки» у обоих параметров
- 4В режиме настроек отчёта (закладка «Настройки» → «Параметры») отметьте параметры как видимые для пользователя
- 5Сформируйте отчёт и проверьте, что данные ограничены выбранным диапазоном
Вывод периода в пользовательские настройки
Параметр, созданный в схеме, по умолчанию не виден пользователю в режиме «Ещё → Изменить вариант». Чтобы даты можно было менять перед формированием, на закладке «Параметры» схемы компоновки включите для параметров периода флажок «Включать в пользовательские настройки» и при необходимости задайте представление — например, «Начало периода» вместо технического имени.
Далее откройте закладку «Настройки» схемы, выберите вариант отчёта и на вкладке «Параметры» установите значения по умолчанию. Распространённая практика — оставить значения пустыми, но тогда заполните их программно в событии «ПриКомпоновкеРезультата» или в модуле формы отчёта, иначе отчёт сформируется за пустой диапазон.
В управляемых формах пользовательские настройки выводятся в шапку отчёта, если у параметра стоит режим редактирования «Быстрый доступ». Это делается в настройках варианта: выделите параметр и в свойствах пользовательской настройки выберите отображение в шапке.
Период через отбор вместо параметров запроса
Не всегда нужно править запрос. Если набор данных выбирает поле Период (например, из таблицы документов или физической таблицы регистра), ограничить диапазон можно отбором СКД: на закладке «Настройки» → «Отбор» добавьте условие «Период» с видом сравнения «В диапазоне» или два условия «Больше или равно» / «Меньше или равно» со ссылками на параметры.
Этот способ гибче: пользователь сам может менять условие отбора. Но он медленнее для больших таблиц — отбор применяется после выборки, а не внутри виртуальной таблицы. Для регистров накопления всегда предпочтительнее передавать период в параметры виртуальной таблицы Обороты или ОстаткиИОбороты.
Комбинированный вариант: жёсткое ограничение в параметрах виртуальной таблицы (для производительности) плюс отбор в настройках (для гибкости). СКД корректно объединит оба условия.
Способы задать период в СКД
Самый быстрый для регистров: отбор на уровне СУБД. Ограничение — работает только с виртуальными таблицами регистров.
Универсально для любых запросов, включая соединения таблиц. Требует аккуратности с границами дат (время 00:00:00).
Гибко для пользователя, не требует правки запроса. Медленнее на больших объёмах, т.к. фильтрация после выборки.
Удобный интерфейс выбора. Требует связать выражениями с параметрами запроса.
Программная установка периода из кода формы
Когда отчёт открывается из документа или обработки, период часто нужно подставить автоматически. Для этого используется объект настроек компоновщика. В модуле формы отчёта:
&НаСервере
Процедура УстановитьПериод(ДатаНачала, ДатаОкончания)
Настройки = Отчет.КомпоновщикНастроек.Настройки;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", ДатаНачала);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецДня(ДатаОкончания));
КонецПроцедуры
Если отчёт формируется полностью программно (без формы), используйте объекты СхемаКомпоновкиДанных, КомпоновщикНастроекКомпоновкиДанных и КомпоновщикМакетаКомпоновкиДанных. Параметры устанавливаются тем же методом УстановитьЗначениеПараметра до вызова Выполнить компоновщика макета.
Для фонового формирования или регламентных заданий не забудьте, что ТекущаяДатаСеанса на сервере может отличаться от ожиданий пользователя в другом часовом поясе — при необходимости передавайте даты явно.
Проверка результата и частые проблемы
После настройки сформируйте отчёт трижды: за текущий месяц, за один день и за заведомо пустой период. В первом случае проверьте, что итоги совпадают с эталонным отчётом конфигурации (например, типовым «Продажи»), во втором — что данные последнего дня не обрезаны, в третьем — что отчёт выдаёт пустую таблицу без ошибок.
Если данные не соответствуют ожиданиям, откройте сформированный отчёт и через «Ещё → Изменить вариант» посмотрите фактические значения параметров. Также полезно временно вывести параметры в заголовок отчёта через ресурсы или макет — сразу видно, с какими датами реально выполнялся запрос.
При подозрении на производительность сравните текст запроса в консоли СКД (или через технологический журнал): период должен попадать в параметры виртуальной таблицы, а не в итоговое условие WHERE по всей таблице регистра.
Как проверить, что период настроен правильно
Пользователь видит и меняет даты перед формированием
Поля нет, период меняется только в режиме изменения варианта
Документы последнего дня присутствуют в отчёте
Последний день пуст — обрезка по времени 00:00:00
Отчёт по регистру формируется за секунды
Долгое формирование — период задан отбором, а не параметром виртуальной таблицы
FAQ
Как сделать, чтобы период по умолчанию был текущим месяцем?
На закладке «Параметры» схемы задайте для параметров выражения НачалоМесяца(ТекущаяДатаСеанса()) и КонецМесяца(ТекущаяДатаСеанса()) в колонке «Выражение» значения по умолчанию, либо установите их программно в событии ПриКомпоновкеРезультата модуля отчёта.
Почему отчёт не видит документы за последний день периода?
Дата окончания содержит время 00:00:00, поэтому документы позже начала этого дня отсекаются. Используйте КонецПериода(&КонецПериода, День) в запросе, КонецДня() в коде или передавайте период в параметры виртуальной таблицы — платформа сама учтёт границу.
Можно ли задать период без изменения запроса?
Да, если в наборе данных доступно поле Период: добавьте отбор в настройках варианта с видом сравнения «В диапазоне». Учтите, что для больших регистров это медленнее, чем параметры виртуальной таблицы.
Как связать один стандартный период с двумя параметрами запроса?
Создайте параметр типа «СтандартныйПериод», а для параметров НачалоПериода и КонецПериода на закладке «Параметры» укажите выражения &ПериодОтчета.ДатаНачала и &ПериодОтчета.ДатаОкончания, убрав их из пользовательских настроек.
Что делать при ошибке «Не задано значение параметра»?
Параметр используется в запросе, но его значение пустое. Задайте значение по умолчанию в схеме компоновки, в настройках варианта отчёта или установите программно через УстановитьЗначениеПараметра перед формированием.
Как запретить пользователю менять период?
Снимите у параметров флажок «Включать в пользовательские настройки» и уберите их из настроек варианта. Значения задайте выражением или программно — отчёт всегда будет формироваться за фиксированный диапазон.
Что важно запомнить
Период в СКД задаётся параметрами запроса, параметрами виртуальных таблиц регистров или отбором в настройках. Для производительности передавайте даты в виртуальную таблицу, для удобства пользователя выводите стандартный период в быстрые настройки и всегда проверяйте границу конца периода — время 00:00:00 отсекает последний день.