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

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

Как программно создать XML-файл в 1С

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

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

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

Какой способ выбрать: ЗаписьXML или XDTO

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

Сериализация XDTO работает иначе: вы создаете объект по фабрике типов (например, по схеме EnterpriseData или собственной XSD-схеме), заполняете его свойства, а платформа сама формирует корректный XML. Это удобно для регламентированных форматов, где важна валидация по схеме.

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

ЗаписьXML

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

XDTO-сериализация

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

ЗаписатьXML() для значений 1С

Быстрый способ сохранить ссылку, структуру или таблицу значений во внутреннем формате платформы. Ограничение: файл читают только механизмы 1С, сторонние системы его не поймут.

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

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

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

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

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

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

ЗаписьXML.ЗаписатьАтрибут("Номер", "А-001");

ЗаписьXML.ЗаписатьАтрибут("Дата", "2026-05-15");

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

ЗаписьXML.ЗаписатьТекст("ООО Ромашка");

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

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

ЗаписьXML.ЗаписатьТекст("12500.50");

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

ЗаписьXML.ЗаписатьКонецЭлемента(); // Документ

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

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

Метод Закрыть() обязателен: именно он сбрасывает буфер на диск. Если процедура завершится без него, файл останется пустым или обрезанным.

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

Запись в строку вместо файла

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

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

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

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

ЗаписьXML.ЗаписатьНачалоЭлемента("Сообщение");

ЗаписьXML.ЗаписатьТекст("Привет");

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

СтрокаXML = ЗаписьXML.Закрыть(); // здесь готовый XML в виде строки

Полученную строку можно передать в HTTP-запрос, записать в макет двоичных данных или сохранить позже через ТекстовыйДокумент.Записать(). Это самый гибкий вариант для интеграций.

Кодировка, спецсимволы и безопасность данных

Стандарт де-факто для обмена — UTF-8, и именно ее стоит указывать при открытии файла. Кодировку Windows-1251 используют только если приемник явно ее требует (некоторые старые банковские форматы). Несовпадение фактической кодировки и объявленной в заголовке — частая причина «кракозябр» у получателя.

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

Запись файла на диск: пути и права

Метод ОткрытьФайл() создает файл на той стороне, где выполняется код. Если процедура работает на сервере, путь «C:\Обмен\» — это диск сервера 1С, а не компьютера пользователя. Это самая частая причина «файл не появился» у новичков.

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

Создание XML через XDTO

Если обмен описан схемой, создайте объект через фабрику XDTO и запишите его. Пример для произвольного пакета «Обмен»:

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

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

Документ.Номер = "А-001";

Документ.Сумма = 12500.5;

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

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

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

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

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

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

Минимальная проверка — открыть созданный файл в браузере: он покажет дерево узлов либо укажет строку с ошибкой разбора. Для формальной проверки прочитайте файл обратно через «ЧтениеXML» — если чтение проходит без исключений, структура корректна.

Типичные ошибки
01
Нет вызова Закрыть() — файл пустой или обрезанный, приемник не может его прочитать
02
Непарные ЗаписатьНачалоЭлемента/ЗаписатьКонецЭлемента — ошибка о незавершенных узлах при закрытии
03
Запись на сервере с ожиданием файла на клиенте — файл лежит на диске сервера и «не находится»
04
Ручное экранирование спецсимволов поверх ЗаписатьТекст() — двойное экранирование, данные искажаются
05
Кодировка Windows-1251 при объявлении UTF-8 — иероглифы вместо кириллицы у получателя
Контрольные точки

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

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

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

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

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

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

Цикл чтения проходит до конца без исключений

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

Исключение о неправильной структуре или символах

Кириллица в файле
Норма

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

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

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

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

Как создать XML без сохранения на диск?

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

Чем отличается ЗаписатьXML() от объекта ЗаписьXML?

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

Почему файл создается пустым?

Почти всегда причина в отсутствии вызова Закрыть() — без него буфер не сбрасывается на диск. Вторая возможная причина: исключение в середине формирования прервало код до закрытия. Оберните запись в Попытка/Исключение и закрывайте поток в любом случае.

Как записать XML на сервере и отдать пользователю?

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

Можно ли проверить XML по XSD-схеме в 1С?

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

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

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

Итог

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

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