При интеграции систем 1С:Предприятие с SAP разработчики часто сталкиваются с критической ошибкой «Неверный формат» при попытке инициализации объекта WSОпределения. Несмотря на то, что ссылка на WSDL прекрасно открывается в браузере или специализированных утилитах типа SOAP UI, конструктор 1С отказывается принимать файл. Разберем подробно, почему это происходит и как решить данную задачу несколькими способами.
Основная причина кроется в избыточности спецификаций SAP. Платформа 1С поддерживает стандарт SOAP не в полном объеме, в то время как SAP по умолчанию включает в описание сервиса (WSDL) расширения, такие как WS-Policy и WS-Addressing. Когда парсер 1С встречает незнакомые теги или атрибуты (например, wsp:Policy), он прерывает чтение и выдает ошибку формата. Проанализируем основные методы обхода этого ограничения.
Если саперы не могут или не хотят менять формат выдачи WSDL на своей стороне, мы можем подготовить файл самостоятельно. Рассмотрим этот алгоритм по шагам:
C:\SAP_WS\service.wsdl).<wsp:UsingPolicy ... />, а также все дерево тегов <wsp:Policy>...</wsp:Policy>.<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Прокси.Пароль = Пароль;
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Прежде чем приступать к ручной правке, попробуем заставить SAP генерировать «упрощенный» вариант WSDL. Выясним, поддерживает ли ваша версия SAP параметры стиля. Попробуйте добавить к ссылке следующие параметры:
&standard=true&style=standardВ некоторых случаях это отключает генерацию WS-Policy, и файл становится «съедобным» для 1С без дополнительных манипуляций.
Часто после успешного подключения возникает вторая проблема: «Тип {http://www.w3.org/2001/XMLSchema}string не найден». Рассмотрим ситуацию: вы создаете пакет XDTO, добавляете импорт пространства имен http://www.w3.org/2001/XMLSchema, но стандартные типы (строка, число) все равно недоступны или вызывают ошибки. Проанализируем правильный порядок действий в конфигураторе:
ПакетXDTO.http://www.w3.org/2001/XMLSchema. Просто прописать URI в директивах импорта недостаточно!Если структура данных 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 на стороне получателя, но гарантирует прохождение данных без ошибок типизации.
Проанализируем ситуацию, когда WSDL настолько перегружен спецификой SAP, что даже очистка не помогает. В этом случае наиболее профессиональным решением будет использование HTTPСоединение. Мы сами формируем SOAP-конверт (текстовый XML) и отправляем его методом POST.
Преимущества метода:
SOAPAction и Authorization.Для реализации этого метода нам потребуется подсмотреть формат запроса в SOAP UI, скопировать XML-тело и подставлять туда свои значения программно. Отправка осуществляется стандартным объектом HTTPЗапрос.
Если вы продолжаете получать ошибку формата, проверьте следующие моменты:
SOAMANAGER.Используя предложенные методы — от очистки WSDL до перехода на прямые HTTP-запросы — вы сможете обойти ограничения платформы и настроить стабильный обмен данными между 1С и SAP.