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

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

При разработке механизмов интеграции, особенно при создании синхронизации с мобильными приложениями на платформе 1С, программисты часто сталкиваются с ошибкой «Ошибка при вызове конструктора (WSОпределения): WSDL должен содержать элемент definitions: Неверный формат». Эта ошибка может показаться неинформативной, так как она лишь констатирует факт: вместо ожидаемого XML-описания сервиса (WSDL) система получила что-то другое. В этой статье мы подробно разберем причины этой ситуации и пошагово пройдем путь к ее решению.

Анализируем исходную ситуацию и код

Рассмотрим пример кода, который вызывает данную ошибку. Часто попытка инициализации подключения выглядит следующим образом:


Адрес = "http://192.168.1.92/pqt/ws/ws1.1cws?wsdl";
Попытка
    Определения = Новый WSОпределения(Адрес, "guest", "password");
Исключение
    Сообщить(ОписаниеОшибки(), СтатусСообщения.Обычное); 
    Возврат;
КонецПопытки;

Если при выполнении этого кода 1С выдает ошибку о неверном формате, первым делом необходимо проверить, что именно возвращает сервер. Самый простой способ сделать это — вставить адрес URL в строку браузера. Проанализируем, какие варианты ответов мы можем получить и что они означают.

Проверка через браузер и расшифровка SOAP Fault

Если при обращении через браузер вы видите не дерево XML с корневым тегом wsdl:definitions, а сообщение об ошибке, значит, веб-сервер или сама база 1С не могут корректно сформировать описание сервиса. Рассмотрим пример реального ответа сервера, который сигнализирует о внутренней проблеме:


<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <soap:Fault>
   <faultcode>soap:Client</faultcode>
   <faultstring>
    Несоответствие количества параметров операции веб-сервиса и процедуры-обработчика {http://localhost/ws1}:ВебОбмен:ВыполнитьОбмен()
   </faultstring>
  </soap:Fault>
 </soap:Body>
</soap:Envelope>

В данном случае мы видим SOAP Fault. Текст ошибки прямо указывает на причину: несоответствие количества параметров. Это означает, что в конфигураторе в объекте Веб-сервис для операции ВыполнитьОбмен указано одно количество входящих параметров, а в модуле веб-сервиса соответствующая процедура ВыполнитьОбмен() описана с другим количеством аргументов.

Шаг 1: Проверка опечаток в URL-адресе

Выясним одну из самых банальных, но частых причин. Внимательно посмотрим на адрес URL. Для получения описания сервиса в конце адреса обязательно должен стоять параметр ?wsdl. Ошибка в одну букву (например, ?wsd1) приведет к тому, что веб-сервер (IIS или Apache) вернет стандартную страницу ошибки 404 (Not Found) в формате HTML. Поскольку конструктор WSОпределения ожидает XML, попытка прочитать HTML-код вызовет ошибку «Неверный формат», так как в HTML нет элемента definitions.

Шаг 2: Исправление именования и использование латиницы

Проанализируем влияние кодировок. Хотя платформа 1С поддерживает кириллицу в именах объектов, практика показывает, что при публикации веб-сервисов использование русских букв часто становится источником проблем при десериализации данных.

Рекомендуется придерживаться следующих правил:

  1. Имя самого объекта Веб-сервис в метаданных должно быть на латинице (например, WebExchange вместо ВебОбмен).
  2. Имена операций и их параметров также следует перевести на латиницу.
  3. Имена пакетов XDTO и типов данных внутри них должны содержать только латинские символы.
  4. Будьте внимательны к регистру символов. Веб-серверы и механизмы XDTO часто чувствительны к регистру: MyParameter и myparameter — это разные сущности.

Пересоздание веб-сервиса с использованием латинских имен часто «магическим» образом решает проблемы, которые трудно диагностировать иным путем.

Шаг 3: Сопоставление параметров в конфигураторе и коде

Разберем ситуацию с параметрами подробнее. Если вы добавили параметр в операцию веб-сервиса в дереве метаданных, вы обязаны обновить заголовок процедуры в модуле этого веб-сервиса. Рассмотрим пример:

В конфигураторе создана операция UploadData с двумя параметрами: ClientID и DataPayload. В модуле веб-сервиса код должен выглядеть строго так:


Функция UploadData(ClientID, DataPayload)
    // Логика обработки
    Возврат "Ок";
КонецФункции

Если вы забудете указать один из параметров в описании функции в коде, при попытке системы сформировать WSDL произойдет сбой, и вы получите ту самую ошибку формата.

Шаг 4: Права доступа и авторизация

Выясним, достаточно ли прав у пользователя, под которым создается WSОпределения. Для корректной работы пользователю (в нашем примере это guest) в базе 1С должны быть назначены следующие права:

Шаг 5: Технические аспекты публикации (IIS/Apache)

Посмотрим на настройки веб-сервера. Ошибка формата может возникнуть, если модуль расширения веб-сервера 1С (например, wsap24.dll для Apache) работает некорректно. Проанализируем следующие моменты:

  1. Версия платформы: Версия установленного модуля расширения на веб-сервере должна в точности совпадать с версией платформы 1С, в которой работает информационная база.
  2. Разрядность: Если вы используете 64-битную платформу, убедитесь, что пул приложений в IIS также настроен на 64 бита (или наоборот для 32-битной).
  3. Кэширование: Веб-серверы часто кэшируют WSDL. После внесения изменений в конфигурацию 1С (например, изменение параметров или имен), обязательно перезагрузите веб-сервер. В противном случае клиент (мобильное приложение) может пытаться получить старую структуру, что приведет к конфликту.

Итоги и рекомендации

Подведем итог. Ошибка «WSDL должен содержать элемент definitions» — это лишь симптом того, что сервер вернул ошибку вместо описания сервиса. Для успешного решения проблемы мы рекомендуем:

Соблюдение этих простых правил позволит вам избежать большинства проблем при публикации и использовании веб-сервисов в 1С.

← На главную