Разработка и Конфигурация · 12 мин
Как прочитать XML-файл в 1С: практическое руководство с примерами
Как прочитать XML-файл в 1С: ЧтениеXML, XDTO и DOM — пошаговый разбор с примерами кода, выбором способа, обработкой ошибок и типичными проблемами.
XML — один из основных форматов обмена данными в экосистеме 1С: через него выгружаются справочники, документы, данные из сторонних систем, банковские выписки и файлы ЭДО. Поэтому задача «прочитать XML-файл» возникает у разработчика и администратора 1С постоянно. Платформа предлагает несколько встроенных механизмов, и выбор между ними определяет, насколько простым и надёжным получится код.
В распоряжении разработчика три основных подхода: потоковое чтение через объект ЧтениеXML, разбор через фабрику XDTO с типизацией данных и объектная модель документа DOM (объект ЧтениеDOM). Каждый подходит под свой сценарий: потоковое чтение — для больших файлов, XDTO — для обмена по схемам, DOM — когда нужен произвольный доступ к узлам.
Ниже разобраны все три способа с готовыми примерами кода на встроенном языке, критерии выбора, обработка ошибок и типичные проблемы: кодировки, пространства имён, большие файлы. Примеры работают на платформе 8.3 в управляемом и обычном приложении.
Какие способы чтения XML есть в платформе 1С
Платформа 1С:Предприятие 8.3 включает три штатных механизма работы с XML, и все они доступны без внешних компонентов. Первый — потоковая модель (ЧтениеXML): файл читается последовательно, узел за узлом, память расходуется минимально. Второй — объектная модель XDTO: данные читаются в типизированные объекты по схеме, что удобно для стандартных обменов. Третий — DOM: весь документ загружается в память как дерево узлов, к которым можно обращаться в любом порядке.
Дополнительно существуют вспомогательные варианты: десериализация через СериализаторXDTO для файлов, выгруженных типовыми средствами 1С (например, выгрузка конфигурации или данных), и чтение через COM-объект MSXML на Windows — но последний считается устаревшим и не работает на Linux-сервере, поэтому в новых разработках его применять не стоит.
Сравнение способов чтения XML
Подходит для больших файлов и произвольной структуры. Минимальный расход памяти, но код обхода узлов нужно писать вручную.
Подходит, когда есть схема данных или файл соответствует стандартному формату обмена. Даёт типизированные объекты, но требует корректной схемы.
Подходит для небольших файлов, когда нужен произвольный доступ к узлам и навигация по дереву. Весь документ загружается в память.
Подходит только для файлов, выгруженных средствами 1С (обмен между одинаковыми конфигурациями).
Чтение XML через объект ЧтениеXML
Объект ЧтениеXML — универсальный и самый часто используемый инструмент. Он открывает файл методом ОткрытьФайл() или строку методом УстановитьСтроку(), после чего документ обходится в цикле Пока Чтение.Прочитать() Цикл. На каждой итерации доступны свойства текущего узла: ТипУзла, Имя, Значение.
Типовой шаблон кода выглядит так:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\data.xml");
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяУзла = Чтение.Имя;
// обработка начала элемента
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
ЗначениеУзла = Чтение.Значение;
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Атрибуты текущего элемента читаются методом Чтение.ПолучитьАтрибут("ИмяАтрибута") или перебором по индексу через КоличествоАтрибутов(). Если нужно пропустить вложенный фрагмент целиком, используйте метод Пропустить() — это заметно ускоряет обход больших файлов, когда часть данных не нужна.
После завершения работы обязательно вызывайте Чтение.Закрыть(): открытый файл остаётся заблокированным для других процессов, а на сервере 1С это может привести к накоплению дескрипторов.
- 1Создайте объект: Чтение = Новый ЧтениеXML
- 2Откройте файл методом ОткрытьФайл() с указанием полного пути
- 3Организуйте цикл Пока Чтение.Прочитать() Цикл
- 4Внутри цикла проверяйте ТипУзла и обрабатывайте нужные элементы и атрибуты
- 5Закройте чтение методом Закрыть() и проверьте загруженные данные в базе
Чтение XML через фабрику XDTO
Механизм XDTO (XML Data Transfer Objects) предназначен для обмена данными по формальным схемам. Если XML-файл соответствует известной схеме — например, формату EnterpriseData, CommerceML или схеме из пакета XDTO конфигурации — файл читается одной строкой в типизированный объект.
Пример чтения объекта из файла:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\order.xml");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Чтение.Закрыть();
// доступ к свойствам объекта
НомерДокумента = ОбъектXDTO.Номер;
Здесь ФабрикаXDTO — глобальная фабрика, включающая пакеты XDTO конфигурации и стандартные схемы платформы. Если схема хранится отдельно (файл .xsd), создаётся собственная фабрика: Новый ФабрикаXDTO(НаборСхем), где набор схем загружается из XSD-файла.
Главное преимущество XDTO — строгая типизация: даты приходят как даты, числа как числа, списки как списки XDTO. Главное ограничение — файл обязан соответствовать схеме. Если сторонняя система прислала XML с отклонениями (лишние элементы, другой порядок, отсутствующие обязательные поля), чтение завершится исключением.
Чтение XML через DOM
Объектная модель документа загружает XML целиком в память в виде дерева узлов. Это удобно, когда нужно многократно обращаться к разным частям документа, искать узлы по имени или ходить «вверх-вниз» по структуре. Чтение выполняется через ПостроительDOM и ЧтениеXML:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\catalog.xml");
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Чтение.Закрыть();
Узлы = Документ.ПолучитьЭлементыПоИмени("Товар");
Для Каждого Узел Из Узлы Цикл
Наименование = Узел.ПолучитьАтрибут("Наименование");
КонецЦикла;
DOM прощает непорядок в обходе: можно сначала прочитать итоги в конце файла, потом вернуться к шапке. Расплата — расход памяти: весь документ хранится в оперативной памяти, поэтому для файлов в сотни мегабайт этот способ не подходит. Для типовых файлов обмена размером до нескольких десятков мегабайт DOM работает без проблем.
Как выбрать способ под свою задачу
Выбор определяется тремя факторами: размером файла, наличием схемы данных и характером доступа к узлам. Для больших файлов (выгрузки номенклатуры, оборотки за год) берите потоковое ЧтениеXML — оно читает файл порциями и не съедает память сервера. Для обменов по стандартным форматам с контрагентами и между конфигурациями — XDTO: типизация избавит от ручного преобразования строк в даты и числа. Для небольших файлов со сложной логикой выборки — DOM.
Отдельный случай — файлы, выгруженные типовой выгрузкой 1С (обмен между идентичными конфигурациями). Их читают через СериализаторXDTO, который восстанавливает сразу объекты конфигурации, включая ссылки. Применять его к «чужим» файлам нельзя: сериализатор понимает только собственный формат платформы.
Как выбрать способ чтения
Обработка ошибок и типичные проблемы
Самая частая проблема — кодировка. XML-декларация <?xml version="1.0" encoding="windows-1251"?> обычно учитывается платформой автоматически, но если файл сохранён без декларации или с неверным указанием кодировки, кириллица превратится в нечитаемые символы. Решение — открыть файл через ЧтениеТекста с явной кодировкой, прочитать в строку и передать в ЧтениеXML методом УстановитьСтроку().
Вторая группа проблем — пространства имён. Если элементы файла имеют префикс (<ns:Товар>), свойство Имя вернёт локальное имя без префикса, а URI пространства доступен в свойстве URIПространстваИмен. При чтении через XDTO несовпадение пространства имён со схемой приводит к тому, что свойства объекта оказываются пустыми — это характерный признак, по которому находят ошибку.
Третья группа — падение на «битых» файлах: обрезанный при передаче файл, недопустимые символы, незакрытые теги. Оборачивайте чтение в попытку-исключение и логируйте номер строки: у ЧтениеXML есть свойства НомерСтроки и ПозицияВСтроке, которые показывают, где именно парсер споткнулся.
Попытка
Чтение.ОткрытьФайл(ИмяФайла);
Пока Чтение.Прочитать() Цикл
// обработка узлов
КонецЦикла;
Исключение
Сообщить("Ошибка в строке " + Чтение.НомерСтроки
+ ": " + ОписаниеОшибки());
КонецПопытки;
Проверка результата чтения
После загрузки убедитесь, что данные действительно попали в базу, а не потерялись по пути. Минимальный набор проверок: количество прочитанных элементов совпадает с ожидаемым (например, с количеством строк в файле-источнике, если оно известно), обязательные поля заполнены, ссылки на справочники разрешились — то есть поиск по коду или наименованию дал существующий элемент, а не пустую ссылку.
Полезно вести протокол загрузки: сколько объектов создано, сколько обновлено, сколько пропущено с ошибками и по какой причине. Для регламентных загрузок записывайте протокол в журнал регистрации или в специальный регистр сведений — это позволит разобрать инцидент, не запуская загрузку повторно в отладчике.
Как проверить результат загрузки
Совпадает с количеством элементов в файле
Часть элементов пропущена без записи в протокол
Все найдены, поля ссылок заполнены
Пустые ссылки или созданные дубли элементов
Корректные типы, даты в разумном диапазоне
Даты как строки, числа с потерянной дробной частью
Есть записи по каждому объекту или сводные итоги
Протокол пуст при наличии ошибок
Частые вопросы
Как прочитать XML из строки, а не из файла?
Создайте объект ЧтениеXML и вместо ОткрытьФайл() вызовите метод УстановитьСтроку(СтрокаXML). Дальнейший обход узлов ничем не отличается от чтения файла. Этот приём используют при получении XML из веб-сервиса, HTTP-запроса или поля базы данных.
Как прочитать большой XML-файл, не загружая его в память целиком?
Используйте потоковое ЧтениеXML — оно читает документ последовательно и не хранит дерево в памяти. Дополнительно пропускайте ненужные ветки методом Пропустить() и обрабатывайте записи порциями, записывая данные в базу транзакциями по несколько сотен объектов.
Почему при чтении через XDTO свойства объекта пустые, хотя данные в файле есть?
Чаще всего не совпадает пространство имён: в файле элементы относятся к одному URI, а в пакете XDTO конфигурации — к другому. Проверьте атрибут xmlns в корневом элементе файла и сравните с целевым пространством имён пакета. Вторая причина — файл не соответствует схеме по структуре, и фабрика молча пропускает неизвестные элементы.
Как узнать кодировку XML-файла и прочитать его правильно?
Кодировка указана в XML-декларации в первой строке файла (encoding="..."). Платформа обычно учитывает её автоматически. Если декларации нет или она неверна, прочитайте файл через ЧтениеТекста с явным указанием кодировки (КодировкаТекста.UTF8 или ANSI) и передайте текст в ЧтениеXML методом УстановитьСтроку().
Можно ли прочитать XML на сервере 1С, если файл лежит на клиенте?
Напрямую нет — сервер не видит диски клиента. Сначала передайте файл на сервер: поместите его во временное хранилище через НачатьПомещениеФайла() или прочитайте содержимое на клиенте в строку и передайте строку в серверную процедуру. На сервере строка читается через УстановитьСтроку().
Чем чтение через СериализаторXDTO отличается от ФабрикиXDTO?
СериализаторXDTO восстанавливает объекты конфигурации (справочники, документы) со ссылками и предопределёнными элементами, но понимает только файлы, выгруженные средствами самой 1С. ФабрикаXDTO работает с произвольными XML по схеме, но возвращает объекты данных XDTO, которые нужно вручную преобразовывать в объекты базы.
Что важно запомнить
Основной инструмент чтения XML в 1С — объект ЧтениеXML с циклом Прочитать(). Для файлов по схеме используйте ФабрикуXDTO, для произвольной навигации по небольшим файлам — DOM. Всегда закрывайте чтение, оборачивайте код в попытку-исключение и проверяйте результат по количеству объектов и заполненности ссылок.