Ошибка десериализации объекта XDTO в 1С 8.3 — Причины и решение
- Исключение:
Ошибка десериализации объекта XDTO / Несоответствие типа элемента. - Сбой выполнения метода
ФабрикаXDTO.ПрочитатьXML()илиСериализаторXDTO.ПрочитатьXML(). - Невозможность десериализовать элемент справочника или документа из XML-пакета обмена.
- Ошибки чтения ссылочных типов данных (UUID / GUID) из внешнего источника.
1. Анализ места сбоя потока десериализации
Оберните вызов десериализации в блок отслеживания узла XML:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\Import\message.xml");
Попытка
// Попытка десериализации через стандартную фабрику
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Исключение
СтрокаСбоя = ЧтениеXML.НомерСтроки;
УзелСбоя = ЧтениеXML.Имя;
ВызватьИсключение СтрШаблон("Ошибка десериализации в узле <%1> (Строка %2): %3", УзелСбоя, СтрокаСбоя, ОписаниеОшибки());
Фиксировать
ЧтениеXML.Закрыть();
КонецПопытки;2. Проверка соответствия типов ссылочных данных
Если в XML передается пустая строка в поле, которое в схеме XDTO определено как xs:decimal, xs:dateTime или v8:UUID, десериализатор прерывает работу. Исправьте генерацию источника или схему пакета:
// Безопасное чтение через СериализаторXDTO для объектов 1С
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
// Чтение объекта базы данных
Попытка
НайденныйОбъект = Сериализатор.ПрочитатьXML(Чтение);
Исключение
ЗаписьЖурналаРегистрации("Десериализация", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;3. Использование промежуточного DOM-парсинга при битых типах
Если входящий XML содержит некорректные типы, прочитайте его через ДокументDOM, нормализуйте значения текстовых узлов и передайте в ФабрикаXDTO.ПрочитатьXML().
Частые вопросы (FAQ)
В чем разница между ФабрикаXDTO и СериализаторXDTO?
ФабрикаXDTO преобразует XML в абстрактные структуры 'ОбъектXDTO'. СериализаторXDTO преобразует XML напрямую в нативные объекты платформы 1С (СправочникОбъект, ДокументОбъект, ТаблицаЗначений и т.д.).
Почему возникает ошибка 'Недопустимое значение GUID'?
Строка GUID в XML не соответствует формату 8-4-4-4-12 шестнадцатеричных цифр (например, содержит пробелы или неверную длину).
Как десериализовать XML, если тип объекта не указан явно через xsi:type?
Передайте ожидаемый тип XDTO вторым аргументом метода: ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипXDTO).
Что делать, если десериализация падает на неизвестном свойстве?
В схеме XSD добавьте элемент <xs:any minOccurs="0" processContents="lax"/> для поддержки расширяемости структуры.