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