Разработка и Конфигурация · 9 мин
Как программно создать XML-файл в 1С
Как программно создать XML-файл в 1С через ЗаписьXML и сериализацию XDTO. Примеры кода, кодировка, запись на диск, типичные ошибки и проверка результата.
Выгрузка данных из 1С в XML — одна из самых частых задач интеграции: обмен с банками, сайтами, ЭДО-операторами, выгрузка прайсов и заказов. Во встроенном языке 1С есть два основных подхода: потоковая запись через объект «ЗаписьXML» и сериализация через механизм XDTO. Первый подходит для произвольных файлов любой структуры, второй — для обмена по формально описанным схемам.
Оба способа работают и на клиенте, и на сервере, не требуют внешних компонент и доступны во всех актуальных версиях платформы. Ниже разобраны готовые примеры кода, настройка кодировки, запись файла на диск и типичные ошибки, которые приводят к битым XML.
Какой способ выбрать: ЗаписьXML или XDTO
Объект «ЗаписьXML» — это последовательный генератор XML: вы сами управляете каждым узлом, атрибутом и текстом. Он идеален, когда структура файла нестандартная, формируется «на лету» или когда нужно выгрузить большой объем данных без загрузки всего документа в память.
Сериализация XDTO работает иначе: вы создаете объект по фабрике типов (например, по схеме EnterpriseData или собственной XSD-схеме), заполняете его свойства, а платформа сама формирует корректный XML. Это удобно для регламентированных форматов, где важна валидация по схеме.
Сравнение вариантов
Подходит для произвольной структуры, больших файлов и потоковой записи. Ограничение: валидацию и правильность иерархии контролируете вы сами.
Подходит для обмена по формальным схемам (XSD, пакеты XDTO конфигурации). Ограничение: требует описанной схемы и загружает объект целиком в память.
Быстрый способ сохранить ссылку, структуру или таблицу значений во внутреннем формате платформы. Ограничение: файл читают только механизмы 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Создайте объект: ЗаписьXML = Новый ЗаписьXML
- 2Откройте файл с указанием пути и кодировки: ОткрытьФайл(Путь, "UTF-8")
- 3Запишите объявление XML методом ЗаписатьОбъявлениеXML()
- 4Сформируйте узлы: начало элемента, атрибуты, текст, конец элемента
- 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» — если чтение проходит без исключений, структура корректна.
Как проверить результат
Отображается дерево элементов без сообщений об ошибке
Браузер показывает ошибку разбора с номером строки
Цикл чтения проходит до конца без исключений
Исключение о неправильной структуре или символах
Русский текст читается в редакторе с 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. Помните про сторону выполнения кода: файл пишется там, где исполняется код.