Разработка отчетов в системе «1С:Предприятие 8» неразрывно связана с использованием Системы Компоновки Данных (СКД). Это мощный инструмент, позволяющий формировать сложные аналитические выборки без глубокого погружения в код запроса на этапе дизайна. Однако фундаментом любого отчета является корректная настройка отборов, и самым востребованным из них неизменно остается временной интервал.

Пользователи часто сталкиваются с ситуацией, когда отчет выдает лишние данные или, наоборот, пустой результат из-за неверно настроенных параметров времени. Понимание механики работы с ТипДанных «Период» и связью между параметрами макета и условиями запроса критически важно для разработчика. В этой статье мы разберем все нюансы: от визуальной настройки в конструкторе до программного управления.

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

Базовая настройка параметров в схеме компоновки

Процесс создания отчета начинается с определения структуры данных. В конструкторе СКД первым шагом является добавление параметров, которые будут передаваться в запрос. Для работы с датами необходимо создать два параметра или один составной, в зависимости от логики вашего отчета. Чаще всего используется пара параметров: НачалоПериода и КонецПериода.

При создании параметра в окне свойств обязательно укажите тип значения. Для дат это обычно Дата или Период. Если вы выбрали тип Дата, система позволит пользователю выбрать конкретный день. Если же выбран тип Период, интерфейс автоматически предложит стандартные варианты, такие как «Этот месяц» или «Квартал», что значительно упрощает работу бухгалтера.

Важно правильно настроить представление параметров. В свойствах параметра в поле «Заголовок» укажите понятное название, например, «Период отчета». Это название будет отображаться на форме настройки отчета. Не забывайте про значения по умолчанию: часто удобно установить значение НачалоПериода равным началу текущего месяца, а КонецПериода — текущей дате.

  • 📅 Выберите тип данных «Период» для автоматического подбора стандартных интервалов.
  • ⚙️ Установите значения по умолчанию в свойствах параметра для ускорения работы.
  • 📝 Дайте параметрам понятные заголовки, избегая технических имен переменных.
  • 🔗 Свяжите параметры с полями отбора в наборе данных.

⚠️ Внимание: Если вы используете тип «Период», убедитесь, что в запросе вы правильно обращаетесь к границам этого периода. Поле Период.Начало и Период.Конец могут вести себя по-разному в зависимости от контекста использования.

📊 Какой тип параметра периода вы используете чаще?
Один параметр типа "Период"
Два параметра типа "Дата"
Три параметра (Начало, Конец, Тип периода)
Использую только текущую дату

Использование стандартных полей периода

СКД предоставляет разработчикам готовый механизм для работы со временем — стандартные поля. Это избавляет от необходимости вручную прописывать сложные условия в тексте запроса для каждого отчета. При добавлении набора данных в конструкторе, система автоматически предлагает использовать стандартные поля, если в запросе есть поля с типом Дата.

Стандартное поле Период является виртуальным. Оно не существует в таблице базы данных физически, но СКД знает, как его интерпретировать. При выборе этого поля в настройках отчета, система сама сформирует необходимые условия отбора, используя параметры, которые вы задали ранее. Это значительно сокращает объем кода и снижает вероятность ошибок.

Однако, использование стандартных полей имеет свои ограничения. Они работают корректно только если в запросе присутствует одно основное поле даты, по которому идет группировка или отбор. Если в отчете фигурируют несколько дат (например, дата документа и дата оплаты), стандартное поле может не сработать так, как ожидается, и потребуется ручная настройка отборов.

💡

Для сложных отчетов с несколькими датами лучше отключить использование стандартных полей периода и настроить отборы вручную через конструктор запроса. Это даст полный контроль над логикой выборки.

Чтобы активировать стандартные поля, перейдите на вкладку «Наборы данных» в конструкторе СКД. В списке полей набора данных найдите группу «Стандартные поля». Убедитесь, что поле Период доступно для использования. Если его нет, проверьте, что в тексте запроса есть хотя бы одно поле типа «Дата», которое система сможет использовать как базовое.

