Как перевести обмен данными с COM-соединения на HTTP-протокол, сохранив правила КД 2.0?

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

Переход с COM-соединения на HTTP-протокол — это важный шаг в развитии любой системы на базе 1С. COM-технология постепенно устаревает: она жестко привязана к операционной системе Windows, требует регистрации библиотек, совпадения разрядности клиента и сервера, а также крайне чувствительна к версиям платформы. HTTP-сервисы, напротив, универсальны, работают быстрее в распределенных сетях и позволяют легко масштабировать систему. Разберем подробно, как реализовать этот переход, сохранив существующие правила выгрузки (ПВД) и правила конвертации (ПВК), созданные в Конвертации данных 2.0.

Общая концепция решения

Основная идея заключается в том, чтобы заменить транспортный уровень. Вместо прямого обращения к объектам другой базы через COMConnector, мы будем использовать стандартную обработку УниверсальныйОбменДаннымиXML программно на обеих сторонах:

  1. На стороне отправителя: Программно запускаем выгрузку данных в файл или поток, используя существующие правила. Полученный XML-пакет отправляем через HTTPЗапрос.
  2. На стороне получателя: Создаем HTTP-сервис, который принимает запрос, извлекает XML-данные и скармливает их той же обработке УниверсальныйОбменДаннымиXML, но уже в режиме загрузки.

Шаг 1. Реализация выгрузки на стороне источника

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


// Создаем объект обработки для выгрузки
ПутьКПравилам = "C:\Rules\ExchangeRules.xml";
ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаВыгрузки.ИмяФайлаПравил = ПутьКПравилам;
ОбработкаВыгрузки.РежимОбмена = "Выгрузка";

// Если нужно выгружать конкретные объекты, можно настроить построитель или параметры
// После настройки вызываем загрузку правил и саму выгрузку во временный файл
ИмяФайлаДанных = ПолучитьИмяВременногоФайла("xml");
ОбработкаВыгрузки.ИмяФайлаОбмена = ИмяФайлаДанных;
ОбработкаВыгрузки.ЗагрузитьПравилаОбмена();
ОбработкаВыгрузки.ВыполнитьВыгрузку();

// Читаем файл в двоичные данные для отправки
ДанныеДляОтправки = Новый ДвоичныеДанные(ИмяФайлаДанных);

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


Сервер = "192.168.1.10";
Порт = 80;
Пользователь = "ExchangeUser";
Пароль = "StrongPassword";

Соединение = Новый HTTPСоединение(Сервер, Порт, Пользователь, Пароль,, 300); // Таймаут 5 минут
Запрос = Новый HTTPЗапрос("/BaseName/hs/ExchangeService/v1/PostData");
Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеДляОтправки);

Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("Данные успешно отправлены и обработаны");
    Иначе
        Сообщить("Ошибка обмена: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
Исключение
    Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;

Шаг 2. Настройка HTTP-сервиса на стороне приемника

Теперь выясним, как принять эти данные. В конфигурации-приемнике необходимо создать новый объект HTTP-сервис. Назовем его ExchangeService, укажем корневой URL ExchangeService и создадим шаблон ресурса v1/PostData с методом POST.

В модуле HTTP-сервиса проанализируем обработчик метода POST:


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

Оптимизация передачи: использование сжатия

При передаче больших объемов XML-данных через HTTP канал может стать узким местом. Рассмотрим, как ускорить процесс с помощью сжатия (ZIP). Использование архивации сокращает размер передаваемого пакета в 5–10 раз.

Для реализации сжатия на стороне отправителя воспользуемся объектом ЗаписьZipФайла:


ПутьАрхива = ПолучитьИмяВременногоФайла("zip");
Архив = Новый ЗаписьZipФайла(ПутьАрхива);
Архив.Добавить(ИмяФайлаДанных, РежимСохраненияПутейZIP.НеСохранятьПути);
Архив.Записать();
ДанныеДляОтправки = Новый ДвоичныеДанные(ПутьАрхива);

На стороне приемника, соответственно, добавим распаковку с помощью ЧтениеZipФайла перед тем, как передать файл в обработку УниверсальныйОбменДаннымиXML. Это значительно повысит стабильность обмена при плохом соединении.

Важные нюансы и рекомендации

Проанализируем несколько критических моментов, которые часто упускают при переходе с COM на HTTP:

Таким образом, мы видим, что использование HTTP-сервисов позволяет полностью инкапсулировать логику обмена, делая систему более гибкой и надежной по сравнению с классическим COM-соединением, при этом не требуя глобальной переработки правил конвертации.

← На главную