Работа с современными веб-сервисами из платформы 1С 7.7 часто вызывает сложности из-за ограничений COM-объектов, которые не поддерживают специфические типы данных .NET, такие как ArrayOfint. Рассмотрим подробнее, почему возникает ошибка Плохой тип переменной и какие пути решения этой задачи существуют.
Когда вы используете компоненту MSSOAP.SoapClient30, она пытается интерпретировать данные на основе классических COM-типов. Современные сервисы (часто построенные на WCF) требуют передачи данных в специфических пространствах имен, например http://schemas.microsoft.com/2003/10/Serialization/Arrays. Старые компоненты 1С 7.7 не умеют сериализовать простые COM-массивы в нужную серверу структуру XML, что и приводит к ошибке несоответствия типов.
Наиболее надежным способом взаимодействия с современными веб-сервисами в 1С 7.7 является использование внешних компонентов для работы со сборками .NET, например NetObjectToIDispatch. Этот подход позволяет передать «тяжелую» работу по сериализации данных библиотеке .NET.
Разберем по шагам, как это реализовать:
Рассмотрим пример кода для вызова метода через загруженную сборку:
// Загружаем внешнюю обертку для .NET
врап = СоздатьОбъект("NetObjectToIDispatch45");
врап.УстЭтоСемерка();
// Загружаем скомпилированную нами сборку
Сборка = врап.загрузитьСборку("ПутьКНашейСборке.dll");
// Получаем тип клиента сервиса
типСервера = врап.ПолучитьТип("Namespace.ИмяКлассаКлиента");
// Настраиваем подключение (Endpoint)
remoteAddress = врап.СоздатьОбъект("System.ServiceModel.EndpointAddress", врап.СоздатьОбъект("System.Uri", "URL_Сервиса"));
привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding");
// Создаем экземпляр сервиса
сервер = врап.СоздатьОбъект(типСервера, привязка, remoteAddress);
// Вызываем метод, передавая данные
рез = сервер.ИмяВашегоМетода(Параметры);
Если вы не хотите создавать отдельные сборки, можно попытаться отправить SOAP-запрос вручную через MSXML2.XMLHTTP. Это требует полного контроля над структурой XML.
При ручной отправке помните о трех важных правилах:
soap:Envelope и soap:Body с корректными пространствами имен.Проанализируем пример формирования структуры данных:
// Пример структуры XML для передачи массива
ТекстЗапроса = "
|<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>
| <soap:Body>
| <AddCommodityToTradeDocument xmlns='http://tempuri.org/'>
| <Grup>
| <arr:int>1</arr:int>
| <arr:int>3</arr:int>
| </Grup>
| </AddCommodityToTradeDocument>
| </soap:Body>
|</soap:Envelope>";
Для отладки веб-сервисов настоятельно рекомендуем использовать инструменты вроде SoapUI. Загрузите туда WSDL, сформируйте запрос и добейтесь успешного ответа. После этого вы будете точно знать, какой именно XML-текст и какие заголовки необходимо передать из 1С 7.7. Это сэкономит часы на «угадывании» структуры SOAP-сообщения.
Если проект требует частой работы с веб-сервисами, использование .NET-сборок (решение 1) будет гораздо стабильнее ручного формирования строк XML, так как оно снимает с вас задачу слежения за актуальностью типов данных и структурой сериализации.