Настройка отборов в конструкторе запроса

Когда стандартных механизмов недостаточно, приходится обращаться к «чистому» запросу. В этом случае настройка периода происходит на уровне языка запросов 1С. Синтаксис условий отбора по дате требует внимательности, особенно при работе с границами интервалов. Ошибка в одном знаке может исключить из отчета важные документы.

Классический вариант отбора выглядит как сравнение поля даты с параметрами. Например, ГДЕ Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода. Однако оператор МЕЖДУ в 1С включает обе границы. Если вы хотите получить данные строго за весь день 31 декабря, параметр конца периода должен быть установлен на 23:59:59 или использован специальный синтаксис.

Более надежным способом является использование функций работы с датой. Функции НАЧАЛОДНЯ(), КОНЕЦДНЯ(), НАЧАЛОМЕСЯЦА() позволяют динамически рассчитывать границы. Это особенно полезно, когда пользователь выбирает период «Месяц», а система должна сама понять, какого именно месяца и где он заканчивается.

ВЫБРАТЬ

Продажи.Номенклатура,

Продажи.Количество

ИЗ

РегистрНакопления.Продажи.Обороты(

&НачалоПериода,

&КонецПериода,

,

) КАК Продажи

ГДЕ

Продажи.Период >= &НачалоПериода

И Продажи.Период < &КонецПериода + 1

Обратите внимание на последнюю строку примера кода. Добавление единицы к дате конца периода (если это тип Дата без времени) или использование строгого неравенства < — это распространенный паттерн для включения всего последнего дня. Если параметр &КонецПериода содержит время 00:00:00 следующего дня, то условие < сработает идеально для выбора всех секунд предыдущего дня.

⚠️ Внимание: При использовании виртуальных таблиц регистров (например, Обороты или Остатки) параметры периода передаются непосредственно в скобки вызова таблицы. В этом случае секция ГДЕ для фильтрации по датам может быть избыточна или даже вызвать ошибку, так как отбор уже выполнен на уровне механизма регистров.

Работа с виртуальными таблицами регистров

Регистры накопления и сведений в 1С имеют специальную оптимизацию для работы с периодами. Виртуальные таблицы позволяют получать срезы данных на конкретную дату или обороты за интервал. Это самый производительный способ работы с большими объемами данных, так как отбор происходит на уровне СУБД до выборки записей.

При вызове виртуальной таблицы Обороты вы указываете параметры периода в круглых скобках после имени таблицы. Синтаксис требует указания начала и конца периода. Если вам нужен срез на конкретный момент, используется таблица Остатки, где период указывает момент времени, на который рассчитываются остатки.

Тип виртуальной таблицы Параметры периода Описание поведения
Обороты Начало, Конец Суммирует движения за указанный интервал включительно.
Остатки МоментВремени Рассчитывает остаток на конкретную дату и время.
ОстаткиИОбороты Начало, Конец Возвращает начальный остаток, обороты и конечный остаток.
СрезПоследних МоментВремени Берет последние записи регистра на указанную дату.

Важно понимать разницу между «включительно» и «исключительно» в разных версиях платформы 1С, хотя в последних релизах логика унифицирована. Для таблицы Обороты интервал всегда замкнутый. Если вы передали в параметр «Конец периода» дату 31.01.2026 00:00:00, вы получите обороты только за эту секунду, а не за весь день.

Особенности работы с временем в регистрах

Виртуальные таблицы регистров всегда работают с точностью до секунды. Если пользователь в интерфейсе выбрал просто дату без времени, система 1С автоматически подставляет 00:00:00 для начала и 23:59:59 для конца, но только если это обрабатывается на уровне СКД. В прямом запросе эта магия не работает автоматически, если не использовать специальные функции.

Программное управление периодом в коде

Иногда настройки в конструкторе недостаточно, и требуется программно изменить период отчета перед его формированием. Это актуально при создании печатных форм, где период жестко задан логикой документа, или при реализации кнопок «Быстрый период» в интерфейсе. Для этого используется объект КомпоновщикНастроекКомпоновкиДанных.

