При разработке интеграционных решений на платформе 1С, основанных на пакетах XDTO, разработчики часто сталкиваются с необходимостью изменения структуры данных. Однако любое изменение XSD-схемы, особенно перенос реквизитов из шапки документа в табличную часть, требует осторожного подхода. Если после модификации пакета XDTO вы получаете ошибку «Ошибка преобразования данных XDTO: НачалоСвойства: Подразделение Форма: Элемент Тип: {http://www...}anyType», давайте разберемся, почему это происходит и как устранить проблему.
Ошибка, которую выдает Сериализатор.ПрочитатьXML(), означает, что механизм сериализации встретил в XML-файле элемент, описание которого не совпадает с тем, что определено в текущем пакете XDTO. В 1С XDTO — это строго типизированный механизм. Если в XML есть тег, который «не узнается» структурой, платформа не может его обработать и пытается присвоить ему тип anyType, что приводит к критическому сбою.
В вашем случае причиной стало нарушение «контракта» данных: вы изменили схему, но XML-файлы, которые вы пытаетесь прочитать, были сформированы по старым правилам. Сериализатор ожидает увидеть «Подразделение» в табличной части, но находит его в шапке (согласно старому XML), и наоборот.
Прежде всего, проанализируем структуру вашего XML-файла. Откройте файл любым текстовым редактором и посмотрите, где именно находится элемент «Подразделение». Если он по-прежнему находится в корне документа (в шапке), а в вашем новом XSD он описан внутри коллекции «Разрешения», возникнет конфликт.
Решение: Вам необходимо синхронизировать структуру выгрузки и структуру загрузки. Если XML создается другой информационной базой, её также нужно обновить под новую XSD-схему. Если же вы работаете с архивами данных, которые были созданы до изменений, необходимо предусмотреть механизм адаптации.
Часто проблема кроется в том, что свойство «Подразделение» в XDTO не имеет четко заданного типа. Рассмотрим, как проверить корректность настройки:
XDTO в Конфигураторе.ComplexType, описывающему строку табличной части.string, int или Reference на справочник), а не пустое значение. Если тип не указан, 1С по умолчанию присваивает anyType, что и вызывает ошибку.Если вам нужно поддерживать загрузку данных, созданных как по «старой», так и по «новой» схеме, не стоит изменять существующий пакет напрямую, если это ломает обратную совместимость. Рассмотрим стратегию версионности:
Рассмотрим подробнее подход с использованием двух пакетов:
XDTO с измененной структурой.XDTO (ФабрикаXDTO) для десериализации.Если вы хотите реализовать гибкую загрузку в рамках одного пакета, воспользуйтесь программным чтением через ЧтениеXML, анализируя наличие элементов:
// Пример логики обработки структуры
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
Пока Чтение.Прочитать() Цикл
Если Чтение.Имя = "Подразделение" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
// Обработка данных в зависимости от того,
// где именно мы находимся в дереве XML
КонецЕсли;
КонецЦикла;
Иногда после внесения изменений в XSD, платформа продолжает использовать старые закэшированные метаданные XDTO. Это может привести к тому, что вы видите верную структуру в Конфигураторе, но в режиме исполнения 1С «не видит» изменений.
Что нужно сделать:
AppData\Local\1C\1Cv8\...).ПрочитатьXML с указанием явной ФабрикаXDTO.Для исправления ошибки проанализируйте следующие моменты:
Namespace URI в XML и в вашем пакете XDTO. Если они разные, сериализатор не найдет соответствие.XDTO. Избегайте использования нетипизированных полей.Соблюдение этих простых правил поможет вам избежать ошибок при обмене данными и сделает вашу интеграцию стабильной и предсказуемой.