Работа со сторонними веб-сервисами в 1С — это стандартная задача, которая, однако, может преподнести сюрпризы в самый неподходящий момент. Распространенная ситуация: сервис исправно работал долгое время, но после добавления нового метода или изменения структуры данных в уже существующем, 1С начинает выдавать неинформативную "Ошибка при вызове метода". Рассмотрим детально, почему это происходит и как реанимировать интеграцию, когда стандартное обновление WSСсылка в конфигураторе не помогает.
Когда мы работаем с примитивными типами (строки, числа), механизмы 1С легко справляются с сериализацией. Проблема возникает, когда в ответе появляются сложные структуры — таблицы или объекты, содержащие вложенные поля. Проанализируем механику процесса: 1С использует объектную модель XDTO (XML Data Transfer Objects) для разбора ответов. Этот механизм работает крайне строго: он не просто читает XML, а валидирует его на соответствие WSDL и XSD схемам.
Если в схеме поле описано как NUM_PO, а сервер фактически присылает NUM, или если поле помечено как обязательное (minOccurs="1"), но отсутствует в ответе, XDTO-сериализатор 1С прерывает работу с ошибкой. При этом сторонние утилиты, такие как SoapUI, могут успешно получать данные, так как они зачастую игнорируют мелкие несоответствия схеме, которые для 1С являются критическими.
Прежде чем вносить изменения в код, нам необходимо выяснить, что именно приходит от сервера в "чистом" виде. Для этого разберем использование специализированных инструментов:
SOAP Envelope. Обратите внимание на заголовки и пространства имен (namespaces).WSDL сервиса, выполните запрос и в окне ответа воспользуйтесь функцией Validate (обычно доступна через контекстное меню или кнопку в интерфейсе). Она подсветит строки XML, которые не соответствуют описанию схемы. Например, вы можете обнаружить сообщение: Expected elements 'NUM_PO' instead of 'NUM'.Проанализируем свойства элементов в схеме XSD. В 1С в объекте WSСсылка можно увидеть дерево типов. Особое внимание обратите на параметры:
sequence (последовательность). Если элементы в ответе приходят в ином порядке, чем описано в xs:sequence, валидация также может провалиться.Если выяснилось, что разработчики стороннего сервиса допустили опечатку в схеме или изменили имена тегов без обновления WSDL, мы можем решить проблему на стороне 1С, не дожидаясь правок от владельцев ресурса. Выясним, как это сделать:
WSDL (и связанные XSD) на локальный диск.NUM_PO на NUM.WSСсылка укажите путь к вашему локальному файлу вместо URL-адреса.Посмотрим на пример кода, который позволяет прочитать XML, если мы решили не использовать автоматическую WSСсылка, а разобрать ответ вручную через ФабрикаXDTO, используя исправленную схему:
// Пример ручного чтения ответа с использованием XDTO
чОтвет = Новый ЧтениеXML();
// Допустим, мы получили ответ от сервера и сохранили во временный файл
чОтвет.ОткрытьФайл("C:\Temp\Response_Server.xml");
// Указываем пространство имен и тип, который мы ожидаем получить
ТипОбъекта = ФабрикаXDTO.Тип("http://othersoft.com/oc/schemas", "OcInsCompensationCurrentInfo");
// Читаем данные. Если схема в конфигурации исправлена, метод отработает успешно
ДанныеXDTO = ФабрикаXDTO.ПрочитатьXML(чОтвет, ТипОбъекта);
// Теперь мы можем обращаться к свойствам объекта 1С-ным способом
Сообщить(ДанныеXDTO.NUM); // Используем новое имя поля из исправленной схемы
Иногда статическая WSСсылка в дереве конфигурации создает неудобства, особенно если схемы часто меняются. В таких случаях рассмотрим вариант динамического создания прокси. Это позволит подкладывать исправленный файл схемы WSDL без необходимости вносить изменения в метаданные и выгонять пользователей из базы.
// Путь к исправленному локальному файлу WSDL
ПутьКЛокальнойСхеме = "C:\WS\service_fixed.wsdl";
Попытка
Определения = Новый WSОпределения(ПутьКЛокальнойСхеме, "Логин", "Пароль");
Прокси = Новый WSПрокси(Определения, "http://uri-сервиса", "ИмяСервиса", "ИмяТочкиПодключения");
// Вызов метода
Результат = Прокси.GetNewData(ПараметрыЗапроса);
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("ОшибкаВебСервиса", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Инфо));
КонецПопытки;
Если веб-сервис спроектирован настолько некорректно, что его WSDL постоянно противоречит ответам, а правка схем превращается в бесконечный процесс, проанализируем "план Б". Мы можем отказаться от типизации 1С и работать с сервисом как с обычным REST/SOAP ресурсом через HTTPСоединение.
В этом случае мы сами формируем XML-тело запроса и получаем XML-ответ в виде строки. Для разбора строки можно использовать ЧтениеXML в режиме обхода узлов. Это более трудоемкий метод, но он дает 100% стабильность, так как исключает этап автоматической валидации через XDTO.
Важные моменты при использовании HTTP-запроса:
SOAPAction, если сервис этого требует.ЧтениеXML.ПерейтиКСодержимому() для пропуска служебных тегов Envelope и Body.BOM-символами, предварительно обрабатывайте строку ответа перед загрузкой в ЧтениеXML.Подводя итог, можно сказать, что большинство проблем с веб-сервисами в 1С решаются именно на уровне сопоставления имен и структур в схеме и XML-документе. Внимательный анализ через SoapUI и ручная корректировка локального WSDL — самые эффективные инструменты в арсенале разработчика 1С.