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

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

Как читать XML-файл в 1С

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

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

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

Какие средства чтения XML есть в платформе 1С

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

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

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

Третий инструмент — сериализация XDTO (СериализаторXDTO, ФабрикаXDTO). Она преобразует XML напрямую в объекты 1С: ссылки, значения примитивных типов, таблицы значений. Это штатный механизм обмена между информационными базами и работы с веб-сервисами, но он требует, чтобы XML соответствовал ожидаемой схеме типов.

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

ЧтениеXML

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

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

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

СериализаторXDTO

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

Как прочитать XML последовательно через ЧтениеXML

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

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

Пока Чтение.Прочитать() Цикл
	Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
		ИмяУзла = Чтение.Имя;
	ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
		ЗначениеУзла = Чтение.Значение;
	КонецЕсли;
КонецЦикла;

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

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

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

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

Как разобрать сложный XML через ПостроительDOM

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

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

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

УзлыТоваров = Документ.ПолучитьЭлементыПоИмени("Товар");
Для Каждого Узел Из УзлыТоваров Цикл
	Артикул = Узел.ПолучитьАтрибут("Артикул");
КонецЦикла;

У каждого элемента DOM доступны свойства ДочерниеУзлы, РодительскийУзел, Атрибуты и метод ПолучитьАтрибут(). Текстовое содержимое элемента извлекается через свойство ТекстовоеСодержимое либо обход дочерних текстовых узлов — поведение зависит от того, есть ли внутри элемента вложенные теги.

Главное ограничение подхода — память. DOM хранит весь документ как дерево объектов, и файл в несколько сотен мегабайт может привести к аварийному завершению сеанса. Для таких объёмов возвращайтесь к последовательному чтению или разбивайте файл на части.

Как читать XML через сериализацию XDTO

Если XML получен из другой базы 1С (например, через план обмена или выгрузку в формате EnterpriseData), разумнее не разбирать его вручную, а воспользоваться сериализатором. Метод СериализаторXDTO.ПрочитатьXML(Чтение) сразу возвращает объект 1С — ссылку на элемент справочника, документ или значение примитивного типа.

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

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

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

Наиболее частая техническая проблема — кодировка файла. XML-документы встречаются в UTF-8, UTF-16 и windows-1251; кодировка указывается в объявлении <?xml version="1.0" encoding="..."?>. ЧтениеXML по умолчанию определяет её автоматически, но при чтении из строки или потока кодировку иногда приходится задавать явно, иначе кириллица превращается в нечитаемые символы.

Вторая типичная сложность — пространства имён. В файлах электронного документооборота и веб-сервисов элементы часто имеют префиксы вида ns:Документ. При поиске через DOM метод ПолучитьЭлементыПоИмени() требует локального имени, но сравнение свойства ИмяУзла вернёт имя с префиксом — это нужно учитывать в условиях разбора.

Третий момент — типы данных. Все значения из XML приходят строками. Даты в формате ISO 8601 преобразуются функцией XMLЗначение(Тип("Дата"), СтрокаДаты), числа с разделителем-точкой — через Число() после замены разделителя, булевы значения «true/false» — явным сравнением. Пропуск преобразования приводит к ошибкам при записи в реквизиты объектов.

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

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

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

Для отладки удобно выводить прочитанные значения в сообщения или таблицу значений на форме обработки до записи в базу. Такой «сухой прогон» позволяет увидеть структуру файла глазами программы и поймать несоответствия до того, как в базе появятся некорректные данные.

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

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

Количество загруженных элементов
Норма

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

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

Меньше ожидаемого — часть узлов не распознана из-за имён или пространств имён

Кириллические значения
Норма

Текст читается корректно

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

Кракозябры — неверно определена кодировка

Числа и даты
Норма

Значения соответствуют файлу и имеют нужный тип

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

Ошибки преобразования или сдвиги форматов дат

Файл после обработки
Норма

Доступен для открытия другими программами

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

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

Частые вопросы о чтении XML в 1С

Можно ли прочитать XML без прав администратора и изменения конфигурации?

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

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

Используйте метод Чтение.УстановитьСтроку(СтрокаXML) вместо ОткрытьФайл(). Дальнейший разбор идентичен. Учтите, что при чтении из строки кодировку платформа не определяет автоматически из объявления XML — при проблемах с кириллицей преобразуйте строку заранее.

Что делать, если файл очень большой и не помещается в память?

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

Почему ПолучитьЭлементыПоИмени ничего не находит, хотя элемент в файле есть?

Наиболее вероятная причина — пространства имён: элемент записан как ns:Товар, а поиск ведётся по имени «Товар» или наоборот. Проверьте фактическое имя узла через свойство ИмяУзла при обходе дерева и скорректируйте условие поиска.

Как преобразовать дату из XML в дату 1С?

Стандартный способ — функция XMLЗначение(Тип("Дата"), СтрокаИзФайла), если дата записана в формате ISO 8601 (например, 2026-03-15T10:30:00). Для нестандартных форматов разбирайте строку вручную и собирайте дату функцией Дата() с явными параметрами.

Можно ли проверить XML на соответствие схеме перед чтением?

Да, при работе через ФабрикуXDTO проверка происходит автоматически: несоответствие схеме вызовет исключение при чтении. Для ручного разбора через ЧтениеXML валидацию выполняют внешними средствами либо ограничиваются проверкой обязательных узлов в коде.

Итог

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

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