Как исправить ошибку "неверный SoapAction" в WSDL файле 1С Web-сервиса при интеграции с SAP?

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

При разработке Web-сервисов на платформе 1С и их интеграции с внешними системами, такими как SAP, разработчики часто сталкиваются с различными нюансами. Одной из распространенных проблем является ошибка, связанная с заголовком SOAPAction в запросах. Если Web-сервис 1С получает запрос из SAP, а в ответ приходит ошибка "Операция не найдена", это часто указывает на то, что SAP ожидает определенное значение SOAPAction, а Web-сервис 1С генерирует другое, например, пустое. Давайте разберем эту ситуацию и найдем решение.

Введение: Понимание проблемы неверного SoapAction

Ошибка "SOAP: Call failed: ... soap fault: Операция не найдена" явно указывает на то, что вызывающая сторона (в нашем случае SAP) не смогла корректно определить, какую операцию Web-сервиса необходимо выполнить. Основной причиной этого часто является несоответствие значения HTTP-заголовка SOAPAction между тем, что ожидает клиент (SAP), и тем, что указано в WSDL файле или фактически передается сервером (Web-сервисом 1С).

Заголовок SOAPAction является обязательным для протокола SOAP 1.1 и предназначен для указания цели SOAP-сообщения. Он помогает Web-серверу быстро маршрутизировать запрос к нужному обработчику. Если SAP-система ожидает конкретное значение SOAPAction, например, "urn:их_сайт:VMI:DataExchange#сервис:getStock", а Web-сервис 1С при публикации своего WSDL файла указывает SoapAction="" (пустое значение), возникает конфликт, который приводит к невозможности найти операцию.

Наша задача — убедиться, что WSDL-файл, генерируемый Web-сервисом 1С, содержит SOAPAction, который точно соответствует ожиданиям системы SAP.

Ключевые понятия: URI пространства имен и URL Web-сервиса

Прежде чем перейти к решению, нам необходимо четко различать два важных понятия, которые часто путают, особенно в контексте Web-сервисов 1С: URI пространства имен и URL Web-сервиса.

  1. URI пространства имен (Namespace URI):
    • URI (Uniform Resource Identifier) — это некий уникальный идентификатор ресурса. В контексте 1С и Web-сервисов, URI пространства имен является уникальным именем для XDTO-пакета или для самого Web-сервиса.
    • Это по сути произвольная строка, которая должна быть уникальной в рамках вашего набора XDTO-пакетов или Web-сервисов в одной конфигурации 1С. Хотя она часто выглядит как URL (например, "http://www.mycompany.com/MyService"), это не означает, что по этому адресу что-то физически находится. Это просто уникальная строка-идентификатор.
    • Именно это свойство URI пространства имен мы будем изменять, чтобы повлиять на формирование SOAPAction.
  2. URL Web-сервиса (Web Service URL):
    • URL (Uniform Resource Locator) — это конкретный адрес, по которому доступен ваш Web-сервис в сети интернет или локальной сети. Он указывает на расположение ресурса.
    • Пример: http://myserver/mybase/ws/MyWebService. Этот адрес зависит от имени вашего домена, имени Web-сервера, пути публикации информационной базы и имени самого Web-сервиса.
    • Изменение URI пространства имен не изменяет URL Web-сервиса. Web-сервис по-прежнему будет доступен по своему старому URL, но его внутренние метаданные (включая SOAPAction в WSDL) изменятся.

Запомните: Наша задача заключается в изменении URI (идентификатора), а не URL (адреса).

Как 1С формирует SoapAction в WSDL-файле

Важный аспект работы с Web-сервисами в 1С заключается в том, что WSDL-файл не является статическим файлом, который хранится на Web-сервере (например, в директории IIS). Вместо этого, WSDL-файл формируется динамически самой платформой 1С в момент обращения к Web-сервису по его URL с добавлением параметра ?wsdl.

Например, если ваш Web-сервис доступен по адресу http://host/base/ws/ИмяWebСервиса, то его WSDL-описание можно получить, перейдя по адресу http://host/base/ws/ИмяWebСервиса?wsdl. Именно при генерации этого WSDL-файла 1С использует метаданные Web-сервиса и связанных XDTO-пакетов, включая их URI пространства имен, для формирования различных элементов WSDL, в том числе и заголовка SOAPAction для каждой операции.

