При работе с веб-сервисами в среде 1С:Предприятие разработчики часто сталкиваются с неприятной особенностью: после внесения правок в код модуля или обновления версии платформы структура WSDL (Web Services Description Language) изменяется. Казалось бы, состав методов и параметров остался прежним, но внешние системы, потребляющие сервис, начинают выдавать ошибки. Рассмотрим подробнее, почему это происходит и какие шаги необходимо предпринять для стабилизации интеграции.
Проанализируем ситуацию: в 1С файл WSDL не является статическим документом, который хранится в метаданных. Он генерируется «на лету» расширением веб-сервера (модулями wsap.dll для IIS или 1cws.so для Apache) в тот момент, когда внешняя система обращается к публикации по ссылке с параметром ?wsdl.
Разберем основные факторы, влияющие на этот процесс:
XDTO. Любое изменение в конфигурации, даже если оно не касается текущего веб-сервиса, может изменить внутренний индекс или порядок перебора. В результате префиксы пространств имен (псевдонимы), такие как d1p1, d1p2 или xs1, переназначаются.XDTO, добавление нового пакета в дерево метаданных или изменение порядка их следования гарантированно сдвинет схему в итоговом WSDL.С точки зрения стандартов XML, префиксы (например, xs1:) не несут смысловой нагрузки. Важны только полные URI пространств имен, которые сопоставляются с этими префиксами в заголовке документа. Однако на практике многие внешние системы реализованы некорректно. Разберем типичные ошибки потребителей:
<d1p1:Name> вместо полноценного парсинга XML-дерева.WSDL и при малейшем изменении порядка элементов types или импортируемых схем выдавать ошибку валидации.Рассмотрим самый надежный способ решения проблемы, когда мы не можем изменить логику работы внешней системы. Мы можем «обмануть» потребителя, предоставив ему неизменяемый файл.
Выполним следующие шаги:
WSDL нашего сервиса.myservice.wsdl..1cws).<soap:address location="..."/> убедимся, что указан правильный URL, ведущий к реальной публикации 1С.Теперь внешняя система будет обращаться к статическому файлу http://server/base/myservice.wsdl, получать всегда одинаковую структуру, а фактические данные будут уходить на обработку в 1С.
Проанализируем альтернативный архитектурный подход. Если интеграция находится в стадии активной разработки, мы рекомендуем отказаться от SOAP (Web-сервисов) в пользу HTTP-сервисов (REST).
В чем преимущество для контроля структуры:
JSON, который гораздо легче парсится и менее чувствителен к изменениям пространств имен.Посмотрим на пример кода формирования ответа в HTTP-сервисе, где мы жестко задаем структуру:
Функция ПолучитьДанные(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Мы сами контролируем префиксы и пространства имен
ЗаписьXML.ЗаписатьНачалоЭлемента("data", "http://www.mysite.ru/integration");
ЗаписьXML.ЗаписатьАтрибут("xmlns:ns1", "http://www.mysite.ru/types");
ЗаписьXML.ЗаписатьНачалоЭлемента("ns1:payload");
ЗаписьXML.ЗаписатьТекст("Тестовые данные");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
Ответ.УстановитьТелоИзСтроки(ЗаписьXML.Закрыть());
Возврат Ответ;
КонецФункции
Если у нас есть доступ к коду внешней системы, правильным путем будет исправление логики чтения WSDL. Необходимо использовать полноценные библиотеки (SOAP-стеки), которые умеют сопоставлять Namespace URI с текущими префиксами документа.
Помните, что согласно спецификации WSDL, порядок следования схем в секции types и названия префиксов могут быть произвольными, если они корректно определены в заголовке. В 1С для работы с такими сервисами мы используем объект WSОпределения, который абстрагирует нас от текстового представления WSDL.
// Пример правильного обращения к сервису в 1С
Определения = Новый WSОпределения("http://server/base/ws/service?wsdl");
Прокси = Новый WSПрокси(Определения, "http://uri", "ServiceName", "EndpointName");
// Здесь платформа сама разберется с префиксами
Результат = Прокси.ВыполнитьОперацию();
Чтобы минимизировать риски «развала» интеграции при обновлениях, придерживайтесь следующих правил:
WSDL в репозиторий после каждого изменения. Это позволит быстро сравнить файлы до и после обновления и понять, что именно изменилось (префиксы или состав полей).XDTO в веб-сервисах, если вы не планируете их менять. Лучше создать отдельный пакет специально для конкретного веб-сервиса.Подведем итог: изменение WSDL в 1С — это особенность динамической природы платформы. Наиболее эффективным методом борьбы с этим является использование статического WSDL-файла или переход на HTTP-сервисы, где контроль над форматом данных полностью переходит в руки разработчика.