Переход с COM-соединения на HTTP-протокол — это важный шаг в развитии любой системы на базе 1С. COM-технология постепенно устаревает: она жестко привязана к операционной системе Windows, требует регистрации библиотек, совпадения разрядности клиента и сервера, а также крайне чувствительна к версиям платформы. HTTP-сервисы, напротив, универсальны, работают быстрее в распределенных сетях и позволяют легко масштабировать систему. Разберем подробно, как реализовать этот переход, сохранив существующие правила выгрузки (ПВД) и правила конвертации (ПВК), созданные в Конвертации данных 2.0.
Основная идея заключается в том, чтобы заменить транспортный уровень. Вместо прямого обращения к объектам другой базы через COMConnector, мы будем использовать стандартную обработку УниверсальныйОбменДаннымиXML программно на обеих сторонах:
HTTPЗапрос.УниверсальныйОбменДаннымиXML, но уже в режиме загрузки.Рассмотрим процесс подготовки данных. Нам не нужно переписывать логику правил, достаточно программно настроить обработку. Проанализируем пример кода для формирования и отправки данных:
// Создаем объект обработки для выгрузки
ПутьКПравилам = "C:\Rules\ExchangeRules.xml";
ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаВыгрузки.ИмяФайлаПравил = ПутьКПравилам;
ОбработкаВыгрузки.РежимОбмена = "Выгрузка";
// Если нужно выгружать конкретные объекты, можно настроить построитель или параметры
// После настройки вызываем загрузку правил и саму выгрузку во временный файл
ИмяФайлаДанных = ПолучитьИмяВременногоФайла("xml");
ОбработкаВыгрузки.ИмяФайлаОбмена = ИмяФайлаДанных;
ОбработкаВыгрузки.ЗагрузитьПравилаОбмена();
ОбработкаВыгрузки.ВыполнитьВыгрузку();
// Читаем файл в двоичные данные для отправки
ДанныеДляОтправки = Новый ДвоичныеДанные(ИмяФайлаДанных);
После того как данные сформированы, нам необходимо отправить их на сервер. Для этого создадим HTTPСоединение. Обратите внимание на важность настройки таймаута, так как выгрузка и последующая загрузка могут занимать значительное время.
Сервер = "192.168.1.10";
Порт = 80;
Пользователь = "ExchangeUser";
Пароль = "StrongPassword";
Соединение = Новый HTTPСоединение(Сервер, Порт, Пользователь, Пароль,, 300); // Таймаут 5 минут
Запрос = Новый HTTPЗапрос("/BaseName/hs/ExchangeService/v1/PostData");
Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеДляОтправки);
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Данные успешно отправлены и обработаны");
Иначе
Сообщить("Ошибка обмена: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;
Теперь выясним, как принять эти данные. В конфигурации-приемнике необходимо создать новый объект 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:
Новый ЗащищенноеСоединениеOpenSSL() в конструктор HTTPСоединение.POST рекомендуется только сохранять файл и запускать фоновое задание на его загрузку, возвращая отправителю код 202 Accepted.Таким образом, мы видим, что использование HTTP-сервисов позволяет полностью инкапсулировать логику обмена, делая систему более гибкой и надежной по сравнению с классическим COM-соединением, при этом не требуя глобальной переработки правил конвертации.