Как исправить ошибку «WSDL должен содержать элемент definitions» при настройке обмена через веб-сервис в 1С?

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

При настройке синхронизации данных между конфигурациями 1С (например, 1С:ERP и 1С:Бухгалтерия предприятия) через прямое подключение по веб-сервису разработчики и администраторы часто сталкиваются со следующей ошибкой:

{ОбщийМодуль.ОбщегоНазначения.Модуль(5469)}: Ошибка при вызове конструктора (WSОпределения) Определения = Новый WSОпределения(ОписаниеФайла.Путь, ИмяПользователя, Пароль, ИнтернетПрокси, Таймаут); по причине: WSDL должен содержать элемент definitions по причине: Неверный формат.

Разберем подробно причины возникновения этой проблемы и рассмотрим способы её устранения как в стандартном мастере обмена Библиотеки Стандартных Подсистем (БСП), так и при программном вызове сервисов.

Выясним причину ошибки

Ошибка возникает в момент, когда платформа 1С через конструктор WSОпределения пытается проанализировать скачанный WSDL-файл с описанием веб-сервиса. Если сервер вместо корректного XML-описания возвращает HTML-страницу с ошибкой веб-сервера (например, 401 Unauthorized, 404 Not Found или 500 Internal Server Error), парсер 1С не обнаруживает корневой XML-элемент definitions и выдаёт сообщение о неверном формате.

Главные причины получения некорректного ответа от веб-сервера:

  1. Неправильно указан адрес программы в мастере БСП: в поле «Адрес программы» введен прямой URL к конкретному файлу веб-сервиса (например, http://server/base/ws/Exchange.1cws?wsdl) вместо базового адреса базы.
  2. Веб-сервис не опубликован: в файле публикации default.vrd отсутствуют или отключены нужные сервисы обмена (в частности InterfaceVersion и Exchange).
  3. Ограничения авторизации: веб-сервер (IIS или Apache) блокирует анонимный доступ к каталогу /ws/ до того, как запрос передается платформе 1С.

Правильная настройка подключения в стандартном мастере БСП

Разберем по шагам, как корректно указать параметры в типовой обработке настройки обмена:

  1. Перейдём к окну «Настройка подключения через Интернет».
  2. Выберем вариант «Настройки вручную» и перейдем к шагу «Прямое подключение через интернет».
  3. В поле «Адрес программы» укажем строго базовый URL публикации информационном базы, без указания конкретных сервисов, расширений .1cws или суффиксов ?wsdl.

Пример правильного адреса:

http://myserver/erp_base

Пример НЕПРАВИЛЬНОГО адреса:

http://myserver/erp_base/ws/Exchange.1cws?wsdl

Подсистема обмена данными БСП автоматически формирует необходимые обращения к сервисам InterfaceVersion и Exchange, добавляя нужные пути к базовому URL. Если указать полный путь вручную, цепочка вызовов ломается, и сервер возвращает ошибку 404 или 500.

Проверка публикации сервисов в default.vrd

Если базовый адрес указан верно, но ошибка сохраняется, проанализируем файл публикации default.vrd, расположенный в каталоге веб-сервера. Проверим наличие публикаций служебных веб-сервисов обмена:


<ws>
    <point name="Exchange" alias="Exchange.1cws"/>
    <point name="Exchange_2_0_1_1_6" alias="Exchange_2_0_1_1_6.1cws"/>
    <point name="InterfaceVersion" alias="InterfaceVersion.1cws"/>
</ws>

Особое внимание следует обратить на сервис InterfaceVersion. Если он не опубликован, мастер настройки не сможет определить поддерживаемые версии программных интерфейсов целевой базы и выдаст сбой при формировании параметров подключения.

Программное подключение к веб-сервису через код 1С

Если задача заключается не в настройке типового обмена БСП, а в написании собственного модуля интеграции, сформировать прокси-объект можно программно с помощью функции подсистемы ОбщегоНазначения.ВнутренняяWSПрокси.

Посмотрим на пример создания подключения к сервису обмена из кода 1С:


СтрукПараметры = Новый Структура;
СтрукПараметры.Вставить("АдресWSDL", "http://myserver/erp_base/ws/Exchange.1cws?wsdl");
СтрукПараметры.Вставить("URIПространстваИмен", "http://www.1c.ru/SSL/Exchange");
СтрукПараметры.Вставить("ИмяСервиса", "Exchange");
СтрукПараметры.Вставить("ИмяТочкиПодключения", "ExchangeSoap");
СтрукПараметры.Вставить("ИмяПользователя", "ws_user");
СтрукПараметры.Вставить("Пароль", "ws_password");
СтрукПараметры.Вставить("Таймаут", 60);

Прокси = ОбщегоНазначения.ВнутренняяWSПрокси(СтрукПараметры);

Если Прокси <> Неопределено Тогда
    // Вызов методов веб-сервиса
    // Результат = Прокси.УстановитьИзменения(...);
КонецЕсли;

Диагностика ошибки в отладчике

Если причина сбоя остается непонятной, проанализируем содержимое ответа веб-сервера с помощью отладчика 1С:

  1. Откроем модуль ОбщегоНазначения в конфигураторе.
  2. Установим точку останова на строке с вызовом Новый WSОпределения(...).
  3. В момент остановки программы скопируем значение переменной ОписаниеФайла.Путь (это путь к временному файлу на диске).
  4. Откроем данный временный файл в любом текстовом редакторе (например, Notepad++).

Внутри файла будет находиться реальный текст ответа сервера (например, HTML-страница ошибки IIS или сообщения об ошибке аутентификации 401 Unauthenticated), что позволит сразу точно определить сетевую или конфигурационную причину сбоя.

← На главную