По умолчанию 1С может генерировать SOAPAction в определенном формате или даже оставлять его пустым, что не всегда соответствует строгим требованиям внешних систем. Поэтому, чтобы повлиять на содержимое SOAPAction, мы должны внести изменения в конфигурацию 1С, а не пытаться вручную править WSDL-файл на сервере.

Решение проблемы: Изменение URI пространства имен

Теперь, когда мы понимаем, что Web-сервис 1С динамически генерирует WSDL и что URI пространства имен является ключевым для формирования SOAPAction, перейдем к шагам по исправлению проблемы. Нам потребуется изменить свойство URI пространства имен у Web-сервиса (или соответствующего XDTO-пакета) в конфигурации 1С.

Разберем процесс по шагам:

  1. Откройте конфигурацию 1С: Запустите "Конфигуратор" для вашей информационной базы.
  2. Найдите Web-сервис: В дереве конфигурации перейдите к ветке "Web-сервисы" и найдите тот Web-сервис, который вы интегрируете с SAP.
  3. Измените свойство "URI пространства имен":
    • Откройте свойства найденного Web-сервиса.
    • Найдите поле, которое называется "URI пространства имен" (или "URI").
    • Измените его значение на то, которое ожидает SAP-система в качестве префикса для SOAPAction. В нашем примере это было бы "urn:их_сайт:VMI:DataExchange". Полный SOAPAction в SAP требовался как "urn:их_сайт:VMI:DataExchange#сервис:getStock". Соответственно, мы должны установить URI пространства имен так, чтобы он стал частью этого требуемого значения. Если у вас несколько операций в Web-сервисе, 1С обычно добавляет имя операции к URI пространства имен для формирования полного SOAPAction. Убедитесь, что конечный формат SOAPAction (URI + # + ИмяОперации) будет соответствовать ожиданиям SAP.
    • Важный момент: Убедитесь, что новое значение URI является уникальным в вашей конфигурации 1С для всех Web-сервисов и XDTO-пакетов, чтобы избежать конфликтов.
  4. Проверьте зависимость в коде: Если в вашей конфигурации есть код 1С, который программно обращается к XDTO-пакетам или Web-сервисам по их URI пространства имен (например, для поиска пакета), то после изменения URI вам потребуется скорректировать и этот код, чтобы он использовал новое, актуальное значение.
  5. Сохраните изменения в конфигурации: Сохраните измененную конфигурацию базы данных (F7).

Изменение URI пространства имен является основным способом, позволяющим управлять содержимым WSDL-файла, генерируемого 1С, и, следовательно, влиять на значение заголовка SOAPAction.

Действия после изменения: Публикация и доступность Web-сервиса

После того как вы внесли изменения в конфигурацию 1С и сохранили их, эти изменения еще не будут немедленно применены к опубликованному Web-сервису. Вам необходимо выполнить несколько критически важных шагов:

  1. Обновите публикацию Web-сервиса:
    • В "Конфигураторе" перейдите в меню "Администрирование" -> "Публикация на Web-сервере".
    • Убедитесь, что ваш Web-сервис выбран для публикации.
    • Нажмите кнопку "Опубликовать". Это действие обновит файлы публикации на Web-сервере (например, в директории IIS), чтобы они отражали новые метаданные Web-сервиса.
  2. Перезапустите Web-сервер (IIS или Apache):
    • После обновления публикации крайне важно перезапустить Web-сервер, на котором опубликован ваш Web-сервис (например, Microsoft IIS или Apache HTTP Server).
    • Для IIS: Откройте "Диспетчер служб IIS", найдите "Пулы приложений" (Application Pools), затем найдите пул, к которому относится ваша информационная база 1С, и перезапустите его. Также можно перезапустить весь IIS сервис.
    • Для Apache: Перезапустите службу Apache.
    • Это обеспечит очистку кэша и принудительную загрузку новых настроек Web-сервиса.
  3. Дождитесь доступности Web-сервиса:
    • Иногда, после внесения изменений, перепубликации и перезапуска Web-сервера, Web-сервис может быть недоступен некоторое время. Это может быть связано с процессами инициализации платформы 1С, кэшированием на уровне Web-сервера или другими фоновыми операциями.
    • Не паникуйте, если Web-сервис сразу не отвечает. Подождите несколько минут (иногда до 5-10 минут), а затем повторно проверьте его доступность, обратившись к его URL, или попробуйте скачать обновленный WSDL-файл (http://host/base/ws/ИмяWebСервиса?wsdl).
    • Убедитесь, что в новом WSDL-файле значение SOAPAction для требуемой операции теперь соответствует ожиданиям SAP.

После выполнения этих шагов ваш Web-сервис 1С должен начать корректно взаимодействовать с SAP-системой, предоставляя ей требуемый SOAPAction.

Почему прямое редактирование WSDL-файла неэффективно

Многие разработчики, столкнувшись с необходимостью изменения WSDL, могут подумать о ручном редактировании файла. Однако, как мы уже выяснили, в 1С WSDL-файл генерируется динамически. Это означает следующее:

  1. Отсутствие статического файла: Вы не найдете WSDL-файл как статический документ на своем Web-сервере. Он создается "на лету" платформой 1С при запросе с параметром ?wsdl.
  2. Бесполезность ручных изменений: Если бы вы даже каким-то образом получили этот сгенерированный WSDL-файл, вручную его отредактировали и попытались "положить обратно" на Web-сервер (что само по себе проблематично), ваши изменения были бы проигнорированы. При следующем запросе ?wsdl 1С снова сгенерирует файл на основе текущих метаданных конфигурации, и все ваши правки будут потеряны.
  3. Единственный способ — через конфигурацию 1С: Все изменения, влияющие на структуру WSDL (включая SOAPAction, типы данных, параметры операций), должны быть внесены исключительно через конфигурацию 1С.

Таким образом, сосредоточьте свои усилия на правильной настройке свойств Web-сервиса и XDTO-пакетов в "Конфигураторе" 1С, а не на поиске и редактировании несуществующего статического WSDL-файла.

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

Интеграция с SAP может быть сложной задачей, и помимо SOAPAction, могут возникнуть и другие нюансы. Рассмотрим дополнительные моменты:

  1. Обмен простыми типами данных: Если ваш Web-сервис обменивается только простыми типами данных (строки, числа, даты), это упрощает интеграцию. Однако, если используются сложные XDTO-типы, убедитесь, что их структуры точно соответствуют ожиданиям SAP.
  2. Формирование исходящего SOAPAction из 1С: Если ваш 1С-сервис сам выступает в роли клиента и вызывает внешние SOAP-сервисы (например, тот же SAP), вы можете явно управлять значением SOAPAction при формировании исходящего запроса, используя встроенный язык 1С и объект WSПрокси. Это позволяет вам точно указать требуемый SOAPAction для стороннего сервиса.
    
    Прокси = Новый WSПрокси(ОпределениеWS, URI_пространстваИмен, ИмяСервиса, ИмяПорта);
    Прокси.НазначениеSOAPAction = "требуемое_значение_SOAPAction"; // Установка конкретного значения SOAPAction
    // Вызов операции
    Результат = Прокси.ИмяОперации(Параметры);
    
  3. Другие протоколы интеграции SAP: Помимо SOAP/Web-сервисов, SAP предлагает и другие, часто более "родные", способы интеграции, например, RFC (Remote Function Call). Если возникают постоянные сложности с Web-сервисами, возможно, стоит рассмотреть возможность использования RFC для обмена данными, при условии, что для этого есть необходимые коннекторы и библиотеки для 1С.
  4. Тестирование и логирование: Всегда используйте инструменты для тестирования Web-сервисов (например, SoapUI, Postman) и включите подробное логирование на стороне Web-сервера 1С и SAP, чтобы отслеживать прохождение запросов и ответов, а также выявлять точные причины ошибок.

Решение проблемы с SOAPAction в 1С Web-сервисе при интеграции с SAP сводится к правильной настройке URI пространства имен в конфигурации 1С, последующей перепубликации Web-сервиса и перезапуску Web-сервера, с учетом возможной задержки в доступности сервиса. Понимание динамического формирования WSDL и различий между URI и URL также играет ключевую роль в успешном решении данной задачи.

← На главную