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

· 9 мин

Содержание

Выгрузить файл XML из 1С можно четырьмя путями: командой «Выгрузить» в форме регламентированного отчёта, через Администрирование → Синхронизация данных, внешней обработкой «Выгрузка и загрузка данных XML» или своим кодом на объекте ЗаписьXML. Какой выбрать — зависит от того, кто будет читать файл: налоговая, другая база 1С или сторонняя программа.

Чаще всего проблема не в самой выгрузке, а в том, что получатель файл не принимает: не та кодировка, запятая вместо точки в суммах, нет обязательного элемента по схеме. Каждый из этих отказов снимается одной-двумя строками кода или правильной настройкой.

С чего начать: кто получатель и какой нужен формат

XML — это контейнер, а не формат. Один и тот же документ «Реализация» можно записать десятком структур, и принимающая сторона поймёт только свою. Поэтому до первой строчки кода или первого клика соберите требования.

📌 Что выяснить у получателя:

  • 📄 Схема XSD или хотя бы образец правильного файла. Без схемы вы гадаете.
  • 🔤 Кодировка. Стандарт — UTF-8, но часть старых систем ждёт windows-1251.
  • 🏷 Пространство имён (namespace) корневого элемента. Ошибка в одной букве URI — и валидатор отвергнет весь файл.
  • 🔢 Формат чисел и дат. XML-схемы ждут 1234.50 и 2026-10-07, а не 1 234,50 и 07.10.2026.
  • 📦 Объём и частота. Разовая выгрузка за месяц и ежечасный обмен решаются по-разному.
  • 📁 Имя файла. Для отчётности в ФНС имя строится по шаблону, и программа формирует его сама.
ПолучательЧем выгружатьКто задаёт формат
ФНС, СФР, РосстатРегламентированный отчётУтверждённая форма, 1С обновляет её с релизами
Другая база 1С (БП, УТ, ЗУП)Синхронизация данных, формат EnterpriseDataРазработчики типовых конфигураций
База с той же конфигурациейОбработка «Выгрузка и загрузка данных XML»Метаданные конфигурации
Сайт, CRM, банк, маркетплейсСвой код или правила «Конвертации данных»Сторонняя система
Разработчик, GitВыгрузка конфигурации в файлыПлатформа
Куда пойдёт ваш XML-файл?

Штатные способы выгрузить XML в типовых конфигурациях

Регламентированная отчётность

В БП 3.0 и ЗУП 3.1 отчёты открываются из Отчеты → Регламентированные отчеты. Порядок:

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

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

Не переименовывайте выгруженный файл отчёта. Имя содержит коды инспекции, ИНН и идентификатор, и приёмный комплекс сверяет его с содержимым.

Синхронизация данных между базами 1С

Обмен между типовыми конфигурациями идёт через Администрирование → Синхронизация данных. Включите флажок синхронизации, задайте префикс информационной базы и создайте настройку обмена с нужной программой.

Транспорт выбирается при настройке: локальный или сетевой каталог, FTP, электронная почта, интернет. При обмене через каталог программа кладёт туда XML-сообщение — его и можно забрать как файл. Формат — EnterpriseData, его понимают все актуальные типовые конфигурации.

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

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

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

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

Загрузку такого файла делайте только в копию базы после резервного копирования — обработка записывает объекты поверх существующих с теми же ссылками.

Выгрузка конфигурации в файлы

Для разработчика XML — это ещё и формат хранения самой конфигурации. В конфигураторе: Конфигурация → Выгрузить конфигурацию в файлы. Получится каталог с XML-описаниями метаданных и модулями, удобный для Git.

То же из командной строки:

"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "" /DumpConfigToFiles "D:\Export\Config" /Out "D:\Export\log.txt"

Номер платформы в пути подставьте свой.

Свой код: запись XML средствами встроенного языка

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

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

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

	Выборка = Запрос.Выполнить().Выбрать();

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

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

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

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

Три правила, без которых файл будет «почти правильным»:

  • 🔢 Числа, даты и булево — только через XMLСтрока(). Строка(1234.5) даст 1 234,5 с неразрывным пробелом, а XMLСтрока(1234.5) — 1234.5. Дата превратится в 2026-10-07T00:00:00, Истина — в true.
  • 🔒 Всегда вызывайте Закрыть(). Без этого хвост файла останется в буфере, и файл окажется обрезанным. Оборачивайте запись в Попытка … Исключение, закрывая объект и при ошибке.
  • 🖥 Пишите на сервере. Выборка и запись в одном серверном вызове — это один проход без передачи данных клиенту. Готовый файл потом отдают пользователю через временное хранилище.

Сериализация объектов целиком

Если получатель — тоже 1С, а нужно передать объект со всеми реквизитами, удобнее не перечислять поля вручную. Глобальный метод ЗаписатьXML(Запись, Объект) или СериализаторXDTO.ЗаписатьXML() записывают объект в стандартном представлении платформы. На другой стороне его читают методом ПрочитатьXML(). Так устроена и обработка из предыдущего раздела.

Работа со схемой XSD и проверка файла

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

Импорт схемы в конфигурацию

В конфигураторе откройте ветку Общие → XDTO-пакеты и выберите команду импорта XML-схемы. Платформа создаст пакет с типами из XSD. Если менять конфигурацию нельзя, сделайте это в расширении.

