При разработке Web-сервисов на платформе 1С и их интеграции с внешними системами, такими как SAP, разработчики часто сталкиваются с различными нюансами. Одной из распространенных проблем является ошибка, связанная с заголовком SOAPAction в запросах. Если Web-сервис 1С получает запрос из SAP, а в ответ приходит ошибка "Операция не найдена", это часто указывает на то, что SAP ожидает определенное значение SOAPAction, а Web-сервис 1С генерирует другое, например, пустое. Давайте разберем эту ситуацию и найдем решение.
Ошибка "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.
Прежде чем перейти к решению, нам необходимо четко различать два важных понятия, которые часто путают, особенно в контексте Web-сервисов 1С: URI пространства имен и URL Web-сервиса.
URI (Uniform Resource Identifier) — это некий уникальный идентификатор ресурса. В контексте 1С и Web-сервисов, URI пространства имен является уникальным именем для XDTO-пакета или для самого Web-сервиса."http://www.mycompany.com/MyService"), это не означает, что по этому адресу что-то физически находится. Это просто уникальная строка-идентификатор.URI пространства имен мы будем изменять, чтобы повлиять на формирование SOAPAction.URL (Uniform Resource Locator) — это конкретный адрес, по которому доступен ваш Web-сервис в сети интернет или локальной сети. Он указывает на расположение ресурса.http://myserver/mybase/ws/MyWebService. Этот адрес зависит от имени вашего домена, имени Web-сервера, пути публикации информационной базы и имени самого Web-сервиса.URI пространства имен не изменяет URL Web-сервиса. Web-сервис по-прежнему будет доступен по своему старому URL, но его внутренние метаданные (включая SOAPAction в WSDL) изменятся.Запомните: Наша задача заключается в изменении URI (идентификатора), а не URL (адреса).
Важный аспект работы с 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-файл на сервере.
Теперь, когда мы понимаем, что Web-сервис 1С динамически генерирует WSDL и что URI пространства имен является ключевым для формирования SOAPAction, перейдем к шагам по исправлению проблемы. Нам потребуется изменить свойство URI пространства имен у Web-сервиса (или соответствующего XDTO-пакета) в конфигурации 1С.
Разберем процесс по шагам:
SOAPAction. В нашем примере это было бы "urn:их_сайт:VMI:DataExchange". Полный SOAPAction в SAP требовался как "urn:их_сайт:VMI:DataExchange#сервис:getStock". Соответственно, мы должны установить URI пространства имен так, чтобы он стал частью этого требуемого значения. Если у вас несколько операций в Web-сервисе, 1С обычно добавляет имя операции к URI пространства имен для формирования полного SOAPAction. Убедитесь, что конечный формат SOAPAction (URI + # + ИмяОперации) будет соответствовать ожиданиям SAP.URI пространства имен (например, для поиска пакета), то после изменения URI вам потребуется скорректировать и этот код, чтобы он использовал новое, актуальное значение.Изменение URI пространства имен является основным способом, позволяющим управлять содержимым WSDL-файла, генерируемого 1С, и, следовательно, влиять на значение заголовка SOAPAction.
После того как вы внесли изменения в конфигурацию 1С и сохранили их, эти изменения еще не будут немедленно применены к опубликованному Web-сервису. Вам необходимо выполнить несколько критически важных шагов:
http://host/base/ws/ИмяWebСервиса?wsdl).SOAPAction для требуемой операции теперь соответствует ожиданиям SAP.После выполнения этих шагов ваш Web-сервис 1С должен начать корректно взаимодействовать с SAP-системой, предоставляя ей требуемый SOAPAction.
Многие разработчики, столкнувшись с необходимостью изменения WSDL, могут подумать о ручном редактировании файла. Однако, как мы уже выяснили, в 1С WSDL-файл генерируется динамически. Это означает следующее:
?wsdl.?wsdl 1С снова сгенерирует файл на основе текущих метаданных конфигурации, и все ваши правки будут потеряны.SOAPAction, типы данных, параметры операций), должны быть внесены исключительно через конфигурацию 1С.Таким образом, сосредоточьте свои усилия на правильной настройке свойств Web-сервиса и XDTO-пакетов в "Конфигураторе" 1С, а не на поиске и редактировании несуществующего статического WSDL-файла.
Интеграция с SAP может быть сложной задачей, и помимо SOAPAction, могут возникнуть и другие нюансы. Рассмотрим дополнительные моменты:
SOAPAction из 1С: Если ваш 1С-сервис сам выступает в роли клиента и вызывает внешние SOAP-сервисы (например, тот же SAP), вы можете явно управлять значением SOAPAction при формировании исходящего запроса, используя встроенный язык 1С и объект WSПрокси. Это позволяет вам точно указать требуемый SOAPAction для стороннего сервиса.
Прокси = Новый WSПрокси(ОпределениеWS, URI_пространстваИмен, ИмяСервиса, ИмяПорта);
Прокси.НазначениеSOAPAction = "требуемое_значение_SOAPAction"; // Установка конкретного значения SOAPAction
// Вызов операции
Результат = Прокси.ИмяОперации(Параметры);
RFC (Remote Function Call). Если возникают постоянные сложности с Web-сервисами, возможно, стоит рассмотреть возможность использования RFC для обмена данными, при условии, что для этого есть необходимые коннекторы и библиотеки для 1С.Решение проблемы с SOAPAction в 1С Web-сервисе при интеграции с SAP сводится к правильной настройке URI пространства имен в конфигурации 1С, последующей перепубликации Web-сервиса и перезапуску Web-сервера, с учетом возможной задержки в доступности сервиса. Понимание динамического формирования WSDL и различий между URI и URL также играет ключевую роль в успешном решении данной задачи.