Как правильно прочитать данные из XML в 1С:УТ 11.5 и избежать ошибок XDTO

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При разработке механизмов интеграции в 1С:Управление торговлей 11.5 программисты часто сталкиваются с необходимостью загрузки данных из внешних XML-файлов. Одной из наиболее типичных ошибок является попытка использовать СериализаторXDTO для чтения файлов, структура которых была сформирована сторонними системами, а не самой платформой 1С. В данной статье мы разберем, почему возникает ошибка преобразования данных XDTO, и рассмотрим правильные методы работы с XML-структурами.

Анализ проблемы: Почему СериализаторXDTO выдает ошибку

Рассмотрим ситуацию, с которой столкнулся автор темы. При попытке прочитать файл со списком товаров программа выдает исключение: "Ошибка преобразования данных XDTO: НачалоСвойства: Товары Форма: Элемент Тип: {". Чтобы понять причину, нам нужно проанализировать используемый код:


&НаСервере
Процедура ПрочитатьФайлНаСервере_1()
    Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
    НовыйЧтениеXML = Новый ЧтениеXML;
    ПутьКФайлу = "W:\1s_bases\import0_1.xml";
    НовыйЧтениеXML.ОткрытьФайл(ПутьКФайлу);
    ТЗ = Сериализатор.ПрочитатьXML(НовыйЧтениеXML);
    НовыйЧтениеXML.Закрыть();
КонецПроцедуры

Главная ошибка здесь заключается в непонимании назначения объекта СериализаторXDTO. Давайте выясним, для чего он предназначен. Этот объект служит для сериализации и десериализации объектов 1С (таких как справочники, документы, таблицы значений или структуры) в формат XML, который понимает сама платформа. Чтобы СериализаторXDTO успешно прочитал файл, этот файл должен содержать специальные метаданные (пространства имен, такие как http://v8.1c.ru/8.1/data/core), которые подсказывают системе, в какой именно тип данных 1С нужно превратить тот или иной тег.

Если мы пытаемся прочитать "произвольный" XML-файл (например, выгрузку из интернет-магазина или от поставщика), СериализаторXDTO видит тег Товары, но не находит в нем описания типа. В результате платформа не понимает, должен ли этот узел стать ТаблицейЗначений, Массивом или Справочником, и выдает ошибку преобразования.

Решение №1: Использование ФабрикиXDTO для автоматического чтения

Если структура вашего XML-файла достаточно проста и вы не хотите описывать каждый узел вручную, можно воспользоваться методом ПрочитатьXML непосредственно у объекта ФабрикаXDTO. Этот метод пытается сопоставить узлы XML с имеющимися в системе типами или создает динамические объекты XDTO.

Разберем пример корректного кода для этого случая:


ЧтениеXMLДанных = Новый ЧтениеXML;
ЧтениеXMLДанных.ОткрытьФайл(ПутьКФайлу);

// Используем ФабрикуXDTO напрямую, а не Сериализатор
Попытка
    Результат = ФабрикаXDTO.ПрочитатьXML(ЧтениеXMLДанных);
    // Теперь переменная 'Результат' содержит ОбъектXDTO, 
    // к свойствам которого можно обращаться через точку
Исключение
    Сообщить("Ошибка при чтении: " + ОписаниеОшибки());
КонецПопытки;

ЧтениеXMLДанных.Закрыть();

Важный нюанс: Чтобы ФабрикаXDTO корректно обработала вложенные элементы (например, список товаров), желательно иметь Пакет XDTO (схему .xsd), предварительно созданный в конфигурации. Если схемы нет, 1С может прочитать данные как набор вложенных объектов, но доступ к ним будет зависеть от наличия пространств имен в самом XML-файле.

Решение №2: Последовательное чтение через объект ЧтениеXML

Проанализируем наиболее надежный и производительный способ, который рекомендуется для работы с внешними файлами в УТ 11.5. Если файл имеет большой объем или сложную структуру, лучше всего использовать последовательный перебор узлов. Это исключает ошибки типизации XDTO и экономит оперативную память.

Рассмотрим алгоритм реализации такого чтения по шагам:

  1. Создаем объект ЧтениеXML и открываем файл.
  2. Запускаем цикл Пока ЧтениеXML.Прочитать().
  3. Внутри цикла анализируем ТипУзла (начало элемента, текст, конец элемента) и Имя текущего узла.
  4. Вручную заполняем нужные нам объекты 1С (например, ТаблицуЗначений).

Пример реализации ручного парсинга:


ТЗ_Товары = Новый ТаблицаЗначений;
ТЗ_Товары.Колонки.Добавить("Код");
ТЗ_Товары.Колонки.Добавить("Наименование");

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);

Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        ИмяУзла = Чтение.Имя;
        
        Если ИмяУзла = "Товар" Тогда
            НоваяСтрока = ТЗ_Товары.Добавить();
            // Читаем атрибуты, если они есть
            Если Чтение.КоличествоАтрибутов() > 0 Тогда
                Пока Чтение.ПрочитатьАтрибут() Цикл
                    // Обработка атрибутов
                КонецЦикла;
            КонецЕсли;
        КонецЕсли;
        
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
        // Наполняем данными колонки в зависимости от текущего ИмениУзла
        Если ИмяУзла = "Код" Тогда
            НоваяСтрока.Код = Чтение.Значение;
        ИначеЕсли ИмяУзла = "Наименование" Тогда
            НоваяСтрока.Наименование = Чтение.Значение;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Чтение.Закрыть();

Решение №3: Чтение с указанием типа (если файл от другой 1С)

Если вы точно знаете, что XML-файл был выгружен из другой базы 1С как ТаблицаЗначений, но при чтении все равно возникает ошибка, попробуйте явно указать тип при вызове метода ПрочитатьXML. Однако помните, что это сработает только при наличии в файле корректных определений пространств имен v8.


ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);

Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
// Пытаемся принудительно типизировать результат
Попытка
    ТЗ = Сериализатор.ПрочитатьXML(ЧтениеXML, Тип("ТаблицаЗначений"));
Исключение
    // Если здесь возникла ошибка, значит формат файла не соответствует 
    // внутреннему стандарту обмена 1С
КонецПопытки;

ЧтениеXML.Закрыть();

Рекомендации и выводы

Проанализировав ситуацию, мы можем выделить несколько ключевых правил для работы с XML в УТ 11.5:

Выяснив причину ошибки "Тип: {", мы понимаем, что она сигнализирует о невозможности системы автоматически сопоставить узел XML с типом данных в метаданных 1С. Используя один из предложенных выше способов, вы сможете успешно загрузить данные о товарах в вашу информационную базу.

← На главную