«Ошибка преобразования данных XDTO» в 1С: причины и решение
Платформа не смогла преобразовать значение 1С в XDTO-объект или XDTO-объект в значение 1С, потому что данные не соответствуют типу или схеме. В продолжении сообщения обычно указаны свойство, тип и форма (элемент или атрибут).
Текст ошибки
Причины
- Значение не соответствует типу в XDTO-пакете: строка вместо числа, дата в другом формате
- Нарушены ограничения схемы: длина строки, шаблон, перечень допустимых значений
- Сериализуется значение типа, который не поддерживает XDTO-сериализацию
- Ответ веб-сервиса не соответствует WSDL, по которому создан прокси
- В обмене данными конфигурации на сторонах имеют разную структуру
- Ссылка на объект, который отсутствует в базе-приёмнике
Как прочитать сообщение
Типичный вид ошибки содержит имя свойства и тип, например «Ошибка преобразования данных XDTO: Запись: ... Форма: Элемент Имя: Количество». Найдите в схеме или в структуре обмена это свойство: значение в нём и есть источник проблемы.
Обмен данными
- Определите, на какой стороне ошибка: при выгрузке или при загрузке. Это видно в протоколе обмена.
- Проверьте версии конфигураций на обеих сторонах: для типовых обменов используемые версии формата должны поддерживаться обеими базами.
- Обновите конфигурацию, в которой устарели правила или формат обмена.
- Найдите объект, на котором падает обмен (по протоколу или журналу регистрации), и проверьте его реквизиты: незаполненные обязательные поля, слишком длинные строки, неверные значения перечислений.
Веб-сервисы (SOAP)
- Если веб-сервис изменился, перезагрузите WSDL и пересоздайте WS-ссылку в конфигурации.
- Сравните фактический ответ сервиса с WSDL: часто сервис возвращает поле, которого нет в описании, или пустое значение в обязательном поле.
- Для отладки сохраните запрос и ответ в файл и проверьте их вручную.
Сериализация из кода
Для сериализации прикладных объектов используйте СериализаторXDTO, а не ручное создание XDTO-объектов:
ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ДокументОбъект); ТекстXML = ЗаписьXML.Закрыть(); ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ТекстXML); Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
При создании XDTO-объектов по своему пакету приводите значения к нужному типу явно и проверяйте ограничения схемы:
ТипТовар = ФабрикаXDTO.Тип("http://example.org/order", "Item");
Товар = ФабрикаXDTO.Создать(ТипТовар);
Товар.Name = Лев(Строка(Номенклатура), 100); // ограничение длины в схеме
Товар.Quantity = Число(Количество);
Товар.Проверить(); // проверка объекта на соответствие схеме
Метод Проверить() выдаёт понятную ошибку с указанием нарушенного ограничения ещё до отправки данных, что упрощает поиск.
Похожая ошибка
«Ошибка проверки данных XDTO» возникает, когда объект не прошёл проверку схемы, например не заполнено обязательное свойство. Решение то же: найти свойство из сообщения и привести данные к требованиям схемы.
Частые вопросы
Обмен работал, а после обновления одной базы появилась ошибка XDTO. Что делать?
Обновите вторую базу до совместимого релиза или проверьте, поддерживают ли обе стороны одну версию формата обмена. Различие форматов — частая причина после обновления только одной стороны.
Как найти, на каком объекте падает обмен?
Откройте протокол обмена или журнал регистрации с событиями обмена данными: там указан объект и текст ошибки. Затем проверьте реквизиты этого объекта.