В коде обработчика нажатия кнопки вы должны получить доступ к настройкам отчета, найти нужный параметр и присвоить ему новое значение. После изменения параметров необходимо вызвать метод Компоновать(), чтобы перестроить запрос с учетом новых данных. Игнорирование этого шага приведет к тому, что отчет сформируется по старым значениям.

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

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

Компоновщик.Инициализировать(МакетКомпоновки);

Начало = НачалоМесяца(ТекущаяДата());

Конец = КонецМесяца(ТекущаяДата());

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

Параметры.Установить("НачалоПериода", Начало);

Параметры.Установить("КонецПериода", Конец);

Компоновщик.Компоновать();

💡

Программная установка параметров не отменяет возможности пользователя изменить их на форме настройки, если форма открывается после выполнения кода. Чтобы зафиксировать период, нужно либо скрывать поля настройки, либо блокировать их редактирование.

Частые ошибки и оптимизация производительности

Некорректная работа с периодами часто становится причиной тормозов отчетов. Самая распространенная ошибка — использование функций в условии отбора над полем таблицы. Например, конструкция ГДЕ ГОД(Документ.Дата) = 2026 запрещает использование индекса по дате, заставляя базу данных перебирать все записи подряд.

Всегда стремитесь к тому, чтобы поле, по которому идет отбор, стояло в левой части условия сравнения без обертки функциями. Правильный вариант: ГДЕ Документ.Дата >= ДатаВремя(2026, 01, 01). Это позволяет механизму 1С использовать индекс для быстрого поиска нужного диапазона записей.

  • 🚀 Используйте диапазон >= ... И < ... вместо функций выделения года или месяца.
  • 🗑️ Избегайте отборов по вычисляемым полям в запросе, если они зависят от даты.
  • 📉 Проверяйте план выполнения запроса через консоль запросов для анализа индексов.

Также стоит помнить о часовых поясах, если ваша база данных используется в распределенной информационной системе или облаке. Хранение дат в UTC и их конвертация на клиенте может сдвигать границы периода на несколько часов, что приведет к попаданию документов соседнего дня в ваш отчет или их выпадению.

⚠️ Внимание: Интерфейсы и названия функций могут незначительно отличаться в разных конфигурациях (Бухгалтерия, УТ, ЗУП) и версиях платформы 1С. Всегда проверяйте актуальность синтаксиса в справке по конкретной версии платформы, которую вы используете в данный момент.

FAQ: Вопросы по настройке периода

Как сделать так, чтобы при открытии отчета всегда стоял текущий месяц?

Это настраивается в свойствах параметров схемы компоновки данных. Откройте конструктор, выберите параметр «НачалоПериода» и в поле «Значение по умолчанию» укажите выражение НачалоМесяца(ТекущаяДата()). Аналогично поступите для конца периода, используя КонецМесяца(ТекущаяДата()).

Почему отчет не видит документы, проведенные 31 числа в 23:59?

Скорее всего, ваш параметр «Конец периода» установлен на 31 число 00:00:00, а в условии запроса используется строгое больше или равно. Документ с временем 23:59 больше, чем 00:00, но если условие сформулировано как Дата <= КонецПериода, то он не попадет в выборку. Установите конец периода на 1 число следующего месяца 00:00:00 и используйте знак <.

Можно ли использовать один параметр типа "Период" вместо двух дат?

Да, это рекомендуемый подход для типовых отчетов. Параметр типа Период содержит внутри себя и начало, и конец. В запросе к нему обращаются как к структуре: &Период.Начало и &Период.Конец. Это упрощает интерфейс настройки для пользователя.

Как передать период из внешнего источника (например, из формы списка документов)?

В модуле объекта или формы, откуда вызывается отчет, создайте объект НастройкиКомпоновкиДанных. Найдите в коллекции настроек отбор по периоду и измените его значение программно перед вызовом метода Сформировать() у отчета.