Как автоматизировать выполнение процедур по расписанию в файловой базе 1С?

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

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

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

Сценарий 1. Автоматический запуск регламентных процедур через планировщик Windows

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

Рассмотрим ключевые особенности и правила формирования командного файла .bat:

  1. Тип исполняемого файла: Параметр командной строки /Execute предназначен исключительно для запуска внешних обработок с расширением .epf. Внешние отчеты (.erf) через этот ключ запустить нельзя. Если алгоритм оформлен в виде внешнего отчета, сохраним его в конфигураторе как внешнюю обработку (Файл — Сохранить как... — Внешняя обработка).
  2. Корректность путей: В командной строке необходимо следить за корректностью обратных слэшей в путях к базе и обработке, а также заключать пути, содержащие пробелы, в кавычки.
  3. Кодировка: При наличии кириллических символов в именах пользователей или путях в начале батника зададим кодовую страницу chcp 1251.

Посмотрим на пример структуры пакетного файла для запуска задачи:


@echo off
chcp 1251
"C:\Program Files (x86)\1cv8\common\1cestart.exe" enterprise /F"D:\Bases\MyBase" /N"Robot" /P"RobotPassword" /Execute "D:\Bases\Scripts\DailyReport.epf" /DisableStartupMessages

Проанализируем параметры командной строки:

  1. enterprise — запуск 1С в режиме «1С:Предприятие»;
  2. /F — указание пути к каталогу файловой информационной базы;
  3. /N и /P — имя пользователя и пароль учетной записи с правами на выполнение необходимых действий;
  4. /Execute — путь к внешней обработке, которая должна автоматически выполниться;
  5. /DisableStartupMessages — отключение стартовых диалогов и предупреждений (например, об обновлении конфигурации), чтобы предотвратить зависание сеанса.

Внутри самой внешней обработки в модуле формы или модуля объекта настроим логику автоматического исполнения и последующего закрытия сеанса:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Выполняем основную процедуру рассылки
    ВыполнитьРассылкуОтчетов();
    
    // Безусловно завершаем работу сеанса без запроса подтверждения
    ЗавершитьРаботуСистемы(Ложь);
    
КонецПроцедуры

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

Сценарий 2. Организация частых циклических процессов через обработчик ожидания

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

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

Разберем обязательные требования к процедуре-обработчику:

  1. Процедура не должна принимать никаких параметров.
  2. Процедура должна быть объявлена с ключевым словом Экспорт, если она вызывается из контекста модуля.
  3. Все потенциально нестабильные сетевые вызовы (HTTP-запросы к SMS-шлюзам, работа с сокетами или почтой) обязательно должны находиться внутри конструкции Попытка ... Исключение. Необработанное исключение внутри обработчика ожидания приведет к остановке таймера или аварийному завершению работы.

Посмотрим на пример корректной реализации циклического выполнения процедуры в форме обработки:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Выполняем первичный запуск процедуры сразу после открытия
    ОбработатьОчередьШлюза();
    
    // Подключаем циклический вызов каждые 300 секунд (5 минут)
    ПодключитьОбработчикОжидания("ОбработатьОчередьШлюза", 300, Ложь);
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьОчередьШлюза() Экспорт
    
    Попытка
        // Вызываем серверную процедуру взаимодействия с внешним сервисом
        ВыполнитьВыгрузкуШлюзаНаСервере();
    Исключение
        ЗаписьЖурналаРегистрации(
            "SMS-шлюз",
            УровеньЖурналаРегистрации.Ошибка,,,
            ОписаниеОшибки()
        );
    КонецПопытки;
    
КонецПроцедуры

Реализация отложенного первого старта

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


&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    
    // Однократный запуск через 600 секунд (10 минут) после старта
    ПодключитьОбработчикОжидания("ПервичныйСтартОбработки", 600, Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура ПервичныйСтартОбработки() Экспорт
    
    // Выполняем задачу
    ОбработатьОчередьШлюза();
    
    // Переключаем обработчик на постоянный интервал в 300 секунд
    ПодключитьОбработчикОжидания("ОбработатьОчередьШлюза", 300, Ложь);
    
КонецПроцедуры

Альтернатива: вызов штатных регламентных заданий в файловой базе

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


&НаКлиенте
Процедура ЗапуститьМенеджерЗаданий()
    // Проверка наличия заданий к запуску каждые 60 секунд
    ПодключитьОбработчикОжидания("ФайловаяОбработкаЗаданий", 60, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ФайловаяОбработкаЗаданий() Экспорт
    ВыполнитьОбработкуЗаданий();
КонецПроцедуры

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

← На главную