Выгрузка данных из 1С в XML: от ЗаписьXML до XDTO и расписания

· 9 мин

Содержание

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

Частое заблуждение — что для выгрузки данных в XML обязательно нужен программист. Типовые сценарии (перенос справочников, обмен между базами, регламентные отчёты) закрываются готовыми обработками и встроенными механизмами. Код нужен, когда формат задаёт внешняя система: банк, маркетплейс, сайт, партнёр. Ниже — оба пути, с рабочими примерами для платформы 8.3 и управляемых форм.

С чего начать: формат получателя и способ создания XML

Прежде чем писать хоть строку кода, выясните три вещи.

  • 📄 Кто задаёт формат. Если есть XSD-схема или образец файла от получателя — структура уже определена, ваша задача повторить её точно.
  • 🔤 Какая кодировка нужна. Чаще всего UTF-8. Многие форматы ФНС используют windows-1251 — это указано в самой схеме и в объявлении образца.
  • 🔁 Разовая выгрузка или регулярная. От этого зависит, хватит ли внешней обработки или нужно регламентное задание.

Дальше выбирайте способ.

СпособКогда подходитЧто нужно
Готовая обработка «Выгрузка и загрузка данных XML»Перенос объектов между базами с одинаковой конфигурациейОбработка с диска ИТС, права администратора
Синхронизация данных в типовыхОбмен между типовыми конфигурациями (формат EnterpriseData)Настройка в Администрирование → Синхронизация данных
Выгрузка регламентированного отчётаДекларации и отчёты в формате ФНС, СФРКоманда выгрузки в форме самого отчёта
ЗаписьXML в кодеПроизвольный формат, небольшая структура, важна скоростьВнешняя обработка или доработка
XDTO-пакет из XSDСложный формат со схемой, много вложенных типовИмпорт схемы в конфигурацию или расширение

Если нужна выгрузка не данных, а самой конфигурации в XML-файлы (для Git или EDT), это другая задача: в Конфигураторе есть команда Конфигурация → Выгрузить конфигурацию в файлы.

Для остального текста предполагаем, что формат задан извне и типового решения нет. Значит, пишем код.

Создание XML файла вручную через объект ЗаписьXML

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

Порядок вызовов

  1. ОткрытьФайл(ИмяФайла, ПараметрыИлиКодировка) — создать файл. Для записи в строку есть УстановитьСтроку().
  2. ЗаписатьОбъявлениеXML() — строка <?xml version="1.0" encoding="..."?>.
  3. ЗаписатьНачалоЭлемента("Имя") — открыть тег.
  4. ЗаписатьАтрибут("Имя", Значение) — атрибуты пишутся сразу после открытия тега, до любого текста и вложенных элементов.
  5. ЗаписатьТекст(Значение) — содержимое тега.
  6. ЗаписатьКонецЭлемента() — закрыть последний открытый тег.
  7. Закрыть() — сбросить буфер на диск. Без этого вызова файл окажется пустым или обрезанным.

Пример: список контрагентов с ИНН и КПП

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

&НаСервере
Функция СформироватьXMLНаСервере()

	ИмяФайла = ПолучитьИмяВременногоФайла("xml");

	Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина); // Истина — с отступами
	Запись = Новый ЗаписьXML;
	Запись.ОткрытьФайл(ИмяФайла, Параметры);
	Запись.ЗаписатьОбъявлениеXML();

	Запись.ЗаписатьНачалоЭлемента("Контрагенты");
	Запись.ЗаписатьАтрибут("ДатаВыгрузки", XMLСтрока(ТекущаяДатаСеанса()));

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Контрагенты.Наименование КАК Наименование,
	|	Контрагенты.ИНН КАК ИНН,
	|	Контрагенты.КПП КАК КПП
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|ГДЕ
	|	НЕ Контрагенты.ЭтоГруппа
	|	И НЕ Контрагенты.ПометкаУдаления";
	Выборка = Запрос.Выполнить().Выбрать();

	Пока Выборка.Следующий() Цикл
		Запись.ЗаписатьНачалоЭлемента("Контрагент");
		Запись.ЗаписатьАтрибут("ИНН", Выборка.ИНН);
		Если ЗначениеЗаполнено(Выборка.КПП) Тогда
			Запись.ЗаписатьАтрибут("КПП", Выборка.КПП);
		КонецЕсли;
		Запись.ЗаписатьНачалоЭлемента("Наименование");
		Запись.ЗаписатьТекст(Выборка.Наименование);
		Запись.ЗаписатьКонецЭлемента(); // Наименование
		Запись.ЗаписатьКонецЭлемента(); // Контрагент
	КонецЦикла;

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

	Данные = Новый ДвоичныеДанные(ИмяФайла);
	УдалитьФайлы(ИмяФайла);
	Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);

