Как интегрировать 1С с веб-сервисом на базе WCF с авторизацией по сертификату?

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

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

Проблема протоколов: Почему WSПрокси не всегда работает

Первое, с чем мы сталкиваемся при работе с WCF — это выбор привязки (binding) на стороне сервера. Проанализируем ситуацию: если сервис использует wsHttpBinding, он ожидает поддержку стандартов WS-Addressing и WS-Security. Платформа 1С "из коробки" через объект WSПрокси не всегда корректно формирует заголовки для таких соединений.

Как показывает практика, наиболее стабильный вариант интеграции достигается при использовании на стороне WCF привязки basicHttpBinding. Она полностью совместима с SOAP 1.1 и легко обрабатывается встроенными механизмами 1С. Если же вы не можете изменить настройки сервера, придется использовать низкоуровневые объекты типа HTTPСоединение.

Настройка защищенного соединения и работа с сертификатами

Для авторизации на веб-сервисе с использованием сертификата нам потребуется объект ЗащищенноеСоединениеOpenSSL. Важно помнить, что 1С работает с файлами сертификатов (обычно в формате .pfx или .p12). Рассмотрим, как правильно инициализировать соединение, если у нас есть файл сертификата и пароль к нему.

Разберем пример кода для создания защищенного соединения:


// Путь к файлу сертификата и пароль
ПутьКСертификату = "C:\Certificates\client_auth.pfx";
ПарольСертификата = "ВашПароль";

// Создаем объект сертификата
СертификатКлиента = Новый СертификатКлиентаФайл(ПутьКСертификату, ПарольСертификата);

// Инициализируем защищенное соединение через OpenSSL
// Первый параметр — сертификат клиента, второй — сертификаты удостоверяющих центров (если нужно)
ССЛ = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента);

Важный нюанс: Если сервер использует самоподписанный сертификат, 1С может отклонить соединение. В этом случае во второй параметр ЗащищенноеСоединениеOpenSSL необходимо передать объект СертификатыУдостоверяющихЦентровФайл, содержащий корневой сертификат сервера.

Вариант 1: Использование WS-ссылок и WSПрокси

Если веб-сервис опубликован с поддержкой WSDL и использует совместимую привязку, мы можем использовать стандартный механизм 1С. Посмотрим на реализацию вызова метода ActualVersion:


Попытка
    // Определение расположения WSDL
    ПутьWSDL = "https://myservice.com/Assistant.svc?wsdl";
    
    // Создаем защищенное соединение
    ССЛ = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("C:\cert.pfx", "password"));
    
    // Получаем определения сервиса
    Определение = Новый WSОпределения(ПутьWSDL, "Логин", "Пароль",,, ССЛ);
    
    // Создаем прокси. Обратите внимание на пространство имен и имя сервиса
    Прокси = Новый WSПрокси(Определение, "http://tempuri.org/", "AssistantWCF", "BasicHttpBinding_IAssistantWCF");
    Прокси.Пользователь = "Логин";
    Прокси.Пароль = "Пароль";
    
    Результат = Прокси.ActualVersion();
    Сообщить("Версия сервиса: " + Результат);
Исключение
    Инфо = ИнформацияОбОшибке();
    Сообщить("Ошибка вызова: " + Инфо.Описание);
КонецПопытки

Вариант 2: Использование HTTPСоединение для нестандартных WCF-сервисов

Если при использовании WSПрокси вы получаете ошибку "Failure when receiving data from the peer", это может означать, что WCF-сервис ожидает специфическую структуру запроса или версию протокола TLS, которую WSПрокси не может обеспечить. В этом случае проанализируем ручной метод отправки запроса через HTTPСоединение.

Этот метод более гибкий, так как позволяет вручную управлять заголовками (например, Content-Type или SoapAction). Рассмотрим пример:


// Настройки подключения
Сервер = "37.203.116.216";
Порт = 8080;
Логин = "test1";
Пароль = "1tset";

// Настройка SSL
ССЛ = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("c:\tmp\mysert.pfx", "пароль"));

// Создаем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , , ССЛ);

// Формируем запрос (например, GET или POST в зависимости от метода WCF)
// Если это SOAP, нужно сформировать тело XML-пакета
Запрос = Новый HTTPЗапрос("/Assistant.svc/ReadID");
Запрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    Сообщить("Ответ получен: " + Ответ.ПолучитьТелоКакСтроку());
Иначе
    Сообщить("Ошибка: " + Ответ.КодСостояния);
КонецЕсли;

Анализ ошибки "Failure when receiving data from the peer"

Выясним причину возникновения этой распространенной ошибки. Она часто указывает на разрыв соединения на уровне сокетов или протокола SSL/TLS. Проанализируем возможные факторы:

  1. Несоответствие версий TLS: Сервер может требовать TLS 1.2, в то время как клиент 1С (в зависимости от версии платформы и ОС) пытается использовать более старый протокол.
  2. Тип сертификата: Убедитесь, что сертификат предназначен именно для аутентификации клиента (Client Authentication).
  3. WS-Addressing: Если WCF-сервис требует Action в заголовке, 1С при работе через WSПрокси может его не передавать. Попробуйте добавить заголовок вручную через HTTPСоединение.
  4. Метод проверки сертификата: Иногда сервер требует валидации цепочки доверия. Убедитесь, что корневой сертификат установлен в системе или передан в объект 1С.

Рекомендации по настройке WCF для совместимости

Если у вас есть доступ к исходному коду WCF-сервиса, мы рекомендуем следующие настройки в App.config для беспроблемной работы с 1С:

Использование этих советов позволит вам создать надежный мост между 1С и веб-сервисом, обеспечив безопасную передачу данных с использованием современных методов шифрования и авторизации.

← На главную