Отчеты и Аналитика · 11 мин
Как в СКД-отчете 1С сделать свой период
Как в СКД-отчете 1С настроить свой период: параметры НачалоПериода и КонецПериода, стандартные периоды, произвольные даты, выражения в запросе и настройки периода для пользователя.
Задача «свой период» в отчете на СКД возникает почти в каждом проекте: пользователю нужно не просто выбрать стандартный месяц или квартал, а задать произвольный интервал дат, сравнить периоды или получить данные «на дату» с отбором по движениям. Система компоновки данных позволяет решить это несколькими способами — от простых параметров даты до вычисляемых полей и собственных форм настроек.
Основная сложность в том, что СКД обрабатывает даты по-разному в зависимости от того, где они заданы: в тексте запроса, в параметрах виртуальной таблицы, в отборах компоновки или в пользовательских настройках. Неправильно выбранное место для периода приводит к лишним соединениям, медленной работе отчета или ошибкам «параметр не заполнен».
Ниже разобраны рабочие способы задать свой период в СКД-отчете: через параметры запроса, стандартные периоды, выражения в тексте запроса, отборы компоновки и программную установку значений. Для каждого варианта указаны условия применения и типичные ошибки.
Как СКД работает с датами и периодами
В СКД период — это обычно два значения типа «Дата»: начало и конец интервала. Они могут участвовать в трех местах схемы компоновки: в параметрах виртуальной таблицы регистра (например, Обороты регистра накопления), в условии отбора текста запроса и в отборах самой компоновки на закладке «Отбор».
Самый эффективный вариант — передавать период в параметры виртуальной таблицы. Тогда платформа отбирает данные на уровне СУБД до соединений и группировок, что существенно быстрее, чем фильтрация готового результата. Отбор же на уровне компоновки применяется уже к полученному набору и не ускоряет запрос.
Важно понимать разницу между датой начала и датой окончания: конец периода в регистрах обычно нужно указывать с точностью до конца дня. Если пользователь ввел «31.01.2026», то без корректировки отбор захватит только 00:00:00, и данные за день потеряются. Для этого используют функцию КонецПериода() в запросе или добавляют 86399 секунд.
Параметры НачалоПериода и КонецПериода в запросе
Базовый способ — создать в схеме компоновки два параметра: НачалоПериода и КонецПериода, оба типа «Дата» с составом «Дата и время». В тексте запроса они подставляются в параметры виртуальной таблицы регистра:
Обороты(&НачалоПериода, &КонецПериода, , )
Если данные берутся не из виртуальной таблицы, а прямым запросом к таблице документов или регистра, параметры указываются в условии:
ГДЕ Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
На закладке «Параметры» схемы компоновки для этих параметров снимите флаг «Ограничение доступности», если пользователь должен менять их в режиме предприятия. При необходимости задайте значения по умолчанию — например, выражение НачалоМесяца(&ТекущаяДата) через параметр-выражение или программно при создании отчета.
Проверьте, что у параметров не стоит признак «Включать в доступные поля» с запретом редактирования, если отчет формируется из формы: иначе при открытии пользователь увидит пустые даты и получит ошибку «Значение параметра не установлено» либо пустой отчет.
- 1Откройте схему компоновки данных отчета, закладка «Параметры»
- 2Добавьте параметры НачалоПериода и КонецПериода типа «Дата»
- 3Подставьте параметры в текст запроса: в параметры виртуальной таблицы или в условие ГДЕ
- 4Для конца периода используйте КонецПериода(&КонецПериода, ДЕНЬ) или передавайте дату с временем 23:59:59
- 5Сформируйте отчет и проверьте, что данные за граничные даты попадают в результат
Параметр «СтандартныйПериод» для удобного выбора
Ввод двух дат неудобен пользователю: легко ошибиться, забыть про время окончания, перепутать начало и конец. Практичное решение — добавить параметр Период типа «СтандартныйПериод», а даты начала и конца вычислять из него.
В тексте запроса это делается прямо в параметрах виртуальной таблицы, если использовать параметр типа СтандартныйПериод — платформа сама подставит границы. Либо создаются два служебных параметра, значения которых задаются выражениями: НачалоПериода со значением-выражением &Период.ДатаНачала и КонецПериода — &Период.ДатаОкончания. Служебные параметры делают недоступными пользователю (ограничение доступности), чтобы в настройках был виден только один параметр «Период».
У стандартного периода дата окончания уже содержит конец дня (23:59:59), поэтому проблема «потерянного последнего дня» исчезает. Это еще одна причина предпочесть его ручному вводу двух дат.
Период в отборах компоновки и пользовательские настройки
Альтернатива параметрам запроса — отбор на закладке «Отбор» схемы компоновки по полю Период виртуальной таблицы или по полю Дата документа. Такой отбор пользователь может менять сам в режиме настроек, включать и отключать без правки запроса.
Однако у этого подхода есть ограничение: отбор компоновки применяется к уже полученным данным. Если запрос выбирает обороты без ограничения по датам, а фильтр стоит только в отборе, то с сервера выгружается весь объем регистра, и на больших базах отчет будет работать заметно медленнее. Поэтому отбор компоновки по периоду оправдан только для небольших выборок или когда период должен быть необязательным.
Чтобы пользователь видел период в быстрых настройках отчета, добавьте параметр или отбор в пользовательские настройки: на закладке «Настройки» схемы выберите режим редактирования «Быстрый доступ» для нужного элемента. Тогда поле периода появится прямо на форме отчета рядом с кнопкой «Сформировать».
Сравнение вариантов задания периода
Самый быстрый вариант: отбор на уровне СУБД. Подходит для регистров накопления и сведений. Ограничение — работает только с виртуальными таблицами.
Универсально для любых таблиц, включая документы. Эффективно, но требует аккуратности с концом периода.
Гибко для пользователя, можно отключить. Не ускоряет запрос, при больших объемах — медленно.
Удобный выбор интервала для пользователя, корректный конец дня из коробки. Требует связки с параметрами запроса.
Программная установка периода и нестандартные сценарии
Установка периода из кода
Когда отчет формируется из обработки, кнопки формы или регламентного задания, период задается программно через компоновщик настроек:
Настройки = Отчет.КомпоновщикНастроек.Настройки;
Парам = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НачалоПериода"));
Парам.Значение = НачалоМесяца(ТекущаяДатаСеанса());
Парам.Использование = Истина;
После установки значений обязательно установите флаг Использование, иначе параметр останется неактивным и отчет сформируется без учета периода. Это одна из самых частых причин «программно заданный период не работает».
Произвольный период внутри запроса
Иногда «свой период» означает не границы выборки, а группировку по нестандартным интервалам: неделям, декадам, произвольным диапазонам. Для этого поле периода добавляется в запрос (например, Период виртуальной таблицы с заданной периодичностью), а в схеме компоновки создается ресурс или группировка по этому полю. Для группировки по неделям или месяцам укажите периодичность виртуальной таблицы — платформа сама вернет поле Период нужной грануляции.
Период «на дату»
Для отчетов по остаткам чаще нужна одна дата, а не интервал. В этом случае достаточно одного параметра Период, передаваемого в виртуальную таблицу Остатки. Чтобы пользователь мог не заполнять дату и получать остатки на текущий момент, параметр делают необязательным, а в запросе используют конструкцию с проверкой на пустое значение или задают значение по умолчанию программно.
Если отчет должен по умолчанию открываться за текущий месяц, не задавайте фиксированные даты в значениях по умолчанию параметров — они «застынут» на момент разработки. Используйте программную установку в событии ПриКомпоновкеРезультата или стандартный период «Этот месяц» в пользовательских настройках.
Проверка результата и типичные ошибки
После настройки периода сформируйте отчет за известный интервал и сверьте итоги с эталонным отчетом конфигурации (например, оборотно-сальдовой ведомостью или карточкой счета). Особое внимание уделите граничным датам: документы первого и последнего дня должны попадать в результат.
Если данные расходятся, проверьте три вещи: время в дате окончания (не обрезан ли последний день), признак Использование у параметров и отсутствие дублирующего отбора в настройках компоновки, который дополнительно сужает выборку.
Как проверить результат
Документы и обороты первого дня присутствуют в отчете
Первый день пустой — проверьте дату начала и время в ней
Обороты последнего дня учтены полностью
Последний день отсутствует — конец периода задан без времени, добавьте КонецПериода()
Отчет формируется за приемлемое время на большом периоде
Долгое формирование — период задан в отборе компоновки вместо параметров запроса
Отчет либо требует заполнения, либо корректно работает со значением по умолчанию
Ошибка «Значение параметра не установлено» при открытии
Частые вопросы о периоде в СКД
Как сделать, чтобы конец периода автоматически включал весь день?
Используйте в запросе функцию КонецПериода(&КонецПериода, ДЕНЬ) — она вернет 23:59:59 указанной даты. Альтернатива — параметр типа «СтандартныйПериод», у которого дата окончания уже содержит конец дня. Ручное добавление секунд к дате менее надежно и хуже читается.
Почему программно заданный период не применяется к отчету?
Чаще всего не установлен признак Использование у параметра компоновки. Также проверьте, что вы обращаетесь к параметру по его точному имени из схемы компоновки и что меняете настройки именно того компоновщика, который формирует отчет (у формы отчета и объекта отчета это могут быть разные экземпляры).
Как дать пользователю выбор: период или одна дата?
Добавьте оба параметра (Период типа СтандартныйПериод и ДатаОтчета) и сделайте их необязательными. В запросе используйте условие с проверкой: если дата заполнена — отбор по ней, иначе по периоду. Либо разделите варианты отчета на две настройки с разными параметрами.
Можно ли задать период без изменения запроса?
Да, через отбор на закладке «Отбор» схемы компоновки по полю Период или Дата. Но такой отбор фильтрует уже выбранные данные и не ускоряет запрос. Для больших регистров правильнее передавать период в параметры виртуальной таблицы.
Как сгруппировать данные по неделям или произвольным интервалам?
Для недель и месяцев задайте периодичность виртуальной таблицы (Неделя, Месяц) — в результате появится поле Период, по которому строится группировка. Для произвольных интервалов используйте вычисляемое поле с выражением на языке выражений СКД или доработайте запрос, вычисляя номер интервала от даты начала.
Отчет за большой период формируется очень долго, что делать?
Убедитесь, что период передается в параметры виртуальной таблицы, а не в отбор компоновки. Проверьте отсутствие лишних соединений в запросе и неиспользуемых наборов данных. Если объем данных принципиально велик, ограничьте максимальный период программно или предложите пользователю детализацию по месяцам.
Что важно запомнить
Свой период в СКД задается параметрами НачалоПериода и КонецПериода, которые эффективнее всего передавать в параметры виртуальной таблицы. Для удобства пользователя добавьте параметр типа «СтандартныйПериод», для корректного конца дня — функцию КонецПериода(). При программной установке не забывайте флаг Использование, а результат всегда проверяйте по граничным датам периода.