Задаём период в 1С 8.3: в отчётах, запросах, регистрах и обработках

· 9 мин

Содержание

Период в 1С задаётся в трёх разных местах, и именно их чаще всего путают. В готовом отчёте — кнопкой Период или через Настройки в командной панели. В запросе — функциями НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА либо параметрами виртуальных таблиц. В обработке или внешнем отчёте — реквизитом типа СтандартныйПериод на форме.

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

Где период задаётся в интерфейсе

Самый частый сценарий — период в списке документов или в отчёте. В командной панели почти любого списка и отчёта есть поле или кнопка выбора периода. Нажмите на неё — откроется форма с двумя датами и календарём.

В форме выбора периода работают два режима:

  • 📅 Стандартный период — готовые варианты: Этот день, Эта неделя, Этот месяц, Этот квартал, Этот год, а также прошлые периоды. Выбрали «Этот месяц» — даты подставятся автоматически и будут пересчитываться относительно текущей даты.
  • ✏️ Произвольный период — вручную задаёте дату начала и дату окончания. Удобно для нестандартного интервала, например с 15-го по 20-е число.

Если нужно посмотреть данные на одну дату (остаток, а не оборот), поставьте одинаковые даты начала и окончания либо выбирайте вариант «Этот день».

В журналах документов и динамических списках период работает так же, но включается отдельно — через меню «Ещё» → Установить интервал дат (или аналогичную команду настройки списка). После установки список показывает только документы в выбранном диапазоне, и это ускоряет открытие больших журналов — программе не нужно читать всю историю.

Отдельно стоит рабочая дата — дата, которую 1С подставляет по умолчанию в новые документы. Меняется через главное меню → Сервис → Параметры, поле «Рабочая дата» (в разных конфигурациях пункт может называться чуть иначе). Если новые документы создаются «не тем числом» — проверьте в первую очередь её.

Период в отчётах: настройка и тонкости

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

Три момента, которые экономят время:

  1. Период сохраняется в варианте отчёта. Если сохранить настройку (Настройки → Сохранить вариант), вместе с ней сохранится и период. При относительном периоде («Этот месяц») сохранённый вариант всегда будет открываться на актуальный месяц.
  2. Детализация внутри периода. В отчётах на СКД в настройках есть «Периодичность» (день, неделя, месяц, квартал). Она разбивает уже заданный интервал на колонки — это не то же самое, что сам период.
  3. Период и отбор по дате документа — разные вещи. Период ограничивает данные по дате движений. Если нужно отобрать документы по дате создания или проведения, добавляйте отдельный отбор, а не меняйте период.

Отчёт, построенный на остатках (например, остатки на складе), показывает данные на конец периода. Отчёт на оборотах — за весь интервал. Если цифры «не те», сначала поймите, что именно считает отчёт: остаток или оборот.

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

В языке запросов 1С для границ периода используют две функции:

ВЫБРАТЬ
    Товар,
    Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(
        &НачалоПериода,
        &КонецПериода,
        ,
    ) КАК ОборотыТоваров

Параметры &НачалоПериода и &КонецПериода вы передаёте из кода. Чтобы привести произвольную дату к началу и концу периода прямо в запросе, применяют:

  • НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) — первый день месяца, время 00:00:00;
  • КОНЕЦПЕРИОДА(Дата, МЕСЯЦ) — последняя секунда месяца, 23:59:59.

Вместо МЕСЯЦ допустимы ДЕНЬ, НЕДЕЛЯ, ДЕКАДА, КВАРТАЛ, ПОЛУГОДИЕ, ГОД. Ключевой нюанс: КОНЕЦПЕРИОДА возвращает именно последнюю секунду, а не 00:00:00 следующего дня. Поэтому движения, сделанные в последний день, в интервал попадают.

Во встроенном языке (не в запросе) те же задачи решают функции НачалоМесяца(), КонецМесяца(), НачалоГода(), КонецГода(), НачалоДня(), КонецДня() и аналогичные:

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

КонецМесяца() вернёт дату с временем 23:59:59 — это важно, когда вы передаёте границу в запрос или в отбор.

Период в обработках и внешних отчётах

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

Период = Новый СтандартныйПериод;
Период.ДатаНачала   = НачалоМесяца(ТекущаяДата());
Период.ДатаОкончания = КонецМесяца(ТекущаяДата());

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

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

Период в регистрах: остатки и обороты

У виртуальных таблиц регистров период задаётся по-разному, и это главный источник ошибок.

ТаблицаЧто показываетКак задаётся период
Остатки(&МоментВремени)остаток на одну датуодин параметр — момент времени
Обороты(&Начало, &Конец)обороты за интервалдве границы
ОстаткиИОбороты(&Начало, &Конец)остаток на начало и конец + оборотыдве границы

Для остатков передаётся один момент — остаток считается «на дату». Для оборотов — два: начало и конец интервала. Регистр бухгалтерии устроен так же: Остатки, Обороты, ОстаткиИОбороты.

