Часто в процессе разработки возникает ситуация, когда успешно протестированная внешняя обработка (например, для выгрузки данных в Excel) должна стать частью системы и выполняться автоматически по расписанию. В среде 1С:Предприятие 8.3 существует несколько архитектурных подходов для решения этой задачи. Мы подробно разберем, как интегрировать готовый алгоритм в конфигурацию, настроить его выполнение в фоне и избежать типичных ошибок, связанных с контекстом сервера и безопасным режимом.
Этот метод считается классическим и подразумевает внесение изменений непосредственно в структуру конфигурации. Мы выбираем его, когда функционал является базовым и не требует частого обновления кода без участия программиста.
Разберем по шагам процесс интеграции:
ОбщийМодуль. В свойствах модуля обязательно должны быть установлены флаги Сервер и Вызов сервера (если планируется запуск из клиентского кода). Рекомендуется давать модулю понятное имя, например, РаботаСВыгрузкамиСервер.
Процедура ВыполнитьВыгрузкуВExcel() Экспорт
// Здесь размещается ваш алгоритм формирования данных
// и записи их в файл XLSX
КонецПроцедуры
РаботаСВыгрузкамиСервер.ВыполнитьВыгрузкуВExcel).Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), мы можем настроить выполнение задания без изменения структуры конфигурации. Это позволяет обновлять код обработки "на лету", просто перезагружая файл в справочнике.
Проанализируем технические требования к модулю объекта такой обработки. Для того чтобы система "увидела" возможность запуска задания в фоне, функция СведенияОВнешнейОбработке должна содержать описание команды с типом вызова Вызов сервера.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Выгрузка данных (фон)";
НоваяКоманда.Идентификатор = "ВыгрузкаExcelФон";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ВыгрузкаExcelФон" Тогда
// Вызов основного кода
КонецЕсли;
КонецПроцедуры
После регистрации такой обработки в справочнике "Дополнительные отчеты и обработки" появится кнопка Настроить расписание, которая автоматически создаст регламентное задание, связанное с этой внешней обработкой.
Иногда нам не нужно строгое расписание, а требуется запустить тяжелую операцию по нажатию кнопки пользователем, чтобы не блокировать интерфейс. В этом случае мы используем метод ФоновыеЗадания.Выполнить(). Рассмотрим пример:
&НаСервере
Процедура ЗапуститьЗаданиеНаСервере()
ПараметрыПроцедуры = Новый Массив;
ПараметрыПроцедуры.Добавить(Объект.Организация);
// Запуск фонового задания
Задание = ФоновыеЗадания.Выполнить("РаботаСВыгрузкамиСервер.ВыполнитьВыгрузкуВExcel", ПараметрыПроцедуры);
ИдентификаторЗадания = Задание.УникальныйИдентификатор;
КонецПроцедуры
Этот подход позволяет передавать параметры напрямую из формы и отслеживать состояние выполнения через свойство Состояние объекта задания.
При работе в фоновом режиме мы должны учитывать ряд специфических ограничений платформы:
1. Безопасный режим и работа с COM-объектами.
Внешние обработки часто запускаются в безопасном режиме. Если ваш алгоритм использует Excel.Application через COM-соединение, система заблокирует создание объекта. Чтобы это обойти, необходимо в справочнике дополнительных обработок снять флаг Безопасный режим. Однако, мы рекомендуем использовать встроенный метод ТабличныйДокумент.Записать() с параметром ТипФайлаТабличногоДокумента.XLSX. Это работает значительно быстрее, стабильнее и не требует наличия установленного Microsoft Excel на сервере.
2. Контекст сеанса и параметры.
Помните, что фоновое задание запускается в отдельном сеансе. Это означает, что ПараметрыСеанса.ТекущийПользователь может быть не заполнен. Если ваш код опирается на данные текущего пользователя, их нужно передавать в процедуру как явные параметры или инициализировать в модуле сеанса при начале работы фонового задания.
3. Особенности файлового режима.
Выясним, как ведет себя система в разных вариантах поставки. В клиент-серверном варианте заданиями управляет менеджер кластера. В файловом варианте задания не будут выполняться, если не открыт ни один пользовательский сеанс. В актуальных версиях платформы 8.3 один из активных сеансов автоматически берет на себя роль исполнителя заданий, но для стабильной работы в файловом режиме часто рекомендуют выделять отдельный сеанс для обработки очереди.
4. Отладка и мониторинг.
Поскольку фоновое задание выполняется "невидимо", проанализируем способы поиска ошибок. Все исключения (ошибки), возникшие в коде, попадают в Журнал регистрации. Мы рекомендуем использовать конструкцию Попытка...Исключение и записывать туда подробности:
Попытка
// Код выгрузки
Исключение
ЗаписьЖурналаРегистрации("ВыгрузкаВExcel", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки
Таким образом, выбор между регламентным заданием в метаданных и внешней обработкой БСП зависит от требований к гибкости системы. Использование БСП предпочтительнее для часто меняющихся бизнес-процессов, в то время как изменения метаданных подходят для стабильного системного функционала.