Интеграция 1С:Предприятия с внешними информационными системами — одна из самых частых задач современного разработчика. При проектировании взаимодействия перед нами неизбежно встает выбор между двумя ключевыми механизмами платформы: WSПрокси (для работы с Web-сервисами по протоколу SOAP) и HTTPСоединение (для работы по архитектуре REST или отправки произвольных HTTP-запросов). Разберем по шагам фундаментальные различия этих подходов, рассмотрим скрытые ограничения платформы 1С и выясним, какую технологию использовать в конкретных сценариях.
Давайте проанализируем суть каждого из механизмов, чтобы понять, как они работают «под капотом» платформы 1С:
Сформулируем простое правило: WSПрокси — это высокоуровневая обвязка над SOAP, которая делает всю рутину за вас, тогда как HTTPСоединение — это «голый» транспорт, требующий ручного написания кода для сборки и разбора сообщений.
На первый взгляд кажется, что WSПрокси гораздо удобнее. Однако на практике разработчики часто сталкиваются с жесткими ограничениями платформы 1С при поддержке стандартов Web-сервисов. Рассмотрим ключевые проблемы, о которых важно знать заранее:
WSПрокси вам не поможет.WSПрокси в 1С крайне затруднительно.Решение проблемы: Если сторонний веб-сервис требует использования неподдерживаемых стандартов безопасности, разработчики отказываются от 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-схему во внешнюю обработку невозможно, и приходится либо менять метаданные основной конфигурации, либо скачивать схемы динамически по сети. На самом деле существует элегантный обходной путь.
Мы можем сохранить схему XSD или файл WSDL как двоичные данные непосредственно в макет нашей внешней обработки. Рассмотрим по шагам, как это реализовать программно:
СхемаИнтеграцииXSD. Загрузим в него наш файл схемы.Посмотрим на пример кода, реализующий этот алгоритм:
// 1. Получаем уникальное имя для временного файла на диске
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xsd");
// 2. Извлекаем двоичные данные из макета внешней обработки
МакетДвоичныеДанные = ЭтотОбъект.ПолучитьМакет("СхемаИнтеграцииXSD");
МакетДвоичныеДанные.Записать(ИмяВременногоФайла);
// 3. Создаем фабрику XDTO на лету из временного файла схемы
Попытка
МояФабрикаXDTO = СоздатьФабрикуXDTO(ИмяВременногоФайла);
// Теперь мы можем создавать типы и объекты фабрики динамически:
// ТипОбъекта = МояФабрикаXDTO.Пакеты.Получить("http://my-namespace").Получить("MyType");
// НовыйОбъект = МояФабрикаXDTO.Создать(ТипОбъекта);
// Выполняем полезную работу...
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка инициализации фабрики XDTO: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
// 4. Обязательно удаляем временный файл после создания фабрики
УдалитьФайлы(ИмяВременногоФайла);
Этот прием позволяет сделать внешнюю обработку полностью автономной. Вы можете передавать файл .epf между базами, не внося никаких изменений в структуру метаданных конфигурации 1С.
Подведем итог нашего анализа. Для наглядности выделим рекомендации по выбору инструмента в виде правил:
Используйте WSПрокси, если:
Используйте HTTPСоединение, если: