Даты в системе компоновки данных: параметры, группировки, оформление

· 8 мин

Содержание

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

Самая частая ошибка новичка — вписать дату прямо в текст запроса. Отчёт работает, пока не наступит следующий месяц. Дальше начинается переделка. Параметры экономят это время.

Как добавить параметр даты в схему компоновки

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

Заполните основные свойства:

  • Имя — без пробелов, например ДатаОтчета. Именно оно пишется в запросе после амперсанда.
  • Заголовок — то, что увидит пользователь («Дата отчёта»).
  • Тип — «Дата» с составом «Дата» или «Дата и время».
  • Значение — дата по умолчанию. Можно оставить пустым и задать выражением.
  • Выражение — вычисляемое значение, о нём ниже.

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

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

У схемы с виртуальными таблицами регистров платформа часто создаёт параметры НачалоПериода и КонецПериода сама. Их можно вывести через один параметр Период типа «Стандартный период»: тогда в выражениях параметров начала и конца берутся его границы.

Схема работы такая:

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

Как сделать параметр доступным пользователю

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

Чтобы параметр показывался в быстрых настройках над отчётом, включите его вывод в режиме «Быстрый доступ» в свойствах элемента параметра данных. Для отчётов с одной датой это лучший вариант: человек не лезет в расширенные настройки.

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

В запросе параметр пишется с амперсандом. Никаких кавычек и преобразований не нужно:

ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.Сумма КАК Сумма
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода

Для виртуальных таблиц регистров границы передают прямо в скобках:

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

Третий аргумент — периодичность, о ней в разделе про группировки.

Конец дня: ловушка времени

Если пользователь вводит конечную дату 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 КОНЕЦ) КАК ТекущийМесяц

Тот же приём с другими границами даёт колонку прошлого периода. Разница между колонками считается вычисляемым полем, а процент изменения — отношением к прошлому периоду с защитой от деления на ноль.

Условное оформление по дате

Условное оформление раскрашивает строки, где дата просрочена, подходит срок или значение попало в нужный интервал. Настройка находится в варианте отчёта, на закладке «Условное оформление».

Порядок действий:

  1. Нажмите «Добавить» и в поле «Оформление» выберите цвет текста или фона.
  2. В отборе условия укажите поле с датой и вид сравнения («Меньше», «Больше или равно», «Заполнено»).
  3. В колонке «Поле» отметьте, какие поля раскрашивать — одно или всю строку.

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

Вычисляемое поле как признак

Добавьте на закладке «Вычисляемые поля» поле Просрочено типа «Булево» с выражением:

ДатаОплаты < ТекущаяДата()

Дальше в условном оформлении ставите отбор «Просрочено равно Истина» — и красите строки. Приём универсален: любое сложное условие превращается в булево поле, а оформление остаётся простым.

Для срока «осталось менее трёх дней» подойдёт поле с выражением РазностьДат(ТекущаяДата(), ДатаОплаты, "День") < 3. Вычисляется оно один раз на строку, поэтому нагрузки на формирование почти нет.

💡 Не смешивайте разные оттенки красного и оранжевого в одном отчёте. Три цвета (просрочено, скоро срок, в норме) читаются мгновенно, пять — уже нет.

Как установить дату из кода

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

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;

    ПараметрДаты = Параметры.НайтиЗначениеПараметра(
        Новый ПараметрКомпоновкиДанных("ДатаОтчета"));

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

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

Обратите внимание на три детали:

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

Установка периода

Для стандартного периода значение собирают из объекта:

Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотМесяц);
Параметры.УстановитьЗначениеПараметра("Период", Период);

Метод УстановитьЗначениеПараметра сам включает использование, поэтому в этом случае отдельный флаг не нужен. Подробности работы с коллекцией параметров смотрите в справке по объекту КомпоновщикНастроек в вашей версии платформы.

Из отчёта, открытого другим кодом, значения передают через структуру параметров формы. В ПриСозданииНаСервере формы отчёта читайте её и вызывайте те же методы.

Ошибки с датами в СКД и как их исправить

Диагностика: выберите симптом

Проверка перед передачей отчёта пользователям

Три минуты тестирования избавят от звонков:

  • Сформируйте отчёт за период на стыке месяцев и убедитесь, что последний день на месте.
  • Запустите под учётной записью без прав администратора: часть настроек зависит от прав.
  • Откройте отчёт повторно, чтобы убедиться, что пользовательские настройки сохраняются.

Частые вопросы про даты в СКД

Чем параметр «Дата» отличается от «Стандартного периода»?
Первый хранит одну точку во времени, второй — пару «начало и конец» с готовым выбором вариантов вроде «Прошлый квартал». Интервалы удобнее задавать вторым.
Почему отчёт не реагирует на изменение даты в настройках?
Чаще всего не включён флаг «Использование» у параметра данных в варианте отчёта, либо параметр имеет выражение, которое перекрывает значение.
Как показать в отчёте только текущий месяц без выбора пользователя?
Создайте параметры начала и конца с выражениями на НачалоПериода(ТекущаяДата(), "Месяц") и КонецПериода(ТекущаяДата(), "Месяц") и скройте их ограничением доступности.
Можно ли сравнивать дату с «сегодня» прямо в условном оформлении?
Проще вынести сравнение в вычисляемое булево поле и оформлять по нему. Так условие читается и проверяется отдельно.
Как убрать время из даты в выводе?
Задайте формат поля ДФ=dd.MM.yyyy в оформлении. Значение остаётся полным, меняется только отображение.