СКД в 1С

Параметры-даты и периоды в СКД: НачалоПериода, КонецПериода и СтандартныйПериод

Коротко

Параметры НачалоПериода и КонецПериода появляются в СКД автоматически, если в наборе данных используется виртуальная таблица с периодом (остатки, обороты, срез). Задать им значение из кода можно через Настройки.ПараметрыДанных.УстановитьЗначениеПараметра().

Удобнее один параметр типа СтандартныйПериод: он хранит ДатаНачала и ДатаОкончания, причём дата окончания уже приведена к 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С

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

Популярный выбор
990 руб. в месяц
≈ 5 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

3900 руб. в месяц
≈ 19,5 млн токенов

Для интенсивного использования или команд

Выбрать тариф