КонецФункции

&НаКлиенте
Процедура ВыгрузитьXML(Команда)
	Адрес = СформироватьXMLНаСервере();
	ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "kontragenty.xml");
КонецПроцедуры

Результат выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<Контрагенты ДатаВыгрузки="2026-10-07T10:15:00">
	<Контрагент ИНН="7701234567" КПП="770101001">
		<Наименование>ООО "Ромашка"</Наименование>
	</Контрагент>
</Контрагенты>

Код на сервере пишет файл в файловую систему сервера 1С, а не компьютера пользователя. Путь вида C:\Выгрузка\ в клиент-серверной базе укажет на диск сервера. Поэтому файл передают через временное хранилище, как в примере. ФайловаяСистемаКлиент есть в типовых конфигурациях на БСП; в самописной конфигурации используйте платформенный метод получения файла с сервера.

Когда нужен не поток, а дерево

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

Выгрузка XML через XDTO: сериализация и пакеты по схеме

XDTO решает две разные задачи. Их часто путают.

Сериализация объектов 1С «как есть»

Глобальный метод ЗаписатьXML() превращает объект конфигурации в XML во внутреннем формате платформы. Это то, на чём построен перенос данных между одинаковыми базами.

Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
ЗаписатьXML(Запись, СсылкаНаКонтрагента.ПолучитьОбъект());
ТекстXML = Запись.Закрыть();

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

Формирование файла по чужой XSD-схеме

Когда получатель прислал XSD, загрузите её в конфигурацию.

  1. Откройте Конфигуратор (или расширение, чтобы не снимать типовую с поддержки).
  2. В дереве метаданных разверните Общие → XDTO-пакеты.
  3. В контекстном меню ветки выберите импорт XML-схемы и укажите файл .xsd.
  4. Обновите конфигурацию базы данных.

После этого типы из схемы доступны через ФабрикаXDTO. Допустим, схема описывает счёт Invoice с повторяющимися строками Line:

URI = "http://example.org/invoice";
ТипСчет = ФабрикаXDTO.Тип(URI, "Invoice");
ТипСтрока = ТипСчет.Свойства.Получить("Line").Тип;

Счет = ФабрикаXDTO.Создать(ТипСчет);
Счет.Number = "А-125";
Счет.Date = ТекущаяДатаСеанса();

Строка = ФабрикаXDTO.Создать(ТипСтрока);
Строка.Name = "Бумага А4";
Строка.Qty = 10;
Строка.Price = 450;
Счет.Line.Добавить(Строка);

Счет.Проверить(); // вызовет исключение, если нарушена схема

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла, "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(Запись, Счет, "Invoice", URI);
Запись.Закрыть();

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

Имена свойств в коде совпадают с именами элементов из XSD, включая регистр. Если в схеме lineItem, то и в коде Счет.lineItem, а не Счет.LineItem.

Кодировка, спецсимволы и формат значений в XML

Большинство отказов получателя связано не со структурой, а с мелочами в значениях.

Кодировка

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

Спецсимволы

  • ✅ ЗаписатьТекст() и ЗаписатьАтрибут() сами экранируют <, >, & и кавычки. Вручную менять & на &amp; не нужно — получится двойное экранирование &amp;amp;.
  • ✅ Для фрагментов, которые должны остаться как есть (HTML в описании товара), используйте ЗаписатьСекциюCDATA().
  • ⚠️ Управляющие символы (коды 1–31, кроме табуляции и переводов строк) в XML 1.0 запрещены. Они попадают из скопированных в 1С текстов. Файл с ними не откроет ни один парсер.

Найти такой символ помогает функция НайтиНедопустимыеСимволыXML(Строка) — она возвращает позицию первого недопустимого символа или 0. Удобно прогнать через неё наименования перед выгрузкой и вычистить мусор.

Числа, даты, булево

ЗначениеКак НЕ надоКак надоРезультат
Число 1234,5Строка(Сумма)XMLСтрока(Сумма)1234.5
ДатаСтрока(Дата)XMLСтрока(Дата)2026-10-07T00:00:00
Только датаСтрока(Дата)Формат(Дата, "ДФ=yyyy-MM-dd")2026-10-07
БулевоСтрока(Флаг)XMLСтрока(Флаг)true / false

