Даты в системе компоновки данных: параметры, группировки, оформление
Содержание
Чтобы установить дату в СКД, создайте на закладке «Параметры» схемы компоновки параметр с типом «Дата» (или «Стандартный период» для интервала), используйте его в запросе как &ИмяПараметра и разрешите пользователю менять значение. Всё остальное — вариации на эту тему: период вместо одной даты, значение по умолчанию через выражение, установка из кода.
Самая частая ошибка новичка — вписать дату прямо в текст запроса. Отчёт работает, пока не наступит следующий месяц. Дальше начинается переделка. Параметры экономят это время.
Как добавить параметр даты в схему компоновки
Откройте схему в конфигураторе или в режиме конфигурирования внешнего отчёта. Перейдите на закладку «Параметры» и нажмите «Добавить».
Заполните основные свойства:
- Имя — без пробелов, например
ДатаОтчета. Именно оно пишется в запросе после амперсанда. - Заголовок — то, что увидит пользователь («Дата отчёта»).
- Тип — «Дата» с составом «Дата» или «Дата и время».
- Значение — дата по умолчанию. Можно оставить пустым и задать выражением.
- Выражение — вычисляемое значение, о нём ниже.
Если нужен интервал, а не одна точка, проще взять тип «Стандартный период». Пользователь получит привычный выбор «Этот месяц», «Прошлый квартал», «Произвольный период».
Стандартные параметры периода
У схемы с виртуальными таблицами регистров платформа часто создаёт параметры НачалоПериода и КонецПериода сама. Их можно вывести через один параметр Период типа «Стандартный период»: тогда в выражениях параметров начала и конца берутся его границы.
Схема работы такая:
- Создаёте параметр
Периодс типом «Стандартный период». - Параметру
НачалоПериодазадаёте выражение&Период.ДатаНачала. - Параметру
КонецПериода— выражение&Период.ДатаОкончания. - Для
НачалоПериодаиКонецПериодавключаете «Ограничение доступности», чтобы пользователь видел один удобный селектор, а не три поля.
Как сделать параметр доступным пользователю
Параметр не появится в окне настроек отчёта, если он не выведен в настройки варианта. Откройте закладку «Настройки», затем «Параметры данных» и найдите нужный параметр. Поставьте флаг «Использование» — слева от имени. Без этого флага СКД подставит значение по умолчанию, а изменения пользователя игнорирует.
Чтобы параметр показывался в быстрых настройках над отчётом, включите его вывод в режиме «Быстрый доступ» в свойствах элемента параметра данных. Для отчётов с одной датой это лучший вариант: человек не лезет в расширенные настройки.
Как использовать дату в тексте запроса
В запросе параметр пишется с амперсандом. Никаких кавычек и преобразований не нужно:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Сумма КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
Для виртуальных таблиц регистров границы передают прямо в скобках:
ИЗ
РегистрНакопления.Продажи.Обороты(
&НачалоПериода,
&КонецПериода,
Месяц,
) КАК Обороты
Третий аргумент — периодичность, о ней в разделе про группировки.
Конец дня: ловушка времени
Если пользователь вводит конечную дату 31.01.2026, в параметр приходит 31.01.2026 0:00:00. Документы, проведённые в тот же день в 15:30, в выборку не попадут. Симптом знакомый: отчёт «теряет» последний день.
Выход — привести границу к концу дня в выражении параметра:
КонецПериода(&ДатаОтчета, "День")
Функция вернёт 31.01.2026 23:59:59. Для начала дня используйте НачалоПериода(&ДатаОтчета, "День").
Для остатков на дату рассуждение другое: таблица Остатки берёт состояние на момент границы. Если нужны остатки на конец дня, задайте границу как КонецПериода, а не начало.
Значение по умолчанию через выражение
Выражение параметра вычисляется при формировании отчёта. Несколько рабочих заготовок:
| Что нужно | Выражение |
|---|---|
| Сегодня | НачалоПериода(ТекущаяДата(), "День") |
| Начало текущего месяца | НачалоПериода(ТекущаяДата(), "Месяц") |
| Конец прошлого месяца | КонецПериода(ДобавитьКДате(ТекущаяДата(), "Месяц", -1), "Месяц") |
| Начало года | НачалоПериода(ТекущаяДата(), "Год") |
| Тридцать дней назад | ДобавитьКДате(ТекущаяДата(), "День", -30) |
Такие функции работают в языке выражений СКД. В тексте запроса используется другой синтаксис, и это частая путаница.
Как сгруппировать данные по периодам
Группировка по месяцам, кварталам или неделям делается двумя способами. Выбирайте по тому, где проще получить нужный результат.
Способ 1. Периодичность в запросе
Если источник — виртуальная таблица регистра, задайте периодичность в её параметрах: День, Неделя, Месяц, Квартал, Год. В результате в таблице появится поле Период, по которому можно группировать.
Для обычной таблицы приведите дату к началу периода функцией языка запросов:
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК Месяц
Теперь все документы января получат одно значение 01.01.2026 0:00:00, и группировка по полю Месяц сложит их вместе.
Способ 2. Дополнение периода в группировке
В настройках варианта отчёта добавьте группировку по полю с датой. Откройте её свойства: у поля группировки есть тип дополнения — по какой единице добавлять пропущенные периоды — и границы дополнения.
Зачем это нужно. Допустим, продаж в марте не было. Обычная группировка пропустит строку целиком, а с дополнением марта в итоге будет строка с нулём. Для динамики по месяцам это принципиально: пропуск выглядит как ошибка в данных.
Границы дополнения можно связать с параметрами отчёта. Тогда период в строках всегда совпадает с тем, что выбрал пользователь.
| Способ | Когда подходит | Риск |
|---|---|---|
| Периодичность в виртуальной таблице | Данные из регистров | Нет пустых периодов |
НАЧАЛОПЕРИОДА в запросе | Документы и справочники | Нужно самому дополнять пустые периоды |
| Дополнение в группировке | Нужна непрерывная шкала | Требует настройки границ |
Как показать месяц словом
Дата в поле группировки выводится целиком. Чтобы получить «Январь 2026», задайте формат в оформлении поля: строка формата ДФ='MMMM yyyy'. Такой вывод не меняет значение, поэтому сортировка остаётся правильной — по дате, а не по алфавиту.
Остатки(&ДатаОтчета). Конец дня задайте выражением КонецПериода.Период типа «Стандартный период». Начало и конец берутся из его свойств, остальные параметры скрывают ограничением доступности.ТекущаяДата() и НачалоПериода. Пользователю параметр не показывают.Сравнение двух периодов в одном отчёте
Часто нужно показать «этот месяц» рядом с «прошлым». Заводите два набора параметров: НачалоТекущего, КонецТекущего и НачалоПрошлого, КонецПрошлого. Второй набор считайте от первого выражением ДобавитьКДате(&НачалоТекущего, "Месяц", -1), чтобы пользователь выбирал только один период.
В запросе объедините две выборки по полю периода или возьмите одну таблицу с отбором на оба интервала и разнесите значения по колонкам условными суммами:
СУММА(ВЫБОР КОГДА Продажи.Период МЕЖДУ &НачалоТекущего И &КонецТекущего
ТОГДА Продажи.Сумма ИНАЧЕ 0 КОНЕЦ) КАК ТекущийМесяц
Тот же приём с другими границами даёт колонку прошлого периода. Разница между колонками считается вычисляемым полем, а процент изменения — отношением к прошлому периоду с защитой от деления на ноль.
Условное оформление по дате
Условное оформление раскрашивает строки, где дата просрочена, подходит срок или значение попало в нужный интервал. Настройка находится в варианте отчёта, на закладке «Условное оформление».
Порядок действий:
- Нажмите «Добавить» и в поле «Оформление» выберите цвет текста или фона.
- В отборе условия укажите поле с датой и вид сравнения («Меньше», «Больше или равно», «Заполнено»).
- В колонке «Поле» отметьте, какие поля раскрашивать — одно или всю строку.
Проблема в том, что в самом отборе удобно сравнивать дату с константой, а не с «сегодня». Решается это через вычисляемое поле.
Вычисляемое поле как признак
Добавьте на закладке «Вычисляемые поля» поле Просрочено типа «Булево» с выражением:
ДатаОплаты < ТекущаяДата()
Дальше в условном оформлении ставите отбор «Просрочено равно Истина» — и красите строки. Приём универсален: любое сложное условие превращается в булево поле, а оформление остаётся простым.
Для срока «осталось менее трёх дней» подойдёт поле с выражением РазностьДат(ТекущаяДата(), ДатаОплаты, "День") < 3. Вычисляется оно один раз на строку, поэтому нагрузки на формирование почти нет.
💡 Не смешивайте разные оттенки красного и оранжевого в одном отчёте. Три цвета (просрочено, скоро срок, в норме) читаются мгновенно, пять — уже нет.
Как установить дату из кода
Когда отчёт открывается из формы документа или обработки, значения параметров нужно подставить программно. Для этого есть компоновщик настроек.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрДаты = Параметры.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("ДатаОтчета"));
Если ПараметрДаты <> Неопределено Тогда
ПараметрДаты.Использование = Истина;
ПараметрДаты.Значение = КонецДня(ТекущаяДатаСеанса());
КонецЕсли;
КонецПроцедуры
Обратите внимание на три детали:
Использование = Истинаобязательно. Без него значение записано, но не применяется.ТекущаяДатаСеанса()берёт время с учётом часового пояса сеанса. Для серверного кода это правильнее, чемТекущаяДата().КонецДня— функция встроенного языка, она работает вне запроса.
Установка периода
Для стандартного периода значение собирают из объекта:
Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотМесяц);
Параметры.УстановитьЗначениеПараметра("Период", Период);
Метод УстановитьЗначениеПараметра сам включает использование, поэтому в этом случае отдельный флаг не нужен. Подробности работы с коллекцией параметров смотрите в справке по объекту КомпоновщикНастроек в вашей версии платформы.
Из отчёта, открытого другим кодом, значения передают через структуру параметров формы. В ПриСозданииНаСервере формы отчёта читайте её и вызывайте те же методы.
Ошибки с датами в СКД и как их исправить
&НачалоПериода, а не константа.КонецПериода(&Дата, "День").Проверка перед передачей отчёта пользователям
Три минуты тестирования избавят от звонков:
- Сформируйте отчёт за период на стыке месяцев и убедитесь, что последний день на месте.
- Запустите под учётной записью без прав администратора: часть настроек зависит от прав.
- Откройте отчёт повторно, чтобы убедиться, что пользовательские настройки сохраняются.
Частые вопросы про даты в СКД
Чем параметр «Дата» отличается от «Стандартного периода»?
Почему отчёт не реагирует на изменение даты в настройках?
Как показать в отчёте только текущий месяц без выбора пользователя?
НачалоПериода(ТекущаяДата(), "Месяц") и КонецПериода(ТекущаяДата(), "Месяц") и скройте их ограничением доступности.Можно ли сравнивать дату с «сегодня» прямо в условном оформлении?
Как убрать время из даты в выводе?
ДФ=dd.MM.yyyy в оформлении. Значение остаётся полным, меняется только отображение.