Экспорт в XML из 1С:Предприятия 8.3 — обработки, код, расписание

· 10 мин

Содержание

Выгрузить данные из 1С 8.3 в формат XML можно четырьмя способами. Для обмена с другой типовой программой 1С берут синхронизацию в формате EnterpriseData (Администрирование → Синхронизация данных). Для переноса между разными конфигурациями — обработку «Универсальный обмен данными в формате XML» с файлом правил. Для полной копии справочников в такую же конфигурацию — обработку ВыгрузкаЗагрузкаДанныхXML83.epf. Для своего формата под сайт, банк или складскую систему — пишут код на объекте ЗаписьXML.

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

Какой XML умеет делать 1С и чем форматы отличаются

XML в 1С — не один формат, а несколько разных «языков». Файл, выгруженный одним механизмом, другой механизм не прочитает.

МеханизмЧто внутри файлаКто читаетНужен программист
Синхронизация EnterpriseDataОбъекты в общем формате обмена (документы, справочники)Типовые конфигурации на БСПНет
Универсальный обмен по правиламДанные + правила конвертацииДругая конфигурация с той же обработкойДля написания правил — да
Выгрузка/загрузка XML83Объекты один к одному, по внутренней структуре метаданныхТолько идентичная конфигурацияНет
Код на ЗаписьXML / XDTOЛюбая структура, которую вы задалиСайт, банк, WMS, маркетплейсДа

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

Типовые способы выгрузки в XML через обработки обмена

Синхронизация в формате EnterpriseData

Подходит, когда данные нужно передать из одной типовой конфигурации в другую: из 1С:Бухгалтерии в УТ, из УНФ в Бухгалтерию.

  1. Откройте Администрирование → Синхронизация данных.
  2. Включите флажок синхронизации данных, если он выключен.
  3. Создайте новую синхронизацию и выберите программу-получателя.
  4. В способе подключения укажите обмен через каталог (локальный или сетевой). Тогда программа будет класть XML-файлы в эту папку.
  5. Настройте правила отбора: какие документы и с какой даты выгружать.
  6. Запустите синхронизацию вручную и откройте папку — там появится файл с сообщением обмена.

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

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

Это внешняя обработка УниверсальныйОбменДаннымиXML.epf. Она поставляется вместе с конфигурацией «Конвертация данных » 2.x. Для работы нужен файл правил обмена — тоже XML, его готовят в «Конвертации данных».

Порядок выгрузки:

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

В базе-приёмнике та же обработка загружает файл: вкладка загрузки, имя файла данных, кнопка загрузки.

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

Обработка ВыгрузкаЗагрузкаДанныхXML83

Самый простой способ получить XML «как есть». Обработка выгружает выбранные объекты метаданных вместе со всеми реквизитами и ссылками.

  • ✅ Подходит: перенести справочник номенклатуры или контрагентов в копию той же конфигурации того же релиза.
  • ❌ Не подходит: перенос между БП и УТ, между разными релизами, загрузка в стороннюю систему.

В обработке отмечаете объекты в дереве метаданных, задаёте имя файла и нажимаете выгрузку. Флажок выгрузки объектов по ссылкам добавит в файл связанные элементы: для номенклатуры это единицы измерения, группы, виды номенклатуры.

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

Куда пойдёт XML-файл?

Выгрузка в XML программным кодом

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

  • 📝 ЗаписьXML — последовательная запись элементов и атрибутов. Полный контроль над структурой.
  • 🧩 XDTO — объектная модель по схеме XSD. Удобна, когда схема большая и вложенная.

Пример на ЗаписьXML

Код выгружает номенклатуру (без групп) в файл вида <Товары><Товар Код="..."><Наименование>...</Наименование></Товар></Товары>:

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

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

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

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

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

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

Каждому ЗаписатьНачалоЭлемента должен соответствовать свой ЗаписатьКонецЭлемента. Если пропустить один — файл получится, но парсер получателя его не примет.

Где окажется файл в клиент-серверной базе

Это главная ловушка программной выгрузки. Процедура с директивой &НаСервере пишет файл на диск сервера 1С, а не на компьютер пользователя. Путь вида C:\Выгрузка\ указывает на диск сервера, и у службы 1С должны быть права на эту папку.

Чтобы отдать файл пользователю:

  1. На сервере пишите во временный файл: ИмяФайла = ПолучитьИмяВременногоФайла("xml");.
  2. Поместите его во временное хранилище: Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);.
  3. Удалите временный файл: УдалитьФайлы(ИмяФайла);.
  4. На клиенте передайте адрес в ПолучитьФайл(Адрес, "tovary.xml", Истина); — пользователь выберет, куда сохранить.

В веб-клиенте вместо ПолучитьФайл используют асинхронный вариант — НачатьПолучениеФайлов или ПолучитьФайлССервераАсинх на новых платформах.

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

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

Схема XSD и проверка файла перед отправкой

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