Строка() выдаёт представление для человека: с неразрывными пробелами между разрядами, запятой и словами «Да/Нет». Внешняя система такое не распарсит. Для любых чисел и дат в XML используйте XMLСтрока() или явный Формат().

Проверка созданного XML файла

Перед отправкой файл стоит проверить на двух уровнях.

Уровень 1: файл вообще корректный

Достаточно прочитать его целиком через ЧтениеXML. Если теги не закрыты или есть недопустимый символ, чтение упадёт с исключением и номером строки.

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
Попытка
	Пока Чтение.Прочитать() Цикл
	КонецЦикла;
	Сообщить("Файл корректен");
Исключение
	Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Чтение.Закрыть();

Быстрая ручная проверка — открыть файл в браузере. Браузер покажет дерево или сообщение об ошибке с позицией.

Уровень 2: файл соответствует схеме

Если формат задан XSD, проверьте соответствие. Внутри 1С это делают так:

  • создают фабрику из схемы методом СоздатьФабрикуXDTO("путь\к\схеме.xsd");
  • читают файл через Фабрика.ПрочитатьXML(Чтение, ТипКорня) в Попытке;
  • вызывают Проверить() у полученного объекта.

Вне 1С подойдёт утилита xmllint:

xmllint --noout --schema invoice.xsd kontragenty.xml

Она напишет validates или перечислит нарушения с номерами строк. Это быстрее, чем перезапускать обработку.

Автоматическая выгрузка XML по расписанию

Если файл нужен каждый день, выгрузку переводят в фоновый режим. Вариантов три.

  1. Регламентное задание в конфигурации. Создаётся в Конфигураторе (ветка Общие → Регламентные задания), ссылается на экспортную процедуру общего модуля. Расписание настраивается в свойствах или программно. В клиент-серверной базе задание выполняет кластер, пользователю не нужно ничего держать открытым.
  2. Дополнительная обработка БСП. В типовых конфигурациях внешнюю обработку можно зарегистрировать в Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки и назначить её команде расписание. Конфигурацию дорабатывать не нужно. Для этого обработка должна содержать функцию СведенияОВнешнейОбработке() по требованиям БСП.
  3. Планировщик Windows. Запуск 1cv8.exe ENTERPRISE с параметром /Execute и путём к обработке. Код выгрузки ставят в ПриОткрытии формы и завершают сеанс после записи. Способ грубый: занимает лицензию на время работы и требует хранить пароль пользователя в задании.

В файловой базе регламентные задания выполняются только при работе клиентского сеанса. Если ночью базу никто не открывает, выгрузка не случится. Для надёжного расписания нужна клиент-серверная база или запуск через планировщик.

Что учесть в фоновой выгрузке:

  • 📁 путь к каталогу — это путь на сервере 1С, а у пользователя, под которым работает служба сервера, должны быть права на запись туда;
  • 🌐 для сетевой папки указывайте UNC-путь \\server\share\, сетевые диски с буквами службе не видны;
  • 🕒 добавляйте в имя файла дату через Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss"), чтобы не затирать вчерашний файл;
  • 🧾 пишите результат в журнал регистрации через ЗаписьЖурналаРегистрации() — иначе о сбое узнаете от получателя.

Частые ошибки при формировании XML

Диагностика: выберите симптом

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

Можно ли создать XML без программирования?
Да, если задача типовая: перенос данных между одинаковыми базами — обработкой «Выгрузка и загрузка данных XML», обмен между типовыми — через синхронизацию данных, отчётность — кнопкой выгрузки в самом отчёте. Произвольный формат без кода не получить.
Чем ЗаписьXML отличается от ЗаписьDOM?
ЗаписьXML пишет поток последовательно и почти не расходует память. ДокументDOM с ЗаписьDOM держат всё дерево в памяти, зато позволяют вставлять элементы в любое место.
Как сделать файл читаемым, с отступами?
Передайте в ОткрытьФайл объект ПараметрыЗаписиXML с третьим параметром Истина. Для машинной передачи отступы не нужны, файл без них меньше.
Как записать пространство имён с префиксом?
После открытия корневого элемента вызовите ЗаписатьСоответствиеПространстваИмен с префиксом и URI. При работе через XDTO-пакет пространства имён проставляются автоматически.
Почему в UTF-8 файле получатель видит лишние символы в начале?
Скорее всего, его парсер не принимает метку порядка байтов (BOM). Откройте файл в HEX-редакторе: если первые байты EF BB BF, уточните у получателя требования и формируйте файл без метки.