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

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

Формат XML: как создать XML-файл в 1С 8.3

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

Формат XML в 1С 8.3 используется повсеместно: обмен с банками, выгрузка отчётности, интеграция с сайтами и сторонними системами, перенос данных между базами. Платформа предлагает несколько способов сформировать XML-документ — от низкоуровневой записи тегов через объект ЗаписьXML до высокоуровневой сериализации через XDTO-пакеты. Выбор подхода зависит от того, есть ли у вас схема (XSD) и насколько сложна структура документа.

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

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

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

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

ЗаписьXML

Подходит для любых произвольных структур без схемы. Требует аккуратности: порядок открытия и закрытия элементов контролируете вы сами.

DOM (ДокументDOM)

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

Сериализация XDTO

Оптимален при наличии XSD-схемы: валидация структуры встроена. Без схемы избыточен.

ЗаписатьXML (сериализация объектов)

Для переноса данных между информационными базами 1С. Не подходит для обмена с внешними системами, ожидающими свой формат.

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

Создание XML через объект ЗаписьXML

Объект ЗаписьXML создаётся командой Новый ЗаписьXML. Далее нужно указать, куда писать результат: в файл методом ОткрытьФайл("ПутьКФайлу", "UTF-8") или в строку методом УстановитьСтроку("UTF-8"). Второй параметр — кодировка; для большинства интеграций используют UTF-8.

Документ формируется последовательно: ЗаписатьОбъявлениеXML() добавляет строку <?xml version="1.0" encoding="UTF-8"?>, затем методами ЗаписатьНачалоЭлемента, ЗаписатьАтрибут, ЗаписатьТекст и ЗаписатьКонецЭлемента строится структура. Завершает работу метод Закрыть() — без него файл может остаться пустым или обрезанным, так как данные буферизуются.

bsl
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Exchange\goods.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Товары");
Для Каждого Строка Из ТаблицаТоваров Цикл
    Запись.ЗаписатьНачалоЭлемента("Товар");
    Запись.ЗаписатьАтрибут("Код", Строка(Строка.Код));
    Запись.ЗаписатьНачалоЭлемента("Наименование");
    Запись.ЗаписатьТекст(Строка.Наименование);
    Запись.ЗаписатьКонецЭлемента(); // Наименование
    Запись.ЗаписатьКонецЭлемента(); // Товар
КонецЦикла;
Запись.ЗаписатьКонецЭлемента(); // Товары
Запись.Закрыть();

Если XML нужен не в файле, а в переменной (например, для отправки по HTTP), замените ОткрытьФайл на УстановитьСтроку("UTF-8"), а после Закрыть() получите текст: Результат = Запись.Закрыть(); — метод возвращает сформированную строку.

Запись атрибутов, пространств имён и CDATA

Атрибут записывается сразу после открытия элемента и до записи текста или дочерних элементов — иначе платформа вызовет исключение. Пространства имён задаются вторым и третьим параметрами ЗаписатьНачалоЭлемента(Имя, URIПространстваИмен) либо через ЗаписатьСоответствиеПространстваИмен. Для текста со спецсимволами, который не должен экранироваться, используйте ЗаписатьСекциюCDATA.

Формирование XML через XDTO по схеме

Механизм XDTO (XML Data Transfer Objects) работает от схемы: вы загружаете XSD в конфигурацию как объект метаданных «XDTO-пакет» или читаете схему программно через Новый ЧтениеXML и ПостроительXDTO. После этого структура документа описывается как дерево объектов, а платформа сама контролирует типы, обязательность и порядок элементов.

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

bsl
Фабрика = СоздатьФабрикуXDTO("C:\Schemas\order.xsd");
ТипЗаказ = Фабрика.Тип("http://example.org/order", "Заказ");
Заказ = Фабрика.Создать(ТипЗаказ);
Заказ.Номер = "А-1024";
Заказ.Дата = ТекущаяДатаСеанса();
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Exchange\order.xml", "UTF-8");
Фабрика.ЗаписатьXML(Запись, Заказ);
Запись.Закрыть();

Если конфигурация уже содержит нужный XDTO-пакет (например, в типовых решениях есть пакеты для обмена с банками и ЭДО), фабрику создавать из файла не нужно — используйте глобальное свойство ФабрикаXDTO, которая включает все пакеты конфигурации.

