При попытке запустить встроенную или внешнюю обработку в фоновом или регламентном задании разработчики нередко сталкиваются с ошибкой инициализации модуля: Module initialization error: Общий модуль.РегламентныеЗадания.Модуль. Разберем причины возникновения этой ситуации, проанализируем контекст исполнения серверного кода и рассмотрим правильные варианты программного запуска обработки без открытия интерфейса.
Выясним, почему вызов методов ПолучитьФорму() или Открыть() приводит к аварийному завершению регламентного задания. Все регламентные и фоновые задания в платформе «1С:Предприятие 8» исполняются исключительно на сервере (в серверном сеансе) или в специализированном фоновом потоке, у которого отсутствует графический интерфейс.
Рассмотрим, что происходит на уровне платформы:
ПолучитьФорму, ОткрытьФорму, Предупреждение, Вопрос), компилятор платформы не может собрать модуль для серверного контекста. Это вызывает исключение инициализации еще до вызова конкретной процедуры.ПриОткрытии), на сервере никогда не вызывается автоматически. Логика регламентного задания должна быть сосредоточена в модуле объекта, модуле менеджера обработки или в серверном общем модуле.Разберем основной и наиболее правильный способ запуска встроенной обработки в регламентном задании. Вместо обращения к форме создадим экземпляр объекта обработки через коллекцию Обработки, заполним необходимые реквизиты объекта и вызовем экспортную процедуру выполнения.
Посмотрим на пример общего модуля, предназначенного для регламентного задания:
Процедура ВыполнитьРегламентныйОбмен() Экспорт
// Создаем экземпляр обработки на сервере
ОбработкаОбъект = Обработки.УниверсальныйОбменДаннымиXML.Создать();
// Заполняем реквизиты и параметры работы
ОбработкаОбъект.РежимОбмена = "Выгрузка";
ОбработкаОбъект.ФлагКомментироватьОбработкуОбъектов = Ложь;
ОбработкаОбъект.ВыводВОкноСообщенийИнформационныхСообщений = Ложь;
ОбработкаОбъект.ВыводВПротоколИнформационныхСообщений = Ложь;
ОбработкаОбъект.ВыводВПротоколСообщенийОбОшибках = Ложь;
ОбработкаОбъект.НеВыводитьНикакихИнформационныхСообщенийПользователю = Истина;
ОбработкаОбъект.ЭтоИнтерактивныйРежим = Ложь;
ОбработкаОбъект.ВыгружатьТолькоРазрешенные = Ложь;
// Указываем пути к правилам и выгружаемым файлам на стороне сервера
ОбработкаОбъект.ИмяФайлаПравилОбмена = "C:\Exchange\Rules.xml";
ОбработкаОбъект.ИмяФайлаОбмена = "C:\Exchange\Data.xml";
Попытка
// Загружаем правила в память
ОбработкаОбъект.ЗагрузитьПравилаОбмена();
// Выполняем основное действие
ОбработкаОбъект.ВыполнитьВыгрузку();
Исключение
ЗаписьЖурналаРегистрации(
"РегламентныйОбмен",
УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки()
);
КонецПопытки;
КонецПроцедуры
Проанализируем этот код подробнее:
Обработки.[ИмяОбработки].Создать() создает экземпляр объекта типа ОбработкаОбъект на сервере без создания формы.ОбработкаОбъект.ЗагрузитьПравилаОбмена() и ВыполнитьВыгрузку() запускает выполнение логики, описанной в модуле объекта обработки.Если разрабатывается собственная конфигурация или дорабатывается существующая обработка, проанализируем шаги по правильному разделению кода:
ПриОткрытии, КнопкаВыполнитьНажатие в модуль объекта (процедура с ключевым словом Экспорт, например ВыполнитьДействие()).
Процедура КнопкаВыполнитьНажатие(Кнопка)
ЭтотОбъект.ВыполнитьДействие();
КонецПроцедуры
Обработки.ИмяОбработки.Создать() и вызываем Обработка.ВыполнитьДействие().При настройке регламентных процедур обратим внимание на ограничения серверной среды:
C:\Exchange\Data.xml) помним, что поиск файла будет выполняться на физическом сервере 1С, а не на компьютере пользователя. Для сетевых папок (\\ServerName\Share) необходимо убедиться, что у пользователя операционной системы, под которым запущена служба ragent (обычно USR1CV8), есть права на чтение и запись.Попытка ... Исключение с фиксацией событий через ЗаписьЖурналаРегистрации().