XML-выгрузка из 1С: от готовых обработок до своего кода

· 9 мин

Содержание

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

Если файл уходит в другую базу 1С, хватит готовых инструментов. Если его ждёт сайт, банк, маркетплейс или складская программа со своей схемой, без XDTO или ручной записи не обойтись.

Что выяснить до выгрузки XML: формат, схема, объём

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

  • 📄 Есть ли XSD-схема. Если получатель прислал файл .xsd, структуру не придумываете — берёте из схемы. Если схемы нет, попросите хотя бы образец XML, который система уже принимает.
  • 🔤 Кодировка. Почти всегда UTF-8. Старые системы иногда требуют windows-1251 — это задаётся при открытии файла.
  • 🏷️ Пространство имён. У схемы обычно есть targetNamespace. Если корневой элемент записан без него, валидатор получателя файл отклонит.
  • 📅 Форматы значений. Даты в XML пишут как 2026-10-07T00:00:00, числа — с точкой и без пробелов между разрядами. Логические — true/false.
  • 📦 Объём и частота. Сто строк раз в месяц и сто тысяч каждую ночь — разные задачи. Для больших файлов подходит только потоковая запись.

Сразу договоритесь, что считается «новыми» данными: всё за период, изменения с прошлой выгрузки или полный срез. От этого зависит запрос, которым вы отбираете данные.

Сравнение способов выгрузки из 1С в XML

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

Первые три способа решают задачу «1С → 1С». Последние два — «1С → что угодно».

Выгрузка в XML без программирования: типовые обработки

Обработка «Выгрузка и загрузка данных XML»

Это внешняя обработка (файл вида ВыгрузкаЗагрузкаДанныхXML83.epf), которую распространяют вместе с методическими материалами по платформе. Она выгружает выбранные справочники, документы и регистры в XML в формате, который понимает только 1С.

Порядок работы:

  1. Откройте обработку через Файл → Открыть (в «Такси» — главное меню с иконкой из трёх полос).
  2. На вкладке выгрузки отметьте флажками нужные объекты метаданных и, если нужно, задайте период.
  3. Укажите имя файла и нажмите кнопку выгрузки.
  4. В базе-приёмнике той же конфигурации откройте ту же обработку и загрузите файл.

Загружайте такой файл только в базу той же конфигурации и, желательно, того же релиза. При разных структурах объекты попадут не туда или загрузка упадёт.

Обработка «Универсальный обмен данными в формате XML»

Она встроена в типовые конфигурации на БСП. Если её нет в разделах, включите команду Все функции: главное меню → Сервис → Параметры → флажок «Отображать команду “Все функции”». Затем Все функции → Обработки и найдите обработку в списке.

Работает обработка не сама по себе, а по правилам обмена — XML-файлу, который описывает, какой объект источника во что превращается в приёмнике. Правила готовят в конфигурации «Конвертация данных » (редакция 2.x). Для части типовых пар программ готовые правила поставляются фирмой-разработчиком вместе с релизами.

Шаги выгрузки:

  1. На вкладке «Выгрузка» укажите файл правил и нажмите загрузку правил.
  2. Задайте период и, при необходимости, отборы по правилам выгрузки.
  3. Укажите имя файла данных и запустите выгрузку.
  4. Проверьте протокол обмена: объекты, которые не удалось выгрузить, перечислены там.

Файл, созданный по правилам, всё равно «понимает» только 1С с такой же обработкой на стороне приёмника. Внешней системе он не подойдёт, даже если открывается в браузере.

Создание XML по XSD-схеме через XDTO

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

Вариант 1. XDTO-пакет в конфигурации

  1. Откройте конфигуратор, в дереве метаданных: Общие → XDTO-пакеты.
  2. Через контекстное меню выполните импорт XML-схемы и выберите файл .xsd.
  3. Платформа создаст пакет с типами и пространством имён из схемы.
  4. Обновите конфигурацию базы данных.

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

Вариант 2. Фабрика XDTO из файла схемы

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

ПутьКСхеме = "C:\Обмен\orders.xsd";
ПространствоИмен = "urn:example:orders";

Фабрика = СоздатьФабрикуXDTO(ПутьКСхеме);
ТипЗаказ = Фабрика.Тип(ПространствоИмен, "Order");

Заказ = Фабрика.Создать(ТипЗаказ);
Заказ.Number = "000123";
Заказ.Customer = "ООО Ромашка";

// Проверка по схеме до записи: при ошибке будет исключение
Заказ.Проверить();

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Обмен\order.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Фабрика.ЗаписатьXML(Запись, Заказ, "Order", ПространствоИмен);
Запись.Закрыть();

Имена типов и свойств (Order, Number, Customer) здесь условные — берите их из своей схемы. Свойство, которое по схеме может повторяться (maxOccurs больше 1), — это список: элементы добавляют методом Добавить().

Что делает XDTO за вас

  • ✅ ставит пространство имён и префиксы;
  • ✅ пишет элементы в порядке, заданном схемой;
  • ✅ приводит даты и числа к формату XML;
  • ✅ ловит пропущенные обязательные элементы методом Проверить().

Если схема ссылается на другие XSD через import или include, держите все файлы в одной папке. Иначе фабрика не построится и вы получите ошибку о ненайденном типе.

Запись XML-файла кодом через ЗаписьXML

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

Пример: выгрузка контрагентов из Бухгалтерии предприятия 3.0 с отступами, временным файлом и корректными значениями.

