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

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

Текст как XML в 1С: практическое руководство по чтению и записи

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

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

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

Ниже разобраны оба механизма на практических примерах: как сформировать XML-строку, как прочитать файл, как сериализовать объект конфигурации, какие ошибки встречаются чаще всего и как проверить корректность результата до отправки данных во внешнюю систему.

Чем отличаются потоковые объекты и XDTO

Объекты ЗаписьXML и ЧтениеXML работают с XML как с последовательностью узлов: открывающий тег, атрибут, текст, закрывающий тег. Разработчик полностью контролирует структуру документа, но и отвечает за её корректность сам — платформа не проверит, закрыли ли вы элемент и в правильном ли порядке идут узлы.

XDTO (XML Data Transfer Objects) — механизм объектной сериализации. XML описывается схемой (фабрикой XDTO), и платформа автоматически преобразует объекты в XML и обратно с проверкой типов, обязательности полей и порядка элементов. Типовые конфигурации используют XDTO в планах обмена и веб-сервисах.

Сравнение подходов

ЗаписьXML / ЧтениеXML

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

XDTO

Подходит для обмена по XSD-схеме, сериализации сложных объектов, веб-сервисов. Требует фабрики XDTO и даёт ошибку при несоответствии схеме.

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

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

Как сформировать XML-строку через ЗаписьXML

Объект ЗаписьXML позволяет последовательно построить документ в памяти и получить его как строку. Основные методы: ЗаписатьНачалоЭлемента, ЗаписатьАтрибут, ЗаписатьТекст, ЗаписатьКонецЭлемента. В конце обязательно вызывается Закрыть(), который возвращает итоговую строку.

Запись = Новый ЗаписьXML;

Запись.УстановитьСтроку("UTF-8");

Запись.ЗаписатьОбъявлениеXML();

Запись.ЗаписатьНачалоЭлемента("Товары");

Для Каждого Строка Из ТаблицаТоваров Цикл

Запись.ЗаписатьНачалоЭлемента("Товар");

Запись.ЗаписатьАтрибут("Код", Строка.Код);

Запись.ЗаписатьАтрибут("Цена", Формат(Строка.Цена, "ЧГ=0"));

Запись.ЗаписатьТекст(Строка.Наименование);

Запись.ЗаписатьКонецЭлемента(); // Товар

КонецЦикла;

Запись.ЗаписатьКонецЭлемента(); // Товары

РезультатXML = Запись.Закрыть();

Метод УстановитьСтроку принимает кодировку — для обмена с российскими государственными системами и банками чаще требуется UTF-8, для некоторых старых систем — windows-1251. Несовпадение кодировки — одна из самых частых причин «кракозябр» на принимающей стороне.

Если нужно записать результат в файл, а не в строку, используется ОткрытьФайл(ПутьКФайлу, Кодировка) вместо УстановитьСтроку. Для больших выгрузок это предпочтительнее: данные пишутся на диск порциями и не занимают память целиком.

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

Объект ЧтениеXML последовательно перебирает узлы документа. Основной цикл строится на методе Прочитать(), а тип текущего узла определяется свойством ТипУзла: начало элемента, конец элемента, текст, атрибуты доступны через Имя, Значение и ПолучитьАтрибут.

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

Чтение.ОткрытьФайл(ПутьКФайлу);

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

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

И Чтение.Имя = "Товар" Тогда

КодТовара = Чтение.ПолучитьАтрибут("Код");

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

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

НаименованиеТовара = Чтение.Значение;

КонецЕсли;

КонецЦикла;

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

Главная сложность потокового чтения — контекст. Значение атрибута «Код» само по себе ничего не значит: важно, внутри какого элемента вы находитесь. Для вложенных структур ведите стек открытых элементов или флаги состояния, иначе данные из разных веток перемешаются.

Для чтения XML из строки вместо ОткрытьФайл используется УстановитьСтроку(ТекстXML). Это типичный сценарий при получении ответа от HTTP-сервиса или веб-сервиса.

Сериализация объектов конфигурации через СериализаторXDTO

Для переноса объектов базы (элементов справочников, документов, записей регистров) между однородными конфигурациями платформа предоставляет глобальный объект СериализаторXDTO. Метод ЗаписатьXML превращает объект в XML-узел, ПрочитатьXML — восстанавливает его обратно.

Запись = Новый ЗаписьXML;

Запись.УстановитьСтроку("UTF-8");

СериализаторXDTO.ЗаписатьXML(Запись, СсылкаНаОбъект.ПолучитьОбъект());

ТекстXML = Запись.Закрыть();

// Обратное преобразование

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

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

Чтение.Прочитать();

НовыйОбъект = СериализаторXDTO.ПрочитатьXML(Чтение);

НовыйОбъект.Записать();

