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

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

1С СКД: как установить дату в отчете

Как установить дату в отчете на СКД в 1С: параметры периода, стандартная дата начала и окончания, выражения на языке СКД, настройки пользователя.

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

Есть несколько уровней установки даты: в схеме компоновки на вкладке «Параметры», в настройках отчёта на вкладке «Параметры данных», в отборе самого запроса и программно — через объект настроек компоновщика. Каждый способ решает свою задачу: одни подходят для разработчика, другие — для конечного пользователя.

Ниже разобраны основные сценарии: создание параметров периода, использование стандартного периода, установка даты по умолчанию, программная установка значений и типичные ошибки, из-за которых отчёт выводит данные не за тот период или не выводит ничего.

Как работают параметры даты в СКД

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

Поэтому установка даты всегда состоит из двух частей: объявление параметра в схеме компоновки и использование его в запросе или в отборе. Пропуск любой из частей — самая частая причина «не работающего» периода.

Создание параметров НачалоПериода и КонецПериода

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

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

Чтобы конец периода включал весь последний день, в параметрах виртуальных таблиц дата окончания трактуется как граница, включающая указанный момент. Если вы фильтруете через ГДЕ по реальной таблице, используйте функцию КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), иначе записи за последний день после полуночи потеряются.

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

Использование стандартного периода

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

Чтобы запрос получил границы стандартного периода, в выражениях параметров укажите: для НачалоПериода — &Период.ДатаНачала, для КонецПериода — &Период.ДатаОкончания. Либо передавайте границы в коде при программной установке настроек.

Обратите внимание: если стандартный период не заполнен, его границы пустые, и запрос без дополнительной обработки вернёт пустой результат. Для типовых отчётов платформа часто подставляет период автоматически, но в собственных схемах это нужно контролировать.

Значения даты по умолчанию

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

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

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

Программная установка даты

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

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

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

После настройки сформируйте отчёт за заведомо известный период, где есть данные, и сверьте итоги с аналогичным типовым отчётом. Если данные не совпадают — проверяйте границы периода: чаще всего теряется последний день из-за отсутствия КОНЕЦПЕРИОДА или неверного времени в дате окончания.

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

Как проверить результат

Итог за последний день периода
Норма

Записи последнего дня попадают в отчёт

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

Данные последнего дня отсутствуют — проверьте КОНЕЦПЕРИОДА или время в дате окончания

Поведение при смене периода пользователем
Норма

Отчёт пересчитывается под новые даты

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

Даты не влияют на результат — параметр не используется в запросе или отключён

Пустой период
Норма

Отчёт сообщает о необходимости заполнить период

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

Формируется выборка по всем данным без ограничений

Типичные ошибки
01
Параметр создан, но не использован в запросе — даты не влияют на выборку
02
Не установлено Использование = Истина при программной установке — параметр игнорируется
03
Фильтрация по реальной таблице без КОНЕЦПЕРИОДА — теряются записи последнего дня
04
Параметр скрыт от пользователя и не заполнен по умолчанию — отчёт выдаёт ошибку при формировании
05
Несовпадение имён параметров в схеме и в запросе — платформа выдаёт ошибку компоновки

FAQ

Как сделать, чтобы пользователь сам выбирал даты перед формированием отчёта?

На вкладке «Настройки» схемы компоновки откройте раздел «Параметры» и добавьте нужные параметры в пользовательские настройки с режимом отображения «Быстрый доступ». Тогда даты появятся на панели над отчётом, и пользователь сможет менять их без входа в полные настройки.

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

Дата окончания обычно содержит время 00:00:00, то есть начало последнего дня. В условии ГДЕ используйте КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ) или оператор МЕЖДУ с границей конца дня. В параметрах виртуальных таблиц регистров граница обрабатывается корректно, но зависит от переданного времени.

Можно ли задать дату жёстко, чтобы пользователь не мог её изменить?

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

Как установить период «текущий месяц» автоматически при открытии?

В модуле формы отчёта в обработчике ПриСозданииНаСервере найдите параметры в ПараметрыДанных настроек компоновщика и присвойте им НачалоМесяца(ТекущаяДатаСеанса()) и КонецМесяца(ТекущаяДатаСеанса()). Не забудьте установить Использование = Истина.

Чем отличается параметр в запросе от параметра виртуальной таблицы?

Параметр виртуальной таблицы ограничивает выборку на этапе её формирования — это быстрее и снижает нагрузку. Параметр в условии ГДЕ фильтрует уже полученный результат. Для периодов регистров накопления и сведений предпочтительнее передавать даты в параметры виртуальной таблицы.

Отчёт выдаёт ошибку «Параметр не заполнен» — что проверить?

Проверьте, что у параметра включено использование (флажок в настройках или Использование = Истина в коде), значение не пустое, а имя параметра в настройках совпадает с именем в запросе. Также убедитесь, что пользовательские настройки не переопределяют значение пустым.

Итог

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

Дата в СКД задаётся через параметры, которые обязательно должны использоваться в запросе. Для пользователей удобнее стандартный период, для кода — установка через ПараметрыДанных с Использование = Истина. Главные ловушки: потеря последнего дня без КОНЕЦПЕРИОДА и отключённый флаг использования параметра.