Как настроить запуск регламентного задания 1С два раза в месяц (например, 1 и 15 числа)?

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

Часто в практике программирования и администрирования 1С возникает необходимость настроить запуск определенной обработки строго в определенные дни месяца — например, 1-го и 15-го числа. Проанализируем стандартное диалоговое окно настройки расписания платформы 1С. На вкладке «Месячное» есть поле, определяющее день выполнения с начала месяца, но технически оно способно принять только одно числовое значение. Платформа физически не поддерживает ввод массива дней (через запятую) в рамках одного интерфейсного окна расписания.

Из-за этого технического ограничения объединить 1 и 15 число в одно задание типовыми средствами визуальной настройки невозможно. Разберем по шагам несколько эффективных способов решения этой задачи, начиная от самых простых и заканчивая правильным использованием механизмов Библиотеки стандартных подсистем (БСП) для конфигураций, находящихся на поддержке.

Способ 1: Ежедневный запуск с программной проверкой даты

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

Посмотрим на пример того, как это можно реализовать в процедуре, которая вызывается регламентным заданием:


Процедура ВыполнитьЗаданиеПоРасписанию() Экспорт
    
    ТекущийДень = День(ТекущаяДата());
    
    // Проверяем, что сегодня 1 или 15 число
    Если ТекущийДень = 1 ИЛИ ТекущийДень = 15 Тогда
        // Размещаем здесь основной код выполнения задачи
        ВыполнитьОсновнойАлгоритм();
    Иначе
        // В остальные дни просто ничего не делаем и завершаем процедуру
        Возврат;
    КонецЕсли;
    
КонецПроцедуры

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

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

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

Чтобы обойти ограничение расписания, мы добавим в функцию СведенияОВнешнейОбработке() несколько команд, которые ссылаются на один и тот же исполняемый код. В результате в пользовательском режиме появится несколько строк команд, и для каждой из них можно будет настроить свое независимое расписание. Одной команде мы зададим запуск 1-го числа, а второй — 15-го.

Рассмотрим подробнее программный код инициализации такой обработки в модуле объекта:


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
    ПараметрыРегистрации.Вставить("Назначение", Новый Массив);
    ПараметрыРегистрации.Вставить("Наименование", "Загрузка прайс-листа (1 и 15 числа)");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    ТЗКоманд = Новый ТаблицаЗначений;
    ТЗКоманд.Колонки.Добавить("Идентификатор");
    ТЗКоманд.Колонки.Добавить("Представление");
    ТЗКоманд.Колонки.Добавить("Модификатор");
    ТЗКоманд.Колонки.Добавить("ПоказыватьОповещение");
    ТЗКоманд.Колонки.Добавить("Использование");
    
    // Команда для ручного запуска (опционально)
    СтрокаКоманды = ТЗКоманд.Добавить();
    СтрокаКоманды.Идентификатор = "ЗагрузитьПрайсЛистРучно";
    СтрокаКоманды.Представление = "Загрузить прайс-лист (Ручной запуск)";
    СтрокаКоманды.ПоказыватьОповещение = Истина;
    СтрокаКоманды.Использование = "ОткрытиеФормы";
    
    // Первая фоновая команда (для настройки на 1 число)
    СтрокаКоманды = ТЗКоманд.Добавить();
    СтрокаКоманды.Идентификатор = "ЗагрузитьПрайсЛистАвто1";
    СтрокаКоманды.Представление = "Загрузить прайс-лист (Автомат - Команда 1)";
    СтрокаКоманды.ПоказыватьОповещение = Ложь;
    СтрокаКоманды.Использование = "ВызовСерверногоМетода";
    
    // Вторая фоновая команда (для настройки на 15 число)
    СтрокаКоманды = ТЗКоманд.Добавить();
    СтрокаКоманды.Идентификатор = "ЗагрузитьПрайсЛистАвто2";
    СтрокаКоманды.Представление = "Загрузить прайс-лист (Автомат - Команда 2)";
    СтрокаКоманды.ПоказыватьОповещение = Ложь;
    СтрокаКоманды.Использование = "ВызовСерверногоМетода";
    
    ПараметрыРегистрации.Вставить("Команды", ТЗКоманд);
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

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

Способ 3: Дублирование типового регламентного задания в пользовательском режиме

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

  1. Откройте форму списка регламентных и фоновых заданий в пользовательском режиме (обычно находится в разделе Администрирование - Обслуживание).
  2. Найдите нужное вам регламентное задание и настройте его расписание, например, на 1-е число месяца.
  3. Нажмите кнопку «Добавить» (или скопируйте существующее задание).
  4. В качестве шаблона выберите то же самое регламентное задание из метаданных.
  5. Для созданной копии укажите расписание на 15-е число месяца.

Платформа позволяет создавать несколько пользовательских заданий на основе одного объекта метаданных РегламентныеЗадания. Каждое из них будет жить своей жизнью и иметь собственное расписание.

Способ 4: Использование внешнего планировщика задач (Планировщик Windows)

Если встроенных механизмов 1С по какой-то причине недостаточно, вынесем управление расписанием за пределы программы. Планировщик заданий ОС (Task Scheduler) имеет гораздо более гибкие настройки, позволяя легко выбирать конкретные дни в месяце (1, 15 и любые другие).

В этом случае мы создаем задачу в Windows, которая запускает 1С в пакетном режиме с передачей пути к нужной обработке через параметр запуска. Например:


"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"ServerName\BaseName" /N"User" /P"Password" /Execute "C:\Scripts\НашаОбработка.epf"

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

Способ 5: Использование Расширений конфигурации (для 1С версии 8.3)

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

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

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

← На главную