При интеграции 1С с внешними сервисами по протоколу HTTPS (например, при настройке обмена с логистическими компаниями или службами доставки) разработчики часто сталкиваются со сложностями при попытке добавления WS-ссылки в Конфигураторе. При указании URL-адреса, начинающегося с https://, платформа выдает окно «Защищенное соединение» с требованием выбрать клиентский сертификат и способ проверки сертификации сервера.
Разберем подробно причины возникновения этой проблемы и рассмотрим несколько рабочих способов подключения к веб-сервисам по HTTPS в 1С.
Выясним причину, почему веб-сервис без проблем открывается в обычном веб-браузере, но вызывает ошибки в Конфигураторе 1С:
xsd:import с указанием ссылок по протоколу HTTPS. Конфигуратор пытается последовательно скачать каждую схему, и если хотя бы одна из них не проходит SSL-проверку, импорт WS-ссылки завершается с ошибкой.Проанализируем наименее трудоемкий способ создания WS-ссылки в Конфигураторе, который позволяет обойти проблемы с SSL при импорте WSDL.
.wsdl на локальный диск (например, service.wsdl).WSСсылка укажем путь к сохраненному файлу на диске вместо HTTPS-ссылки.Рассмотрим вариант, при котором нет необходимости фиксировать WS-ссылку в дереве метаданных. Создадим объект WSОпределения программно во время выполнения приложения с помощью объекта ЗащищенноеСоединениеOpenSSL.
Посмотрим на пример кода для платформы 1С:Предприятие:
// Создаем экземпляр защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// При необходимости использования системного хранилища Windows:
// ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровWindows());
URL_WSDL = "https://service.example.com/ws/service?wsdl";
Попытка
// Создаем определение веб-сервиса
Определение = Новый WSОпределения(URL_WSDL, , , ЗащищенноеСоединение);
// Получаем прокси для вызова методов
Прокси = Новый WSПрокси(Определение, URIПространстваИмен, ИмяСервиса, ИмяПорта);
// Вызываем требуемый метод сервиса
Результат = Прокси.ИмяМетода();
Исключение
Сообщить("Ошибка при подключении к веб-сервису: " + ОписаниеОшибки());
КонецПопытки;
Этот подход позволяет гибко настраивать параметры безопасности на сервере или клиенте без привязки к статичной конфигурации метаданных.
Если требуется использовать именно статичную WS-ссылку в конфигурации и обращаться по HTTPS напрямую, разберем по шагам порядок добавления корневого сертификата в базу доверенных сертификатов 1С:
cacert.pem, расположенный в каталоге установки платформы 1С (обычно в папке bin\conf или bin).cacert.pem текстовым редактором и допишем в конец содержимого текст экспортированных сертификатов.Если веб-сервис предъявляет нестандартные требования к SSL или механизм WS-ссылок 1С выбывает ошибки из-за структуры WSDL, проанализируем альтернативный вариант отправки SOAP-запросов через объект HTTPСоединение.
Рассмотрим пример формирования и отправки SOAP-пакета:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("service.example.com", 443, , , , 30, ЗащищенноеСоединение);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
Заголовки.Вставить("SOAPAction", "http://example.com/action");
ТекстЗапросаXML =
"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"">" +
" <soapenv:Body>" +
" <GetInfoRequest xmlns=""http://example.com/""/>" +
" </soapenv:Body>" +
"</soapenv:Envelope>";
Запрос = Новый HTTPЗапрос("/ws/service", Заголовки);
Запрос.УстановитьТелоИзСтроки(ТекстЗапросаXML, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
При использовании HTTPСоединение разработчик получает полный контроль над заголовками HTTP и телом SOAP-сообщения, что снимает ограничения встроенного механизма импорта WSDL-схем.