Как реализовать веб-сервис в 1С без требования заголовка SOAPAction

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

При интеграции 1С с внешними системами (особенно зарубежными шинами данных или корпоративными сервисами на базе Java/SAP) разработчики часто сталкиваются со специфическим требованием: «Веб-сервис не должен требовать SOAPAction». Для программиста 1С, привыкшего к стандартным объектам Web-сервисы, это может стать камнем преткновения. Разберемся детально, что это за заголовок, почему он важен для платформы и как обойти это ограничение.

Что такое SOAPAction и зачем он нужен

С технической точки зрения SOAPAction — это специализированный HTTP-заголовок, используемый в протоколе SOAP версии 1.1. Его основное назначение заключается в том, чтобы сообщить веб-серверу (IIS, Apache) или посреднику (Firewall, API Gateway) о том, какое именно действие (метод) содержится внутри XML-пакета, не разбирая само тело запроса. Это позволяет инфраструктуре маршрутизировать запросы быстрее и эффективнее.

Проанализируем структуру типичного SOAP-запроса. Если в вашем веб-сервисе есть метод ЗаписатьДанные, то в заголовках HTTP клиент должен передать: SOAPAction: "имя_пространства_имен#ЗаписатьДанные". Без этого заголовка многие серверные приложения просто не поймут, какой программный код нужно запустить, даже если внутри XML-тела в теге Body явно указано имя метода.

Почему стандартный Web-сервис 1С всегда требует SOAPAction

Рассмотрим, как работает платформа 1С. Когда вы создаете объект конфигурации Web-сервис, 1С автоматически генерирует файл описания WSDL. В этом файле для каждой операции жестко прописывается атрибут soapAction. Модуль расширения веб-сервера 1С ориентируется именно на этот заголовок, чтобы передать управление конкретному методу в модуле веб-сервиса.

Если внешняя система (клиент) не присылает этот заголовок, платформа 1С может вернуть ошибку или не распознать вызов. Проблема усугубляется тем, что в стандартных веб-сервисах 1С мы не имеем прямого доступа к низкоуровневой обработке HTTP-заголовков — платформа делает это за нас «под капотом».

Решение №1: Переход на HTTP-сервисы (Рекомендуемый способ)

Если заказчик настаивает на отсутствии SOAPAction, самым правильным и гибким решением будет отказ от использования объекта Web-сервис в пользу HTTP-сервисы. Начиная с версии платформы 8.3.5, 1С позволяет создавать произвольные HTTP-эндпоинты, где мы сами решаем, как обрабатывать входящий поток данных.

Разберем алгоритм реализации «эмуляции» SOAP-сервиса через HTTP-сервис по шагам:

  1. Создадим новый объект HTTP-сервис в конфигураторе (например, с именем CustomSoapAdapter).
  2. Добавим Шаблон URL (например, /endpoint).
  3. Внутри шаблона создадим Метод с типом POST.
  4. В обработчике этого метода мы будем вручную читать тело запроса и возвращать сформированный SOAP-ответ.

Проанализируем пример кода для обработки такого запроса. Нам необходимо прочитать 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-сервисах никак не ограничивает состав заголовков.

Решение №2: Использование протокола SOAP 1.2

Выясним причину, почему возникло требование об отсутствии заголовка. Часто это связано с переходом на стандарт SOAP 1.2. В этой версии протокола HTTP-заголовок SOAPAction официально упразднен. Вместо него параметр действия передается внутри заголовка Content-Type, например: Content-Type: application/soap+xml; action="MyMethod".

Посмотрим, как это реализовать в 1С:

Решение №3: Проксирование на стороне веб-сервера

Рассмотрим ситуацию, когда вы не можете менять код 1С, а клиент категорически не может посылать заголовки. В этом случае проблему можно решить на уровне инфраструктуры, используя Reverse Proxy (Nginx или Apache).

Настроим веб-сервер таким образом, чтобы он перехватывал входящий запрос от внешней системы и «на лету» добавлял в него необходимый заголовок SOAPAction перед тем, как передать запрос в 1С. Для платформы 1С такой запрос будет выглядеть абсолютно легитимным.

Пример логики для конфигурации Nginx:

  1. Принимаем POST-запрос на определенный location.
  2. Используем модуль ngx_http_headers_module.
  3. Добавляем proxy_set_header SOAPAction "http://your-namespace#MethodName";.

Резюме

Подведем итог. Если вам нужно разработать веб-сервис в 1С, который не требует SOAPAction:

  1. Проверьте версию SOAP: Если внешняя система использует SOAP 1.2, заголовок и так не нужен, но нужно правильно настроить Content-Type.
  2. Используйте HTTP-сервисы: Это самый надежный способ. Вы получаете полный контроль над обработкой XML и можете имитировать поведение SOAP-сервиса любой сложности.
  3. Парсите XML вручную: Используйте объекты ЧтениеXML и ЗаписьXML для обработки входящих данных, так как стандартная сериализация 1С (XDTO) в HTTP-сервисах не привязана к заголовкам автоматически.

Таким образом, требование «без SOAPAction» — это не приговор для 1С, а лишь повод использовать более гибкие инструменты платформы, такие как HTTP-сервисы.

← На главную