При разработке и сопровождении конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача периодического выполнения процедур: например, ежедневной рассылки отчетов на электронную почту или циклического опроса SMS-шлюза каждые несколько минут. В клиент-серверном варианте для этого традиционно используются встроенные регламентные задания, выполняемые сервером 1С. Однако в файловом режиме автоматический запуск сервером отсутствует, что требует применения альтернативных подходов.
Разберем подробно два основных сценария автоматизации: запуск разовых ежедневных задач через системный планировщик задач Windows с использованием пакетного файла и организацию постоянного циклического процесса с помощью обработчиков ожидания платформы 1С.
Для задач, которые требуется выполнять с большими интервалами (например, один раз в сутки в ночное время), нецелесообразно держать сеанс постоянно открытым. Оптимальным решением является запуск платформы 1С через командную строку с передачей параметров выполнения внешней обработки.
Рассмотрим ключевые особенности и правила формирования командного файла .bat:
/Execute предназначен исключительно для запуска внешних обработок с расширением .epf. Внешние отчеты (.erf) через этот ключ запустить нельзя. Если алгоритм оформлен в виде внешнего отчета, сохраним его в конфигураторе как внешнюю обработку (Файл — Сохранить как... — Внешняя обработка).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
Проанализируем параметры командной строки:
enterprise — запуск 1С в режиме «1С:Предприятие»;/F — указание пути к каталогу файловой информационной базы;/N и /P — имя пользователя и пароль учетной записи с правами на выполнение необходимых действий;/Execute — путь к внешней обработке, которая должна автоматически выполниться;/DisableStartupMessages — отключение стартовых диалогов и предупреждений (например, об обновлении конфигурации), чтобы предотвратить зависание сеанса.Внутри самой внешней обработки в модуле формы или модуля объекта настроим логику автоматического исполнения и последующего закрытия сеанса:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Выполняем основную процедуру рассылки
ВыполнитьРассылкуОтчетов();
// Безусловно завершаем работу сеанса без запроса подтверждения
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Важный момент: все ключевые этапы выполнения обязательно фиксируем в журнале регистрации с помощью метода ЗаписьЖурналаРегистрации(). В случае возникновения ошибок обернем вызовы в блок Попытка ... Исключение, чтобы зафиксировать текст ошибки в журнале перед завершением работы системы.
Если процедуру необходимо выполнять с высокой периодичностью (например, опрос SMS-шлюза каждые 300 секунд), постоянный перезапуск сеанса через батник создаст чрезмерную нагрузку на систему и файловую базу. В этом случае выделяется один запущенный сеанс 1С, внутри которого подключается таймер.
Для вызова процедур по интервалу платформа предоставляет метод ПодключитьОбработчикОжидания(). Выясним причину частой ошибки: при указании процедуры обработчика многие разработчики сталкиваются с исключением вида «Недопустимое значение параметра... Процедура, указанная в качестве обработчика события, имеет неверное количество параметров».
Разберем обязательные требования к процедуре-обработчику:
Экспорт, если она вызывается из контекста модуля.Попытка ... Исключение. Необработанное исключение внутри обработчика ожидания приведет к остановке таймера или аварийному завершению работы.Посмотрим на пример корректной реализации циклического выполнения процедуры в форме обработки:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Выполняем первичный запуск процедуры сразу после открытия
ОбработатьОчередьШлюза();
// Подключаем циклический вызов каждые 300 секунд (5 минут)
ПодключитьОбработчикОжидания("ОбработатьОчередьШлюза", 300, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьОчередьШлюза() Экспорт
Попытка
// Вызываем серверную процедуру взаимодействия с внешним сервисом
ВыполнитьВыгрузкуШлюзаНаСервере();
Исключение
ЗаписьЖурналаРегистрации(
"SMS-шлюз",
УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки()
);
КонецПопытки;
КонецПроцедуры
Иногда требуется запустить обработку при старте системы, но дать платформе время на инициализацию всех подсистем, отложив первый запуск (например, на 10 минут). Для этого используем третий параметр метода ПодключитьОбработчикОжидания() — признак однократности вызова:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
// Однократный запуск через 600 секунд (10 минут) после старта
ПодключитьОбработчикОжидания("ПервичныйСтартОбработки", 600, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПервичныйСтартОбработки() Экспорт
// Выполняем задачу
ОбработатьОчередьШлюза();
// Переключаем обработчик на постоянный интервал в 300 секунд
ПодключитьОбработчикОжидания("ОбработатьОчередьШлюза", 300, Ложь);
КонецПроцедуры
Если в конфигурации уже созданы стандартные объекты метаданных РегламентныеЗадания с настроенным расписанием, нам не обязательно создавать отдельные внешние файлы под каждую операцию. В постоянно запущенном сеансе можно инициировать механизм выполнения регламентных заданий платформы с помощью глобального метода ВыполнитьОбработкуЗаданий():
&НаКлиенте
Процедура ЗапуститьМенеджерЗаданий()
// Проверка наличия заданий к запуску каждые 60 секунд
ПодключитьОбработчикОжидания("ФайловаяОбработкаЗаданий", 60, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ФайловаяОбработкаЗаданий() Экспорт
ВыполнитьОбработкуЗаданий();
КонецПроцедуры
Метод ВыполнитьОбработкуЗаданий() выполняет один цикл проверки и запуска назначенных регламентных заданий, позволяя файловой информационной базе полноценно использовать штатные расписания конфигурации без привлечения сторонних утилит.