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

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

Как записать XML файл в 1С 8: практическая инструкция

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

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

Выбор способа зависит от задачи. Если нужно быстро выгрузить простую структуру без строгой схемы — достаточно ЗаписьXML на десяток строк кода. Если файл должен соответствовать утверждённому формату (например, обмен с банком или ФНС), надёжнее работать через пакеты XDTO, где платформа сама контролирует типы и обязательность полей.

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

Два способа записи XML в 1С: что выбрать

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

Сериализация XDTO строится вокруг фабрики типов. Вы описываете (или импортируете из XSD) схему документа, создаёте объекты XDTO, заполняете свойства и записываете их одним вызовом. Платформа проверяет типы данных, обязательность полей и порядок элементов ещё на этапе формирования. Это стандартный путь для регламентированных форматов — выгрузок в банки, ЭДО, отчётности.

Сравнение вариантов

ЗаписьXML

Подходит для простых и разовых выгрузок, произвольных структур, отладки. Нет проверки по схеме — ошибки формата всплывут на стороне приёмника.

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

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

ЗаписьJSON / универсальные форматы

Если приёмник принимает JSON, используйте ЗаписьJSON — не стоит искусственно формировать XML там, где это не требуется.

Базовый пример: запись XML через объект ЗаписьXML

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

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

Запись.ОткрытьФайл("C:\Обмен\Товары.xml", "UTF-8");

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

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

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

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

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

Запись.ЗаписатьАтрибут("Наименование", Строка.Наименование);

Запись.ЗаписатьЭлемент("Цена", Формат(Строка.Цена, "ЧРД=.; ЧГ=0"));

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

КонецЦикла;

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

Запись.Закрыть();

Ключевые моменты кода. Метод ОткрытьФайл принимает путь и кодировку — по умолчанию используется UTF-8, что подходит для большинства обменов. Каждый ЗаписатьНачалоЭлемента обязан закрываться парным ЗаписатьКонецЭлемента: платформа при закрытии проверит балансировку, но лучше контролировать это явно. Атрибуты записываются только сразу после открытия элемента, до записи текста или вложенных узлов.

Числа и даты передавайте в каноническом виде: разделитель дробной части — точка, дата — в формате ISO (ГГГГ-ММ-ДД). Функция Формат() с параметром ЧРД=. гарантирует точку независимо от региональных настроек сеанса. Для дат удобно использовать XMLСтрока(ДатаЗначения).

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

Запись через сериализацию XDTO

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

Фабрика = СоздатьФабрикуXDTO("C:\Схемы\order.xsd");

ТипЗаказ = Фабрика.Тип("http://example.org/order", "Заказ");

Заказ = Фабрика.Создать(ТипЗаказ);

Заказ.Номер = "000123";

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

ТипСтрока = Фабрика.Тип("http://example.org/order", "СтрокаЗаказа");

Строка = Фабрика.Создать(ТипСтрока);

Строка.Товар = "Номенклатура 1";

Строка.Количество = 5;

Заказ.Строки.Добавить(Строка);

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

Запись.ОткрытьФайл("C:\Обмен\order.xml", "UTF-8");

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

Фабрика.ЗаписатьXML(Запись, Заказ);

Запись.Закрыть();

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

Обратите внимание на пространства имён: URI в Фабрика.Тип() должен точно совпадать с указанным в XSD, включая регистр символов. Несовпадение — частая причина ошибки «тип не найден».

Кодировка, путь к файлу и права доступа

Подавляющее большинство современных обменов ожидает UTF-8, и это значение стоит указывать явно вторым параметром ОткрытьФайл. Некоторые старые банковские форматы требуют windows-1251 — уточняйте требование в спецификации формата, а не подбирайте кодировку экспериментально: «кракозябры» в файле приёмник может отклонить молча.

Путь к файлу интерпретируется в контексте того процесса, где выполняется код. Если процедура серверная, путь C:\Обмен — это диск сервера 1С, а не компьютера пользователя. Учётная запись агента сервера 1С должна иметь право записи в целевой каталог. Для передачи файла пользователю типовой приём — сформировать файл во временном каталоге на сервере, поместить данные во временное хранилище и на клиенте сохранить через диалог выбора файла.

