Как перенести код внешней обработки в конфигурацию и настроить запуск фоновым или регламентным заданием

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

Часто в процессе разработки возникает ситуация, когда успешно протестированная внешняя обработка (например, для выгрузки данных в Excel) должна стать частью системы и выполняться автоматически по расписанию. В среде 1С:Предприятие 8.3 существует несколько архитектурных подходов для решения этой задачи. Мы подробно разберем, как интегрировать готовый алгоритм в конфигурацию, настроить его выполнение в фоне и избежать типичных ошибок, связанных с контекстом сервера и безопасным режимом.

Способ 1. Интеграция через метаданные конфигурации

Этот метод считается классическим и подразумевает внесение изменений непосредственно в структуру конфигурации. Мы выбираем его, когда функционал является базовым и не требует частого обновления кода без участия программиста.

Разберем по шагам процесс интеграции:

  1. Создание общего модуля. Прежде всего, нам необходимо создать новый объект метаданных — ОбщийМодуль. В свойствах модуля обязательно должны быть установлены флаги Сервер и Вызов сервера (если планируется запуск из клиентского кода). Рекомендуется давать модулю понятное имя, например, РаботаСВыгрузкамиСервер.
  2. Перенос алгоритма. Копируем основной код выгрузки из модуля объекта внешней обработки в созданный общий модуль. Важно оформить его как экспортную процедуру.
    
    Процедура ВыполнитьВыгрузкуВExcel() Экспорт
        // Здесь размещается ваш алгоритм формирования данных
        // и записи их в файл XLSX
    КонецПроцедуры
    
  3. Создание регламентного задания. В дереве метаданных переходим в раздел Общие -> Регламентные задания. Создаем новое задание. В поле Имя метода выбираем нашу экспортную процедуру из общего модуля (например, РаботаСВыгрузкамиСервер.ВыполнитьВыгрузкуВExcel).
  4. Настройка расписания. Настройку периодичности запуска (например, каждый день в 08:00) можно выполнить как в конфигураторе, так и в режиме 1С:Предприятие. В современных конфигурациях удобнее использовать стандартную обработку Регламентные и фоновые задания.

Способ 2. Использование подсистемы Дополнительные отчеты и обработки (БСП)

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

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


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

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

После регистрации такой обработки в справочнике "Дополнительные отчеты и обработки" появится кнопка Настроить расписание, которая автоматически создаст регламентное задание, связанное с этой внешней обработкой.

Программный запуск фонового задания

Иногда нам не нужно строгое расписание, а требуется запустить тяжелую операцию по нажатию кнопки пользователем, чтобы не блокировать интерфейс. В этом случае мы используем метод ФоновыеЗадания.Выполнить(). Рассмотрим пример:


&НаСервере
Процедура ЗапуститьЗаданиеНаСервере()
    ПараметрыПроцедуры = Новый Массив;
    ПараметрыПроцедуры.Добавить(Объект.Организация);
    
    // Запуск фонового задания
    Задание = ФоновыеЗадания.Выполнить("РаботаСВыгрузкамиСервер.ВыполнитьВыгрузкуВExcel", ПараметрыПроцедуры);
    ИдентификаторЗадания = Задание.УникальныйИдентификатор;
КонецПроцедуры

Этот подход позволяет передавать параметры напрямую из формы и отслеживать состояние выполнения через свойство Состояние объекта задания.

Важные технические нюансы и ограничения

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

1. Безопасный режим и работа с COM-объектами.
Внешние обработки часто запускаются в безопасном режиме. Если ваш алгоритм использует Excel.Application через COM-соединение, система заблокирует создание объекта. Чтобы это обойти, необходимо в справочнике дополнительных обработок снять флаг Безопасный режим. Однако, мы рекомендуем использовать встроенный метод ТабличныйДокумент.Записать() с параметром ТипФайлаТабличногоДокумента.XLSX. Это работает значительно быстрее, стабильнее и не требует наличия установленного Microsoft Excel на сервере.

2. Контекст сеанса и параметры.
Помните, что фоновое задание запускается в отдельном сеансе. Это означает, что ПараметрыСеанса.ТекущийПользователь может быть не заполнен. Если ваш код опирается на данные текущего пользователя, их нужно передавать в процедуру как явные параметры или инициализировать в модуле сеанса при начале работы фонового задания.

3. Особенности файлового режима.
Выясним, как ведет себя система в разных вариантах поставки. В клиент-серверном варианте заданиями управляет менеджер кластера. В файловом варианте задания не будут выполняться, если не открыт ни один пользовательский сеанс. В актуальных версиях платформы 8.3 один из активных сеансов автоматически берет на себя роль исполнителя заданий, но для стабильной работы в файловом режиме часто рекомендуют выделять отдельный сеанс для обработки очереди.

4. Отладка и мониторинг.
Поскольку фоновое задание выполняется "невидимо", проанализируем способы поиска ошибок. Все исключения (ошибки), возникшие в коде, попадают в Журнал регистрации. Мы рекомендуем использовать конструкцию Попытка...Исключение и записывать туда подробности:


Попытка
    // Код выгрузки
Исключение
    ЗаписьЖурналаРегистрации("ВыгрузкаВExcel", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки
Чтобы "поймать" выполнение задания отладчиком, в меню Отладка -> Подключение необходимо установить флаг Автоматическое подключение фоновых заданий.

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

← На главную