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

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

Как прочитать XML файл в 1С 8.3: пошаговое руководство с примерами

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

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

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

Ниже разобраны практические варианты с готовыми фрагментами кода, способы проверить корректность разбора и типичные ошибки, из-за которых файл «не читается», хотя формально он валиден.

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

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

Второй механизм — DOM: связка ЧтениеXML + ПостроительDOM строит в памяти дерево документа, к которому можно обращаться произвольно по путям вида Элемент.ДочерниеУзлы. Удобно для небольших файлов со сложной вложенностью, но на больших документах расход памяти растёт пропорционально размеру файла.

Третий вариант — ФабрикаXDTO: платформа сама сопоставляет XML-элементы типам по схеме (XSD) и возвращает готовые объекты. Так читают, например, файлы обмена EnterpriseData или выгрузки конфигураций. Четвёртый — универсальная обработка «Универсальный обмен данными в формате XML» из поставки «Конвертации данных», когда писать код вообще не требуется.

Сравнение вариантов

ЧтениеXML

Потоковое чтение, минимум памяти, подходит для больших файлов. Требует ручного обхода узлов и аккуратной проверки типов узлов.

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

Произвольный доступ к любому узлу дерева. Не подходит для очень больших файлов из-за расхода памяти.

ФабрикаXDTO

Автоматическое преобразование в объекты по схеме. Нужна XSD-схема или пакеты XDTO конфигурации; ошибки валидации возможны при несовпадении версий схемы.

Универсальная обработка обмена

Загрузка без программирования по готовым правилам. Работает только с файлами формата обмена данными 1С.

Как прочитать XML через объект ЧтениеXML

Базовый алгоритм: создать объект, открыть файл, в цикле вызывать Прочитать() и анализировать тип текущего узла. Метод возвращает Истина, пока документ не закончился. Типы узлов проверяются через перечисление ТипУзлаXML: НачалоЭлемента, КонецЭлемента, Текст и другие.

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

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

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

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

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

Если ИмяУзла = "Товар" Тогда

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

КонецЕсли;

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

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

КонецЕсли;

КонецЦикла;

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

Атрибуты читаются двумя способами: ПолучитьАтрибут("Имя") — по имени, либо перебором через КоличествоАтрибутов() и ИмяАтрибута(Индекс). Важно: атрибуты доступны только пока текущий узел — начало элемента; после перехода к следующему узлу они теряются.

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

Чтение XML из строки, из веб-сервиса и из макета

XML пришёл строкой

Если XML получен из HTTP-запроса, веб-сервиса или хранилища значения, файл создавать не нужно. Метод УстановитьСтроку() загружает XML напрямую из строковой переменной:

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

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

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

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

КонецЦикла;

Такой же приём работает для текста, прочитанного из макета конфигурации или из текстового документа через ЧтениеТекста. Учтите кодировку: если файл в UTF-8 с BOM или в windows-1251, при чтении через ЧтениеТекста кодировку нужно указать явно, иначе кириллица превратится в нечитаемые символы ещё до разбора XML.

Чтение на сервере и на клиенте

В клиент-серверном режиме файловые операции обычно выполняются на сервере: путь C:\Обмен\file.xml в серверном коде — это диск сервера 1С, а не компьютера пользователя. Чтобы прочитать файл с машины пользователя, его сначала передают на сервер через ПоместитьВоВременноеХранилище либо читают в тонком клиенте с предварительным подключением расширения работы с файлами.

Чтение XML через ПостроительDOM

Когда структура файла сложная и нужно обращаться к узлам в произвольном порядке, удобнее построить дерево документа. Построитель читает весь XML целиком и возвращает ДокументDOM, по которому можно ходить через ДочерниеУзлы, ПервыйДочерний, ЭлементыПоИмени:

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

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

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

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

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

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

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

КонецЦикла;

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

Чтение типизированных XML через ФабрикаXDTO

Если XML соответствует известной схеме — например, формату обмена EnterpriseData, файлу выгрузки конфигурации или схеме поставщика, — разбор сводится к одной строке. Фабрика проверяет документ по схеме и возвращает объект XDTO с типизированными свойствами:

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

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

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

НомерДокумента = ОбъектXDTO.Body.Document.Number;

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

Проверка результата и типичные ошибки

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

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

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

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

Совпадает с числом строк/объектов в исходном файле

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

Ноль или меньше ожидаемого — цикл завершился раньше времени

Значения строковых полей
Норма

Кириллица читается нормально

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

Кракозябры — неверная кодировка на этапе получения строки

Даты и числа
Норма

Приводятся к типам Дата и Число без ошибок

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

Все значения остались строками — нужна явная конвертация или XDTO

Состояние файла после чтения
Норма

Файл можно удалить или переименовать

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

Файл заблокирован — не вызван метод Закрыть()

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

Можно ли прочитать XML в 1С без программирования?

Да, если файл имеет формат обмена данными 1С — используйте обработку «Универсальный обмен данными в формате XML». Для произвольных XML от сторонних систем без кода не обойтись: структуру файла нужно описать в алгоритме загрузки.

Чем отличается ЧтениеXML от ФабрикиXDTO?

ЧтениеXML — низкоуровневый потоковый парсер: вы сами обходите узлы и интерпретируете значения как строки. ФабрикаXDTO работает по схеме: сразу возвращает типизированный объект с датами, числами и вложенными структурами, но требует соответствия файла схеме.

Как прочитать большой XML файл, не загружая его целиком в память?

Используйте только ЧтениеXML с последовательным циклом Прочитать(). Обрабатывайте каждый элемент сразу и не накапливайте их в массиве — записывайте порциями в базу. ПостроительDOM и ФабрикаXDTO для таких файлов не подходят.

Почему ПолучитьАтрибут возвращает Неопределено?

Атрибуты доступны только на узле типа НачалоЭлемента. Если вызвать ПолучитьАтрибут после перехода к тексту или следующему элементу, вернётся Неопределено. Также проверьте регистр и пространство имён — имя атрибута чувствительно к регистру.

Как обработать XML с пространствами имён (префиксами вида ns:)?

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

Можно ли прочитать XML в веб-клиенте?

Да, ЧтениеXML работает в веб-клиенте, но файл сначала нужно передать на сервер через механизм временного хранилища, так как прямой доступ к файловой системе пользователя из веб-клиента ограничен.

Итог

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

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