Как вызвать метод веб-сервиса с комплексными типами параметров через NetObjectToIDispatch45

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

При интеграции 1С с внешними системами через .NET-сборки и библиотеку NetObjectToIDispatch45 программисты часто сталкиваются с ошибкой «Метод не найден». Чаще всего эта проблема не означает отсутствие самого метода в веб-сервисе, а указывает на несоответствие типов передаваемых аргументов. Рассмотрим подробно, как правильно инициализировать подключение к веб-сервису и подготавливать сложные объекты для передачи в методы.

Анализ причины ошибки «Метод не найден»

В среде COM-взаимодействия вызов метода происходит по его сигнатуре. Сигнатура включает в себя не только имя метода, но и количество, а также типы входящих параметров. Проанализируем ситуацию: если в коде 1С вы вызываете метод, передавая ему строку (String), а веб-сервис ожидает объект сложного класса (InputClass), то .NET-обертка не сможет сопоставить этот вызов и вернет ошибку «Метод не найден».

Для решения этой задачи нам необходимо выполнить следующие шаги:

  1. Изучить структуру (сигнатуру) метода в исходном коде или через декомпилятор.
  2. Инициализировать необходимые типы из .NET-сборки.
  3. Создать и заполнить иерархию объектов параметров.
  4. Выполнить вызов метода с передачей подготовленного объекта.

Шаг 1: Инициализация базового подключения

Для начала разберем стандартную схему подключения к веб-службе через BasicHttpBinding. Проанализируем пример кода, который создает клиентскую часть сервиса:


// Инициализация обертки
Врап = Новый COMОбъект("NetObjectToIDispatch45");

// Загрузка типов для настройки транспорта
BasicHttpBinding = Врап.ПолучитьТипИзСборки("System.ServiceModel.BasicHttpBinding", "System.ServiceModel.dll");
EndpointAddress = Врап.ПолучитьТипИзСборки("System.ServiceModel.EndpointAddress", "System.ServiceModel.dll");

// Настройка привязки (Binding)
Binding = Врап.СоздатьОбъект(BasicHttpBinding);
Binding.MaxReceivedMessageSize = 2147483647; // Максимально возможный размер сообщения
Binding.OpenTimeout = Врап.СоздатьОбъект("System.TimeSpan", 0, 0, 30); // 30 секунд

// Установка адреса сервиса
Address = Врап.СоздатьОбъект(EndpointAddress, "https://api.example.com/service.svc");

// Получение типа клиента из вашей скомпилированной сборки (Proxy-класса)
ServiceType = Врап.ПолучитьТипИзСборки("MyNamespace.ServiceClient", "C:\Path\To\MyAssembly.dll");
Client = Врап.СоздатьОбъект(ServiceType, Binding, Address);

Шаг 2: Работа со сложными типами параметров

Рассмотрим ситуацию, когда метод RejectedClient ожидает не просто ИНН строкой, а специальный класс RejectedClientInput. Выясним структуру этого класса. Допустим, он содержит объект ClientInfo и строку SourceGUID. В свою очередь, ClientInfo содержит поле INN.

Чтобы метод был успешно вызван, проанализируем и реализуем процесс создания этих объектов в 1С:


// 1. Создаем основной объект параметров
ПараметрыМетода = Врап.СоздатьОбъект("MyNamespace.RejectedClientInput");

// 2. Создаем вложенный объект с информацией о клиенте
ИнфоОКлиенте = Врап.СоздатьОбъект("MyNamespace.ClientInfo");
ИнфоОКлиенте.INN = "7701234567";

// 3. Собираем структуру воедино
ПараметрыМетода.RejectedClientInfo = ИнфоОКлиенте;
ПараметрыМетода.SourceGUID = Строка(Новый УникальныйИдентификатор());

// 4. Теперь вызываем метод, передавая подготовленный объект
Попытка
    Результат = Client.RejectedClient(ПараметрыМетода);
    Сообщить("Запрос выполнен успешно");
Исключение
    // В случае ошибки важно просмотреть InnerException
    ОшибкаПодробно = ИнформацияОбОшибке().Описание;
    Сообщить("Ошибка вызова: " + ОшибкаПодробно);
КонецПопытки;

Шаг 3: Настройка безопасности и TLS

Современные веб-сервисы (особенно банковские и государственные) требуют использования протоколов TLS 1.2 или TLS 1.3. По умолчанию .NET 4.5 может использовать более старые протоколы, что приведет к ошибке соединения. Рассмотрим, как включить поддержку современных протоколов безопасности программно:


ServicePointManager = Врап.ПолучитьТип("System.Net.ServicePointManager");
SecurityProtocolType = Врап.ПолучитьТип("System.Net.SecurityProtocolType");

// Объединяем флаги протоколов (Ssl3 | Tls | Tls11 | Tls12)
// В .NET перечисления (Enum) комбинируются через логическое ИЛИ (OR)
Протоколы = Врап.OR(SecurityProtocolType.Tls, SecurityProtocolType.Tls11);
Протоколы = Врап.OR(Протоколы, SecurityProtocolType.Tls12);

ServicePointManager.SecurityProtocol = Протоколы;

Важные рекомендации по диагностике

Если после всех манипуляций ошибка сохраняется, проанализируем дополнительные аспекты, которые могут влиять на результат:

1. Проверка разрядности приложения

Библиотека NetObjectToIDispatch45 является COM-компонентом. Если ваша 1С работает в 64-битном режиме (например, на сервере 1С), то и библиотека должна быть зарегистрирована с помощью 64-битной версии regasm.exe, находящейся в папке C:\Windows\Microsoft.NET\Framework64\v4.0.30319\. Если регистрация выполнена только для 32-битной версии, объект не будет создан или будет работать некорректно.

2. Использование Null-значений

В .NET объекты могут принимать значение null. Если веб-сервис ожидает необязательный объект, а вы передаете пустую строку или значение Неопределено из 1С, это может вызвать ошибку типизации. Используйте специальное свойство библиотеки Врап.Null для явной передачи пустого значения объекта .NET.

3. Просмотр InnerException

Ошибки COM-объектов часто маскируют истинную причину проблемы. Чтобы увидеть реальную ошибку, возникшую внутри .NET, разберем способ получения детальной информации:


Попытка
    Результат = Client.ExecuteMethod();
Исключение
    // Получаем объект исключения .NET
    LastException = Врап.LastException;
    Если LastException <> Неопределено Тогда
        Сообщить("Сообщение: " + LastException.Message);
        Если LastException.InnerException <> Неопределено Тогда
            Сообщить("Внутренняя ошибка: " + LastException.InnerException.Message);
        КонецЕсли;
    КонецЕсли;
КонецПопытки;

Используя данный подход, мы можем детально проанализировать структуру SOAP-запроса и убедиться, что передаваемые данные полностью соответствуют схеме XSD, ожидаемой веб-сервисом.

← На главную