Этот способ удобен для отладки и точечного переноса данных, но имеет ограничение: структура метаданных в базе-источнике и базе-приёмнике должна совпадать. При различиях в составе реквизитов чтение завершится ошибкой или потерей данных. Для обмена между разными конфигурациями используются планы обмена или «Конвертация данных».

Работа с XML через фабрику XDTO

Когда формат обмена задан XSD-схемой (например, требования внешней системы), создаётся пакет XDTO в конфигураторе или фабрика строится программно из файла схемы. Документ собирается как дерево объектов: создаётся объект типа, заполняются свойства, затем вызывается ФабрикаXDTO.ЗаписатьXML.

ТипДокумент = ФабрикаXDTO.Тип("http://example.org/schema", "Документ");

Документ = ФабрикаXDTO.Создать(ТипДокумент);

Документ.Номер = "0001";

Документ.Дата = ТекущаяДатаСеанса();

Запись = Новый ЗаписьXML;

Запись.УстановитьСтроку("UTF-8");

ФабрикаXDTO.ЗаписатьXML(Запись, Документ);

ТекстXML = Запись.Закрыть();

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

Порядок действий при настройке обмена через XDTO
  1. 1
    Получите XSD-схему формата от внешней системы или из документации
  2. 2
    Создайте пакет XDTO в конфигураторе и импортируйте схему
  3. 3
    Сформируйте тестовый документ программно и запишите его в XML
  4. 4
    Проверьте полученный файл валидатором по схеме
  5. 5
    Отправьте тестовый файл принимающей стороне и зафиксируйте результат
  6. 6
    Только после успешной проверки включайте обмен в рабочем режиме

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

Перед отправкой XML во внешнюю систему документ нужно проверить на двух уровнях: синтаксическая корректность (well-formed) и соответствие схеме (valid). Первое проверяется простым чтением через ЧтениеXML — если документ читается без исключения, синтаксис в порядке. Второе — валидацией по XSD, встроенной в XDTO или выполняемой внешними средствами.

Числа и даты — отдельный источник проблем. В XML число с плавающей точкой записывается с точкой, а не запятой; дата — в формате ISO 8601 вида 2026-03-15T10:30:00. Функция Формат() с региональными настройками по умолчанию может выдать запятую и пробелы, что приведёт к ошибке разбора на приёмной стороне.

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

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

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

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

Синтаксис документа
Норма

ЧтениеXML читает файл до конца без исключений

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

Ошибка «Ошибка разбора XML» с указанием строки и позиции

Кодировка
Норма

Кириллица читается корректно на принимающей стороне

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

Кракозябры или ошибка недопустимого символа

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

Точка как разделитель, дата в формате ISO

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

Запятые в числах, даты вида «15.03.2026»

Соответствие схеме
Норма

Валидация по XSD проходит без замечаний

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

Ошибки обязательных элементов и типов

Производительность и ограничения

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

Для HTTP-интеграций XML часто передаётся как тело запроса. Здесь важно согласовать заголовок Content-Type (обычно text/xml или application/xml) и кодировку с ожиданиями сервера — несовпадение приводит к ошибкам, которые трудно диагностировать, так как сам XML при этом корректен.

Итог

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

Простые и большие документы формируйте и разбирайте потоковыми объектами ЗаписьXML и ЧтениеXML. Обмен по формальной схеме и веб-сервисы делайте через XDTO с валидацией. Перед отправкой проверяйте кодировку, формат чисел и дат, соответствие схеме. Не разбирайте XML строковыми функциями и не экранируйте спецсимволы вручную.

Частые вопросы

Как прочитать XML, если заранее неизвестна его структура?

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

Чем XDTO отличается от СериализаторXDTO?

Фабрика XDTO работает с произвольными схемами и типами данных — это инструмент обмена с внешними системами. СериализаторXDTO — внутренний механизм платформы для преобразования объектов конфигурации (ссылок, документов, записей регистров) и рассчитан на однородные базы с совпадающими метаданными.

Почему принимающая система отвергает корректный XML-файл?

Чаще всего причины вне самого XML: несовпадение кодировки, наличие BOM в начале файла, неправильный заголовок Content-Type при HTTP-передаче, запятые вместо точек в числах или даты не в формате ISO. Проверяйте файл валидатором по схеме и сравнивайте с эталонным примером от принимающей стороны.

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

Пройдите по строкам в цикле и для каждой записывайте элемент через ЗаписьXML — это самый контролируемый способ. Альтернатива — преобразовать данные в структуру и использовать ЗаписьJSON с последующей конвертацией, но для XML прямой потоковый обход проще и надёжнее.

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

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

Как обработать пространства имён при чтении XML?

У объекта ЧтениеXML есть свойства URIПространстваИмен и ЛокальноеИмя. Сравнивайте узлы по локальному имени и URI отдельно, либо используйте методы с явным указанием пространства имён. При записи пространства объявляются через ЗаписатьСоответствиеПространстваИмен.