При разработке и настройке отчетов в 1С программисты и аналитики часто сталкиваются с задачей корректного сопоставления данных за разные календарные годы. Классический пример — необходимость вывести в одном отчете сведения за декабрь 2018 и январь 2019 года. Если в рамках одного года выборка данных кажется тривиальной, то переход через границу года требует понимания механизмов работы с датами во встроенном языке, запросах и Системе компоновки данных (СКД).
Рассмотрим подробнее, какие инструменты и функции предоставляет платформа 1С для решения этой задачи, и разберем по шагам наиболее эффективные подходы.
Если формирование периода происходит программно (в модуле отчета или обработки), нам необходимо вычислить границы дат таким образом, чтобы система корректно обработала смену года. Проанализируем основные функции, которые помогут нам в этом.
Самым надежным инструментом является функция ДобавитьМесяц. Ее преимущество заключается в том, что она автоматически инкрементирует или декрементирует год, если прибавление или вычитание месяцев выходит за пределы текущего календаря.
Рассмотрим пример кода, где нам нужно получить начало декабря предыдущего года, отталкиваясь от текущей даты в январе:
ТекущаяДата = '20190115'; // Январь 2019
НачалоТекущегоМесяца = НачалоМесяца(ТекущаяДата);
НачалоПрошлогоМесяца = ДобавитьМесяц(НачалоТекущегоМесяца, -1);
КонецПрошлогоМесяца = КонецМесяца(НачалоПрошлогоМесяца);
// В итоге:
// НачалоТекущегоМесяца = 01.01.2019 00:00:00
// НачалоПрошлогоМесяца = 01.12.2018 00:00:00
Выясним причину, почему это удобно: вам не нужно вручную проверять, равен ли месяц единице, чтобы вычесть единицу из года. Платформа берет эту логику на себя. Для построения отчета за два месяца (декабрь и январь) мы можем установить границы периода от НачалоПрошлогоМесяца до КонецМесяца(ТекущаяДата).
Когда данные выбираются напрямую из базы данных, мы используем язык запросов 1С. Здесь механизмы работы схожи, но имеют свои синтаксические особенности. Проанализируем ситуацию, когда нам нужно в запросе отобрать документы за прошлый и текущий месяцы.
Для смещения дат в запросах используется функция ДОБАВИТЬКДАТЕ. Посмотрим на пример реализации условия в запросе:
ВЫБРАТЬ
Продажи.Регистратор,
Продажи.Период,
Продажи.СуммаОборота
ИЗ
РегистрНакопления.Продажи.Обороты(
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&КонецПериода, МЕСЯЦ), МЕСЯЦ, -1),
КОНЕЦПЕРИОДА(&КонецПериода, МЕСЯЦ),
,
) КАК Продажи
В данном примере, если параметр &КонецПериода будет установлен на любую дату января 2019 года, функция НАЧАЛОПЕРИОДА вернет 01.01.2019, а ДОБАВИТЬКДАТЕ с множителем -1 по месяцу корректно вернет 01.12.2018. Таким образом, запрос охватит оба интересующих нас месяца.
Если ваш отчет построен на Системе компоновки данных (СКД), решение задачи значительно упрощается для конечного пользователя. Разберем, как настроить отчет, чтобы он автоматически подхватывал нужные периоды.
Период лучше использовать тип СтандартныйПериод. Это позволит пользователю в настройках отчета выбрать не просто две даты, а предопределенный интервал (например, "Прошлый месяц" или "Произвольный период").ДобавитьМесяц(НачалоМесяца(&ТекущаяДата), -1)
КонецМесяца(&ТекущаяДата)
Такой подход гарантирует, что при открытии отчета в январе, система сама предложит диапазон, начинающийся с 1 декабря прошлого года. Это избавляет пользователя от необходимости ручного ввода дат и минимизирует риск ошибок.
Рассмотрим важный нюанс, упомянутый в контексте взносов и налогов. Часто возникает путаница: данные за декабрь отражаются в отчетах января. Это связано с тем, что в учетных системах 1С (особенно в ЗУП или ERP) разделяются два понятия:
Чтобы собрать отчет за декабрь и январь, важно понимать, по какому из этих полей идет отбор. Если вам нужно увидеть перечисленные в январе взносы за декабрь, ваш запрос должен обращаться к периоду регистрации (январь), но в группировках отчета выводить период действия (декабрь). Для реализации этого в СКД или запросе достаточно выбрать соответствующие поля из регистров расчета или накопления.
Подводя итог, при работе с переходящими периодами рекомендуется придерживаться следующих правил:
НачалоМесяца и КонецМесяца для фиксации границ. Это исключит потерю данных за первые или последние секунды суток.ДобавитьМесяц, так как она является наиболее универсальной для корректного вычисления года.Проанализировав данные подходы, мы видим, что платформа 1С предоставляет исчерпывающий набор инструментов для работы с датами. Будь то программный код или визуальная настройка отчета пользователем, механизм пересчета года при изменении месяца работает стабильно и предсказуемо.