Как в отчете 1С собрать данные за декабрь прошлого года и январь текущего: работа с переходящими периодами

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим подробнее, какие инструменты и функции предоставляет платформа 1С для решения этой задачи, и разберем по шагам наиболее эффективные подходы.

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

Если формирование периода происходит программно (в модуле отчета или обработки), нам необходимо вычислить границы дат таким образом, чтобы система корректно обработала смену года. Проанализируем основные функции, которые помогут нам в этом.

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

Рассмотрим пример кода, где нам нужно получить начало декабря предыдущего года, отталкиваясь от текущей даты в январе:


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

// В итоге:
// НачалоТекущегоМесяца = 01.01.2019 00:00:00
// НачалоПрошлогоМесяца = 01.12.2018 00:00:00

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

Метод 2: Работа с периодами в языке запросов

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

Для смещения дат в запросах используется функция ДОБАВИТЬКДАТЕ. Посмотрим на пример реализации условия в запросе:


ВЫБРАТЬ
    Продажи.Регистратор,
    Продажи.Период,
    Продажи.СуммаОборота
ИЗ
    РегистрНакопления.Продажи.Обороты(
        ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&КонецПериода, МЕСЯЦ), МЕСЯЦ, -1),
        КОНЕЦПЕРИОДА(&КонецПериода, МЕСЯЦ),
        ,
        ) КАК Продажи

В данном примере, если параметр &КонецПериода будет установлен на любую дату января 2019 года, функция НАЧАЛОПЕРИОДА вернет 01.01.2019, а ДОБАВИТЬКДАТЕ с множителем -1 по месяцу корректно вернет 01.12.2018. Таким образом, запрос охватит оба интересующих нас месяца.

Метод 3: Настройка СКД и использование стандартных периодов

Если ваш отчет построен на Системе компоновки данных (СКД), решение задачи значительно упрощается для конечного пользователя. Разберем, как настроить отчет, чтобы он автоматически подхватывал нужные периоды.

  1. Использование типа "СтандартныйПериод": В параметрах СКД для поля Период лучше использовать тип СтандартныйПериод. Это позволит пользователю в настройках отчета выбрать не просто две даты, а предопределенный интервал (например, "Прошлый месяц" или "Произвольный период").
  2. Выражения для параметров: Мы можем автоматизировать расчет. Вкладка "Параметры" в СКД позволяет задавать выражения. Для автоматического подбора декабря и января можно прописать выражение для начала периода:

    ДобавитьМесяц(НачалоМесяца(&ТекущаяДата), -1)

    и для конца периода:

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

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

Метод 4: Разделение периода регистрации и периода действия

Рассмотрим важный нюанс, упомянутый в контексте взносов и налогов. Часто возникает путаница: данные за декабрь отражаются в отчетах января. Это связано с тем, что в учетных системах 1С (особенно в ЗУП или ERP) разделяются два понятия:

Чтобы собрать отчет за декабрь и январь, важно понимать, по какому из этих полей идет отбор. Если вам нужно увидеть перечисленные в январе взносы за декабрь, ваш запрос должен обращаться к периоду регистрации (январь), но в группировках отчета выводить период действия (декабрь). Для реализации этого в СКД или запросе достаточно выбрать соответствующие поля из регистров расчета или накопления.

Практические советы по реализации

Подводя итог, при работе с переходящими периодами рекомендуется придерживаться следующих правил:

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

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

← На главную