Работа с веб-сервисами в среде 1С:Предприятие 8.3 часто сопровождается труднодиагностируемыми ошибками сериализации. Одной из самых распространенных является «Ошибка преобразования данных XDTO». Ситуация осложняется тем, что при использовании динамического подключения через программный код всё может работать исправно, в то время как статическая ссылка, добавленная в дерево конфигурации, выдает сбой. В этой статье мы подробно разберем причины такого поведения, проанализируем разницу между методами подключения и найдем оптимальное решение задачи.
В платформе 1С существует два основных способа создания прокси-класса для взаимодействия с SOAP-сервисами:
WSСсылка. В этом случае описание сервиса (WSDL) импортируется в конфигурацию на этапе разработки.WSОпределения и WSПрокси непосредственно в коде. Описание сервиса считывается из сети в момент выполнения программы.Рассмотрим классический пример кода для динамического создания прокси, который обычно работает стабильно:
&НаСервере
Процедура СформироватьНаСервере()
// Динамическое определение через URL
Определения = Новый WSОпределения("http://localhost/web/ws/List.1cws?wsdl");
Прокси = Новый WSПрокси(Определения, "Имена_СписокНоменклатуры", "СписокНоменклатуры", "СписокНоменклатурыSoap");
Таблица = Прокси.ПолучитьСписокНоменклатуры();
// Обработка данных...
КонецПроцедуры
Основная причина появления ошибки преобразования XDTO при использовании статической ссылки заключается в несоответствии сохраненной схемы WSDL актуальному состоянию веб-сервиса. Когда вы добавляете WSСсылка в конфигуратор, система «запоминает» структуру типов данных (XDTO-пакет). Если на стороне внешнего сервиса добавляется новое поле, изменяется тип реквизита или меняется пространство имен (Namespace), статическая ссылка перестает понимать структуру приходящего XML-ответа.
Разберем, почему динамический метод при этом продолжает работать: объект WSОпределения каждый раз заново загружает актуальную схему с сервера, подстраиваясь под изменения «на лету». Статическая же ссылка требует ручного вмешательства программиста.
Если ваша задача требует использования именно статической ссылки, выполните следующие действия:
WSСсылка в дереве метаданных (ветка «Общие»).Важный нюанс: Любое изменение в пакетах XDTO, связанных с веб-сервисом (даже добавление необязательного поля), требует повторения этой процедуры. В противном случае механизм XDTO не сможет сопоставить узлы XML-документа с известными ему свойствами объектов.
Иногда даже после обновления ссылки ошибка сохраняется. Это может быть связано с агрессивным кэшированием платформы 1С. Выясним, какие факторы могут влиять на стабильность:
1C:Enterprise Server Administration.Code вместо код, XDTO-сериализатор выдаст ошибку преобразования.Опытные разработчики часто отказываются от использования WSСсылка в пользу динамического создания или использования функций Библиотеки стандартных подсистем (БСП). Рассмотрим пример обращения к общему модулю БСП, который автоматизирует создание прокси и корректно обрабатывает параметры авторизации:
// Использование типовых механизмов БСП
ПараметрыПодключения = ОбщегоНазначения.WSПараметрыПодключения();
ПараметрыПодключения.Пользователь = "Логин";
ПараметрыПодключения.Пароль = "Пароль";
Прокси = ОбщегоНазначения.WSПрокси(
"http://localhost/web/ws/List.1cws?wsdl",
"Имена_СписокНоменклатуры",
"СписокНоменклатуры",
"СписокНоменклатурыSoap",
ПараметрыПодключения
);
Такой подход считается более надежным, так как он не привязывает конфигурацию к жесткой схеме данных и позволяет легче адаптироваться к изменениям на стороне внешнего API без внесения изменений в метаданные базы.
Проанализируем ситуацию и выберем подходящий инструмент:
WSОпределения из локального пути, а не по прямой ссылке.Таким образом, если вы столкнулись с ошибкой преобразования данных XDTO, в первую очередь попробуйте обновить WSСсылка в конфигураторе. Если это не помогло или сервис часто меняется, рекомендуем перевести интеграцию на динамическое формирование WSПрокси.