Для временных файлов используйте ПолучитьИмяВременногоФайла("xml") — платформа создаст уникальное имя в каталоге временных файлов и избавит от конфликтов при параллельных выгрузках.

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

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

Чаще всего выгрузку ломают не алгоритмы, а мелочи: незакрытый элемент, спецсимволы в данных, неверный формат чисел. Символы &, <, > и кавычки в тексте платформа экранирует автоматически, но если вы собираете XML конкатенацией строк (чего делать не стоит), экранирование ложится на вас.

Типичные ошибки
01
Незакрытый элемент: пропущен ЗаписатьКонецЭлемента — файл обрывается, приёмник сообщает о синтаксической ошибке.
02
Число с запятой или пробелами разрядов: 1С выводит по региональным настройкам, а XML ждёт точку — используйте Формат() с ЧРД=.
03
Запись атрибута после текста или вложенного элемента — платформа выдаёт ошибку, так как атрибуты пишутся только сразу после открытия узла.
04
Серверный код пишет по клиентскому пути: файл создаётся на сервере, пользователь его не находит.
05
Кодировка не указана явно: приёмник в другой системе читает файл с неверной кодировкой, кириллица искажается.
06
Сборка XML конкатенацией строк вместо ЗаписьXML: ломается экранирование спецсимволов и балансировка тегов.

Запись без файла: строка и поток в памяти

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

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

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

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

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

Запись.ЗаписатьЭлемент("Значение", "Тест");

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

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

Также существует запись в поток (ПотокВПамяти, файловый поток) — актуально при работе с двоичными вложениями и архивами. Логика записи узлов не меняется, отличается только способ открытия.

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

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

Файл создан и не пустой
Норма

Размер файла больше нуля, дата изменения свежая

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

Файл отсутствует или нулевого размера — проверяйте путь и права

Синтаксис XML
Норма

Файл открывается в браузере как дерево без сообщений об ошибке

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

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

Читаемость кириллицы
Норма

Русский текст отображается корректно в редакторе с UTF-8

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

Кракозябры — несовпадение кодировки записи и чтения

Соответствие формату приёмника
Норма

Тестовая загрузка на стороне приёмника проходит без отказов

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

Приёмник отклоняет файл — сверьте обязательные узлы и типы со спецификацией

Частые вопросы по записи XML в 1С 8

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

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

Почему в файле кириллица отображается нечитаемыми символами?

Причина — несовпадение кодировки записи и чтения. Укажите кодировку явно во втором параметре ОткрытьФайл, обычно UTF-8. Если приёмник требует windows-1251, передайте "windows-1251" и убедитесь, что принимающая сторона читает файл именно в ней.

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

Откройте ЗаписьXML, запишите корневой элемент с реквизитами шапки, затем в цикле по табличной части для каждой строки создавайте вложенный элемент с атрибутами или дочерними узлами. Не забудьте парный ЗаписатьКонецЭлемента внутри цикла и после него.

Чем отличается ЗаписатьЭлемент от ЗаписатьНачалоЭлемента?

ЗаписатьЭлемент(Имя, Текст) создаёт законченный узел с текстовым содержимым одним вызовом. ЗаписатьНачалоЭлемента открывает узел, в который можно добавить атрибуты, текст и вложенные элементы, и требует парного ЗаписатьКонецЭлемента.

Файл создаётся, но пользователь его не видит. Что не так?

Код выполняется на сервере, поэтому файл пишется в файловую систему сервера. Сформируйте файл на сервере, поместите данные во временное хранилище, а на клиенте получите их и сохраните через диалог сохранения файла.

Когда обязательно нужна сериализация XDTO?

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

Итог

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

Простые выгрузки делайте через ЗаписьXML с явным указанием кодировки UTF-8 и парным закрытием элементов; регламентированные форматы — через сериализацию XDTO с валидацией по схеме. Учитывайте, что серверный код пишет файлы на сервере, а числа и даты передавайте в каноническом формате. После записи всегда проверяйте файл чтением или тестовой загрузкой на стороне приёмника.