Как передать массив целых чисел в SOAP-запрос из 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Когда вы используете компоненту MSSOAP.SoapClient30, она пытается интерпретировать данные на основе классических COM-типов. Современные сервисы (часто построенные на WCF) требуют передачи данных в специфических пространствах имен, например http://schemas.microsoft.com/2003/10/Serialization/Arrays. Старые компоненты 1С 7.7 не умеют сериализовать простые COM-массивы в нужную серверу структуру XML, что и приводит к ошибке несоответствия типов.

Решение 1: Использование .NET сборок (рекомендуемый путь)

Наиболее надежным способом взаимодействия с современными веб-сервисами в 1С 7.7 является использование внешних компонентов для работы со сборками .NET, например NetObjectToIDispatch. Этот подход позволяет передать «тяжелую» работу по сериализации данных библиотеке .NET.

Разберем по шагам, как это реализовать:

  1. Создайте в Visual Studio библиотеку классов (.NET Framework), добавив ссылку на WSDL-описание вашего веб-сервиса. Это создаст необходимые прокси-классы.
  2. Скомпилируйте сборку (DLL).
  3. Используйте внешнюю компоненту в 1С для загрузки этой сборки и вызова методов.

Рассмотрим пример кода для вызова метода через загруженную сборку:


// Загружаем внешнюю обертку для .NET
врап = СоздатьОбъект("NetObjectToIDispatch45");
врап.УстЭтоСемерка();

// Загружаем скомпилированную нами сборку
Сборка = врап.загрузитьСборку("ПутьКНашейСборке.dll");

// Получаем тип клиента сервиса
типСервера = врап.ПолучитьТип("Namespace.ИмяКлассаКлиента");

// Настраиваем подключение (Endpoint)
remoteAddress = врап.СоздатьОбъект("System.ServiceModel.EndpointAddress", врап.СоздатьОбъект("System.Uri", "URL_Сервиса"));
привязка = врап.СоздатьОбъект("System.ServiceModel.BasicHttpBinding");

// Создаем экземпляр сервиса
сервер = врап.СоздатьОбъект(типСервера, привязка, remoteAddress);

// Вызываем метод, передавая данные
рез = сервер.ИмяВашегоМетода(Параметры);

Решение 2: Формирование XML-запроса вручную

Если вы не хотите создавать отдельные сборки, можно попытаться отправить SOAP-запрос вручную через MSXML2.XMLHTTP. Это требует полного контроля над структурой XML.

При ручной отправке помните о трех важных правилах:

Проанализируем пример формирования структуры данных:


// Пример структуры 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, так как оно снимает с вас задачу слежения за актуальностью типов данных и структурой сериализации.

← На главную