Переход с классических методов обмена данными, таких как прямое подключение через COM-соединение или обмен через внешние файлы (FTP, сетевые папки), на HTTP-протокол — это важный шаг в сторону масштабируемости и стабильности системы. Часто программисты 1С сталкиваются с психологическим барьером: кажется, что переход на HTTP требует полной переработки огромного массива алгоритмов, написанных в «Конвертации данных 2.0». Однако, как показывает практика, это далеко не всегда так.
В этой статье мы подробно разберем, как сохранить наработки в правилах обмена (КД 2.0), но при этом использовать HTTP как современный и быстрый транспорт. Мы проанализируем архитектурные подходы, рассмотрим примеры кода и выясним, как решить проблему длительных выгрузок.
Первое, что нам необходимо понять: логика конвертации и способ доставки данных — это две независимые сущности. Правила, созданные в КД 2.0, генерируют XML-файл определенной структуры. Для программы-приемника не имеет значения, как этот файл попал в ее «руки»: был ли он прочитан с диска или получен из тела HTTP-запроса.
Рассмотрим стандартную схему обмена через COM:
COMОбъект.УниверсальныйОбменДаннымиXML в контексте приемника.При переходе на HTTP мы меняем эту схему на следующую:
HTTPЗапрос к базе-приемнику.Чтобы не плодить временные файлы, мы будем использовать возможность выгрузки данных прямо в строку или поток. Разберем, как программно вызвать обработку выгрузки. Для этого нам понадобится внешняя обработка УниверсальныйОбменДаннымиXML, встроенная в конфигурацию или подключенная как внешняя. Для этих целей подойдёт дополненная обработка универсального обмена данными XML с расширенными настройками.
Проанализируем пример кода для выгрузки данных в строку:
// Создаем объект обработки
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравил = "C:\Rules\MyRules.xml"; // Путь к правилам на сервере
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
// Вместо файла указываем признак выгрузки в память (если поддерживается логикой)
// Либо выгружаем во временный файл и считываем его
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ОбработкаОбмена.ИмяФайлаОбмена = ИмяВременногоФайла;
ОбработкаОбмена.ВыполнитьВыгрузку();
// Читаем данные в двоичные данные для отправки
ДанныеОбмена = Новый ДвоичныеДанные(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
Важный момент: Если объем данных велик, выгрузка в одну строку может вызвать переполнение памяти. В таких случаях мы рекомендуем использовать временные файлы на стороне сервера, которые удаляются сразу после формирования объекта ДвоичныеДанные.
Теперь, когда у нас есть сформированный пакет данных, нам нужно передать его в базу-приемник. Рассмотрим создание HTTPСоединения. Использование HTTP вместо COM дает нам преимущество в производительности, так как создание HTTP-сессии происходит значительно быстрее, чем инициализация тяжелого COM-сервера.
Разберем процесс отправки по шагам:
// Параметры подключения
Сервер = "192.168.1.10";
Порт = 80;
Пользователь = "ExchangeUser";
Пароль = "Password123";
// Создаем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт, Пользователь, Пароль);
// Формируем запрос к нашему HTTP-сервису в базе-приемнике
// Путь включает имя публикации и имя сервиса
ПутьКСервису = "/BaseName/hs/ExchangeService/v1/load";
Запрос = Новый HTTPЗапрос(ПутьКСервису);
// Устанавливаем заголовки
Запрос.Заголовки.Вставить("Content-Type", "application/xml");
// Помещаем наши XML-данные в тело запроса
Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеОбмена);
// Отправляем POST запрос
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Данные успешно переданы и обработаны"); Иначе
Сообщить("Ошибка при передаче: " + Ответ.КодСостояния);
Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
На стороне приемника нам необходимо создать объект метаданных HTTP-сервис. Назовем его ExchangeService, создадим шаблон URL /v1/load и метод POST.
В модуле этого сервиса мы должны прописать логику получения данных и запуска загрузки. Посмотрим на пример реализации:
Функция loadPOST(Запрос)
// Получаем двоичные данные из тела запроса
ДанныеXML = Запрос.ПолучитьТелоИзДвоичныхДанных();
// Сохраняем во временный файл для обработки загрузкой КД 2.0
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
ДанныеXML.Записать(ИмяФайла);
// Инициализируем загрузку
ОбработкаЗагрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаЗагрузки.РежимОбмена = "Загрузка";
ОбработкаЗагрузки.ИмяФайлаОбмена = ИмяФайла;
Попытка
ОбработкаЗагрузки.ВыполнитьЗагрузку();
УдалитьФайлы(ИмяФайла);
Возврат Новый HTTPСервисОтвет(200);
Исключение
ТекстОшибки = ОписаниеОшибки();
УдалитьФайлы(ИмяФайла);
Ответ = Новый HTTPСервисОтвет(500);
Ответ.УстановитьТелоИзСтроки(ТекстОшибки);
Возврат Ответ;
КонецПопытки;
КонецФункции
Как справедливо замечено в обсуждении, если УниверсальныйОбменДаннымиXML «шуршит» 2 часа, HTTP-соединение просто разорвется по таймауту. Стандартные настройки веб-серверов (IIS/Apache) обычно ограничивают время ожидания ответа 60–300 секундами.
Выясним, как обойти это ограничение. Мы рекомендуем использовать асинхронную модель:
ФоновоеЗадание, которое в фоновом режиме читает эти данные и загружает их в базу.GET /status/123), чтобы узнать, завершена ли загрузка.Этот подход делает обмен максимально отказоустойчивым. Даже если связь оборвется, данные уже лежат в базе-приемнике и будут обработаны фоновым заданием.
XML-файлы очень хорошо сжимаются (до 90% экономии объема). При обмене через HTTP это критично. Вы можете использовать объект ЗаписьZip в 1С для сжатия данных перед отправкой. Большинство современных HTTP-сервисов умеют прозрачно работать со сжатым контентом, если установить правильный заголовок Content-Encoding: gzip. Это значительно ускорит передачу данных по медленным каналам связи.
Рассмотрим ситуацию, когда логику все же стоит переписать. Конвертация данных 3.0 работает на базе формата EnterpriseData (XDTO). Она изначально спроектирована для работы через HTTP и веб-сервисы. Если ваша задача — создать гибкую экосистему, где базы могут обновляться независимо друг от друга, КД 3.0 будет лучшим выбором.
Однако, если у вас уже есть отлаженные правила в КД 2.0 для сложного обмена (например, УПП — БП), замена транспорта на HTTP — это самый быстрый и экономически выгодный способ «осовременить» вашу интеграцию без риска сломать сложную бизнес-логику конвертации. При необходимости наладить постоянную синхронизацию по расписанию с использованием веб-сервисов применяется система автоматического обмена данными между базами 1С.
Таким образом, мы выяснили, что переход на HTTP-сервисы при использовании КД 2.0 — это не переписывание алгоритмов, а профессиональная настройка транспортного уровня, позволяющая уйти от капризных COM-соединений и ненадежных файловых папок. При необходимости можно использовать готовое решение для универсального переноса данных между конфигурациями через HTTP-соединение.