Интеграция систем 1С с внешними веб-сервисами, построенными на технологии WCF (Windows Communication Foundation), часто вызывает затруднения у разработчиков. Основная причина кроется в различиях стандартов: 1С ориентирована на классический SOAP 1.1, в то время как WCF по умолчанию часто использует расширенные протоколы семейства WS-* (через wsHttpBinding). В этой статье мы подробно разберем, как наладить взаимодействие между 1С и WCF-сервисом, настроить авторизацию по сертификату и обойти типичные ошибки соединения.
Первое, с чем мы сталкиваемся при работе с 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 необходимо передать объект СертификатыУдостоверяющихЦентровФайл, содержащий корневой сертификат сервера.
Если веб-сервис опубликован с поддержкой 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();
Сообщить("Версия сервиса: " + Результат);
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Ошибка вызова: " + Инфо.Описание);
КонецПопытки
Если при использовании 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 Тогда
Сообщить("Ответ получен: " + Ответ.ПолучитьТелоКакСтроку());
Иначе
Сообщить("Ошибка: " + Ответ.КодСостояния);
КонецЕсли;
Выясним причину возникновения этой распространенной ошибки. Она часто указывает на разрыв соединения на уровне сокетов или протокола SSL/TLS. Проанализируем возможные факторы:
Action в заголовке, 1С при работе через WSПрокси может его не передавать. Попробуйте добавить заголовок вручную через HTTPСоединение.Если у вас есть доступ к исходному коду WCF-сервиса, мы рекомендуем следующие настройки в App.config для беспроблемной работы с 1С:
wsHttpBinding.security mode="Transport" (для HTTPS) или TransportWithMessageCredential.establishSecurityContext="false", так как 1С не поддерживает сохранение состояния безопасности в SOAP-запросах.Использование этих советов позволит вам создать надежный мост между 1С и веб-сервисом, обеспечив безопасную передачу данных с использованием современных методов шифрования и авторизации.