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

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

Как читать XML в 1С: способы, примеры и типичные ошибки

Как читать XML в 1С: ЧтениеXML, XDTO, DOM, построчный разбор. Примеры кода, работа с большими файлами, типичные ошибки кодировки и пространств имён.

XML — один из основных форматов обмена данными в экосистеме 1С: через него выгружаются справочники, документы, отчёты в контролирующие органы, файлы ЭДО и выгрузки из сторонних систем. Задача «прочитать XML» возникает у разработчика при загрузке прайсов поставщиков, обработке ответов веб-сервисов, импорте данных из других учётных программ и при разборе выгрузок конфигураций.

В платформе 1С:Предприятие есть несколько встроенных механизмов чтения XML, и выбор конкретного зависит от размера файла, наличия схемы (XSD) и того, что нужно сделать с данными дальше. Неправильный выбор подхода приводит к типичным проблемам: файл «не читается» из-за кодировки, большая выгрузка съедает всю память сервера, а данные теряются из-за неучтённых пространств имён.

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

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

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

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

Третий подход — XDTO (XML Data Transfer Objects): платформа строит объектную модель по XSD-схеме, и разработчик работает не с «голым» XML, а с типизированными объектами и свойствами. Именно так устроены штатные обмены в типовых конфигурациях (EnterpriseData, обмен с сайтами). XDTO требует схемы и уместен, когда формат файла формализован.

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

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

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

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

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

XDTO

Типизированная работа по XSD-схеме, проверка соответствия формату. Ограничение: нужна схема, выше порог входа, избыточен для разового разбора простого файла.

Потоковое чтение через объект ЧтениеXML

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

Базовый цикл чтения выглядит так: создаётся объект, вызывается метод ОткрытьФайл(), затем в цикле вызывается Прочитать(), пока он возвращает Истина. На каждой итерации проверяются ТипУзла и Имя, а для узла «НачалоЭлемента» доступны атрибуты через ЗначениеАтрибута() или ПолучитьАтрибут().

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

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

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

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

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

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

// дальше читаем вложенные узлы элемента

КонецЕсли;

КонецЕсли;

КонецЦикла;

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

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

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

Чтение XML из строки и из HTTP-ответа

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

При работе с HTTP-запросами ответ часто получают через HTTPСоединение и HTTPОтвет: тело ответа можно получить как поток (ПолучитьТелоКакПоток()) и открыть его напрямую методом ОткрытьПоток() — это избавляет от промежуточного сохранения на диск и лишнего расхода памяти на строку целиком.

Чтение через DOM: когда нужен доступ к произвольным узлам

DOM-подход строится в два шага: сначала ПостроительDOM читает XML и возвращает ДокументDOM, затем по дереву документа выполняют навигацию — через ЭлементыПоИмени, свойства ДочерниеУзлы, РодительскийУзел, а также XPath-запросы методом ВычислитьВыражениеXPath().

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

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

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

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

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

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

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

Наименование = Узел.ПолучитьЭлементыПоИмени("Наименование")[0].ТекстовоеСодержимое;

КонецЦикла;

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

Чтение через XDTO: работа по схеме

Механизм XDTO применяется, когда формат XML описан XSD-схемой: платформа проверяет соответствие файла схеме и даёт доступ к данным как к свойствам объектов. Фабрика XDTO строится либо из пакетов конфигурации, либо из внешней схемы через СоздатьФабрикуXDTO().

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

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

Фабрика = СоздатьФабрикуXDTO("C:\Schemas\order.xsd");

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

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

Для Каждого Строка Из ОбъектXDTO.Товары.Строка Цикл

Сообщить(Строка.Наименование + " — " + Строка.Количество);

КонецЦикла;

Преимущество XDTO — валидация: если файл не соответствует схеме (отсутствует обязательный элемент, неверный тип данных), платформа выдаст ошибку ещё на этапе чтения. Это избавляет от написания собственных проверок структуры. Обратная сторона — жёсткая привязка к схеме: малейшее отклонение формата поставщика от XSD приводит к отказу чтения, поэтому для «плавающих» форматов сторонних систем XDTO часто не подходит.

Кодировка, пространства имён и другие нюансы формата

Самая частая причина «нечитаемого» файла — кодировка. XML-документы встречаются в UTF-8, UTF-16 и windows-1251 (старые выгрузки российских систем). Если в объявлении файла указана кодировка, платформа обычно определяет её сама, но при чтении файлов без корректного объявления или с BOM-несоответствием кодировку стоит задать явно вторым параметром метода ОткрытьФайл().

Вторая типичная ловушка — пространства имён. Если в файле элементы объявлены с префиксом (например, <ns:Товар>), то свойство Имя у ЧтениеXML вернёт локальное имя без префикса, а URIПространстваИмен — пространство. Сравнивать узлы надёжнее по локальному имени, а не по строке с префиксом, потому что префикс в разных файлах одного формата может отличаться.

