Параметры-даты и периоды в СКД: НачалоПериода, КонецПериода и СтандартныйПериод
Параметры НачалоПериода и КонецПериода появляются в СКД автоматически,
если в наборе данных используется виртуальная таблица с периодом (остатки, обороты, срез).
Задать им значение из кода можно через
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра().
Удобнее один параметр типа СтандартныйПериод: он хранит
ДатаНачала и ДатаОкончания, причём дата окончания уже приведена
к 23:59:59. Именно поэтому пара «две даты типа Дата» теряет документы
последнего дня, а стандартный период — нет.
Стандартные параметры НачалоПериода и КонецПериода
Когда набор данных СКД обращается к виртуальной таблице регистра
(ОстаткиИОбороты, Обороты, СрезПоследних), границы периода
передают параметрами запроса. Классическая связка «начало периода конец периода» в СКД выглядит так:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.КоличествоОборот КАК Количество,
Продажи.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(
&НачалоПериода,
&КонецПериода,
Регистратор,
) КАК Продажи
Оба параметра автоматически попадают на вкладку Параметры схемы компоновки данных
с типом Дата. Там же задают заголовок, доступные значения и признак
ограничения доступности. Параметры набора данных и параметры компоновки — это одна сущность:
СКД сама подставляет значение параметра компоновки в текст запроса.
Практическое следствие: если параметр не выведен пользователю и его значение не задано,
в запрос уйдёт пустая дата 01.01.0001 0:00:00. Для начала периода это обычно
безопасно, для конца — отчёт окажется пустым.
Тип СтандартныйПериод: один параметр вместо двух
Вместо двух дат в схеме заводят один параметр Период с типом
СтандартныйПериод. Пользователь получает привычный выбор «Этот месяц»,
«Прошлый квартал», «Произвольный период», а разработчик — готовые границы:
Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.ПрошлыйМесяц);
Сообщить(Период.ДатаНачала); // 01.05.2024 0:00:00
Сообщить(Период.ДатаОкончания); // 31.05.2024 23:59:59
// Произвольные границы задаются вторым конструктором
Произвольный = Новый СтандартныйПериод(НачалоМес, КонецМес);
Ключевой момент: у стандартного периода ДатаОкончания — это конец дня
(23:59:59), а не полночь. Поэтому обороты за последний день попадают в отчёт без
дополнительных ухищрений. Пустой конструктор Новый СтандартныйПериод()
даёт незаполненный период — его удобно использовать как значение по умолчанию.
Выражения в значениях параметров: связываем период и границы
Если в схеме есть параметр Период типа СтандартныйПериод, то
НачалоПериода и КонецПериода пользователю показывать не нужно.
Их значения задают выражением в колонке «Выражение» на вкладке «Параметры»:
// Параметр НачалоПериода, колонка «Выражение»
&Период.ДатаНачала
// Параметр КонецПериода, колонка «Выражение»
&Период.ДатаОкончания
У обоих служебных параметров при этом снимают флажок «Доступен» (ограничение доступности), чтобы они не попадали в пользовательские настройки. Пользователь выбирает один период — СКД вычисляет обе границы сама. Это самый устойчивый способ задать параметры-даты в СКД: границы не разъезжаются и не требуют кода в модуле отчёта.
В выражениях доступны и другие параметры схемы, поэтому так же удобно вычислять сопоставимый период прошлого года или дату актуальности для среза последних.
ПараметрыДанных
до и после установки — видно, какой параметр остался с флагом
Использование = Ложь.
Конец дня: почему выпадают документы последнего дня
Самая частая жалоба по параметрам даты в СКД: отчёт «за май» не показывает документы
31 мая. Причина в том, что параметр типа Дата с составом «Дата» хранит
время 0:00:00. Условие Дата <= &КонецПериода превращается
в «до 31.05.2024 0:00:00», и весь последний день отсекается.
Рабочие варианты решения, по убыванию надёжности:
-
Тип СтандартныйПериод.
ДатаОкончанияуже равна 23:59:59 — править ничего не нужно. -
Арифметика дат в коде отчёта. Прибавление числа секунд к дате даёт
конец дня:
ДатаОкончания = ДатаКонца + 86399. - Тип «Дата и время» у параметра. Пользователь вводит время сам — вариант для регламентных выгрузок, но не для рядового пользователя.
// Параметр введён как 31.05.2024 0:00:00
ДатаКонца = НачалоДняПериода; // значение из формы
ГраницаОкончания = ДатаКонца + 86399; // 31.05.2024 23:59:59
Для виртуальных таблиц оборотов это критично: интервал в СКД включает обе границы, поэтому «недокрученный» конец периода режет ровно один рабочий день, а расхождение в отчёте выглядит как ошибка учёта.
Как задать параметр СКД программно
Запрос «1с скд задать параметр» почти всегда про установку значения из модуля отчёта или
обработки. Значения параметров-дат живут в коллекции ПараметрыДанных настроек
компоновки:
Настройки = КомпоновщикНастроек.Настройки;
Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотМесяц);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", Период);
// Пара отдельных дат
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", Период.ДатаНачала);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", Период.ДатаОкончания);
Метод одновременно взводит признак использования, поэтому отдельно включать параметр не требуется. Если же нужно прочитать текущее значение параметра или точечно изменить только флаг использования — берут само значение параметра:
ЗначениеПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("КонецПериода"));
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Использование = Истина;
ЗначениеПараметра.Значение = ДатаОкончания;
КонецЕсли;
Свойство Использование — то самое, из-за чего «значение параметра стоит,
а отчёт его игнорирует». При Ложь СКД подставит в запрос значение по умолчанию
из схемы, а не то, что записали в Значение.
Ограничение периода в пользовательских настройках
Чтобы пользователь мог менять период прямо в форме отчёта, значение параметра нужно вынести в пользовательские настройки: задать идентификатор и режим отображения.
ЗначениеПериода = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("Период"));
ЗначениеПериода.ИдентификаторПользовательскойНастройки = "Период";
ЗначениеПериода.ПредставлениеПользовательскойНастройки = "Период отчёта";
ЗначениеПериода.РежимОтображения =
РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
Режим БыстрыйДоступ выводит выбор периода в шапку формы отчёта — это то,
что в типовых конфигурациях выглядит как поле «Период» с кнопкой выбора стандартного периода.
Режим Недоступный прячет параметр от пользователя, оставляя значение из кода.
Ограничить набор допустимых значений можно на уровне схемы: у параметра задают доступные значения и флаг «Запрещать незаполненные значения», после чего пустая дата в отчёт не пройдёт.
Проверка: какое значение реально ушло в отчёт
Перед выводом результата полезно распечатать все параметры данных вместе с флагом использования — это снимает 90% вопросов «почему параметр даты не применился»:
Для Каждого Элемент Из Настройки.ПараметрыДанных.Элементы Цикл
Сообщить(Строка(Элемент.Параметр) + " = " + Строка(Элемент.Значение)
+ " / Использование: " + Строка(Элемент.Использование));
КонецЦикла;
Если параметр в списке отсутствует, значит в схеме его нет: имя в коде и имя в СКД
должны совпадать точно, включая регистр. Отсутствующий параметр
НайтиЗначениеПараметра() вернёт как Неопределено, а
УстановитьЗначениеПараметра() просто ничего не сделает — без ошибки.
Частые ошибки с параметрами дат в СКД
-
Конец периода без времени. Значение
31.05.2024 0:00:00отсекает последний день. Лечится типомСтандартныйПериодили явным добавлением 86399 секунд. -
Забытое свойство
Использование. Значение записано, но флаг снят — в запрос уходит значение по умолчанию из схемы. - Установка параметров в пользовательские настройки вместо основных. При обновлении варианта отчёта пользовательские настройки перезатираются, и период «сбрасывается сам собой».
-
Опечатка в имени параметра.
"КонецПериода "с пробелом или другой регистр — параметр молча не установится. -
Две даты вместо стандартного периода. Пользователь может выбрать
конец раньше начала. У
СтандартныйПериодтакой ошибки нет, а для пары дат нужна собственная проверка. -
Доступность служебных параметров. Если
НачалоПериодаиКонецПериодазаданы выражениями, но остались доступными, пользователь перебьёт вычисленные границы вручную.
Частые вопросы о параметрах даты в СКД
Как задать параметр СКД программно из модуля отчёта?
Через коллекцию параметров данных настроек:
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", Значение).
Метод сам взводит признак использования. Для чтения текущего значения применяют
НайтиЗначениеПараметра().
Почему в отчёт не попадают документы последнего дня периода?
Параметр КонецПериода имеет время 0:00:00, а условие включает
границу. Нужен конец дня: тип СтандартныйПериод с
ДатаОкончания 23:59:59 либо добавление 86399 секунд к дате.
Как связать один параметр Период с НачалоПериода и КонецПериода?
В схеме компоновки в колонке «Выражение» служебных параметров указывают
&Период.ДатаНачала и &Период.ДатаОкончания, а сами
параметры делают недоступными для пользователя.
ИИ Консоль запросов 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Популярный выборДля индивидуального использования
- До 5ти конфигураций
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Для интенсивного использования или команд
- До 15-ти конфигураций
-
≈ 300 задач Подробнее про лимиты
- Техническая поддержка