Как настроить автоматический выбор периода «Конец следующего месяца» в рассылке отчетов 1С?

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

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

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

Метод 1: Использование выражений в параметрах СКД

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

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

  1. Выясним текущую дату в момент формирования отчета с помощью функции ТекущаяДата().
  2. Добавим к текущей дате один месяц, чтобы перейти в будущий месяц.
  3. Вычислим конец полученного месяца.

В результате в поле выражения для параметра ДатаОкончания следует прописать следующую конструкцию:

ДобавитьКДате(КонецПериода(ТекущаяДата(), "Месяц"), "Месяц", 1)

Если же ваша конфигурация построена на БСП и отчет использует стандартный период (диапазон), мы можем составить выражение для типа СтандартныйПериод. Рассмотрим пример, где отчет должен всегда формироваться за два месяца: текущий и следующий. В выражении для параметра типа СтандартныйПериод пропишем:


Новый СтандартныйПериод(НачалоПериода(ТекущаяДата(), "Месяц"), КонецПериода(ДобавитьКДате(ТекущаяДата(), "Месяц", 1), "Месяц"))

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

Метод 2: Создание пользовательского меню выбора периодов

Иногда требуется предоставить пользователю выбор из нескольких специфических вариантов (например, «План на 2 месяца», «План на квартал»). Рассмотрим ситуацию, предложенную опытными разработчиками: создание вспомогательного параметра.

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

Теперь в выражении основного параметра даты (например, ДатаКонца) используем конструкцию ВЫБОР КОГДА.... Это позволит системе динамически вычислять дату в зависимости от того, какой пункт меню выбрал пользователь в настройках отчета или рассылки:


ВЫБОР 
    КОГДА &ВариантРасчетаПериода = 0 ТОГДА КонецПериода(ТекущаяДата(), "Месяц")
    КОГДА &ВариантРасчетаПериода = 1 ТОГДА ДобавитьКДате(КонецПериода(ТекущаяДата(), "Месяц"), "Месяц", 1)
    КОГДА &ВариантРасчетаПериода = 2 ТОГДА ДобавитьКДате(КонецПериода(ТекущаяДата(), "Месяц"), "Месяц", 3)
    ИНАЧЕ КонецПериода(ТекущаяДата(), "Месяц")
КОНЕЦ

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

Метод 3: Программная установка параметров в модуле отчета

Если логика определения периода слишком сложная или зависит от времени суток (как в примере из обсуждения на форуме), мы можем прибегнуть к программированию в модуле объекта отчета. Разберем работу с предопределенной процедурой ПриКомпоновкеРезультата.

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


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
	
	// Проверяем, запущен ли отчет в фоновом задании (характерно для рассылок)
	Если ПараметрыСеанса.ТекущийПользователь.Наименование = "Робот" Или Найти(ИмяПользователя(), "Background") > 0 Тогда
		
		ТекущийПериод = ТекущаяДата();
		ПараметрКонецПериода = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаОкончания");
		
		Если ПараметрКонецПериода <> Неопределено Тогда
			ПараметрКонецПериода.Значение = ДобавитьМесяц(КонецМесяца(ТекущийПериод), 1);
			ПараметрКонецПериода.Использование = Истина;
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры

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

Особенности работы с «Произвольной датой» в рассылках

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

Рассмотрим, как правильно настроить поле в интерфейсе рассылки:

  1. Никогда не вводите дату вручную, если отчет должен быть актуальным завтра.
  2. Используйте стандартные периоды (Месяц, Квартал), если они подходят.
  3. Если стандартных периодов не хватает (как в нашем случае с «Концом следующего месяца»), оставляйте поле заполненным «по умолчанию» или используйте настройки, которые мы прописали в Методе 1.

Использование механизмов БСП (Библиотеки стандартных подсистем)

В современных конфигурациях (УТ 11, ERP, БП 3.0) подсистема «Рассылка отчетов» базируется на БСП. В версиях БСП 3.1.5 и выше механизм выбора относительных дат был расширен. Проанализируем возможности:

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

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

← На главную