При интеграции 1С с внешними системами через .NET-сборки и библиотеку NetObjectToIDispatch45 программисты часто сталкиваются с ошибкой «Метод не найден». Чаще всего эта проблема не означает отсутствие самого метода в веб-сервисе, а указывает на несоответствие типов передаваемых аргументов. Рассмотрим подробно, как правильно инициализировать подключение к веб-сервису и подготавливать сложные объекты для передачи в методы.
В среде COM-взаимодействия вызов метода происходит по его сигнатуре. Сигнатура включает в себя не только имя метода, но и количество, а также типы входящих параметров. Проанализируем ситуацию: если в коде 1С вы вызываете метод, передавая ему строку (String), а веб-сервис ожидает объект сложного класса (InputClass), то .NET-обертка не сможет сопоставить этот вызов и вернет ошибку «Метод не найден».
Для решения этой задачи нам необходимо выполнить следующие шаги:
Для начала разберем стандартную схему подключения к веб-службе через 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);
Рассмотрим ситуацию, когда метод RejectedClient ожидает не просто ИНН строкой, а специальный класс RejectedClientInput. Выясним структуру этого класса. Допустим, он содержит объект ClientInfo и строку SourceGUID. В свою очередь, ClientInfo содержит поле INN.
Чтобы метод был успешно вызван, проанализируем и реализуем процесс создания этих объектов в 1С:
// 1. Создаем основной объект параметров
ПараметрыМетода = Врап.СоздатьОбъект("MyNamespace.RejectedClientInput");
// 2. Создаем вложенный объект с информацией о клиенте
ИнфоОКлиенте = Врап.СоздатьОбъект("MyNamespace.ClientInfo");
ИнфоОКлиенте.INN = "7701234567";
// 3. Собираем структуру воедино
ПараметрыМетода.RejectedClientInfo = ИнфоОКлиенте;
ПараметрыМетода.SourceGUID = Строка(Новый УникальныйИдентификатор());
// 4. Теперь вызываем метод, передавая подготовленный объект
Попытка
Результат = Client.RejectedClient(ПараметрыМетода);
Сообщить("Запрос выполнен успешно");
Исключение
// В случае ошибки важно просмотреть InnerException
ОшибкаПодробно = ИнформацияОбОшибке().Описание;
Сообщить("Ошибка вызова: " + ОшибкаПодробно);
КонецПопытки;
Современные веб-сервисы (особенно банковские и государственные) требуют использования протоколов 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, ожидаемой веб-сервисом.