Работа в файловом варианте информационной базы 1С:Предприятие накладывает определенные ограничения на механизмы управления регламентными заданиями. В отличие от клиент-серверного варианта, где за выполнение заданий отвечает менеджер кластера, в файловой базе выполнение инициируется самой платформой в рамках запущенных сеансов. В данной статье мы подробно разберем, как программно определить, выполняется ли конкретное регламентное задание в текущий момент (поможет система автоматического контроля и уведомления о сбоях регламентных заданий), и рассмотрим особенности реализации этой задачи для конфигураций на базе 1С:Предприятие 8.3.
Самый прямой и очевидный способ — использование встроенного менеджера платформы. Вопреки распространенному заблуждению, менеджер фоновых заданий в файловых базах активен (начиная с версии платформы 8.3.3). При запуске регламентного задания система автоматически порождает фоновое задание, состояние которого мы и можем проанализировать.
Рассмотрим по шагам, как получить список активных фоновых заданий, связанных с конкретным регламентным заданием. Для этого нам понадобится объект ФоновыеЗадания и структура отбора.
// Определим регламентное задание, которое нас интересует
// Например, найдем его по метаданным или уникальному идентификатору
РегламентноеЗаданиеСсылка = РегламентныеЗадания.НайтиПоНаименованию("СинхронизацияДанныхСЦБ");
Если РегламентноеЗаданиеСсылка <> Неопределено Тогда
// Создаем структуру отбора для поиска связанных фоновых заданий
Отбор = Новый Структура;
Отбор.Вставить("РегламентноеЗадание", РегламентноеЗаданиеСсылка);
Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); // Ищем только работающие
// Получаем массив фоновых заданий по фильтру
МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если МассивФоновыхЗаданий.Количество() > 0 Тогда
Сообщить("Задание в данный момент выполняется. Количество активных потоков: " + МассивФоновыхЗаданий.Количество());
Иначе
Сообщить("Задание не запущено.");
КонецЕсли;
КонецЕсли;
Проанализируем ситуацию: метод ПолучитьФоновыеЗадания возвращает объекты, содержащие свойства Начало (Begin), Конец (End) и Состояние (State). Важно понимать, что в файловом режиме информация о фоновых заданиях может быть ограничена временем жизни текущего сеанса или активностью параллельных процессов, которые "подхватили" выполнение задания.
Если вы работаете в современной конфигурации, такой как "Розница 2.0/3.0", "Управление торговлей" или "Бухгалтерия предприятия", в них наверняка внедрена Библиотека стандартных подсистем (БСП). Разработчики БСП уже предусмотрели программный интерфейс для работы с заданиями, который учитывает специфику файлового и серверного режимов. Для упрощения интеграции и управления фоновыми процессами в типовых конфигурациях можно использовать расширение для работы с командами БСП и регламентными заданиями.
Рекомендуем использовать функцию ДанныеЗадания программного интерфейса подсистемы "Регламентные задания". Это более надежно, так как БСП может кэшировать состояния или использовать дополнительные регистры сведений для мониторинга.
Пример обращения к механизмам БСП:
// Используем общий модуль БСП
ИдентификаторЗадания = РегламентныеЗадания.НайтиПоНаименованию("СинхронизацияДанных").УникальныйИдентификатор;
СостояниеЗадания = РегламентныеЗаданияСервер.ДанныеЗадания(ИдентификаторЗадания);
Если СостояниеЗадания.Состояние = "Выполняется" Тогда
// Ваша логика при активном задании
КонецЕсли;
В некоторых случаях менеджер фоновых заданий может не возвращать актуальную информацию (например, при сбоях в синхронизации процессов файловой системы). Тогда на помощь приходит анализ Журнала регистрации — для этого есть утилита мониторинга фоновых заданий по журналу регистрации. Каждое регламентное задание при старте и завершении записывает соответствующее событие.
Выясним причину возможного отсутствия данных, обратившись к записям журнала напрямую:
// Настроим фильтр для журнала регистрации
Фильтр = Новый Структура;
Фильтр.Вставить("Событие", "_$ScheduledJob.Start$_"); // Событие начала задания
Фильтр.Вставить("ДатаНачала", ТекущаяДата() - 3600); // Проверяем за последний час
ТЗ_Событий = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТЗ_Событий, Фильтр);
// Далее необходимо проанализировать, есть ли для каждого события старта
// соответствующее событие завершения (_$ScheduledJob.Finish$_)
Этот метод считается "тяжелым" для системы, но он дает 100% гарантию того, запускалось ли задание фактически, даже если сеанс, который его инициировал, уже закрыт.
Посмотрим на практический совет, который часто применяют опытные разработчики для РИБ-систем в файловом режиме. Чтобы избежать конфликтов при ручном и автоматическом запуске, внутри самого кода регламентного задания можно реализовать механизм "флагов".
Алгоритм реализации:
Константу или в специально созданный Регистр сведений (например, "СтатусОбмена"). Указываем статус "Выполняется" и текущее время.Попытка...Исключение...КонецПопытки основного кода задания обязательно прописываем очистку этого флага в конце работы (в блоке КонецПроцедуры или после успешного выполнения).Рассмотрим пример кода внутри задания:
Процедура ВыполнитьОбменДанными()
// 1. Установка блокировки/флага
УстановитьСтатусВыполнения(Истина);
Попытка
// Основной код синхронизации
// ...
Исключение
// Запись ошибки
КонецПопытки;
// 2. Снятие флага
УстановитьСтатусВыполнения(Ложь);
КонецПроцедуры
Проанализируем ситуацию с запуском. Чтобы вышеописанные методы (особенно через менеджер фоновых заданий) работали корректно, убедитесь, что в базе разрешено выполнение заданий — для этого подойдёт интерактивная консоль для управления регламентными заданиями в 1С. Для файлового режима это регулируется параметром строки запуска или в настройках параметров информационной базы.
Важные моменты:
/AllowExecuteScheduledJobs в ярлыке запуска или настройках.Config. При активном обмене 1С накладывает объектные блокировки, которые также можно попытаться отследить программно через попытку блокировки узла обмена.Подводя итог, можно сказать: наиболее универсальным программным способом является использование ФоновыеЗадания.ПолучитьФоновыеЗадания(), дополненное проверкой через Журнал регистрации или пользовательские флаги для обеспечения максимальной надежности в условиях файлового режима.