Дальше объект собирают по типам схемы:

URI = "http://example.ru/exchange/1.0"; // пространство имён из схемы
ТипДокумента = ФабрикаXDTO.Тип(URI, "Document");
Документ = ФабрикаXDTO.Создать(ТипДокумента);
Документ.Number = "А-125";
Документ.Date = ТекущаяДатаСеанса();

Документ.Проверить(); // исключение, если объект не соответствует схеме

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

URI, Document, Number и Date — условные имена; берите их из своей схемы. Метод Проверить() ловит пропущенные обязательные элементы и нарушения типов до того, как файл уйдёт получателю.

Схема без изменения конфигурации

XSD можно загрузить и во время работы. Читают файл схемы через ЧтениеXML и ПостроительDOM, затем ПостроительСхемXML.СоздатьСхемуXML() даёт схему, её добавляют в НаборСхемXML и создают Новый ФабрикаXDTO(НаборСхем). Это удобно во внешней обработке, которую нельзя встраивать в типовую.

Внешняя проверка

Готовый файл полезно прогнать независимым валидатором. Например, утилитой xmllint:

xmllint --noout --schema schema.xsd export.xml

Ответ export.xml validates значит, что файл соответствует схеме. Иначе утилита укажет строку и элемент с ошибкой.

Большие объёмы: как не упереться в память и время

На тысячах записей любой способ работает. На сотнях тысяч начинаются зависания и ошибки нехватки памяти. Вот что помогает:

  • 🌊 Потоковая запись. ЗаписьXML пишет в файл по мере обхода. ДокументDOM строит всё дерево в памяти — для больших файлов он не годится.
  • 📋 Выборка вместо таблицы. Запрос.Выполнить().Выбрать() читает строки порциями, а Выгрузить() тянет весь результат в память сразу.
  • 🎯 Только нужные поля. Обращение через точку к реквизитам ссылки внутри цикла порождает отдельный запрос на каждую строку. Получайте всё одним запросом с соединениями.
  • ✂️ Деление на файлы. Многие приёмные системы ограничивают размер файла. Пишите по периодам или по N записей и открывайте новый файл.
  • 📏 Без отступов. Форматирование с переносами раздувает файл. Отключите его через ПараметрыЗаписиXML, передав третьим параметром Ложь.
  • ⏳ Фоновое задание. Долгую выгрузку запускайте через ФоновыеЗадания.Выполнить() — пользователь продолжит работать, а длительный серверный вызов не оборвётся по таймауту.
ОбъёмПодходНа что смотреть
До 10 тыс. объектовЛюбой способКорректность формата
10–500 тыс.ЗаписьXML + выборка, на сервереЗапросы внутри цикла
Больше 500 тыс.Фоновое задание, деление на файлыПамять рабочего процесса, лимиты получателя

Границы в таблице условные: многое зависит от числа реквизитов и табличных частей.

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

Ежедневную выгрузку цен на сайт или остатков в CRM никто не хочет запускать руками. Вариантов три.

Синхронизация по расписанию

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

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

Для своей выгрузки создают объект метаданных «Регламентное задание» (в конфигурации или в расширении), привязывают к нему процедуру общего модуля и задают расписание.

В клиент-серверном варианте задания выполняет сервер 1С. В файловом варианте они запускаются из клиентских сеансов, поэтому без открытой базы выгрузка не пройдёт. Для регулярных обменов лучше клиент-сервер.

Планировщик Windows и командная строка

Если менять конфигурацию нельзя, запускают 1С с внешней обработкой. Параметр /Execute открывает обработку сразу после старта, а /C передаёт ей строку параметров:

"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" ENTERPRISE /F "D:\Bases\Buh" /N "Обмен" /P "пароль" /Execute "D:\Scripts\ВыгрузкаЦен.epf" /C "auto" /DisableStartupMessages

Обработка в модуле формы проверяет параметр запуска, выполняет выгрузку и завершает работу через ЗавершитьРаботуСистемы(Ложь). Добавьте задачу в планировщик Windows на нужное время. Заведите для обмена отдельного пользователя с минимальными правами и не держите пароль администратора в bat-файле.

Почему получатель не принимает файл

Файл выгрузился, но на той стороне ошибка. Типичные причины и что проверить:

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

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

Можно ли выгрузить в XML табличный документ или отчёт?
Сам табличный документ в XML не сохраняется: из формы отчёта доступны xlsx, ods, pdf, mxl и другие. Если нужен XML, выгружайте данные отчёта своим кодом.
Чем XML отличается от выгрузки базы в .dt?
Файл .dt — полный архив информационной базы для восстановления в той же платформе. XML-выгрузка переносит выбранные данные и читается другими программами.
Как открыть выгруженный XML для просмотра?
Любым браузером или редактором кода. Браузер покажет дерево элементов и сообщит, если файл синтаксически повреждён.
Можно ли выгрузить XML в тонком клиенте через веб?
Да. Запишите файл на сервере во временный каталог, поместите его во временное хранилище и предложите пользователю сохранить через НачатьПолучениеФайлаССервера().
Почему обработка выгрузки не открывается в моей базе?
Обработка собрана под определённую версию платформы и режим совместимости. Возьмите вариант для 8.3 и проверьте, что у пользователя есть право открывать внешние обработки.