Работа с веб-сервисами из платформы 1С 7.7 часто ставит перед разработчиками сложные задачи. Основная трудность заключается в том, что старые библиотеки, такие как MSSOAP.SoapClient30, плохо справляются с сериализацией сложных типов данных, например, массивов (ArrayOfInt). В данной статье мы разберем, как диагностировать и решать проблемы при передаче данных в веб-сервис.
При использовании MSSOAP.SoapClient30 мы часто сталкиваемся с ошибкой HRESULT=0x80020005: Несовпадение типов. Это происходит потому, что библиотека пытается автоматически сопоставить типы данных 1С и типы WSDL-схемы, но не может корректно интерпретировать массивы. Попытки передать СписокЗначений или сгенерированный через MSScriptControl объект чаще всего приводят к этой ошибке.
Разберем основные шаги по преодолению этой проблемы:
Вместо того чтобы полагаться на автоматическую сериализацию SOAP-клиента, мы будем формировать тело запроса вручную. Это дает нам полный контроль над структурой XML. Для этого будем использовать объект MSXML2.XMLHTTP. Рассмотрим пример реализации:
ТекстОтправки = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" " +
"xmlns:tem=""http://tempuri.org/"" " +
"xmlns:arr=""http://schemas.microsoft.com/2003/10/Serialization/Arrays"">" +
"<soapenv:Header/><soapenv:Body>" +
"<tem:PoluchitOtvet>" +
"<tem:taxGroups>" +
"<arr:int>1</arr:int><arr:int>3</arr:int>" +
"</tem:taxGroups>" +
"</tem:PoluchitOtvet>" +
"</soapenv:Body></soapenv:Envelope>";
Чтобы сервер корректно принял наш запрос, критически важно правильно настроить заголовки (headers). Ошибка 400 (Bad Request) чаще всего указывает именно на неверные заголовки или поврежденную структуру SOAP-конверта.
text/xml; charset=utf-8.Посмотрим на пример настройки объекта:
об = СоздатьОбъект("MSXML2.XMLHTTP");
об.open("POST", "http://localhost:1111/Service", 0, Login, Password);
об.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
об.setRequestHeader("SOAPAction", "http://tempuri.org/IService/PoluchitOtvet");
об.send(ТекстОтправки);
Если после формирования запроса мы получаем ошибку 400, проанализируем следующие моменты:
<?xml version=\"1.0\" encoding=\"utf-8\"?>.arr:int не совпадает с тем, что ожидает сервер.SoapUI. Это профессиональный стандарт при работе с веб-сервисами, который позволит увидеть реальную ошибку, возвращаемую сервером (например, подробное описание конфликта схем).Если MSXML2.XMLHTTP ведет себя нестабильно, попробуйте сменить его на WinHttp.WinHttpRequest.5.1. Он обладает более гибкими настройками для работы с прокси и авторизацией. Также всегда проверяйте, не требуется ли серверу авторизация по протоколу NTLM, что для 1С 7.7 требует специфических настроек объекта запроса.
Помните: ручное формирование XML — это надежный путь для обмена данными между 1С 7.7 и современными .NET сервисами. Тщательно проверяйте структуру Envelope, соблюдайте регистр имен тегов и всегда проверяйте заголовки запроса.