При интеграции 1С со сторонними веб-сервисами разработчики часто сталкиваются с ситуацией, когда стороннее WSDL-описание успешно открывается и выполняется в специализированных утилитах для тестирования (например, SOAP UI), однако в 1С при попытке добавить объект в ветку конфигуратора WS-ссылки возникает ошибка «Неверный формат». При попытке инициализировать сервис программно через объект WSОпределения объект создается, но коллекция доступных операций оказывается пустой, а вызов методов через WSПрокси завершается ошибкой Метод объекта не обнаружен.
Разберем детально, почему возникает подобное расхождение в поведении 1С и сторонних утилит, и рассмотрим практические способы решения этой проблемы.
Проанализируем особенности разбора WSDL-схем в платформе 1С:
RPC/encoded и не содержат явного блока <wsdl:types>, либо ссылаются на некорректные типы (например, нестандартный xsd:Array вместо строгой схемы массивов с атрибутом maxOccurs="unbounded"). Сторонние программы способны автоматически достраивать структуру вызова по именам параметров, а платформа 1С требует строгого соответствия типов схеме.WSОпределения и WSПрокси.Если необходимо сохранить работу через стандартный механизм WSПрокси или ветку WS-ссылки, выполним ручную адаптацию файла описания сервиса. Разберем этот процесс по шагам:
xsd:Array, добавим недостающую секцию types с явным определением complexType и последовательностей элементов (sequence).Посмотрим на пример правильного создания объектов WSОпределения и WSПрокси программным путем:
ПутьКЛокальномуWSDL = "C:\WSDL\ForumAutoService.wsdl";
URIПространстваИмен = "API";
ИмяСервиса = "Forum-AutoAPIService";
ИмяТочкиПодключения = "FA_API_Port";
Попытка
// Создаем определения на основе локально исправленного файла
ОпределениеСервиса = Новый WSОпределения(ПутьКЛокальномуWSDL);
// Инициализируем прокси с указанием точных параметров из WSDL
СервисПоиска = Новый WSПрокси(
ОпределениеСервиса,
URIПространстваИмен,
ИмяСервиса,
ИмяТочкиПодключения
);
// Выполняем вызов целевого метода сервиса
Результат = СервисПоиска.listGoods(Логин, Пароль, Артикул, 0);
Исключение
Сообщить("Ошибка при работе с веб-сервисом: " + ОписаниеОшибки());
КонецПопытки;
Если редактирование стороннего WSDL-файла затруднено или схема периодически меняется на стороне поставщика, наиболее надежным решением является отправка прямых SOAP-запросов через объект HTTPСоединение. Поскольку протокол SOAP работает поверх стандартного HTTP(S), мы можем сформировать готовый XML-конверт (SOAP Envelope) и отправить его сервису напрямую, минуя строгий валидатор WSDL в 1С.
Рассмотрим подробнее реализацию прямого SOAP-вызова:
HTTPСоединение с использованием ЗащищенноеСоединениеOpenSSL для безопасных протоколов.Content-Type и SOAPAction в объекте HTTPЗапрос.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Соединение, что полностью исключает зависимость от встроенного валидатора схем платформы.