Как изменить расписание регламентного запуска внешней обработки в узлах РИБ 1С?

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

В распределенных информационных базах (РИБ) нередко возникает задача централизованного управления внешними отчетами и обработками. Например, в центральном узле изменена логика регламентного отчета, рассылаемого по почте. Изменения программного кода успешно доставляются через план обмена в десятки или сотни периферийных узлов (магазинов). Однако при изменении расписания запуска в справочнике ДополнительныеОтчетыИОбработки в центральной базе новые настройки времени и периодичности в дочерние базы автоматически не применяются.

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

Почему расписание регламентного задания не передается через РИБ

Выясним причину такого поведения платформы 1С и типовых конфигураций. Дело заключается в разделении прикладных данных и системных механизмов:

  1. Системная природа заданий: Объекты метаданных РегламентноеЗадание и связанный с ними объект РасписаниеРегламентногоЗадания хранятся на уровне системных таблиц кластера серверов или файла информационной базы. Они не входят в состав таблиц данных, синхронизируемых планами обмена РИБ.
  2. Подавление событий при обмене: В Библиотеке стандартных подсистем (БСП) внешние обработки хранятся в справочнике ДополнительныеОтчетыИОбработки, а связь с системным регламентным заданием обеспечивается через реквизит РегламентноеЗаданиеGUID. При загрузке данных в подчиненный узел обмен выполняется со свойством ОбменДанными.Загрузка = Истина. В этом режиме прикладные обработчики событий записи подавляются, из-за чего системное регламентное задание не пересоздается и его расписание не обновляется.

Решение 1. Программное изменение расписания внутри внешней обработки

Рассмотрим способ, предложенный на практике. Если обработка уже запускается в периферийных узлах по старому графику, мы можем встроить логику обновления расписания непосредственно в процедуру выполнения команды. При очередном сеансе работы обработка сама изменит параметры своего регламентного задания.

Посмотрим на пример кода, который помещается в модуль внешней обработки:


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    
    // Имя регламентного задания, сформированное подсистемой дополнительных обработок
    ИмяЗадания = "Дополнительная обработка: Регламент ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ"; 
    
    МассивРегламентныхЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Неопределено);       
    
    Для Каждого ТекЗадание Из МассивРегламентныхЗаданий Цикл
        Если ТекЗадание.Наименование = ИмяЗадания Тогда 
            ИзменитьРасписаниеРегЗадания(ТекЗадание);
        КонецЕсли;    
    КонецЦикла;
    
    // Далее следует основной рабочий код формирования и отправки отчета
    
КонецПроцедуры

Процедура ИзменитьРасписаниеРегЗадания(РегЗадание)
    
    НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
    НовоеРасписание.ДатаНачала = НачалоМесяца(ТекущаяДата());
    НовоеРасписание.ВремяНачала = '00010101080000'; // Запуск в 8:00 утра
    НовоеРасписание.ПериодНедель = 1;
    
    ДниНеделиРасписания = Новый Массив;
    ДниНеделиРасписания.Добавить(1); // 1 — понедельник
    НовоеРасписание.ДниНедели = ДниНеделиРасписания;
    
    РегЗадание.Расписание = НовоеРасписание;
    РегЗадание.Использование = Истина;
    РегЗадание.Записать();
    
КонецПроцедуры

Разберем особенности и технические нюансы этого метода:

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

Решение 2. Обновление расписания в обработчиках обмена данными

Рассмотрим более надежный инженерный подход, не зависящий от факта запуска самой обработки. Для синхронизации настроек мы можем задействовать обработчики загрузки данных обмена в подчиненном узле:

  1. В плане обмена используем процедуру ПриПолученииДанныхОтГлавного или подписку на событие ПослеЗагрузкиДанных.
  2. При получении изменений по справочнику ДополнительныеОтчетыИОбработки выполняем сброс признака загрузки для конкретного объекта: Объект.ОбменДанными.Загрузка = Ложь.
  3. Вызываем штатные методы БСП из общего модуля ДополнительныеОтчетыИОбработки, которые отвечают за актуализацию системных регламентных заданий по переданным настройкам справочника.

В таком случае регламентное задание будет обновлено или создано сразу в момент завершения сеанса синхронизации данных.

Решение 3. Перенос функционала в расширение конфигурации

Проанализируем современную альтернативу использованию внешних обработок. Начиная с версии платформы 8.3.17, объекты РегламентноеЗадание поддерживаются в расширениях конфигурации.

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

Особенности работы в файловых базах магазинов

Обратим внимание на частую специфику розничных сетей: узлы в магазинах нередко развернуты в файловом режиме без сервера 1С:Предприятия. Важно помнить: в файловой информационной базе фоновые и регламентные задания не стартуют сами по себе. Для их корректной работы по расписанию на рабочем месте должен быть постоянно запущен сеанс 1С с включенной обработкой регламентных заданий либо настроен запуск выделенного служебного сеанса через планировщик операционной системы.

← На главную