Процедура ВыгрузитьКонтрагентов(ИмяФайла) Экспорт

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

	ВременныйФайл = ИмяФайла + ".tmp";
	Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);

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

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

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

		Запись.ЗаписатьНачалоЭлемента("ИНН");
		Запись.ЗаписатьТекст(СокрЛП(Выборка.ИНН));
		Запись.ЗаписатьКонецЭлемента();

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

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

	// Готовый файл появляется под рабочим именем только целиком
	Если Новый Файл(ИмяФайла).Существует() Тогда
		УдалитьФайлы(ИмяФайла);
	КонецЕсли;
	ПереместитьФайл(ВременныйФайл, ИмяФайла);

КонецПроцедуры

Три приёма, которые экономят время на отладке

  1. XMLСтрока() для любых значений, кроме строк. Функция переводит дату, число и булево в формат XML : дату — в 2026-10-07T00:00:00, число — с точкой и без пробелов. Если писать число через Строка(), в файл попадёт неразрывный пробел между разрядами, и получатель его не разберёт.
  2. Временный файл. Если внешняя система забирает файлы из папки по расписанию, она может схватить недописанный XML. Запись в .tmp и переименование в конце снимают проблему.
  3. Третий параметр ПараметрыЗаписиXML включает отступы. Файл с переносами строк легко читать глазами при отладке. Для «боевого» обмена отступы можно выключить — файл станет меньше.

Спецсимволы (&, <, >) в тексте ЗаписатьТекст() экранирует сам, вручную заменять их не нужно.

Если у получателя есть пространство имён, объявите его сразу после открытия корневого элемента методом ЗаписатьСоответствиеПространстваИмен("", "urn:...").

Внешняя обработка или изменение конфигурации

Для разовой или периодической выгрузки код удобно оформить внешней обработкой (.epf): конфигурацию трогать не нужно, обновления не страдают. Расширение конфигурации нужно, если выгрузка должна работать как регламентное задание или из кнопки в форме документа.

Проверка XML-файла перед отправкой получателю

Не отдавайте первый файл в работу, не проверив его. Минимальный порядок такой.

  1. Корректность XML. Откройте файл в браузере. Если он показал дерево элементов — синтаксис верный. Ошибка с номером строки означает незакрытый тег или недопустимый символ.
  2. Соответствие схеме. Если есть XSD, прогоните файл через валидатор. На Linux и в WSL работает xmllint:
xmllint --noout --schema orders.xsd order.xml
  1. Проверка средствами 1С. Прочитайте готовый файл обратно через фабрику — платформа выбросит исключение с описанием, где файл расходится со схемой:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\order.xml");
Попытка
	Объект = Фабрика.ПрочитатьXML(Чтение, Фабрика.Тип(ПространствоИмен, "Order"));
	Объект.Проверить();
	Сообщить("Файл соответствует схеме");
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;
Чтение.Закрыть();
  1. Контроль данных. Сравните число записей в файле с отчётом в 1С за тот же период. Пустые обязательные поля — частая причина отказа, хотя по схеме файл формально верен.
Диагностика: выберите симптом

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

Когда выгрузка отлажена, её запуск руками превращается в рутину. Есть два рабочих варианта.

Регламентное задание

В конфигураторе или расширении: Общие → Регламентные задания. Создайте задание, укажите метод серверного общего модуля (например, ту же процедуру ВыгрузитьКонтрагентов) и расписание — скажем, ежедневно в 02:00.

  • 🖥️ Клиент-серверная база. Задания выполняет сервер 1С, пользователи могут быть не в программе. Путь к файлу должен быть доступен именно серверу и учётной записи, от которой работает служба.
  • 📁 Файловая база. Регламентные задания выполняются только пока в базе открыт хотя бы один сеанс. На ночь никто не оставит программу открытой — для файлового варианта надёжнее второй способ.

Планировщик Windows и параметр /Execute

Платформа умеет при запуске сразу открыть внешнюю обработку. Пропишите в планировщике задачу с такой командой:

"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Обмен" /P"пароль" /Execute"D:\Обмен\ВыгрузкаXML.epf" /DisableStartupMessages

Для серверной базы вместо /F укажите /S"сервер\имябазы". В модуле формы обработки вызовите выгрузку в обработчике открытия и затем завершите сеанс командой ЗавершитьРаботуСистемы(Ложь) — иначе окно 1С останется висеть и займёт лицензию.

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

Перед включением выгрузки по расписанию
Выполнено: 0 / 6

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

Можно ли выгрузить в XML отчёт или табличный документ?
Табличный документ сохраняется в форматы xlsx, mxl, html, pdf и другие, но не в XML произвольной структуры. Для XML берите данные запросом из регистров и пишите их через ЗаписьXML.
Чем XML-выгрузка отличается от выгрузки базы в файл .dt?
Файл .dt — полная копия информационной базы для восстановления в 1С. XML-выгрузка содержит только выбранные данные и предназначена для обмена с другой программой.
Как выгрузить только изменённые с прошлого раза объекты?
Используйте план обмена: платформа регистрирует изменения объектов, а выгрузка берёт только их. Простой вариант — хранить дату последней выгрузки и отбирать документы по дате изменения, если такой реквизит есть в конфигурации.
Почему ЗаписатьXML() у глобального контекста даёт не тот формат?
Глобальная функция ЗаписатьXML и СериализаторXDTO пишут данные во внутреннем формате 1С с типами платформы. Внешней системе нужен свой формат — его задают XDTO-пакетом по схеме или ручной записью.
Можно ли создать XDTO-пакет без доступа к конфигуратору?
Да: функция СоздатьФабрикуXDTO строит фабрику из файла XSD прямо во время выполнения. Код при этом всё равно нужен — во внешней обработке или расширении.