К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как прочитать XML в 1С: практическое руководство с примерами кода

Способы прочитать XML в 1С: последовательное чтение через ЧтениеXML, DOM-модель, XDTO-сериализация. Примеры кода, ошибки, проверка результата.

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

Выбор способа зависит от задачи. Если файл большой и нужна экономия памяти — используют ЧтениеXML. Если структура документа сложная и требуется свободная навигация по узлам — удобнее DOM. Если XML описан схемой и соответствует объектам конфигурации — рациональнее сериализация через XDTO или универсальные функции ПрочитатьXML.

Ниже разобраны все три подхода с рабочими примерами кода, типичными ошибками и способами проверки результата. Примеры написаны на встроенном языке 1С и работают в управляемых и обычных формах, на клиенте (с ограничениями) и на сервере.

Способы чтения XML в 1С: какой выбрать

Платформа 1С:Предприятие предлагает несколько встроенных механизмов, и у каждого есть своя область применения. Неправильный выбор приводит либо к избыточному расходу памяти, либо к громоздкому коду, который трудно сопровождать.

Сравнение способов чтения XML

ЧтениеXML (потоковое)

Подходит для больших файлов и простой последовательной обработки. Минимальный расход памяти, но навигация только вперёд — вернуться к предыдущему узлу нельзя.

DOM (ЧтениеDOM + ПостроительDOM)

Весь документ загружается в память как дерево узлов. Удобен для сложных структур и произвольного доступа, но на больших файлах расходует много памяти.

ПрочитатьXML / XDTO-сериализация

Преобразует XML сразу в объекты конфигурации (справочники, документы). Используется для обмена между базами 1С; требует, чтобы XML соответствовал формату сериализации платформы.

Для произвольного XML из внешних систем (банки, поставщики, государственные сервисы) чаще всего подходит именно ЧтениеXML — он не требует описания схемы и корректно обрабатывает файлы любого размера.

Чтение XML через объект ЧтениеXML: базовый пример

Объект ЧтениеXML работает как курсор: он последовательно перемещается по узлам документа, и на каждой итерации вы анализируете тип текущего узла, его имя и значение. Основные типы узлов — НачалоЭлемента, КонецЭлемента и Текст.

Типовой цикл чтения файла выглядит так:

Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл("C:\Обмен\Товары.xml");

Пока Чтение.Прочитать() Цикл

Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

ИмяУзла = Чтение.Имя;

ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда

ЗначениеУзла = Чтение.Значение;

ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

// Завершение обработки элемента

КонецЕсли;

КонецЦикла;

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

Если XML находится не в файле, а в строковой переменной (например, получен из веб-сервиса), используйте метод УстановитьСтроку() вместо ОткрытьФайл():

Чтение = Новый ЧтениеXML;

Чтение.УстановитьСтроку(СтрокаXML);

Пока Чтение.Прочитать() Цикл

// обработка узлов

КонецЦикла;

Обязательно вызывайте Закрыть() после завершения чтения файла — иначе файл останется заблокированным, и другие процессы не смогут с ним работать.

Чтение атрибутов и значений элементов

Атрибуты элемента доступны, когда курсор стоит на узле типа НачалоЭлемента. Получить их можно по имени через ПолучитьАтрибут() или перебором по индексу через КоличествоАтрибутов() и ЗначениеАтрибута().

Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

Если Чтение.Имя = "Номенклатура" Тогда

Код = Чтение.ПолучитьАтрибут("Код");

Наименование = Чтение.ПолучитьАтрибут("Наименование");

КонецЕсли;

КонецЕсли;

Если запрошенного атрибута нет, ПолучитьАтрибут() вернёт Неопределено — это нужно учитывать, чтобы не получить ошибку приведения типов при дальнейшей обработке. Для обязательных атрибутов добавляйте явную проверку и осмысленное сообщение об ошибке с указанием номера строки XML, который возвращает свойство Чтение.НомерСтроки.

Значение текстового узла всегда читается как строка. Числа, даты и булево преобразуйте самостоятельно с учётом формата источника — например, дату из ISO-строки удобно разбирать через XMLЗначение(Тип("Дата"), СтрокаДаты).

Обход вложенных структур

Когда элементы вложены друг в друга (например, документ содержит табличную часть), ведите учёт текущего контекста: запоминайте имя открытого элемента и сбрасывайте его на КонецЭлемента. Для глубокой вложенности удобно использовать стек в виде массива, куда добавляются имена открывающихся узлов.

Чтение XML через DOM-модель

DOM-подход загружает весь документ в память и представляет его как дерево объектов. Это удобно, когда нужно многократно обращаться к разным веткам или когда порядок узлов неизвестен заранее.

Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл("C:\Обмен\Заказ.xml");

Построитель = Новый ПостроительDOM;

ДокументDOM = Построитель.Прочитать(Чтение);

УзлыТоваров = ДокументDOM.ПолучитьЭлементыПоИмени("Товар");

Для Каждого Узел Из УзлыТоваров Цикл

Наименование = Узел.ПолучитьАтрибут("Наименование");

// обработка узла

КонецЦикла;

Метод ПолучитьЭлементыПоИмени() возвращает все элементы с заданным именем независимо от уровня вложенности — это избавляет от ручного обхода дерева. Для точечной навигации используйте свойства РодительскийУзел, ДочерниеУзлы и ПервыйДочерний.

Чтение XML в объекты конфигурации через ПрочитатьXML

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

Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл("C:\Обмен\Документы.xml");

Пока ВозможностьЧтенияXML(Чтение) Цикл

Объект = ПрочитатьXML(Чтение);

Если ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда

Объект.Записать();

КонецЕсли;

КонецЦикла;

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

