Почему в 1С возникает ошибка «Неверный формат» при добавлении WSDL веб-сервиса и как ее исправить?

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

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

Разберем детально, почему возникает подобное расхождение в поведении 1С и сторонних утилит, и рассмотрим практические способы решения этой проблемы.

Причины возникновения ошибки

Проанализируем особенности разбора WSDL-схем в платформе 1С:

  1. Строгая валидация XML Schema (XSD): В отличие от специализированных инструментов тестирования, платформа 1С строго следует спецификациям WS-I Basic Profile и стандартам W3C XML Schema. Если в WSDL-описании присутствуют синтаксические неточности, отсутствуют обязательные секции или нарушены правила объявления типов, парсер 1С не может корректно построить модель метаданных сервиса. В результате коллекция операций не заполняется.
  2. Отсутствие или некорректное описание секции types: Многие сервисы (особенно созданные на базе PHP, NuSOAP или устаревших генераторах WSDL) используют стиль вызовов RPC/encoded и не содержат явного блока <wsdl:types>, либо ссылаются на некорректные типы (например, нестандартный xsd:Array вместо строгой схемы массивов с атрибутом maxOccurs="unbounded"). Сторонние программы способны автоматически достраивать структуру вызова по именам параметров, а платформа 1С требует строгого соответствия типов схеме.
  3. Ограничения платформы: В 1С отсутствуют настройки для отключения строгой проверки валидности схемы в объектах WSОпределения и WSПрокси.

Способ 1. Ручная корректировка WSDL-файла

Если необходимо сохранить работу через стандартный механизм WSПрокси или ветку WS-ссылки, выполним ручную адаптацию файла описания сервиса. Разберем этот процесс по шагам:

  1. Скачаем исходный WSDL-файл по ссылке сервиса и сохраним его на локальный диск.
  2. Откроем файл в текстовом редакторе и проанализируем секцию описания типов. Если в схеме отсутствуют описания структур данных или используются невалидные типы вроде xsd:Array, добавим недостающую секцию types с явным определением complexType и последовательностей элементов (sequence).
  3. Сохраним исправленный файл.
  4. Инициализируем сервис в коде 1С, передав путь к локальному файлу, либо загрузим файл в конфигураторе в ветку WS-ссылки.

Посмотрим на пример правильного создания объектов WSОпределения и WSПрокси программным путем:


ПутьКЛокальномуWSDL = "C:\WSDL\ForumAutoService.wsdl";
URIПространстваИмен = "API";
ИмяСервиса           = "Forum-AutoAPIService";
ИмяТочкиПодключения  = "FA_API_Port";

Попытка
    // Создаем определения на основе локально исправленного файла
    ОпределениеСервиса = Новый WSОпределения(ПутьКЛокальномуWSDL);
    
    // Инициализируем прокси с указанием точных параметров из WSDL
    СервисПоиска = Новый WSПрокси(
        ОпределениеСервиса, 
        URIПространстваИмен, 
        ИмяСервиса, 
        ИмяТочкиПодключения
    );
    
    // Выполняем вызов целевого метода сервиса
    Результат = СервисПоиска.listGoods(Логин, Пароль, Артикул, 0);
Исключение
    Сообщить("Ошибка при работе с веб-сервисом: " + ОписаниеОшибки());
КонецПопытки;

Способ 2. Отказ от WSПрокси в пользу прямых HTTP-запросов (рекомендуемый)

Если редактирование стороннего WSDL-файла затруднено или схема периодически меняется на стороне поставщика, наиболее надежным решением является отправка прямых SOAP-запросов через объект HTTPСоединение. Поскольку протокол SOAP работает поверх стандартного HTTP(S), мы можем сформировать готовый XML-конверт (SOAP Envelope) и отправить его сервису напрямую, минуя строгий валидатор WSDL в 1С.

Рассмотрим подробнее реализацию прямого SOAP-вызова:

  1. Сформируем XML-тело запроса (шаблон конверта можно скопировать из рабочей сессии SOAP UI).
  2. Создадим объект HTTPСоединение с использованием ЗащищенноеСоединениеOpenSSL для безопасных протоколов.
  3. Настроим заголовки Content-Type и SOAPAction в объекте HTTPЗапрос.
  4. Отправим запрос методом POST и прочитаем ответ через ЧтениеXML или ДокументDOM.

Посмотрим на пример программной реализации отправки прямого SOAP-запроса:


Сервер = "api.forum-auto.ru";
Ресурс = "/wsdl"; // Или адрес конечной точки из тега soap:address

// Формируем тело SOAP-конверта
ТелоЗапросаXML = 
"<?xml version=""1.0"" encoding=""utf-8""?>
|<soapenv:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" 
|                  xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" 
|                  xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" 
|                  xmlns:api=""API"">
|   <soapenv:Header/>
|   <soapenv:Body>
|      <api:listGoods soapenv:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">
|         <login xsi:type=""xsd:string"">" + Логин + "</login>
|         <password xsi:type=""xsd:string"">" + Пароль + "</password>
|         <artikul xsi:type=""xsd:string"">" + Артикул + "</artikul>
|         <cross xsi:type=""xsd:int"">0</cross>
|      </api:listGoods>
|   </soapenv:Body>
|</soapenv:Envelope>";

Попытка
    // Настраиваем защищенное соединение HTTPS
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, ЗащищенноеСоединение);
    
    // Формируем HTTP-запрос и устанавливаем обязательные заголовки SOAP
    Запрос = Новый HTTPЗапрос(Ресурс);
    Запрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
    Запрос.Заголовки.Вставить("SOAPAction", "API#listGoods");
    Запрос.УстановитьТелоИзСтроки(ТелоЗапросаXML, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    // Выполняем отправку POST-запроса
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        // Разбираем полученный XML-ответ
        Чтение = Новый ЧтениеXML;
        Чтение.УстановитьСтроку(ТекстОтвета);
        
        ПостроительDOM = Новый ПостроительDOM;
        Документ = ПостроительDOM.Прочитать(Чтение);
        // Обрабатываем узлы DOM-документа
    Иначе
        Сообщить("Ошибка вызова веб-сервиса. Код состояния: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    Сообщить("Исключение при обращении по HTTP: " + ОписаниеОшибки());
КонецПопытки;

Итоги

Ошибка «Неверный формат» в 1С возникает из-за строгого контроля стандартов XSD при разборе WSDL. Для обхода проблемы можно либо локально скорректировать XML-схему файла, дополнив ее корректными типами данных, либо использовать прямую отправку SOAP-сообщений через HTTPСоединение, что полностью исключает зависимость от встроенного валидатора схем платформы.

← На главную