Разработка и настройка регламентных заданий в системе «1С:Предприятие 8.3» — задача стандартная, но только до тех пор, пока мы работаем в клиент-серверном варианте. В серверной архитектуре запуск и выполнение заданий полностью берет на себя кластер серверов 1С. В файловом же режиме разработчики часто сталкиваются с ситуацией, когда созданное задание упорно отказывается запускаться автоматически. Выясним, почему так происходит, подробно разберем внутреннюю архитектуру работы планировщика в файловой базе и рассмотрим пошаговые инструкции по настройке, отладке и обеспечению стабильной круглосуточной работы регламентных заданий.
Для начала проанализируем, как именно эволюционировал механизм выполнения регламентных заданий. В старых версиях платформы (8.2 и ранее) для запуска фоновых задач в файловом режиме требовалось держать открытым специальный сеанс «1С» и регулярно вызывать метод ВыполнитьОбработкуЗаданий() в обработчике ожидания. Начиная с версии платформы 8.3.3, этот механизм кардинально изменился и стал значительно дружелюбнее к разработчику. Рассмотрим ключевые особенности современной архитектуры:
/AllowExecuteScheduledJobs. Если же база опубликована на веб-сервере, управление планировщиком осуществляется в файле настроек публикации default.vrd при помощи специального атрибута allowexecutescheduledjobs.Рассмотрим классическую ситуацию: разработчик создал в конфигураторе новое регламентное задание, установил свойство «Предопределенное», задал расписание повторения каждые две минуты, запустил отладку пустого приложения — но в результате ничего не произошло. Почему система молчит? Разберем по шагам неочевидные тонкости платформы, из-за которых происходят подобные сбои.
А. Предопределенное задание отсутствует в таблице базы данных
В пустых, только что созданных базах или при первом добавлении нового предопределенного объекта в конфигурацию платформа не всегда автоматически создает соответствующую запись в таблице базы данных. Конфигурация «знает» о задании, но планировщик его не видит. Чтобы принудительно инициализировать и обновить состав предопределенных заданий в информационной базе, нам необходимо программно вызвать специальный метод встроенного языка. Сделать это можно, например, в модуле управляемого приложения при начале работы системы или через специализированную внешнюю обработку:
Процедура ОбновитьЗадания() Экспорт
РегламентныеЗадания.ОбновитьПредопределенныеРегламентныеЗадания();
КонецПроцедуры
Б. Активна блокировка выполнения регламентных заданий
В свойствах файловой информационной базы может быть установлен флаг блокировки регламентных заданий. Часто эта блокировка устанавливается автоматически при копировании базы данных, чтобы предотвратить случайную отправку писем или синхронизацию из копии. Проверить состояние блокировки и снять ее мы можем программно с помощью следующего кода:
Блокировка = ПолучитьБлокировкуСеансов();
Если Блокировка.Установлена и Блокировка.БлокировкаРегламентныхЗаданий Тогда
Блокировка.БлокировкаРегламентныхЗаданий = Ложь;
УстановитьБлокировкуСеансов(Блокировка);
КонецЕсли;
В. Неверно настроен контекст исполнения процедуры-обработчика
Метод, который вызывается регламентным заданием, должен отвечать строгим правилам компиляции:
Экспорт.Г. Использование интерактивных методов в фоновом потоке
Регламентное задание выполняется в фоновом режиме, где полностью отсутствует пользовательский интерфейс. Если в коде обработчика встретится вызов интерактивных методов, таких как Сообщить(), Предупреждение(), Вопрос() или ОткрытьФорму(), платформа мгновенно сгенерирует исключение, и выполнение задания завершится аварийно. Пользователь при этом ничего не увидит. Для автоматического выявления и исправления таких модальных вызовов в коде можно использовать обработку для проверки модулей на соответствие стандартам разработки.
Чтобы фиксировать результаты работы и выявлять ошибки, вместо интерактивных сообщений мы должны использовать запись в Журнал регистрации. Рассмотрим пример правильного логирования:
Процедура ВыполнитьЗагрузкуДанных() Экспорт
Попытка
// Здесь располагается основной код загрузки данных
// ...
// Фиксируем успешное выполнение в журнале регистрации
ЗаписьЖурналаРегистрации(
"РегламентноеЗадание.ЗагрузкаДанных",
УровеньЖурналаРегистрации.Информация,
,
,
"Загрузка данных успешно завершена."
);
Исключение
// Фиксируем ошибку в случае сбоя
ЗаписьЖурналаРегистрации(
"РегламентноеЗадание.ЗагрузкаДанных",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка при загрузке данных: " + ОписаниеОшибки()
);
КонецПопытки;
КонецПроцедуры
Основная проблема файлового режима заключается в том, что как только все пользователи закрывают свои сеансы «1С» (например, в конце рабочего дня), выполнение регламентных заданий полностью прекращается. Планировщику просто не в рамках какого процесса работать. Рассмотрим три проверенных практических сценария решения этой проблемы.
На постоянно включенном компьютере или сервере создается отдельная учетная запись пользователя операционной системы. Под этим пользователем настраивается автоматический запуск «1С:Предприятия» под специальным служебным пользователем базы данных (например, «Робот»). Этот сеанс оставляют запущенным круглосуточно. Чтобы минимизировать потребление ресурсов компьютера, конфигурацию для этого пользователя можно запускать в режиме тонкого клиента с отключенным интерфейсом.
Если нам требуется выполнять регламентную процедуру строго в определенное время (например, в 3 часа ночи для обмена данными), мы можем настроить регламентную задачу в операционной системе Windows. Задача будет запускать 1С в неинтерактивном режиме выполнения внешней обработки, а по завершении работы автоматически закрывать программу. Рассмотрим пример строки запуска для планировщика Windows:
"C:\Program Files\1cv8\8.3.13.1644\bin\1cv8.exe" ENTERPRISE /F"C:\1C_Bases\MyBase" /N"ScheduledRobot" /P"RobotPassword" /Execute "C:\1C_Scripts\RunLoadData.epf" /C"CloseAfterDone"
В модуле внешней обработки RunLoadData.epf в обработчике события ПриОткрытии мы прописываем вызов нашей процедуры загрузки данных, после чего вызываем метод завершения работы системы:
Процедура ПриОткрытии(Отказ)
Попытка
МойОбщийМодульСервер.ВыполнитьЗагрузкуДанных();
Исключение
// Обработка критической ошибки
КонецПопытки;
// Автоматически закрываем сеанс 1С по окончании работы
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Если файловая информационная база опубликована на веб-сервере под управлением IIS или Apache, то при наличии хотя бы одного активного подключения к базе через веб-клиент или через HTTP-сервисы, веб-сервер берет на себя роль хоста для фонового процесса. В этом случае регламентные задания будут выполняться стабильно силами веб-сервера без необходимости держать открытым тяжелое интерактивное окно платформы 1С.
Поскольку фоновые и регламентные задания запускаются платформой в отдельном, изолированном потоке, обычная точка останова в конфигураторе не сработает. Настроим отладку фонового процесса по шагам:
Для удобного ручного управления регламентными заданиями в процессе разработки настоятельно рекомендуется использовать стандартную обработку «Консоль заданий». С ее помощью мы можем в любой момент вручную запустить любое регламентное задание на выполнение (не дожидаясь наступления времени по расписанию), посмотреть точное время последнего запуска, проанализировать возникшие ошибки и оперативно отредактировать расписание выполнения.