Как правильно запустить встроенную обработку в регламентном задании 1С

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

При попытке запустить встроенную или внешнюю обработку в фоновом или регламентном задании разработчики нередко сталкиваются с ошибкой инициализации модуля: Module initialization error: Общий модуль.РегламентныеЗадания.Модуль. Разберем причины возникновения этой ситуации, проанализируем контекст исполнения серверного кода и рассмотрим правильные варианты программного запуска обработки без открытия интерфейса.

Причина ошибки: клиентский контекст и серверные ограничения

Выясним, почему вызов методов ПолучитьФорму() или Открыть() приводит к аварийному завершению регламентного задания. Все регламентные и фоновые задания в платформе «1С:Предприятие 8» исполняются исключительно на сервере (в серверном сеансе) или в специализированном фоновом потоке, у которого отсутствует графический интерфейс.

Рассмотрим, что происходит на уровне платформы:

  1. Синтаксическая проверка серверных модулей: если в общем модуле с признаком «Сервер» встречаются глобальные клиентские методы (например, ПолучитьФорму, ОткрытьФорму, Предупреждение, Вопрос), компилятор платформы не может собрать модуль для серверного контекста. Это вызывает исключение инициализации еще до вызова конкретной процедуры.
  2. Отсутствие пользовательского интерфейса: на сервере форм физически не существует. Форма — это клиентский объект, предназначенный для визуализации данных и взаимодействия с пользователем.
  3. Неприменимость клиентских событий: код, написанный в обработчиках формы (например, в процедуре ПриОткрытии), на сервере никогда не вызывается автоматически. Логика регламентного задания должна быть сосредоточена в модуле объекта, модуле менеджера обработки или в серверном общем модуле.

Решение 1: Программная инициализация и вызов модуля объекта

Разберем основной и наиболее правильный способ запуска встроенной обработки в регламентном задании. Вместо обращения к форме создадим экземпляр объекта обработки через коллекцию Обработки, заполним необходимые реквизиты объекта и вызовем экспортную процедуру выполнения.

Посмотрим на пример общего модуля, предназначенного для регламентного задания:


Процедура ВыполнитьРегламентныйОбмен() Экспорт

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

КонецПроцедуры

Проанализируем этот код подробнее:

  1. Метод Обработки.[ИмяОбработки].Создать() создает экземпляр объекта типа ОбработкаОбъект на сервере без создания формы.
  2. Все параметры, которые ранее пользователь выбирал на форме (флаги, переключатели, пути к файлам), устанавливаются напрямую через свойства объекта ОбработкаОбъект.
  3. Вызов методов ЗагрузитьПравилаОбмена() и ВыполнитьВыгрузку() запускает выполнение логики, описанной в модуле объекта обработки.

Решение 2: Перенос кода из модуля формы в модуль объекта

Если разрабатывается собственная конфигурация или дорабатывается существующая обработка, проанализируем шаги по правильному разделению кода:

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

Важные особенности серверного выполнения

При настройке регламентных процедур обратим внимание на ограничения серверной среды:

  1. Файловые пути: при указании локальных путей (например, C:\Exchange\Data.xml) помним, что поиск файла будет выполняться на физическом сервере 1С, а не на компьютере пользователя. Для сетевых папок (\\ServerName\Share) необходимо убедиться, что у пользователя операционной системы, под которым запущена служба ragent (обычно USR1CV8), есть права на чтение и запись.
  2. Логирование ошибок: так как серверные процессы не могут выводить диалоговые окна с ошибками, весь критичный код оборачиваем в блок Попытка ... Исключение с фиксацией событий через ЗаписьЖурналаРегистрации().
  3. Файловый режим работы: если информационная база работает в файловом варианте, регламентные задания не выполняются в фоне автоматически без запущенного сеанса пользователя или специального выделенного клиента для фоновых задач.
← На главную