Как программно запустить обработку "Универсальный обмен данными в формате XML" для выгрузки данных?

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

Часто возникает задача автоматизировать обмен данными между базами 1С. Один из распространенных сценариев — запустить выгрузку данных в XML-файл по внешнему событию, например, по HTTP-запросу, без участия пользователя. Рассмотрим, как программно, без открытия формы, вызвать стандартную обработку "Универсальный обмен данными в формате XML" (известную как "Загрузка_Выгрузка_xml") и выполнить выгрузку.

Основной подход: создание объекта обработки и вызов его методов

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

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

  1. Создание объекта обработки. Для этого используется метод Обработки.Создать(). Если обработка встроена в конфигурацию, мы обращаемся к ней по имени.
    
    // Создаем экземпляр стандартной обработки из конфигурации
    ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    
  2. Настройка параметров выгрузки. Перед запуском необходимо указать обработке, что и куда выгружать. Это делается через установку ее свойств. Основные параметры:
    • РежимОбмена: Устанавливаем в значение "Выгрузка" (для сложных задач возможна выгрузка произвольным запросом).
    • ИмяФайлаПравилОбмена: Полный путь к файлу правил обмена (.xml), который был создан в конфигурации "Конвертация данных".
    • ИмяФайлаВыгрузки: Полный путь к файлу, в который будут сохранены данные. Важно: так как код выполняется на сервере (особенно в случае HTTP-сервиса), этот путь должен быть доступен с сервера 1С.
  3. Запуск выгрузки. После настройки параметров вызывается метод, который инициирует процесс. Чаще всего он называется ВыполнитьВыгрузку().
  4. Обработка ошибок. Любая операция с файлами или сложная логика обмена может вызвать ошибку. Поэтому весь код следует обернуть в конструкцию Попытка ... Исключение ... КонецПопытки для корректной обработки нештатных ситуаций и их логирования.

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

Рассмотрим обобщенный и правильный пример кода, который можно разместить в модуле HTTP-сервиса или в регламентном задании.


Процедура ВыполнитьАвтоматическуюВыгрузкуНоменклатуры()

    // 1. Создаем объект обработки
    ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();

    // 2. Устанавливаем ключевые параметры
    ОбработкаВыгрузки.РежимОбмена = "Выгрузка";
    // Путь к файлу правил. Должен быть доступен на сервере!
    ОбработкаВыгрузки.ИмяФайлаПравилОбмена = "C:\ExchangeRules\Rules_Nomenclature.xml"; 
    // Путь для файла с данными. Каталог должен существовать!
    ОбработкаВыгрузки.ИмяФайлаВыгрузки = "C:\ExchangeData\Nomenclature_export.xml";
    
    // 3. Дополнительные параметры (по необходимости)
    // Например, если нужно выгружать только измененные объекты, а не все подряд
    ОбработкаВыгрузки.ВыгружатьТолькоИзменения = Ложь; // В данном случае выгружаем все
    
    // Можно также программно задавать отборы, если это предусмотрено правилами
    // Например, отбор по конкретной группе номенклатуры
    // СтруктураОтборов = ОбработкаВыгрузки.ПолучитьСтруктуруОтборов();
    // Если СтруктураОтборов.Свойство("Номенклатура") Тогда
    //     СтруктураОтборов.Номенклатура.Использование = Истина;
    //     СтруктураОтборов.Номенклатура.Значение = Справочники.Номенклатура.НайтиПоНаименованию("Компьютеры");
    //     СтруктураОтборов.Номенклатура.ВидСравнения = ВидСравнения.ВИерархии;
    //     ОбработкаВыгрузки.УстановитьОтборы(СтруктураОтборов);
    // КонецЕсли;

    // 4. Запускаем выгрузку с обработкой ошибок
    Попытка
        ОбработкаВыгрузки.ВыполнитьВыгрузку();
        
        // Записываем в журнал регистрации информацию об успехе
        ЗаписьЖурналаРегистрации("Обмен.Выгрузка", 
                                УровеньЖурналаРегистрации.Информация, , , 
                                "Выгрузка номенклатуры успешно завершена в файл: " + ОбработкаВыгрузки.ИмяФайлаВыгрузки);
    Исключение
        // В случае ошибки получаем ее описание и логируем
        ИнформацияОбОшибке = ИнформацияОбОшибке();
        ТекстОшибки = "Ошибка при автоматической выгрузке номенклатуры: " + ИнформацияОбОшибке.Описание;
        
        ЗаписьЖурналаРегистрации("Обмен.Выгрузка", 
                                УровеньЖурналаРегистрации.Ошибка, , , 
                                ТекстОшибки);
    КонецПопытки;

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

Этот код является надежным шаблоном для автоматизации выгрузки. Он создает обработку, настраивает ее и безопасно выполняет операцию, логируя как успех, так и возможные сбои.

Альтернативная архитектура: передача данных напрямую

В ходе обсуждения на форуме был поднят важный архитектурный вопрос: зачем использовать промежуточный файл, если данные передаются по HTTP? Выгрузка в файл на диске сервера, чтобы потом другая система его оттуда забрала, усложняет схему и создает дополнительную точку отказа (файловую систему).

Более современный подход — передавать XML-данные напрямую в теле HTTP-ответа. Схема работы при этом меняется:

  1. Система-клиент отправляет HTTP-запрос в базу-источник.
  2. База-источник формирует XML-строку с данными (можно использовать те же механизмы "Конвертации данных", но выгружать не в файл, а в строку или поток в памяти).
  3. Эта XML-строка устанавливается как тело HTTP-ответа и отправляется обратно клиенту.
  4. Система-клиент получает ответ, разбирает XML из его тела и загружает данные.

Этот метод исключает работу с файловой системой, что делает обмен более надежным и быстрым, особенно если базы находятся в одной сети. Однако он может быть неэффективен для очень больших объемов данных, которые могут не поместиться в оперативную память или превысить лимиты HTTP-сервера.

Важные моменты, которые нужно учитывать

← На главную