Функция ВозможностьЧтенияXML() проверяет, что курсор стоит на начале корректного XML-представления объекта. Этот способ работает только с форматом сериализации платформы — произвольный XML от внешних систем он не прочитает. Для обмена по фабрике XDTO (EnterpriseData и подобные форматы) используются пакеты XDTO и объекты ЧтениеXDTO через фабрику ФабрикаXDTO.

Перед записью прочитанных объектов в базу проверяйте, существует ли уже объект с такой ссылкой или ключевыми реквизитами. Иначе повторная загрузка файла создаст дубли элементов справочников, которые потом придётся искать и сворачивать вручную.
ПЗ
Практическое замечание

Обработка ошибок и проверка результата

Любое чтение XML следует оборачивать в конструкцию Попытка ... Исключение ... КонецПопытки. Типичные причины ошибок: некорректный синтаксис XML, несовпадение кодировки, отсутствие файла по указанному пути, неожиданная структура документа.

Попытка

Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл(ИмяФайла);

// чтение данных

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

Исключение

Сообщить("Ошибка чтения XML: " + ОписаниеОшибки());

КонецПопытки;

Кодировка файла определяется объявлением XML (<?xml version="1.0" encoding="UTF-8"?>). Если источник отдаёт файл в устаревшей кодировке без корректного объявления, русские символы превратятся в нечитаемые знаки. В таком случае прочитайте файл как текст с явным указанием кодировки через ЧтениеТекста, а затем передайте строку в УстановитьСтроку().

Контрольные точки

Как проверить результат

Количество обработанных элементов
Норма

Совпадает с количеством записей в файле-источнике

Тревожный признак

Часть элементов пропущена — проверьте логику вложенности и условия фильтрации

Значения реквизитов
Норма

Числа, даты и строки соответствуют данным в XML

Тревожный признак

Смещение значений между полями — признак неверного порядка чтения узлов

Сообщения об ошибках
Норма

Загрузка завершилась без исключений

Тревожный признак

Ошибки синтаксиса XML или приведения типов — файл повреждён или структура не соответствует ожиданиям

Типичные ошибки при чтении XML

Типичные ошибки
01
Чтение значения элемента вне узла Текст: свойство Значение заполнено только на узлах типа Текст, на НачалоЭлемента оно пустое — данные теряются.
02
Отсутствие вызова Закрыть(): файл остаётся заблокированным, повторная обработка или удаление файла завершаются ошибкой.
03
Игнорирование пространств имён: при наличии префиксов свойство Имя возвращает локальное имя, а сравнение с полным именем не срабатывает.
04
Отсутствие проверки существования файла перед ОткрытьФайл(): обработка падает с неинформативной ошибкой вместо понятного сообщения.
05
Загрузка всего файла в память через DOM при больших объёмах: сеанс завершается аварийно по нехватке памяти.

Ещё одна частая проблема — сравнение имён узлов с учётом регистра. XML чувствителен к регистру: элементы Товар и товар — разные узлы. Если источник нестабилен в написании, приводите имя к одному регистру через НРег() перед сравнением.

При обработке в цикле с записью в базу выполняйте запись порциями внутри транзакции или фиксируйте транзакцию на каждый логический блок. Ошибка в середине файла не должна оставлять базу в частично загруженном состоянии без возможности понять, что уже записано.

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

Часто задаваемые вопросы

Как прочитать XML, полученный из веб-сервиса, без сохранения в файл?

Используйте метод УстановитьСтроку(): передайте в неё текст ответа HTTP-запроса, полученный через HTTPСоединение и HTTPОтвет.ПолучитьТелоКакСтроку(). Дальнейшая обработка ничем не отличается от чтения файла — тот же цикл Прочитать() с анализом узлов.

Что делать, если в XML используются пространства имён?

Свойство Имя объекта ЧтениеXML возвращает локальное имя без префикса, а URI пространства доступен через свойство URIПространстваИмен. Сравнивайте узлы по локальному имени, а при необходимости дополнительно проверяйте URI, чтобы различать одноимённые элементы из разных пространств.

Можно ли читать XML на тонком клиенте без сервера?

Да, объект ЧтениеXML доступен на тонком клиенте. Однако файловые операции требуют расширения работы с файлами в браузере или передачи файла на сервер. На практике разбор больших XML выполняют в серверной процедуре, передавая туда содержимое файла через временное хранилище.

Как прочитать очень большой XML-файл без переполнения памяти?

Используйте только потоковое ЧтениеXML — оно обрабатывает документ по частям и не загружает его целиком. Не применяйте DOM и не накапливайте все данные в массивах: обрабатывайте и записывайте каждый логический блок сразу, периодически фиксируя транзакцию.

Почему ПрочитатьXML выдаёт ошибку на файле от внешней системы?

Функция ПрочитатьXML понимает только формат сериализации платформы 1С — XML, созданный через ЗаписатьXML или механизмы обмена. Произвольный XML от сторонних систем нужно разбирать вручную через ЧтениеXML или DOM, либо описывать его структуру XDTO-пакетом.

Как определить кодировку XML-файла перед чтением?

Кодировка указана в XML-объявлении в первой строке файла (атрибут encoding). ЧтениеXML обычно определяет её автоматически. Если объявление отсутствует или неверно, прочитайте файл объектом ЧтениеТекста с явным параметром кодировки и передайте полученную строку через УстановитьСтроку().

Итог

Что важно запомнить

Для чтения XML в 1С чаще всего достаточно объекта ЧтениеXML с циклом Прочитать() и анализом типов узлов. DOM выбирайте для сложной навигации по небольшим документам, ПрочитатьXML — только для формата сериализации платформы. Всегда закрывайте чтение, обрабатывайте исключения и проверяйте результат по количеству и содержимому загруженных данных.