Как подключиться к веб-сервису через NetObjectToIDispatch45 в 1С?

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

При работе с внешними веб-сервисами штатные средства 1С, такие как WSОпределения и WSПрокси, не всегда справляются со сложными протоколами безопасности, специфическими заголовками или особенностями WCF (Windows Communication Foundation). В таких случаях программисты часто прибегают к использованию библиотеки NetObjectToIDispatch45, которая позволяет прозрачно работать с объектами .NET прямо из кода 1С через COM-интерфейс. В этой статье мы подробно разберем, как пройти путь от создания промежуточной сборки до успешного вызова метода веб-сервиса.

Понимание концепции промежуточной сборки

Первое, что необходимо осознать при работе с данным подходом: мы не просто подключаемся к URL, а создаем полноценного клиента на стороне .NET. Разберем, почему это важно. Платформа .NET предоставляет мощные инструменты для генерации кода клиента по метаданным WSDL. Вместо того чтобы пытаться вручную описывать сложные типы данных в 1С, мы делегируем эту задачу Visual Studio.

Проанализируем последовательность действий. Сначала в среде разработки (например, Visual Studio) создается проект типа "Библиотека классов" (Class Library). В этот проект добавляется "Service Reference" (ссылка на службу), указывающая на адрес вашего веб-сервиса. Компилятор автоматически генерирует классы для всех методов и типов данных. После этого мы получаем готовую DLL-библиотеку, которую будем загружать в 1С через NetObjectToIDispatch45.

Важность выбора версии .NET Framework

Одной из критических ошибок, с которой сталкиваются разработчики (как показано в сообщениях 41–42), является несовместимость версий .NET. Если основная библиотека NetObjectToIDispatch45.dll скомпилирована под .NET Framework 4.5 или 4.6.1, то и ваша промежуточная сборка должна быть создана именно под эту версию платформы. Попытка использовать современные .NET Core или .NET 5/6 приведет к ошибкам типа "Данное имя сборки или база кода недействительны".

Рассмотрим рекомендации по настройке проекта в Visual Studio:

  1. При создании проекта выбирайте шаблон "Библиотека классов (.NET Framework)".
  2. В свойствах проекта на вкладке "Приложение" установите "Целевая рабочая среда" на .NET Framework 4.6.1.
  3. Убедитесь, что все зависимости (NuGet-пакеты) также поддерживают эту версию.

Загрузка сборки и создание объектов в 1С

После того как DLL сгенерирована, перейдем к коду в 1С. Для начала нам нужно инициализировать саму библиотеку-обертку и загрузить нашу сборку. Рассмотрим, как это сделать правильно:


Врап = Новый COMОбъект("NetObjectToIDispatch45");
ПутьКСборке = "C:\MyAssemblies\ServiceProxy.dll";

// Вариант 1: Через прямую загрузку типа
Тип_ServiceClient = Врап.ПолучитьТипИзСборки("Namespace.MyServiceClient", ПутьКСборке);

// Вариант 2: Сначала загружаем сборку целиком
Сборка = Врап.ЗагрузитьСборку(ПутьКСборке);
Тип_ServiceClient = Сборка.GetType("Namespace.MyServiceClient");

Обратите внимание на важный нюанс: часто разработчики пытаются создать экземпляр интерфейса (например, IServiceSoap), что приводит к ошибке "Конструктор для типа не найден". Выясним причину: интерфейсы не имеют конструкторов. Нам нужно найти класс-реализацию, который обычно имеет суффикс Client (например, ServiceSoapClient).

Настройка привязки (Binding) и адреса (Endpoint)

В отличие от стандартного 1С, где параметры подключения часто скрыты внутри WSПрокси, в .NET WCF мы должны явно сконфигурировать транспортный уровень. Разберем пример создания BasicHttpBinding и EndpointAddress, так как именно этот способ наиболее универсален для SOAP-сервисов.

Проанализируем ситуацию: поскольку 1С работает как исполняемый процесс, он не видит файл app.config вашей библиотеки. Следовательно, все настройки нужно передавать программно. Посмотрим на программную настройку:


// Получаем тип биндинга из системной библиотеки .NET
BasicHttpBindingТип = Врап.ПолучитьТипИзСборки("System.ServiceModel.BasicHttpBinding", "System.ServiceModel.dll");
// Создаем объект биндинга
Биндинг = Врап.СоздатьОбъект(BasicHttpBindingТип);

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

// Создаем адрес конечной точки
Адрес = Врап.СоздатьОбъект("System.ServiceModel.EndpointAddress", "http://myservice.com/api.asmx");

// Инициализируем клиента, передавая настройки в конструктор
Клиент = Врап.СоздатьОбъект(Тип_ServiceClient, Биндинг, Адрес);

Вызов методов и обработка авторизации

Если веб-сервис требует авторизации, мы можем передать учетные данные через свойства созданного клиента. Разберем пример для Basic Authentication:


Клиент.ClientCredentials.UserName.UserName = "Логин";
Клиент.ClientCredentials.UserName.Password = "Пароль";

// Теперь можно вызывать методы сервиса
Результат = Клиент.SomeMethod(Параметр1, Параметр2);

Выясним, как работать с типами данных, которые ожидает .NET. Если метод требует сложный объект, мы создаем его через ту же обертку, используя Врап.СоздатьОбъект("Namespace.MyComplexType"). Библиотека NetObjectToIDispatch45 автоматически преобразует простые типы 1С (строки, числа, даты) в эквиваленты .NET.

Альтернатива: Использование HttpClient для REST-запросов

Иногда веб-сервис не является SOAP-службой, и нам нужно выполнить обычный POST-запрос с JSON. Рассмотрим, как применить класс HttpClient из .NET через ту же обертку. Это особенно полезно, когда встроенный HTTPСоединение в 1С не поддерживает нужные методы или требует сложной работы с сертификатами.


// Инициализация HttpClient
HttpClientТип = NetObject.ПолучитьТипИзСборки("System.Net.Http.HttpClient", "System.Net.Http.dll");
Handler = NetObject.СоздатьОбъект("System.Net.Http.HttpClientHandler");

// Настройка учетных данных
Credentials = NetObject.СоздатьОбъект("System.Net.NetworkCredential", "User", "Pass");
Handler.Credentials = Credentials;
Handler.PreAuthenticate = Истина;

Client = NetObject.СоздатьОбъект(HttpClientТип, Handler);

// Подготовка контента
StringContentТип = NetObject.ПолучитьТип("System.Net.Http.StringContent");
Контент = NetObject.СоздатьОбъект(StringContentТип, "{'inn': '12345678'}");
Контент.Headers.ContentType = NetObject.СоздатьОбъект("System.Net.Http.Headers.MediaTypeHeaderValue", "application/json");

// Выполнение асинхронного вызова синхронно через .Result
РезультатЗапроса = Client.PostAsync("http://api.service.ru/score", Контент).Result;
ОтветТекстом = РезультатЗапроса.Content.ReadAsStringAsync().Result;

Низкоуровневая эмуляция VMT (для продвинутых разработчиков)

В обсуждении также затронута тема реализации 1C NativeAPI на языках программирования, не поддерживающих классы C++ (например, Go или чистый C). Ключ к решению здесь — понимание Таблицы Виртуальных Методов (VMT). Рассмотрим, как это устроено на низком уровне.

Для 1С внешняя компонента должна выглядеть как объект C++. Это означает, что первым полем структуры в памяти должен быть указатель на массив адресов функций. Проанализируем структуру TAddInDefBaseVTable, упомянутую в теме:

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

← На главную