Сериализация объектов 1С: справочники и документы в XML

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

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

Куда выгружать: файл, строка, поток

Метод ОткрытьФайл — самый простой вариант, но у него есть нюанс: путь должен быть доступен тому контексту, где выполняется код. В клиент-серверном режиме код на сервере пишет на диск сервера, а не на компьютер пользователя. Чтобы передать файл пользователю, сформируйте XML на сервере в строку или во временное хранилище, а на клиенте сохраните через диалог или ПолучитьФайл.

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

Порядок действий для выгрузки в файл
  1. 1
    Создайте объект: Запись = Новый ЗаписьXML
  2. 2
    Откройте файл с кодировкой UTF-8 или установите строку
  3. 3
    Запишите объявление XML и корневой элемент
  4. 4
    В цикле по данным запишите элементы, атрибуты и текст
  5. 5
    Закройте все элементы и вызовите Запись.Закрыть()
  6. 6
    Откройте файл в браузере или редакторе и проверьте структуру

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

Минимальная проверка — открыть полученный файл в браузере: современные браузеры показывают дерево XML и сообщают об ошибке разбора с указанием строки. Более строгая проверка — программное чтение обратно через ЧтениеXML в цикле Пока Чтение.Прочитать() Цикл: если документ прочитался до конца без исключения, он синтаксически корректен. При наличии XSD-схемы выполните валидацию через ФабрикаXDTO.ПроверитьXML или чтение с валидацией.

Типичные ошибки
01
Не вызван Запись.Закрыть() — файл пустой или обрезанный, потому что буфер не сброшен на диск.
02
ЗаписатьАтрибут вызван после записи текста или дочернего элемента — платформа выдаёт исключение о нарушении последовательности.
03
Несовпадение имён в ЗаписатьНачалоЭлемента и ЗаписатьКонецЭлемента по вложенности — получается невалидный документ, который не открывает ни один парсер.
04
Запись в файл на сервере с ожиданием, что он появится у пользователя, — в клиент-серверном режиме путь относится к серверу.
05
Дата и число записаны строкой в региональном формате — принимающая система не распознает значения; используйте XMLСтрока() для приведения типов.
06
Спецсимволы (&, <, >) в тексте не учтены — ЗаписьXML экранирует их сам, но при ручной склейке строк XML это приводит к битому файлу.
Контрольные точки

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

Файл открывается в браузере
Норма

Отображается дерево элементов без сообщений об ошибке

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

Браузер показывает ошибку разбора с номером строки

Программное чтение через ЧтениеXML
Норма

Цикл Прочитать() доходит до конца без исключений

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

Исключение о незакрытом элементе или недопустимом символе

Кодировка файла
Норма

UTF-8, кириллица читается корректно в любом редакторе

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

Крякозябры — файл записан не в той кодировке или принимающая сторона ждёт другую

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

Валидация по XSD проходит, обязательные элементы заполнены

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

Ошибки вида «элемент не объявлен» или «нарушен порядок»

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

Как записать дату и число в XML, чтобы их поняла другая система?

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

Чем отличается ЗаписьXML от ЗаписатьXML?

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

Как создать XML без записи на диск?

Вызовите Запись.УстановитьСтроку("UTF-8") вместо ОткрытьФайл. После формирования документа метод Закрыть() вернёт готовую строку, которую можно отправить по HTTP, сохранить в реквизит или поместить во временное хранилище.

Файл создаётся пустым — в чём причина?

Чаще всего не вызван метод Закрыть(): данные накапливаются в буфере и физически записываются только при закрытии. Вторая частая причина — исключение в середине кода, из-за которого выполнение не дошло до закрытия. Оборачивайте запись в попытку с гарантированным закрытием в блоке исключения.

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

Да, ЗаписьXML доступен и на тонком, и на веб-клиенте. Ограничение касается только записи в файл: на клиенте без модальных вызовов сохранение выполняется асинхронно через НачатьПолучениеФайлов или диалог сохранения, а прямой путь к диску пользователя из серверного кода недоступен.

Как добавить в XML секцию CDATA?

Методом Запись.ЗаписатьСекциюCDATA(Текст) внутри открытого элемента. Текст в CDATA не экранируется, что удобно для вложенного HTML или XML-фрагментов. Учтите, что сама последовательность ]]> внутри текста недопустима — она завершит секцию.

Итог

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

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