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

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

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

Использование менеджера фоновых заданий

Самый прямой и очевидный способ — использование встроенного менеджера платформы. Вопреки распространенному заблуждению, менеджер фоновых заданий в файловых базах активен (начиная с версии платформы 8.3.3). При запуске регламентного задания система автоматически порождает фоновое задание, состояние которого мы и можем проанализировать.

Рассмотрим по шагам, как получить список активных фоновых заданий, связанных с конкретным регламентным заданием. Для этого нам понадобится объект ФоновыеЗадания и структура отбора.


// Определим регламентное задание, которое нас интересует
// Например, найдем его по метаданным или уникальному идентификатору
РегламентноеЗаданиеСсылка = РегламентныеЗадания.НайтиПоНаименованию("СинхронизацияДанныхСЦБ");

Если РегламентноеЗаданиеСсылка <> Неопределено Тогда
    
    // Создаем структуру отбора для поиска связанных фоновых заданий
    Отбор = Новый Структура;
    Отбор.Вставить("РегламентноеЗадание", РегламентноеЗаданиеСсылка);
    Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); // Ищем только работающие
    
    // Получаем массив фоновых заданий по фильтру
    МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
    
    Если МассивФоновыхЗаданий.Количество() > 0 Тогда
        Сообщить("Задание в данный момент выполняется. Количество активных потоков: " + МассивФоновыхЗаданий.Количество());
    Иначе
        Сообщить("Задание не запущено.");
    КонецЕсли;
    
КонецЕсли;

Проанализируем ситуацию: метод ПолучитьФоновыеЗадания возвращает объекты, содержащие свойства Начало (Begin), Конец (End) и Состояние (State). Важно понимать, что в файловом режиме информация о фоновых заданиях может быть ограничена временем жизни текущего сеанса или активностью параллельных процессов, которые "подхватили" выполнение задания.

Методы Библиотеки стандартных подсистем (БСП)

Если вы работаете в современной конфигурации, такой как "Розница 2.0/3.0", "Управление торговлей" или "Бухгалтерия предприятия", в них наверняка внедрена Библиотека стандартных подсистем (БСП). Разработчики БСП уже предусмотрели программный интерфейс для работы с заданиями, который учитывает специфику файлового и серверного режимов. Для упрощения интеграции и управления фоновыми процессами в типовых конфигурациях можно использовать расширение для работы с командами БСП и регламентными заданиями.

Рекомендуем использовать функцию ДанныеЗадания программного интерфейса подсистемы "Регламентные задания". Это более надежно, так как БСП может кэшировать состояния или использовать дополнительные регистры сведений для мониторинга.

Пример обращения к механизмам БСП:


// Используем общий модуль БСП
ИдентификаторЗадания = РегламентныеЗадания.НайтиПоНаименованию("СинхронизацияДанных").УникальныйИдентификатор;
СостояниеЗадания = РегламентныеЗаданияСервер.ДанныеЗадания(ИдентификаторЗадания);

Если СостояниеЗадания.Состояние = "Выполняется" Тогда
    // Ваша логика при активном задании
КонецЕсли;

Проверка через Журнал регистрации

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

Выясним причину возможного отсутствия данных, обратившись к записям журнала напрямую:


// Настроим фильтр для журнала регистрации
Фильтр = Новый Структура;
Фильтр.Вставить("Событие", "_$ScheduledJob.Start$_"); // Событие начала задания
Фильтр.Вставить("ДатаНачала", ТекущаяДата() - 3600); // Проверяем за последний час

ТЗ_Событий = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТЗ_Событий, Фильтр);

// Далее необходимо проанализировать, есть ли для каждого события старта 
// соответствующее событие завершения (_$ScheduledJob.Finish$_)

Этот метод считается "тяжелым" для системы, но он дает 100% гарантию того, запускалось ли задание фактически, даже если сеанс, который его инициировал, уже закрыт.

Создание собственного "флага" выполнения

Посмотрим на практический совет, который часто применяют опытные разработчики для РИБ-систем в файловом режиме. Чтобы избежать конфликтов при ручном и автоматическом запуске, внутри самого кода регламентного задания можно реализовать механизм "флагов".

Алгоритм реализации:

  1. В начале процедуры регламентного задания записываем значение в Константу или в специально созданный Регистр сведений (например, "СтатусОбмена"). Указываем статус "Выполняется" и текущее время.
  2. В блоке Попытка...Исключение...КонецПопытки основного кода задания обязательно прописываем очистку этого флага в конце работы (в блоке КонецПроцедуры или после успешного выполнения).
  3. Перед запуском задания (программным или ручным) проверяем этот флаг. Если статус "Выполняется" и время записи не превышает разумный предел (например, 30 минут), значит, задание еще в работе.

Рассмотрим пример кода внутри задания:


Процедура ВыполнитьОбменДанными()
    
    // 1. Установка блокировки/флага
    УстановитьСтатусВыполнения(Истина);
    
    Попытка
        // Основной код синхронизации
        // ...
    Исключение
        // Запись ошибки
    КонецПопытки;
    
    // 2. Снятие флага
    УстановитьСтатусВыполнения(Ложь);
    
КонецПроцедуры

Особенности настройки для файлового режима

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

Важные моменты:

Подводя итог, можно сказать: наиболее универсальным программным способом является использование ФоновыеЗадания.ПолучитьФоновыеЗадания(), дополненное проверкой через Журнал регистрации или пользовательские флаги для обеспечения максимальной надежности в условиях файлового режима.

← На главную