Как подключиться к веб-сервису через WS-ссылку в 1С и обработать результат?

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

Интеграция сторонних веб-сервисов (Web Services) в среду 1С — это классическая задача автоматизации, с которой часто сталкиваются разработчики при организации обмена данными с поставщиками, логистическими компаниями или платежными шлюзами. На примере B2B-сервиса дистрибьютора Treolan мы подробно разберем, как правильно настроить подключение к защищенным веб-сервисам по протоколу HTTPS, как вызывать методы с большим количеством обязательных параметров и как эффективно обрабатывать возвращаемые «сырые» XML-строки.

Статическое и динамическое создание WS-прокси: в чем разница?

При работе с веб-сервисами в платформе 1С Предприятие у разработчика есть два пути создания объекта связи. Выясним особенности каждого подхода, чтобы выбрать оптимальный для вашей задачи.

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

Для создания прокси-сервера на основе существующей ссылки используется следующий синтаксис:


Прокси = WSСсылки.ИмяВашейСсылки.СоздатьWSПрокси("ПространствоИмен", "ИмяСервиса", "ТочкаПодключения", , SSL);

Обратите внимание, что при использовании статической ссылки нам не требуется создавать промежуточный объект WSОпределения. Это экономит время выполнения кода и избавляет от необходимости инициализировать повторные сетевые запросы для чтения схемы WSDL.

Способ 2. Использование динамического определения WSОпределения. Этот способ незаменим, если адрес веб-сервиса может меняться (например, тестовый и продуктовый сервера) или если схема WSDL должна загружаться «на лету» прямо из интернета:


SSL = Новый ЗащищенноеСоединениеOpenSSL;
ОпределениеWS = Новый WSОпределения(АдресWSDL, ИмяПользователя, Пароль, , , SSL);
Прокси = Новый WSПрокси(ОпределениеWS, ПространствоИмен, ИмяСервиса, ТочкаПодключения, , SSL);

Настройка защищенного соединения (SSL) в 1С

Современные веб-сервисы практически повсеместно работают по защищенному протоколу HTTPS. Если при попытке инициализации подключения опустить параметры безопасности, платформа выдаст критическую ошибку сокета. Чтобы избежать этой проблемы, рассмотрим использование объекта ЗащищенноеСоединениеOpenSSL.

Для создания защищенного соединения по умолчанию достаточно вызвать конструктор без параметров. Платформа 1С задействует стандартные сертификаты операционной системы:

SSL = Новый ЗащищенноеСоединениеOpenSSL;

В редких случаях, когда удаленный сервер использует самоподписанный сертификат, может потребоваться детальная настройка с указанием конкретных сертификатов в параметрах объекта, однако для большинства публичных API (включая Treolan) стандартной инициализации более чем достаточно.

Разбор параметров метода GenCatalogV2

Одной из частых ошибок разработчиков при вызове методов веб-сервиса является некорректная передача параметров. Согласно спецификации WSDL-схемы, многие веб-сервисы требуют жесткого соблюдения порядка и типов данных аргументов. Если метод ожидает 10 параметров, вы обязаны передать ровно 10 параметров, даже если часть из них останется пустыми.

Проанализируем структуру параметров популярного метода GenCatalogV2 для получения каталога товаров:

  1. login (тип string) — Логин для авторизации в системе дистрибьютора.
  2. password (тип string) — Пароль пользователя.
  3. category (тип string) — Фильтр по категории. Если нужно получить весь доступный каталог, передаем пустую строку "".
  4. vendorid (тип string) — Идентификатор вендора (производителя). Значение "0" отключает фильтрацию по бренду.
  5. keywords (тип string) — Ключевые слова для поиска по наименованию. Передается пустая строка "", если поиск не требуется.
  6. criterion (тип int) — Критерий поиска. Принимает числовые значения (например, 0 — совпадение с начала строки).
  7. inArticul (тип boolean или int) — Флаг поиска по артикулу (истина/ложь или 1/0).
  8. inName (тип boolean или int) — Флаг поиска по наименованию.
  9. inMark (тип boolean или int) — Признак выборки только акционных товаров.
  10. showNc (тип int) — Настройка показа некондиционного товара (например, уценки).

Пример правильного вызова метода через подготовленный WS-прокси выглядит следующим образом:


Логин = "ampc_pa";
Пароль = "fgp9vtl6"; // Используйте актуальный пароль вашей учетной записи
СтрокаРезультат = Прокси.GenCatalogV2(Логин, Пароль, "", "0", "", 0, 0, 0, 0, 0);

Как обработать возвращаемый XML-результат?

Часто веб-сервисы возвращают не готовую структуру объектов XDTO, а одну длинную строку, внутри которой упакована структура XML. Попытка обойти такую строку стандартным циклом Для Каждого приведет к ошибке, так как строка не является коллекцией. Разберем по шагам два способа эффективного парсинга полученных XML-данных в 1С.

Вариант А. Быстрое потоковое чтение с помощью ЧтениеXML

Этот способ является наиболее производительным и экономичным по отношению к оперативной памяти. Он идеально подходит, если возвращаемый каталог товаров содержит десятки тысяч позиций.

Рассмотрим пример кода для последовательного разбора XML-строки:


// Создаем объект для чтения XML-данных
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаРезультат);

// Запускаем цикл последовательного обхода дерева XML
Пока ЧтениеXML.Прочитать() Цикл
    // Проверяем, что текущий узел является началом элемента товара
    Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Product" Тогда
        
        // Получаем значения атрибутов товара напрямую из узла
        Артикул    = ЧтениеXML.ПолучитьАтрибут("Articul");
        ИмяТовара  = ЧтениеXML.ПолучитьАтрибут("Name");
        ЦенаТовара = ЧтениеXML.ПолучитьАтрибут("Price");
        Остаток    = ЧтениеXML.ПолучитьАтрибут("Quantity");
        
        // Здесь мы можем реализовать логику записи данных в базу 1С:
        // Создать новую номенклатуру или обновить цены и остатки на складах
        
    КонецЕсли;
КонецЦикла;

// Обязательно закрываем поток чтения данных
ЧтениеXML.Закрыть();

Вариант Б. Чтение данных через Объектную Модель Документа (DOM)

Если объем передаваемых данных невелик и вам требуется произвольный доступ к элементам в разных частях структуры (или фильтрация через XPath), удобнее воспользоваться построителем DOM дерева. Этот метод загружает весь XML в память, поэтому используйте его с осторожностью на больших файлах.


ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаРезультат);

// Строим дерево DOM в оперативной памяти
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);

// Получаем коллекцию всех узлов с тегом "Product"
СписокТоваров = ДокументDOM.ПолучитьЭлементыПоИмени("Product");

Для Каждого ЭлементТовара Из СписокТоваров Цикл
    // Извлекаем необходимые данные из атрибутов или дочерних узлов
    Артикул = ЭлементТовара.ПолучитьАтрибут("Articul");
    Название = ЭлементТовара.ПолучитьАтрибут("Name");
    
    // Обрабатываем полученную позицию
КонецЦикла;

ЧтениеXML.Закрыть();

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

← На главную