При разработке механизмов интеграции, особенно при создании синхронизации с мобильными приложениями на платформе 1С, программисты часто сталкиваются с ошибкой «Ошибка при вызове конструктора (WSОпределения): WSDL должен содержать элемент definitions: Неверный формат». Эта ошибка может показаться неинформативной, так как она лишь констатирует факт: вместо ожидаемого XML-описания сервиса (WSDL) система получила что-то другое. В этой статье мы подробно разберем причины этой ситуации и пошагово пройдем путь к ее решению.
Рассмотрим пример кода, который вызывает данную ошибку. Часто попытка инициализации подключения выглядит следующим образом:
Адрес = "http://192.168.1.92/pqt/ws/ws1.1cws?wsdl";
Попытка
Определения = Новый WSОпределения(Адрес, "guest", "password");
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Обычное);
Возврат;
КонецПопытки;
Если при выполнении этого кода 1С выдает ошибку о неверном формате, первым делом необходимо проверить, что именно возвращает сервер. Самый простой способ сделать это — вставить адрес URL в строку браузера. Проанализируем, какие варианты ответов мы можем получить и что они означают.
Если при обращении через браузер вы видите не дерево 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. Текст ошибки прямо указывает на причину: несоответствие количества параметров. Это означает, что в конфигураторе в объекте Веб-сервис для операции ВыполнитьОбмен указано одно количество входящих параметров, а в модуле веб-сервиса соответствующая процедура ВыполнитьОбмен() описана с другим количеством аргументов.
Выясним одну из самых банальных, но частых причин. Внимательно посмотрим на адрес URL. Для получения описания сервиса в конце адреса обязательно должен стоять параметр ?wsdl. Ошибка в одну букву (например, ?wsd1) приведет к тому, что веб-сервер (IIS или Apache) вернет стандартную страницу ошибки 404 (Not Found) в формате HTML. Поскольку конструктор WSОпределения ожидает XML, попытка прочитать HTML-код вызовет ошибку «Неверный формат», так как в HTML нет элемента definitions.
Проанализируем влияние кодировок. Хотя платформа 1С поддерживает кириллицу в именах объектов, практика показывает, что при публикации веб-сервисов использование русских букв часто становится источником проблем при десериализации данных.
Рекомендуется придерживаться следующих правил:
Веб-сервис в метаданных должно быть на латинице (например, WebExchange вместо ВебОбмен).MyParameter и myparameter — это разные сущности.Пересоздание веб-сервиса с использованием латинских имен часто «магическим» образом решает проблемы, которые трудно диагностировать иным путем.
Разберем ситуацию с параметрами подробнее. Если вы добавили параметр в операцию веб-сервиса в дереве метаданных, вы обязаны обновить заголовок процедуры в модуле этого веб-сервиса. Рассмотрим пример:
В конфигураторе создана операция UploadData с двумя параметрами: ClientID и DataPayload. В модуле веб-сервиса код должен выглядеть строго так:
Функция UploadData(ClientID, DataPayload)
// Логика обработки
Возврат "Ок";
КонецФункции
Если вы забудете указать один из параметров в описании функции в коде, при попытке системы сформировать WSDL произойдет сбой, и вы получите ту самую ошибку формата.
Выясним, достаточно ли прав у пользователя, под которым создается WSОпределения. Для корректной работы пользователю (в нашем примере это guest) в базе 1С должны быть назначены следующие права:
Посмотрим на настройки веб-сервера. Ошибка формата может возникнуть, если модуль расширения веб-сервера 1С (например, wsap24.dll для Apache) работает некорректно. Проанализируем следующие моменты:
Подведем итог. Ошибка «WSDL должен содержать элемент definitions» — это лишь симптом того, что сервер вернул ошибку вместо описания сервиса. Для успешного решения проблемы мы рекомендуем:
Соблюдение этих простых правил позволит вам избежать большинства проблем при публикации и использовании веб-сервисов в 1С.