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

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

Стандартная обработка «Универсальный обмен данными в формате XML» является мощным инструментом, но её интерфейс часто избыточен для конечного пользователя. В типовых конфигурациях, таких как УТ 11.4 или БП 3.0, пользователям бывает сложно ориентироваться в выборе файлов правил, настройке параметров и фильтров. Оптимальное решение — создание узкоспециализированной внешней обработки, которая «под капотом» использует механизм универсального обмена, но предоставляет пользователю лишь минимально необходимые поля (например, период или организацию).

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

Шаг 1. Создание объекта обработки и загрузка правил из макета

Для начала нам необходимо создать объект обработки. Поскольку мы работаем в управляемом интерфейсе, основной код будет исполняться на сервере. Чтобы не заставлять пользователя выбирать файл правил .xml на диске, мы сохраним эти правила в макет нашей внешней обработки (тип макета — Текстовый документ или Двоичные данные).

Рассмотрим, как правильно инициализировать обработку и загрузить в неё правила из макета:


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

Важный нюанс: если вы используете управляемые формы, обычный вызов ЭтотОбъект.ПолучитьМакет() может не сработать. Всегда используйте РеквизитФормыВЗначение("Объект") для доступа к методам объекта обработки на сервере.

Шаг 2. Программная установка параметров обмена

Часто программисты сталкиваются с тем, что простое заполнение структуры Параметры в обработке не дает результата. Это происходит потому, что внутренняя логика обработки УниверсальныйОбменДаннымиXML опирается на таблицу ТаблицаНастройкиПараметров, которая инициализируется только после вызова ЗагрузитьПравилаОбмена().

Проанализируем правильный алгоритм установки параметров:

  1. Сначала вызываем ЗагрузитьПравилаОбмена().
  2. Затем ищем нужные строки в ТаблицаНастройкиПараметров и устанавливаем значения.

// Пример установки параметра "Организация"
СтрокаПараметра = ОбработкаОбмена.ТаблицаНастройкиПараметров.Найти("Организация", "Имя");
Если СтрокаПараметра <> Неопределено Тогда
    СтрокаПараметра.Значение = Объект.Организация;
КонецЕсли;

// Если параметров много, можно использовать цикл по заранее подготовленной структуре
Для Каждого ТекПараметр Из СтруктураМоихПараметров Цикл
    СтрокаПараметра = ОбработкаОбмена.ТаблицаНастройкиПараметров.Найти(ТекПараметр.Ключ, "Имя");
    Если СтрокаПараметра <> Неопределено Тогда
        СтрокаПараметра.Значение = ТекПараметр.Значение;
    КонецЕсли;
КонецЦикла;

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

Шаг 3. Выполнение выгрузки и передача файла на клиент

После настройки всех реквизитов вызываем метод ВыполнитьВыгрузку(). Поскольку процедура выполняется на сервере, созданный файл также находится на сервере. Чтобы пользователь мог сохранить его себе на компьютер, необходимо использовать временное хранилище.

Разберем полный цикл выгрузки с возвратом файла на клиент:


&НаСервере
Функция ВыполнитьВыгрузкуНаСервере()
    
    // (Здесь код из Шага 1 и Шага 2 по созданию и настройке ОбработкаОбмена)
    
    // Запускаем процесс
    ОбработкаОбмена.ВыполнитьВыгрузку();
    
    // Читаем созданный файл в двоичные данные
    ДанныеФайла = Новый ДвоичныеДанные(ОбработкаОбмена.ИмяФайлаОбмена);
    
    // Помещаем во временное хранилище и возвращаем адрес
    Возврат ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
КонецФункции

&НаКлиенте
Процедура Выгрузить(Команда)
    
    АдресХранилища = ВыполнитьВыгрузкуНаСервере();
    
    Если ЗначениеЗаполнено(АдресХранилища) Тогда
        // Описание оповещения после сохранения файла (необязательно, если используем ПолучитьФайл)
        ПараметрыСохранения = Новый ПараметрыДиалогаПолученияФайлов("Выберите куда сохранить данные", "Выгрузка.xml");
        
        // Интерактивное сохранение файла пользователю
        ПолучитьФайл(АдресХранилища, "Выгрузка_Данных.xml", Истина);
    КонецЕсли;
    
КонецПроцедуры

Дополнительные рекомендации по автоматизации

Чтобы ваша выгрузка работала стабильно и быстро, рассмотрим несколько профессиональных советов, которые помогут избежать типовых ошибок:

Проанализировав ситуацию, мы видим, что программное использование Универсального обмена данными сводится к правильной последовательности инициализации объекта. Главное — помнить, что загрузка правил всегда должна предшествовать заполнению параметров, а передача готового XML-файла с сервера на клиент требует использования временного хранилища и двоичных данных.

Используя предложенные примеры кода, вы сможете создать удобный инструмент для пользователей, минимизировав риск ошибок при ручном заполнении настроек обмена.

← На главную