Третий нюанс — секции CDATA и текстовое содержимое. Текст внутри элемента читается как отдельный узел типа Текст, и если разработчик ожидает текст сразу после начала элемента, а там оказался вложенный элемент или комментарий, логика разбора ломается. Устойчивый разбор всегда проверяет тип текущего узла, а не предполагает фиксированную последовательность.

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

После разбора файла нужно убедиться, что данные прочитаны полностью и корректно. Минимальный набор проверок: количество обработанных элементов соответствует ожиданиям (или контрольной сумме из шапки файла, если она есть), обязательные поля заполнены, значения попадают в допустимые диапазоны. Результаты загрузки стоит фиксировать в журнале: сколько строк прочитано, сколько записано, какие пропущены и почему.

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

Типичные ошибки при чтении XML в 1С
01
Чтение большого файла целиком в строку или DOM — перерасход памяти и падение рабочего процесса сервера
02
Сравнение имён узлов с учётом префикса пространства имён — разбор ломается на файлах с другим префиксом
03
Отсутствие Чтение.Закрыть() при исключении — файл остаётся заблокированным до конца сеанса
04
Прямое преобразование строк к датам и числам без учёта формата — значения теряются или искажаются
05
Отсутствие протокола загрузки — при частичном сбое невозможно понять, какие данные попали в базу

Практические рекомендации по надёжной загрузке

Для промышленных загрузок выработайте единый шаблон: потоковое чтение, обработка порциями с транзакциями на разумное число объектов (а не одна транзакция на весь файл и не транзакция на каждую строку), протоколирование в регистр сведений или файл журнала. Такой подход позволяет перезапускать загрузку после сбоя без ручного разбора последствий.

Перед записью в базу проверяйте входные данные на критичность: файл с неожиданной корневой структурой лучше отклонить целиком, чем загрузить наполовину. Если загрузка выполняется регламентным заданием на сервере, убедитесь, что файл доступен именно с сервера 1С, а не только с клиентской машины, — путь вида «C:\...» на сервере указывает на диск сервера.

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

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

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

Совпадает с контрольным числом из файла или ожидаемым объёмом

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

Прочитано меньше — вероятно, разбор оборвался или часть узлов не распознана

Обязательные поля объектов
Норма

Все ключевые реквизиты заполнены значениями из файла

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

Пустые артикулы, даты, суммы — значит, атрибуты или узлы читались неправильно

Протокол загрузки
Норма

Есть записи по каждой пропущенной строке с причиной

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

Протокол пуст при явно неполной загрузке — ошибки теряются

Итог

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

Основной инструмент чтения XML в 1С — потоковый объект ЧтениеXML; DOM берите для небольших файлов со сложной структурой, XDTO — при наличии XSD-схемы. Всегда закрывайте чтение, проверяйте типы узлов, учитывайте кодировку и пространства имён, а результат загрузки фиксируйте в протоколе.

Частые вопросы

Как прочитать XML-файл, если неизвестна его кодировка?

Сначала откройте файл без указания кодировки — платформа обычно определяет её по объявлению XML или метке BOM. Если текст читается с искажениями, откройте файл в текстовом редакторе, посмотрите фактическую кодировку и укажите её явно вторым параметром метода ОткрытьФайл, например КодировкаТекста.UTF8 или КодировкаТекста.ANSI.

Чем отличается ПолучитьАтрибут от ЗначениеАтрибута у ЧтениеXML?

Оба метода возвращают значение атрибута текущего элемента по имени. Разница в поведении при отсутствии атрибута: ПолучитьАтрибут возвращает Неопределено, что удобно для проверки наличия, тогда как ЗначениеАтрибута возвращает пустую строку. Для необязательных атрибутов безопаснее использовать ПолучитьАтрибут с проверкой на Неопределено.

Можно ли читать XML напрямую из архива ZIP?

Да. Сначала извлеките файл из архива объектом ЧтениеZipФайла во временный каталог или получите поток, затем откройте его стандартным ЧтениеXML. Метод ОткрытьПоток позволяет читать XML из потока без сохранения на диск, если извлечение выполняется в поток.

Почему Прочитать() выдаёт ошибку «Ошибка разбора XML»?

Чаще всего файл повреждён (обрезан при передаче), содержит недопустимые символы или незакрытые теги. В тексте исключения указывается позиция ошибки — откройте файл в редакторе и посмотрите это место. Если файл формирует сторонняя система, передайте ей информацию о позиции сбоя. Иногда помогает предварительная очистка управляющих символов в начале файла.

Как пропустить часть XML-документа, которая не нужна?

У ЧтениеXML есть метод Пропустить() — он переносит позицию чтения на узел, следующий за концом текущего элемента, не разбирая его содержимое. Это полезно, когда в файле есть крупные блоки (например, вложенные изображения или история), которые не участвуют в загрузке.

Что выбрать для разбора ответа веб-сервиса: ЧтениеXML или XDTO?

Если сервис предоставляет WSDL/XSD-описание и вы подключили его как WS-ссылку или фабрику XDTO, используйте XDTO — получите типизированные объекты и валидацию. Если ответ имеет простую или нестабильную структуру без формальной схемы, надёжнее потоковое ЧтениеXML с ручным разбором нужных узлов.