При разработке и внедрении новых механизмов в конфигурации 1С программисты часто сталкиваются с ситуацией, когда созданное регламентное задание, несмотря на все установленные флаги в конфигураторе, упорно отказывается запускаться в автоматическом режиме. Особенно остро эта проблема проявляется в файловых вариантах информационных баз. Рассмотрим, почему это происходит, и разберем эффективные способы решения этой задачи, включая автоматизацию для большого количества узлов или баз.
Типичная ситуация: в конфигурации создано новое РегламентноеЗадание. В конфигураторе установлены свойства Предопределенное и Использовать, настроено расписание. Однако после обновления базы в списке регламентных заданий оно отображается как включенное, но дата последнего выполнения пуста, и задание не стартует. Выясним причину такого поведения системы.
В платформе 1С существует разделение между объектом метаданных и конкретным экземпляром задания в базе данных. В файловом режиме механизм планировщика инициализируется не сразу. Рассмотрим этапы запуска планировщика в файловой базе:
Таким образом, первые задания должны начать выполняться не ранее чем через 120 секунд. Но если даже спустя часы задание не запустилось, значит, платформа "не подцепила" новое предопределенное задание из метаданных. Проанализируем ситуацию подробнее: часто для того, чтобы задание начало работать, достаточно просто открыть список всех регламентных заданий в пользовательском интерфейсе. Это действие инициирует обращение к менеджеру регламентных заданий, который синхронизирует список метаданных с текущим состоянием базы данных.
Если у вас одна или две базы, проблему можно решить вручную, зайдя в список заданий. Но если баз десятки или сотни (например, распределенная сеть магазинов), нам потребуется программный метод. Как показывает практика, принудительный вызов метода Записать() для конкретного регламентного задания заставляет систему зарегистрировать его в планировщике.
Рассмотрим пример кода, который решает эту проблему:
// Получаем объект регламентного задания по его метаданным
МетаданныеЗадания = Метаданные.РегламентныеЗадания.НазваниеВашегоЗадания;
ЗаданиеОбъект = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(МетаданныеЗадания);
// Принудительная перезапись для инициализации задания в базе
Если ЗаданиеОбъект <> Неопределено Тогда
ЗаданиеОбъект.Записать();
КонецЕсли;
Этот простой блок кода "будит" задание. После выполнения этого фрагмента планировщик начинает видеть задание и запускает его согласно установленному расписанию.
Когда стоит задача применить это решение во всех базах после очередного обновления конфигурации, лучше всего использовать механизмы Библиотеки стандартных подсистем (БСП). Разберем по шагам, как встроить инициализацию в процедуру обновления базы.
Проанализируем работу модуля ОбновлениеИнформационнойБазы. Мы можем добавить обработчик, который выполнится один раз при запуске системы после обновления. Это гарантирует, что задание стартанет на всех 100 точках без ручного вмешательства администратора.
В модуле управления обновлением вашей конфигурации (обычно это ОбновлениеИнформационнойБазы[ВашПрефикс]) добавим следующий код:
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
НовыйОбработчик = Обработчики.Добавить();
НовыйОбработчик.Версия = "1.0.0.5"; // Укажите текущую версию вашей конфигурации
НовыйОбработчик.Процедура = "ВашМодульСервер.ИнициализироватьРегламентноеЗадание";
НовыйОбработчик.ВыполнятьВПараллельномРежиме = Ложь;
КонецПроцедуры
Процедура ИнициализироватьРегламентноеЗадание() Экспорт
// Находим наше задание
ИмяЗадания = "МоеНовоеРегламентноеЗадание";
Задание = РегламентныеЗаданияСервер.НайтиРегламентноеЗадание(Метаданные.РегламентныеЗадания[ИмяЗадания]);
Если Задание <> Неопределено Тогда
// Устанавливаем использование и записываем
Задание.Использование = Истина;
Задание.Записать();
КонецЕсли;
КонецПроцедуры
Важный момент: использование метода НайтиРегламентноеЗадание или ПолучитьРегламентноеЗадание позволяет работать именно с экземпляром задания, который привязан к метаданным с флагом "Предопределенное".
Разберем дополнительные факторы, которые могут влиять на работу заданий в файловой базе, чтобы исключить другие ошибки:
Посмотрим также на ситуацию с публикацией базы на веб-сервере. Если ваша файловая база работает через Apache или IIS, для выполнения заданий может потребоваться настройка параметра AllowExecuteScheduledJobs в файле conf.cfg или выделение отдельного клиентского сеанса, который будет играть роль "сервера заданий".
Подведем итог нашему исследованию. Если предопределенное регламентное задание не стартует автоматически:
Задание.Записать() для принудительной активации.Соблюдение этих рекомендаций позволит вам избежать рутины при обновлении распределенных систем и обеспечит стабильную работу фоновых процессов в 1С.