В чем разница между WSПрокси и HTTPСоединение в 1С:Предприятии и что выбрать?

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

Интеграция 1С:Предприятия с внешними информационными системами — одна из самых частых задач современного разработчика. При проектировании взаимодействия перед нами неизбежно встает выбор между двумя ключевыми механизмами платформы: WSПрокси (для работы с Web-сервисами по протоколу SOAP) и HTTPСоединение (для работы по архитектуре REST или отправки произвольных HTTP-запросов). Разберем по шагам фундаментальные различия этих подходов, рассмотрим скрытые ограничения платформы 1С и выясним, какую технологию использовать в конкретных сценариях.

Архитектурные различия: Автоматизация против полного контроля

Давайте проанализируем суть каждого из механизмов, чтобы понять, как они работают «под капотом» платформы 1С:

  1. WSПрокси (SOAP-сервисы): Этот объект ориентирован на работу со строгими стандартами. В основе веб-сервисов лежит файл описания WSDL. Платформа 1С считывает это описание и автоматически строит в памяти структуру доступных методов, типов данных и фабрику XDTO. Вызов удаленного метода выглядит как обычный вызов функции 1С на встроенном языке. Нам не нужно вручную формировать XML-документ — платформа сама сериализует объекты 1С в SOAP-конверт, отправляет его, получает ответ и десериализует его обратно в объекты XDTO.
  2. HTTPСоединение (REST / произвольные запросы): Это инструмент низкоуровневой работы с протоколом HTTP. Здесь нет никаких «готовых методов» или автоматической валидации типов со стороны платформы. Мы получаем полный фристайл: самостоятельно формируем заголовки запроса, тело (в формате JSON, XML, Plain Text или двоичных данных), отправляем запрос на определенный URL-адрес и вручную разбираем полученный ответ.

Сформулируем простое правило: WSПрокси — это высокоуровневая обвязка над SOAP, которая делает всю рутину за вас, тогда как HTTPСоединение — это «голый» транспорт, требующий ручного написания кода для сборки и разбора сообщений.

Ограничения стандартов: Почему WSПрокси подходит не всегда

На первый взгляд кажется, что WSПрокси гораздо удобнее. Однако на практике разработчики часто сталкиваются с жесткими ограничениями платформы 1С при поддержке стандартов Web-сервисов. Рассмотрим ключевые проблемы, о которых важно знать заранее:

Решение проблемы: Если сторонний веб-сервис требует использования неподдерживаемых стандартов безопасности, разработчики отказываются от WSПрокси в пользу HTTPСоединения. В этом случае SOAP-конверт формируется вручную в виде текста (через объект ЗаписьXML), заголовки безопасности добавляются в HTTP-запрос, а отправка выполняется стандартным методом POST.

Производительность, ресурсы и скорость работы

Выясним, как выбор технологии влияет на скорость работы системы и потребление ресурсов сервера:

Динамическое создание WSПрокси — медленный процесс. Когда мы пишем в коде инициализацию через Новый WSОпределения(СсылкаНаWSDL), платформа 1С при каждом вызове обращается к удаленному серверу, скачивает тяжелый WSDL-файл (и связанные схемы XSD), парсит их и компилирует фабрику XDTO. Это создает колоссальные задержки при интерактивной работе пользователей.

Использование статических WS-ссылок в дереве конфигурации решает эту проблему, так как схемы уже скомпилированы. Однако у этого подхода есть минус: при любом изменении схемы на стороне внешнего сервиса вам придется обновлять конфигурацию 1С.

Превосходство связки HTTP + JSON. Современный стандарт де-факто в интеграциях — это REST API с использованием формата JSON. Сериализация и десериализация JSON на платформе 1С (с помощью функций ПрочитатьJSON() и ЗаписатьJSON()) выполняются в разы быстрее, чем парсинг XML-структур через XDTO-пакеты. Это экономит оперативную память сервера и процессорное время.

Отладка и обработка ошибок

Проанализируем процесс поиска ошибок в интеграциях. При работе с WSПрокси все сетевые операции происходят внутри платформы. Если что-то идет не так (например, сервер вернул статус 500), 1С часто генерирует неинформативное исключение: «Ошибка вызова удаленного метода». Нам крайне сложно понять, какой именно XML-пакет ушел в сеть и что конкретно ответил сервер.

При использовании HTTPСоединение мы полностью контролируем процесс. Мы получаем объект HTTPОтвет, из которого можем извлечь:

Рассмотрим пример кода для отправки гибкого запроса через HTTPСоединение с детальной обработкой результата:


// Создаем защищенное соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.example.com", , , , , 10, ЗащищенноеСоединение);

// Формируем запрос
Запрос = Новый HTTPЗапрос("/v1/get_data");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Authorization", "Bearer token_string_xyz");

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

Асинхронное выполнение запросов

Начиная с версии платформы 1С 8.3.15, разработчикам доступен мощный механизм асинхронных вызовов для работы с HTTP (например, метод ВызватьHTTPМетодАсинх()). Это позволяет выполнять тяжелые интеграционные запросы непосредственно на клиенте (в тонком или веб-клиенте) в фоновом режиме, абсолютно не блокируя интерфейс пользователя. Настроить красивую асинхронную работу с WSПрокси на клиенте штатными методами платформы гораздо сложнее.

Лайфхак: Как встроить XDTO-схемы внутрь внешней обработки (EPF)

В ходе обсуждений на форумах часто утверждается, что встроить XDTO-схему во внешнюю обработку невозможно, и приходится либо менять метаданные основной конфигурации, либо скачивать схемы динамически по сети. На самом деле существует элегантный обходной путь.

Мы можем сохранить схему XSD или файл WSDL как двоичные данные непосредственно в макет нашей внешней обработки. Рассмотрим по шагам, как это реализовать программно:

  1. Добавим в нашу внешнюю обработку новый макет с типом Двоичные данные и назовем его, например, СхемаИнтеграцииXSD. Загрузим в него наш файл схемы.
  2. При запуске интеграции мы программно выгрузим этот макет во временный файл на диске.
  3. Создадим фабрику XDTO на основе этого временного файла.
  4. Удалим временный файл, чтобы не засорять систему.

Посмотрим на пример кода, реализующий этот алгоритм:


// 1. Получаем уникальное имя для временного файла на диске
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xsd");

// 2. Извлекаем двоичные данные из макета внешней обработки
МакетДвоичныеДанные = ЭтотОбъект.ПолучитьМакет("СхемаИнтеграцииXSD");
МакетДвоичныеДанные.Записать(ИмяВременногоФайла);

// 3. Создаем фабрику XDTO на лету из временного файла схемы
Попытка
    МояФабрикаXDTO = СоздатьФабрикуXDTO(ИмяВременногоФайла);
    
    // Теперь мы можем создавать типы и объекты фабрики динамически:
    // ТипОбъекта = МояФабрикаXDTO.Пакеты.Получить("http://my-namespace").Получить("MyType");
    // НовыйОбъект = МояФабрикаXDTO.Создать(ТипОбъекта);
    
    // Выполняем полезную работу...
Исключение
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка инициализации фабрики XDTO: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

// 4. Обязательно удаляем временный файл после создания фабрики
УдалитьФайлы(ИмяВременногоФайла);

Этот прием позволяет сделать внешнюю обработку полностью автономной. Вы можете передавать файл .epf между базами, не внося никаких изменений в структуру метаданных конфигурации 1С.

Резюме: Что и в каком случае использовать?

Подведем итог нашего анализа. Для наглядности выделим рекомендации по выбору инструмента в виде правил:

Используйте WSПрокси, если:

Используйте HTTPСоединение, если:

← На главную