Разработка и Конфигурация · 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 сразу в объекты 1С. Идеален для обмена между базами 1С; требует соответствия схемы типов и не подходит для произвольных чужих форматов.
Как прочитать XML последовательно через ЧтениеXML
Базовый сценарий: создать объект, открыть файл, перебрать узлы в цикле, закрыть. Тип текущего узла определяется перечислением ТипУзлаXML — начало элемента, конец элемента, текст, атрибут и другие.
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\goods.xml");
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяУзла = Чтение.Имя;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
ЗначениеУзла = Чтение.Значение;
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();Внутри цикла логика строится на сочетании имени текущего элемента и его типа. Если нужно прочитать атрибуты текущего элемента, используется метод Чтение.ПолучитьАтрибут("ИмяАтрибута") или цикл по Чтение.КоличествоАтрибутов(). Значения атрибутов всегда приходят как строки — числа и даты нужно преобразовывать вручную.
Для обработки больших файлов полезно вести счётчик прочитанных элементов и периодически фиксировать транзакцию записи в базу, чтобы при сбое не потерять весь прогресс. Также рекомендуется оборачивать разбор в попытку-исключение с обязательным вызовом Чтение.Закрыть() в блоке исключения — иначе файл останется занятым процессом.
- 1Создайте объект ЧтениеXML и откройте файл методом ОткрытьФайл
- 2В цикле Пока Чтение.Прочитать() анализируйте ТипУзла и Имя
- 3Извлекайте атрибуты через ПолучитьАтрибут, текст — из Значение
- 4Преобразуйте строковые значения в числа, даты и ссылки
- 5Закройте файл методом Закрыть, включая ветку исключения
- 6Проверьте результат: количество загруженных объектов и контрольные значения
Как разобрать сложный XML через ПостроительDOM
Когда структура файла разветвлённая — например, документ содержит шапку, табличную часть и вложенные блоки контрагентов — последовательное чтение превращается в запутанный код с флагами состояния. В этом случае удобнее загрузить документ целиком в DOM и обращаться к узлам по имени.
Чтение = Новый Чтение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» — явным сравнением. Пропуск преобразования приводит к ошибкам при записи в реквизиты объектов.
Как проверить результат чтения
После загрузки данных недостаточно отсутствия ошибок — нужно убедиться, что прочитано именно то, что содержится в файле. Минимальный контроль: сравнить количество обработанных элементов с ожидаемым (например, с количеством строк в табличной части документа-источника) и выборочно сверить несколько значений.
Для отладки удобно выводить прочитанные значения в сообщения или таблицу значений на форме обработки до записи в базу. Такой «сухой прогон» позволяет увидеть структуру файла глазами программы и поймать несоответствия до того, как в базе появятся некорректные данные.
Как проверить результат
Совпадает с количеством узлов в файле
Меньше ожидаемого — часть узлов не распознана из-за имён или пространств имён
Текст читается корректно
Кракозябры — неверно определена кодировка
Значения соответствуют файлу и имеют нужный тип
Ошибки преобразования или сдвиги форматов дат
Доступен для открытия другими программами
Заблокирован — не вызван метод Закрыть
Частые вопросы о чтении 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. Всегда преобразуйте строковые значения в нужные типы, учитывайте пространства имён и закрывайте файл после чтения. Результат проверяйте по количеству элементов и контрольным значениям до записи в базу.