Для остатков важно, что Дата без времени — это начало дня. Если нужен остаток с учётом движений самого дня, передавайте КонецДня(Дата) или объект Граница:

МоментРасчёта = Новый Граница(КонецДня(ДатаОстатка), ВидГраницы.Включая);

Так остаток посчитается с учётом документов за ДатаОстатка, а не по состоянию на его утро.

Отдельно — период рассчитанных итогов. 1С хранит промежуточные итоги регистров до определённой даты, чтобы остатки считались быстро. Управляет этим стандартная обработка «Управление итогами» (в типовых конфигурациях — в разделе администрирования). Если отчёты по остаткам стали работать медленно или показывают расхождения после массового перепроведения, итоги пересчитывают именно там.

Пересчёт итогов — тяжёлая операция. Запускайте её в нерабочее время: пока идёт пересчёт, другие пользователи будут ждать.

Как закрыть период от изменений

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

В 1С:Бухгалтерии 3.0 путь такой: Администрирование → Настройки пользователей и прав → Даты запрета изменения данных. В ЗУП 3.1 и УТ 11 раздел называется похоже и лежит в настройках прав.

Варианты настройки:

  • 🔒 Общая дата — одна для всех пользователей и разделов учёта.
  • 👥 По пользователям — например, рядовым бухгалтерам прошлый квартал закрыт, а главбуху открыт.
  • 📂 По разделам — отдельно по организации, по виду операций.

После установки даты запрета документы раньше неё нельзя будет провести или перепровести. Это защита от случайной правки закрытого периода, а не замена архивной копии базы.

Не путайте с датой запрета загрузки — она ограничивает приём данных при синхронизации (о ней ниже).

Период при обмене и синхронизации данных

При настройке синхронизации между базами период участвует в двух местах.

Первое — начальная выгрузка. В настройках синхронизации (Администрирование → Синхронизация данных) обычно указывают дату, начиная с которой выгружаются документы. Это избавляет от переноса многолетней истории, когда нужны только данные текущего года.

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

В распределённой информационной базе (РИБ) отдельного периода нет — узлы обмениваются всеми изменениями с момента последней синхронизации. Ограничить набор данных там можно только отбором на уровне плана обмена.

Относительные и динамические периоды

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

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

В коде относительный период собирают из текущей даты:

// С начала года по сегодня
НачалоПериода = НачалоГода(ТекущаяДата());
КонецПериода  = КонецДня(ТекущаяДата());

// Предыдущий месяц целиком
НачалоПрошлого = НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), -1));
КонецПрошлого  = КонецМесяца(ДобавитьМесяц(ТекущаяДата(), -1));

Функция ДобавитьМесяц(Дата, Количество) сдвигает дату на нужное число месяцев (отрицательное — назад) и корректно обрабатывает концы месяцев. На таких выражениях строят регламентные отчёты и рассылки «по итогам прошлого месяца», которые не требуют ручного ввода дат.

Где вам нужно задать период?

Типичные ошибки при работе с периодами

Документ последнего дня не попал в отчёт. Классика: в интервал передали дату 31.01 с временем 00:00:00, а документ проведён днём. Решение — для верхней границы использовать КОНЕЦПЕРИОДА в запросе или КонецДня()/КонецМесяца() в коде, которые дают 23:59:59.

Для остатков указали две даты вместо одной. У таблицы Остатки период — это один момент времени. Если передавать туда интервал, результат будет неверным. Две границы нужны только оборотам.

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

Отчёт показывает «ничего», хотя данные есть. Частая причина — период задан за будущий или прошлый интервал, в котором движений нет. Второе по частоте — перепутаны остаток и оборот: на конец периода остаток есть, а оборотов за интервал ноль.

Нельзя провести документ прошлого месяца. Скорее всего установлена дата запрета изменения. Это не ошибка программы — период закрыт намеренно.

Чем отличается момент времени от интервала?
Момент времени — одна дата для остатка («сколько на складе на 31-е»). Интервал — две даты для оборотов («что пришло и ушло за месяц»). Таблица Остатки принимает момент, Обороты — интервал.
Почему в отчёт не попадают документы последнего дня периода?
Верхняя граница задана с временем 00:00:00. Используйте КОНЕЦПЕРИОДА в запросе или КонецДня()/КонецМесяца() в коде — они возвращают 23:59:59, и движения последнего дня учитываются.
Как сделать, чтобы отчёт всегда открывался за текущий месяц?
В форме выбора периода выберите вариант «Этот месяц» (а не произвольные даты) и сохраните вариант отчёта. Относительный период пересчитывается от текущей даты автоматически.
Что хранит рабочая дата и где её сменить?
Рабочая дата — дата, которую 1С подставляет в новые документы по умолчанию. Меняется в главном меню → Сервис → Параметры.
Как запретить менять документы за закрытый квартал?
Установите дату запрета изменения: Администрирование → Настройки пользователей и прав → Даты запрета изменения данных. Можно задать общую дату или отдельные для разных пользователей и разделов.