Как настроить подключение к веб-сервису на базе Siebel (Oracle) и решить проблемы с авторизацией

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

Интеграция 1С с системами на базе Oracle Siebel часто вызывает затруднения у разработчиков. Основная сложность заключается в специфических требованиях Siebel к структуре SOAP-пакета и заголовкам авторизации. В этой статье мы подробно разберем, почему стандартный механизм WSПрокси может не работать, и как реализовать надежное подключение с помощью низкоуровневых HTTP-запросов.

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

При работе с веб-сервисами Siebel часто используется специализированный заголовок безопасности (Siebel Security Header), который включает теги UsernameToken, PasswordText и SessionType. Проблема заключается в том, что если в WSDL-описании сервиса эти заголовки не описаны явно для каждой операции, объект 1С WSПрокси просто не включит их в отправляемый пакет, даже если вы попытаетесь добавить их программно через ДанныеXDTO.

Рассмотрим типичную ситуацию: сервис возвращает ошибку некорректного разбора сообщения или игнорирует запрос. Проанализируем структуру пакета, которую ожидает Siebel:


<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <UsernameToken>user</UsernameToken>
        <PasswordText>pass</PasswordText>
        <SessionType>None</SessionType>
    </soap:Header>
    <soap:Body>
        <!-- Данные запроса -->
    </soap:Body>
</soap:Envelope>

Если WSПрокси формирует пакет без секции Header, авторизация не пройдет. Поэтому наиболее гибким и рабочим методом является использование объекта HTTPЗапрос.

Шаг 1. Формирование тела SOAP-запроса

Для начала нам необходимо подготовить строку XML, которая будет содержать как заголовок с авторизационными данными, так и тело запроса. Разберем пример формирования такой строки:


ТекстХедера = 
    "<soap:Header>
    |<UsernameToken>" + Логин + "</UsernameToken>
    |<PasswordText>" + Пароль + "</PasswordText>
    |<SessionType>None</SessionType>
    |</soap:Header>";

СтрокаSOAP = 
    "<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">"
    + ТекстХедера + 
    "<soap:Body>
    |<m:ReceiveWarrantyClaim1C_Input xmlns:m=""http://siebel.com/CustomUI"">"
    + ДанныеXDTO +
    "</m:ReceiveWarrantyClaim1C_Input>
    |</soap:Body>
    |</soap:Envelope>";

Важный нюанс: Обратите внимание на тег SessionType. Значение None указывает системе Siebel на то, что сессия должна быть создана только на время выполнения этого запроса. Если требуется высокая интенсивность обмена, рассмотрите использование пула сессий.

Шаг 2. Настройка HTTP-соединения и критически важных заголовков

После того как тело запроса сформировано, необходимо настроить HTTPСоединение. Выясним причину, по которой сервер может возвращать ошибку HTTP 500. Одной из самых частых причин в случае с Siebel является некорректный заголовок SOAPAction.

Согласно спецификации SOAP 1.1, значение SOAPAction должно быть обязательно заключено в двойные кавычки. В коде 1С это требует дополнительного экранирования.

Рассмотрим правильную настройку заголовков:


Заголовки = Новый Соответствие;
// Важно: кавычки внутри строки обязательны для Siebel!
Заголовки.Вставить("SOAPAction", """document/http://siebel.com/CustomUI:method""");
Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");

нТТП = Новый HTTPСоединение(Сервер, Порт, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(РесурсСервиса, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаSOAP, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Проанализируем используемые параметры:

  1. ЗащищенноеСоединениеOpenSSL: Почти все современные инстансы Siebel работают по протоколу HTTPS, поэтому использование этого объекта обязательно.
  2. ИспользованиеByteOrderMark.НеИспользовать: Это критический момент. Парсеры Oracle часто не понимают BOM (невидимые символы в начале файла UTF-8) и выдают ошибку разбора XML. Всегда отключайте BOM при передаче данных в Siebel.
  3. SOAPAction: Если вы не знаете точное значение этого заголовка, его можно посмотреть в WSDL-файле в секции soap:operation.

Шаг 3. Обработка ответа и отладка

Отправим запрос и получим ответ от сервера. Для диагностики полезно сохранять тело ответа, особенно если статус-код отличается от 200.


Попытка
    Ответ = нТТП.ОтправитьДляОбъекта(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        // Разбираем ответ через ЧтениеXML или ПостроительDOM
        Чтение = Новый ЧтениеXML;
        Чтение.УстановитьСтроку(Ответ.ПолучитьТелоИзСтроки());
        // Логика обработки XML
    Иначе
        Сообщить("Ошибка сервиса: " + Ответ.КодСостояния);
        Сообщить(Ответ.ПолучитьТелоИзСтроки());
    КонецЕсли;
Исключение
    Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;

Дополнительные рекомендации по работе с Siebel

Разберем несколько тонкостей, которые помогут избежать проблем при промышленной эксплуатации интеграции:

Использование HTTPЗапрос вместо WSПрокси дает вам полный контроль над структурой пакета. Это позволяет обходить ограничения платформы 1С при работе с нестандартными или не полностью описанными в WSDL заголовками авторизации, что является ключом к успешной интеграции с Oracle Siebel.

← На главную