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

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

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

Разбор основной ошибки: Контекст выполнения

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

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

Шаг 1. Перенос логики в модуль объекта

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

  1. Откроем конфигуратор и перейдем в модуль объекта вашей обработки.
  2. Создадим там процедуру и обязательно добавим ключевое слово Экспорт. Это позволит обращаться к процедуре «снаружи» объекта.
  3. Перенесем туда код формирования файла.

Пример структуры кода в модуле объекта:


// В модуле объекта обработки
Процедура СформироватьXmlФайл() Экспорт
    // Здесь располагается основной алгоритм
    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл("C:\temp\price.xml");
    // ... логика заполнения ...
    Запись.Закрыть();
    ЗаписьЖурналаРегистрации("ВыгрузкаXML", УровеньЖурналаРегистрации.Информация, , , "Файл успешно сформирован");
КонецПроцедуры

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

Шаг 2. Программный вызов встроенной обработки

Теперь разберем, как вызвать эту процедуру программно, например, из модуля регламентного задания или другого общего модуля. Проанализируем последовательность команд:


// Создаем экземпляр объекта обработки
ОбъектОбработки = Обработки.ПрайсЛистXML.Создать();

// Вызываем экспортную процедуру модуля объекта
ОбъектОбработки.СформироватьXmlФайл();

Метод Создать() инициализирует объект в памяти сервера, что дает нам доступ ко всем его экспортным методам и реквизитам, при этом никакие окна не открываются.

Шаг 3. Работа с внешними обработками (.epf)

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


// Путь к файлу на сервере
ПутьКФайлу = "C:\ExternalProc\MyProcessing.epf";

// Безопасный режим лучше отключать, если обработка пишет файлы на диск
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);

// Создаем объект по полученному внутреннему имени
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбработки);

// Запускаем выполнение
ОбъектОбработки.СформироватьXmlФайл();

Обратите внимание, что при работе в регламентном задании сервер 1С должен иметь права доступа к указанной папке в файловой системе.

Шаг 4. Интеграция через БСП (Библиотека стандартных подсистем)

В современных конфигурациях (УП, ERP, КА 2.4+, ЗУП 3) наиболее правильным и надежным способом является использование подсистемы «Дополнительные отчеты и обработки». Это позволяет настраивать расписание запуска прямо в пользовательском режиме без изменения кода конфигурации.

Для этого в модуле объекта обработки должна быть специальная функция СведенияОВнешнейОбработке(). Рассмотрим пример минимального наполнения:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Наименование = "Автоматическая выгрузка XML";
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Запустить выгрузку";
    НоваяКоманда.Идентификатор = "ВыгрузкаПрайса";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    
    Возврат ПараметрыРегистрации;
КонецФункции

// Эта процедура будет вызвана БСП при запуске задания
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    Если ИдентификаторКоманды = "ВыгрузкаПрайса" Тогда
        СформироватьXmlФайл();
    КонецЕсли;
КонецПроцедуры

После добавления такой обработки в справочник «Дополнительные отчеты и обработки», вы сможете нажать кнопку «Настроить расписание», и система сама создаст регламентное задание.

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

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

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

Таким образом, мы выяснили, что ключ к успеху — в строгом разделении кода на интерфейсный и исполнительный. Вынос алгоритмов в экспортные методы модуля объекта делает вашу обработку универсальной: её можно запустить как кнопкой с формы, так и программно по расписанию в любое время суток.

← На главную