Интеграция 1С с системами на базе Oracle Siebel часто вызывает затруднения у разработчиков. Основная сложность заключается в специфических требованиях Siebel к структуре SOAP-пакета и заголовкам авторизации. В этой статье мы подробно разберем, почему стандартный механизм WSПрокси может не работать, и как реализовать надежное подключение с помощью низкоуровневых HTTP-запросов.
При работе с веб-сервисами 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Запрос.
Для начала нам необходимо подготовить строку 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 на то, что сессия должна быть создана только на время выполнения этого запроса. Если требуется высокая интенсивность обмена, рассмотрите использование пула сессий.
После того как тело запроса сформировано, необходимо настроить 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.НеИспользовать);
Проанализируем используемые параметры:
HTTPS, поэтому использование этого объекта обязательно.BOM (невидимые символы в начале файла UTF-8) и выдают ошибку разбора XML. Всегда отключайте BOM при передаче данных в Siebel.WSDL-файле в секции soap:operation.Отправим запрос и получим ответ от сервера. Для диагностики полезно сохранять тело ответа, особенно если статус-код отличается от 200.
Попытка
Ответ = нТТП.ОтправитьДляОбъекта(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Разбираем ответ через ЧтениеXML или ПостроительDOM
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоИзСтроки());
// Логика обработки XML
Иначе
Сообщить("Ошибка сервиса: " + Ответ.КодСостояния);
Сообщить(Ответ.ПолучитьТелоИзСтроки());
КонецЕсли;
Исключение
Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;
Разберем несколько тонкостей, которые помогут избежать проблем при промышленной эксплуатации интеграции:
SOAP Header Siebel (например, UsernameToken) крайне чувствительны к регистру. Пишите их в точном соответствии с документацией Oracle.HTTPСоединение (например, 60–120 секунд).SoapUI работает — всегда сравнивайте вкладку Raw в SoapUI с тем, что отправляет 1С (можно перехватить запрос с помощью Fiddler или Wireshark). Основное различие обычно кроется в составе заголовков HTTP или наличии BOM.Использование HTTPЗапрос вместо WSПрокси дает вам полный контроль над структурой пакета. Это позволяет обходить ограничения платформы 1С при работе с нестандартными или не полностью описанными в WSDL заголовками авторизации, что является ключом к успешной интеграции с Oracle Siebel.