Как исправить ошибку «Неверный формат» при подключении 1С к веб-сервису SAP?

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

При интеграции систем 1С:Предприятие с SAP разработчики часто сталкиваются с критической ошибкой «Неверный формат» при попытке инициализации объекта WSОпределения. Несмотря на то, что ссылка на WSDL прекрасно открывается в браузере или специализированных утилитах типа SOAP UI, конструктор 1С отказывается принимать файл. Разберем подробно, почему это происходит и как решить данную задачу несколькими способами.

Почему возникает ошибка «Неверный формат»?

Основная причина кроется в избыточности спецификаций SAP. Платформа 1С поддерживает стандарт SOAP не в полном объеме, в то время как SAP по умолчанию включает в описание сервиса (WSDL) расширения, такие как WS-Policy и WS-Addressing. Когда парсер 1С встречает незнакомые теги или атрибуты (например, wsp:Policy), он прерывает чтение и выдает ошибку формата. Проанализируем основные методы обхода этого ограничения.

Способ 1. Очистка WSDL-файла вручную (наиболее надежный)

Если саперы не могут или не хотят менять формат выдачи WSDL на своей стороне, мы можем подготовить файл самостоятельно. Рассмотрим этот алгоритм по шагам:

  1. Откроем ссылку на WSDL в браузере и сохраним содержимое как XML-файл на локальный диск или в сетевую папку (например, C:\SAP_WS\service.wsdl).
  2. Откроем полученный файл в любом текстовом редакторе (Notepad++, VS Code) и удалим все блоки, связанные с политиками безопасности.
  3. Что именно удалять: Ищем и вырезаем узлы <wsp:UsingPolicy ... />, а также все дерево тегов <wsp:Policy>...</wsp:Policy>.
  4. Также рекомендуется удалить блоки <wsa:EndpointReference>, если они присутствуют, так как 1С не поддерживает WS-Addressing внутри WSDL-описаний.

После очистки файла мы будем обращаться не к URL сервера SAP, а к локальному файлу. Посмотрим на пример кода:


// Путь к очищенному файлу на диске
МестоположениеWSDL = "file://c:/SAP_WS/service.wsdl";
ИмяПользователя = "SAP_USER";
Пароль = "SAP_PASSWORD";

// Пробуем создать определения из локального файла
Попытка
    SSL = Новый ЗащищенноеСоединениеOpenSSL();
    WSОпределение = Новый WSОпределения(МестоположениеWSDL, ИмяПользователя, Пароль, , , SSL);
    
    // ВАЖНО: При создании прокси нужно указать реальный URL сервиса, 
    // так как в локальном WSDL адрес может быть неверным
    URLПространстваИмен = "urn:sap-com:document:sap:soap:functions:mc-style";
    ИмяСервиса = "ZWS_SAP_TO_1C";
    ИмяТочкиПодключения = "ZWS_SAP_TO_1C";
    
    WSПрокси = Новый WSПрокси(WSОпределение, URLПространстваИмен, ИмяСервиса, ИмяТочкиПодключения, , , SSL);
    WSПрокси.Пользователь = ИмяПользователя;
    WSПрокси.Пароль = Пароль;
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;

Способ 2. Использование параметров URL в SAP

Прежде чем приступать к ручной правке, попробуем заставить SAP генерировать «упрощенный» вариант WSDL. Выясним, поддерживает ли ваша версия SAP параметры стиля. Попробуйте добавить к ссылке следующие параметры:

В некоторых случаях это отключает генерацию WS-Policy, и файл становится «съедобным» для 1С без дополнительных манипуляций.

Способ 3. Решение проблемы с типами XSD (XMLSchema:string)

Часто после успешного подключения возникает вторая проблема: «Тип {http://www.w3.org/2001/XMLSchema}string не найден». Рассмотрим ситуацию: вы создаете пакет XDTO, добавляете импорт пространства имен http://www.w3.org/2001/XMLSchema, но стандартные типы (строка, число) все равно недоступны или вызывают ошибки. Проанализируем правильный порядок действий в конфигураторе:

  1. В дереве конфигурации откройте ваш ПакетXDTO.
  2. Найдите свойство Зависимые пакеты.
  3. Нажмите кнопку выбора и в открывшемся списке системных наборов выберите http://www.w3.org/2001/XMLSchema. Просто прописать URI в директивах импорта недостаточно!
  4. После добавления в зависимости, типы станут доступны для выбора в свойствах элементов вашего пакета.

Способ 4. Работа через CDATA и ручную сборку XML

Если структура данных SAP слишком сложна (например, используются массивы структур, которые 1С некорректно сопоставляет через XDTO), можно прибегнуть к «универсальному» методу: передаче данных в виде строки, обернутой в CDATA. Это избавляет от строгого контроля типов на уровне транспортного протокола. Рассмотрим пример упаковки данных:


Функция ПодготовитьДанныеДляSAP(ОбъектДанныхXDTO)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    ФабрикаXDTO.ЗаписатьXML(Запись, ОбъектДанныхXDTO);
    ДанныеXML = Запись.Закрыть();
    
    // Оборачиваем в CDATA, чтобы SOAP-сервер не пытался парсить внутренний XML как часть структуры сообщения
    ОтветCDATA = "<![CDATA[<?xml version=""1.0"" encoding=""UTF-8""?>" + ДанныеXML + "]]>";
    Возврат ОтветCDATA;
КонецФункции

В этом случае на стороне SAP параметр веб-сервиса должен иметь тип string. Это потребует ручного разбора XML на стороне получателя, но гарантирует прохождение данных без ошибок типизации.

Способ 5. Отказ от WS-ссылок в пользу HTTP-запросов

Проанализируем ситуацию, когда WSDL настолько перегружен спецификой SAP, что даже очистка не помогает. В этом случае наиболее профессиональным решением будет использование HTTPСоединение. Мы сами формируем SOAP-конверт (текстовый XML) и отправляем его методом POST.

Преимущества метода:

Для реализации этого метода нам потребуется подсмотреть формат запроса в SOAP UI, скопировать XML-тело и подставлять туда свои значения программно. Отправка осуществляется стандартным объектом HTTPЗапрос.

Важные рекомендации по отладке

Если вы продолжаете получать ошибку формата, проверьте следующие моменты:

Используя предложенные методы — от очистки WSDL до перехода на прямые HTTP-запросы — вы сможете обойти ограничения платформы и настроить стабильный обмен данными между 1С и SAP.

← На главную