В распределенных информационных базах (РИБ) нередко возникает задача централизованного управления внешними отчетами и обработками. Например, в центральном узле изменена логика регламентного отчета, рассылаемого по почте. Изменения программного кода успешно доставляются через план обмена в десятки или сотни периферийных узлов (магазинов). Однако при изменении расписания запуска в справочнике ДополнительныеОтчетыИОбработки в центральной базе новые настройки времени и периодичности в дочерние базы автоматически не применяются.
Разберем, почему возникает данная проблема, рассмотрим решение по программной модификации расписания из самой обработки, а также проанализируем альтернативные и более надежные архитектурные подходы.
Выясним причину такого поведения платформы 1С и типовых конфигураций. Дело заключается в разделении прикладных данных и системных механизмов:
РегламентноеЗадание и связанный с ними объект РасписаниеРегламентногоЗадания хранятся на уровне системных таблиц кластера серверов или файла информационной базы. Они не входят в состав таблиц данных, синхронизируемых планами обмена РИБ.ДополнительныеОтчетыИОбработки, а связь с системным регламентным заданием обеспечивается через реквизит РегламентноеЗаданиеGUID. При загрузке данных в подчиненный узел обмен выполняется со свойством ОбменДанными.Загрузка = Истина. В этом режиме прикладные обработчики событий записи подавляются, из-за чего системное регламентное задание не пересоздается и его расписание не обновляется.Рассмотрим способ, предложенный на практике. Если обработка уже запускается в периферийных узлах по старому графику, мы можем встроить логику обновления расписания непосредственно в процедуру выполнения команды. При очередном сеансе работы обработка сама изменит параметры своего регламентного задания.
Посмотрим на пример кода, который помещается в модуль внешней обработки:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
// Имя регламентного задания, сформированное подсистемой дополнительных обработок
ИмяЗадания = "Дополнительная обработка: Регламент ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ";
МассивРегламентныхЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Неопределено);
Для Каждого ТекЗадание Из МассивРегламентныхЗаданий Цикл
Если ТекЗадание.Наименование = ИмяЗадания Тогда
ИзменитьРасписаниеРегЗадания(ТекЗадание);
КонецЕсли;
КонецЦикла;
// Далее следует основной рабочий код формирования и отправки отчета
КонецПроцедуры
Процедура ИзменитьРасписаниеРегЗадания(РегЗадание)
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.ДатаНачала = НачалоМесяца(ТекущаяДата());
НовоеРасписание.ВремяНачала = '00010101080000'; // Запуск в 8:00 утра
НовоеРасписание.ПериодНедель = 1;
ДниНеделиРасписания = Новый Массив;
ДниНеделиРасписания.Добавить(1); // 1 — понедельник
НовоеРасписание.ДниНедели = ДниНеделиРасписания;
РегЗадание.Расписание = НовоеРасписание;
РегЗадание.Использование = Истина;
РегЗадание.Записать();
КонецПроцедуры
Разберем особенности и технические нюансы этого метода:
ВыполнитьКоманду никогда не запустится автоматически.ПолучитьРегламентныеЗадания() является ресурсоемким и неустойчивым к изменению наименования. В БСП регламентные задания внешних обработок создаются на основе предопределенного задания ЗапускДополнительныхОбработок. Более надежно выполнять точечный поиск по идентификатору задания методом РегламентныеЗадания.НайтиПоУникальномуИдентификатору().Записать() при каждом выполнении фонового процесса создает лишнюю нагрузку на системные таблицы. Рекомендуется предварительно проверять текущее расписание через сравнение строкового представления или параметров и выполнять запись только при несовпадении.Рассмотрим более надежный инженерный подход, не зависящий от факта запуска самой обработки. Для синхронизации настроек мы можем задействовать обработчики загрузки данных обмена в подчиненном узле:
ПриПолученииДанныхОтГлавного или подписку на событие ПослеЗагрузкиДанных.ДополнительныеОтчетыИОбработки выполняем сброс признака загрузки для конкретного объекта: Объект.ОбменДанными.Загрузка = Ложь.ДополнительныеОтчетыИОбработки, которые отвечают за актуализацию системных регламентных заданий по переданным настройкам справочника.В таком случае регламентное задание будет обновлено или создано сразу в момент завершения сеанса синхронизации данных.
Проанализируем современную альтернативу использованию внешних обработок. Начиная с версии платформы 8.3.17, объекты РегламентноеЗадание поддерживаются в расширениях конфигурации.
Если логику формирования и отправки отчета вынести из внешней обработки в расширение, отпадает необходимость настраивать расписание вручную в каждом узле. Структура расширения, само регламентное задание и его базовое расписание будут передаваться по каналам РИБ централизованно вместе с конфигурацией.
Обратим внимание на частую специфику розничных сетей: узлы в магазинах нередко развернуты в файловом режиме без сервера 1С:Предприятия. Важно помнить: в файловой информационной базе фоновые и регламентные задания не стартуют сами по себе. Для их корректной работы по расписанию на рабочем месте должен быть постоянно запущен сеанс 1С с включенной обработкой регламентных заданий либо настроен запуск выделенного служебного сеанса через планировщик операционной системы.