При интеграции 1С с внешними системами (особенно зарубежными шинами данных или корпоративными сервисами на базе Java/SAP) разработчики часто сталкиваются со специфическим требованием: «Веб-сервис не должен требовать SOAPAction». Для программиста 1С, привыкшего к стандартным объектам Web-сервисы, это может стать камнем преткновения. Разберемся детально, что это за заголовок, почему он важен для платформы и как обойти это ограничение.
С технической точки зрения SOAPAction — это специализированный HTTP-заголовок, используемый в протоколе SOAP версии 1.1. Его основное назначение заключается в том, чтобы сообщить веб-серверу (IIS, Apache) или посреднику (Firewall, API Gateway) о том, какое именно действие (метод) содержится внутри XML-пакета, не разбирая само тело запроса. Это позволяет инфраструктуре маршрутизировать запросы быстрее и эффективнее.
Проанализируем структуру типичного SOAP-запроса. Если в вашем веб-сервисе есть метод ЗаписатьДанные, то в заголовках HTTP клиент должен передать: SOAPAction: "имя_пространства_имен#ЗаписатьДанные". Без этого заголовка многие серверные приложения просто не поймут, какой программный код нужно запустить, даже если внутри XML-тела в теге Body явно указано имя метода.
Рассмотрим, как работает платформа 1С. Когда вы создаете объект конфигурации Web-сервис, 1С автоматически генерирует файл описания WSDL. В этом файле для каждой операции жестко прописывается атрибут soapAction. Модуль расширения веб-сервера 1С ориентируется именно на этот заголовок, чтобы передать управление конкретному методу в модуле веб-сервиса.
Если внешняя система (клиент) не присылает этот заголовок, платформа 1С может вернуть ошибку или не распознать вызов. Проблема усугубляется тем, что в стандартных веб-сервисах 1С мы не имеем прямого доступа к низкоуровневой обработке HTTP-заголовков — платформа делает это за нас «под капотом».
Если заказчик настаивает на отсутствии SOAPAction, самым правильным и гибким решением будет отказ от использования объекта Web-сервис в пользу HTTP-сервисы. Начиная с версии платформы 8.3.5, 1С позволяет создавать произвольные HTTP-эндпоинты, где мы сами решаем, как обрабатывать входящий поток данных.
Разберем алгоритм реализации «эмуляции» SOAP-сервиса через HTTP-сервис по шагам:
HTTP-сервис в конфигураторе (например, с именем CustomSoapAdapter)./endpoint).POST.Проанализируем пример кода для обработки такого запроса. Нам необходимо прочитать XML, найти в нем имя вызываемой функции и выполнить логику:
Функция ОбработатьЗапрос(Запрос)
// 1. Получаем тело запроса в виде строки или потока
ТелоСтрокой = Запрос.ПолучитьТелоКакСтроку();
// 2. Инициализируем чтение XML
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТелоСтрокой);
// Пропускаем служебные теги Envelope и Body
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента
И Чтение.ЛокальноеИмя <> "Envelope"
И Чтение.ЛокальноеИмя <> "Body" Тогда
// Мы нашли имя метода внутри XML
ИмяМетода = Чтение.ЛокальноеИмя;
Прервать;
КонецЕсли;
КонецЦикла;
// 3. Выполняем бизнес-логику в зависимости от имени метода
РезультатОбработки = "";
Если ИмяМетода = "MyMethodName" Тогда
РезультатОбработки = ВыполнитьЛогику(Чтение); // ваша функция обработки
КонецЕсли;
// 4. Формируем SOAP-ответ вручную
ТекстОтвета =
"<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">" +
" <soap:Body>" +
" <m:Response xmlns:m=""your-namespace"">" +
" <m:Result>" + РезультатОбработки + "</m:Result>" +
" </m:Response>" +
" </soap:Body>" +
"</soap:Envelope>";
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(ТекстОтвета, КодировкаТекста.UTF8);
Ответ.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
Возврат Ответ;
КонецФункции
Используя этот подход, мы полностью игнорируем наличие или отсутствие заголовка SOAPAction, так как платформа 1С в HTTP-сервисах никак не ограничивает состав заголовков.
Выясним причину, почему возникло требование об отсутствии заголовка. Часто это связано с переходом на стандарт SOAP 1.2. В этой версии протокола HTTP-заголовок SOAPAction официально упразднен. Вместо него параметр действия передается внутри заголовка Content-Type, например: Content-Type: application/soap+xml; action="MyMethod".
Посмотрим, как это реализовать в 1С:
SOAPAction.Content-Type, иначе 1С вернет ошибку.Рассмотрим ситуацию, когда вы не можете менять код 1С, а клиент категорически не может посылать заголовки. В этом случае проблему можно решить на уровне инфраструктуры, используя Reverse Proxy (Nginx или Apache).
Настроим веб-сервер таким образом, чтобы он перехватывал входящий запрос от внешней системы и «на лету» добавлял в него необходимый заголовок SOAPAction перед тем, как передать запрос в 1С. Для платформы 1С такой запрос будет выглядеть абсолютно легитимным.
Пример логики для конфигурации Nginx:
location.ngx_http_headers_module.proxy_set_header SOAPAction "http://your-namespace#MethodName";.Подведем итог. Если вам нужно разработать веб-сервис в 1С, который не требует SOAPAction:
Content-Type.ЧтениеXML и ЗаписьXML для обработки входящих данных, так как стандартная сериализация 1С (XDTO) в HTTP-сервисах не привязана к заголовкам автоматически.Таким образом, требование «без SOAPAction» — это не приговор для 1С, а лишь повод использовать более гибкие инструменты платформы, такие как HTTP-сервисы.