Как построить выгрузку по схеме

  1. В конфигураторе добавьте в ветку Общие → XDTO-пакеты новый пакет и импортируйте в него XSD.
  2. В коде получите тип: Тип = ФабрикаXDTO.Тип("URI-пространства-имён", "ИмяТипа");.
  3. Создайте объект ФабрикаXDTO.Создать(Тип) и заполните его свойства.
  4. Вызовите у объекта метод Проверить() — он сообщит, какие обязательные поля пусты или не соответствуют типу.
  5. Запишите объект в файл: ФабрикаXDTO.ЗаписатьXML(Запись, Объект);.

Если менять конфигурацию нельзя, фабрику создают прямо из файла схемы во внешней обработке: Фабрика = СоздатьФабрикуXDTO("C:\Схемы\order.xsd");.

Проверка готового файла снаружи 1С

Быстрее всего — утилита xmllint из пакета libxml2:

xmllint --noout --schema order.xsd tovary.xml

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

Что чаще всего не проходит проверку:

  • 🔢 Дробные числа с запятой: в XML разделитель — точка. Для числа используйте XMLСтрока(Сумма), а не Строка(Сумма) — вторая функция вернёт неразрывный пробел между разрядами и запятую.
  • 📅 Даты: схема ждёт 2026-03-15T00:00:00 или 2026-03-15. Функция XMLСтрока(Дата) даёт первый вариант, для второго — Формат(Дата, "ДФ=yyyy-MM-dd").
  • ✔️ Булево: XMLСтрока(Истина) вернёт true, а Строка(Истина) — «Да».
  • 📏 Длина строк и обязательные элементы — их и ловит Проверить().

Кодировки и спецсимволы при выгрузке в XML

Кодировку задают вторым параметром ОткрытьФайл. Платформа сама пишет её в объявление <?xml version="1.0" encoding="..."?>.

ПолучательКодировкаКак указать
Большинство сайтов, API, маркетплейсыUTF-8Запись.ОткрытьФайл(Имя, "UTF-8")
Электронные форматы ФНСwindows-1251Запись.ОткрытьФайл(Имя, "windows-1251")
Старые банковские и складские системыПо их документацииУточните до разработки

При выгрузке в windows-1251 символы, которых нет в этой кодировке, испортятся. Это типичная беда с наименованиями, скопированными с сайтов поставщиков: длинное тире, кавычки-лапки, значок «№» в другой форме, эмодзи.

Что делать со спецсимволами

  • <, >, & и кавычки в тексте экранировать вручную не нужно: ЗаписатьТекст и ЗаписатьАтрибут делают это сами. Ручная замена & на &amp; даст двойное экранирование — &amp;amp;.
  • Управляющие символы (коды до 32, кроме табуляции и переводов строк) стандарт XML 1.0 запрещает. Они попадают в наименования из буфера обмена и Excel. Найти их помогает функция НайтиНедопустимыеСимволыXML; удалить — через СтрЗаменить по найденным позициям.
  • Если получатель требует блок CDATA (например, для HTML-описания товара), используйте метод ЗаписатьСекциюCDATA.

Файл, открытый в Блокноте с кракозябрами, не всегда испорчен. Сначала проверьте объявление в первой строке и откройте файл в редакторе, который понимает кодировку (Notepad++, VS Code).

Как автоматизировать выгрузку XML по расписанию

Ручная выгрузка раз в день быстро надоедает. Есть три пути.

Расписание синхронизации

Для обмена EnterpriseData в карточке синхронизации (Администрирование → Синхронизация данных) есть настройка расписания. Достаточно включить запуск по расписанию и задать интервал — например, каждые 2 часа в рабочее время.

Регламентное задание в конфигурации

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

Нюанс по варианту работы базы:

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

Запуск из планировщика Windows

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

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Trade" /N"Обмен" /P"пароль" /Execute"D:\Scripts\vygruzka_xml.epf" /DisableStartupDialogs /DisableStartupMessages

Номер версии в пути подставьте свой. Для серверной базы вместо /F указывают /S"сервер\имя_базы".

Заведите для обмена отдельного пользователя с минимальными правами. Пароль в bat-файле лежит открытым текстом — ограничьте доступ к папке со скриптом.

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

Типичные сбои при выгрузке и как их разобрать

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

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

Можно ли выгрузить в XML отчёт или табличный документ?
Табличный документ сохраняется в mxl, xlsx, pdf, html, но не в произвольный XML. Если нужен XML, данные отчёта выгружают кодом из запроса или схемы компоновки.
Сколько весит XML по сравнению с базой?
Обычно больше, чем данные в базе: теги повторяются для каждой записи. Файл в сотни мегабайт нормален для полной выгрузки документов за год; для передачи его сжимают в zip.
Нужно ли монопольное открытие базы для выгрузки?
Нет. Выгрузка только читает данные, пользователи могут работать. Монопольный режим не нужен и при загрузке через синхронизацию.
Как выгрузить только изменённые объекты?
Синхронизация EnterpriseData сама отслеживает изменения через планы обмена. В своей обработке используйте план обмена или отбор по дате изменения, если такой реквизит есть в объекте.
Чем выгрузка XML отличается от выгрузки базы в dt?
Файл dt — полная копия базы для восстановления через конфигуратор. XML — выборочные данные для обмена; конфигурацию и пользователей он не переносит.