Как сохранить данные 1С в файл XML: от типового обмена до сериализации XDTO

· 9 мин

Содержание

Выгрузить данные в XML можно тремя разными путями, и выбор зависит от задачи. Нужно разово передать справочники и документы в другую базу — подойдёт штатная синхронизация или технологическая обработка выгрузки по плану обмена. Нужно отдать данные во внешнюю систему в своём формате — это сериализация объектов через механизм XDTO прямо из кода.

Разберём каждый механизм выгрузки данных по шагам: где он включается, какой файл XML получается на выходе, как проверить результат схемой и что делать с типовыми ошибками сериализации. Примеры кода проверены на платформе 8.3 с интерфейсом «Такси».

Три механизма выгрузки данных в XML

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

  • 🔄 Синхронизация данных — типовой обмен между конфигурациями 1С (например, Бухгалтерия ↔ Управление торговлей). Формат фиксированный — EnterpriseData, настраивается без программирования.
  • 🧩 Технологическая выгрузка по плану обмена — обработка «Выгрузка и загрузка данных XML». Выгружает объекты одной базы в XML для переноса в точно такую же конфигурацию.
  • ⚙️ Сериализация через XDTO — программная выгрузка объектов в XML произвольной структуры прямо из встроенного языка. Полный контроль над форматом, годится для обмена с внешними системами.

Коротко, как выбрать:

ЗадачаМеханизмНужен программист
Обмен между типовыми 1ССинхронизация (EnterpriseData)Нет
Перенос части данных в такую же базуОбработка выгрузки XMLНет
Отдать данные во внешнюю системуСериализация XDTOДа

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

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

Штатная синхронизация: выгрузка без кода

Когда данные нужно регулярно передавать в другую базу 1С, настраивают синхронизацию. Она сама формирует XML-сообщения в формате EnterpriseData и сама же их принимает на другой стороне.

Путь к настройке: Администрирование → Синхронизация данных. Если пункт не виден, синхронизацию сначала включают флажком в том же разделе настроек.

Порядок действий:

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

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

Формат EnterpriseData описывает универсальный набор объектов (контрагенты, номенклатура, документы продаж и т. д.), на который конфигурации «переводят» свои данные правилами конвертации. Благодаря этому Бухгалтерия и Управление торговлей понимают друг друга, хотя внутри у них разные справочники. Если типовой состав формата вас не устраивает, правила конвертации дорабатывают в отдельном инструменте — «Конвертация данных 3.0». Но это уже задача для специалиста, а не настройка в пользовательском режиме.

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

Технологическая выгрузка по плану обмена

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

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

Работает она так: вы выбираете план обмена или набор метаданных, и платформа выгружает все объекты вместе со ссылками в один XML-файл. Главное свойство — формат файла жёстко привязан к структуре конкретной конфигурации. Загрузить такой файл можно только в базу с той же структурой метаданных.

Перед технологической выгрузкой проверьте
Выполнено: 0 / 4

Что важно помнить:

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

Сериализация объектов через XDTO в коде

Самый гибкий путь — выгрузка из встроенного языка. Платформа умеет сериализовать объекты (элементы справочников, документы, записи регистров) в XML одним вызовом через глобальный сериализатор СериализаторXDTO.

Базовый пример: выгрузим всю номенклатуру в файл.

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

Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    СериализаторXDTO.ЗаписатьXML(Запись, Выборка.ПолучитьОбъект());
КонецЦикла;

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

Разберём, что здесь происходит:

  1. ЗаписьXML — объект, который пишет XML в файл. Кодировку задаём явно, UTF-8 — безопасный выбор для кириллицы.
  2. ЗаписатьОбъявлениеXML() добавляет строку <?xml version="1.0" encoding="UTF-8"?>.
  3. Оборачиваем выгрузку в корневой элемент Данные. Без общего корневого элемента файл с несколькими объектами будет невалидным XML — у документа XML может быть только один корень.
  4. СериализаторXDTO.ЗаписатьXML() сам превращает объект 1С в набор тегов по его реквизитам.

Если нужно отдать данные во внешнюю систему в заранее оговорённом формате (не в стандартном представлении 1С), объект не сериализуют целиком, а пишут теги вручную методами ЗаписатьНачалоЭлемента, ЗаписатьАтрибут, ЗаписатьТекст и ЗаписатьКонецЭлемента. Так вы полностью управляете структурой файла.

Пример ручной записи нужных полей:

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

Обратное чтение такого файла выполняется объектом ЧтениеXML и методом СериализаторXDTO.ПрочитатьXML() — для объектов, сериализованных стандартно, или последовательным разбором тегов — для файлов своей структуры.

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\exchange\nomenklatura.xml");
Чтение.Прочитать(); // перейти к объявлению XML
Чтение.Прочитать(); // перейти к корневому элементу "Данные"
Чтение.Прочитать(); // войти внутрь корня

Пока СериализаторXDTO.ВозможностьЧтенияXML(Чтение) Цикл
    Объект = СериализаторXDTO.ПрочитатьXML(Чтение);
    Объект.Записать();
КонецЦикла;

Чтение.Закрыть();

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

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

Проверка выгрузки: схема XSD и валидация

XML без проверки — это просто текст. Чтобы принимающая сторона была уверена в составе и типах полей, к формату прилагают схему XSD. Схема описывает, какие элементы обязательны, какого они типа и в каком порядке идут.

Механизм XDTO в 1С работает со схемами напрямую. Если внешняя система дала вам XSD, по ней строят фабрику типов и проверяют соответствие:

  • Загрузите XSD в конфигурацию как пакет XDTO (в дереве метаданных есть ветка «XDTO-пакеты») либо постройте ФабрикаXDTO из файла схемы программно.
  • При записи указывайте тип элемента из фабрики — платформа проследит, чтобы структура совпадала со схемой.
  • При чтении чужого файла несоответствие схеме вызовет ошибку сразу, а не превратится в тихо потерянные данные.

Пакеты XDTO стоит понимать как словарь типов для вашего обмена. Один пакет — это одна предметная область со своими элементами и атрибутами. Фабрика ФабрикаXDTO собирает из пакетов рабочий набор типов, через который и читаются, и пишутся объекты. Для простой выгрузки стандартного представления объектов 1С фабрику строить не нужно — хватает глобального СериализаторXDTO. Фабрика из внешней XSD нужна там, где формат диктует партнёр.

Практические советы по валидации:

  • ✅ Проверяйте выгруженный файл в стороннем валидаторе XSD, прежде чем отдавать его партнёру, — так вы отделите свою ошибку от проблем на их стороне.
  • ✅ Следите за кодировкой: заявленная в объявлении XML кодировка должна совпадать с фактической, иначе кириллица придёт «кракозябрами».
  • ✅ Экранирование спецсимволов (&, <, >) платформа делает сама при использовании ЗаписатьТекст и ЗаписатьАтрибут — вручную подставлять их в строку не нужно.

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

Типичные ошибки выгрузки в XML

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

Ещё две ситуации, которые путают новичков:

  • «Почему в типовом файле синхронизации не видно моих документов» — синхронизация выгружает только изменения с момента последнего обмена и только то, что прошло правила отбора. Полную выгрузку даёт не она, а технологическая обработка.
  • «XDTO-сериализатор не выгружает табличную часть целиком» — вы, скорее всего, сериализуете Ссылку, а не объект. Ссылка содержит только идентификатор; чтобы в XML попали реквизиты и табличные части, выгружайте результат ПолучитьОбъект().

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

Можно ли выгрузить в XML только один справочник, а не всю базу?
Да. В коде через СериализаторXDTO вы сами выбираете, что писать в файл — хоть один элемент. В технологической обработке выгрузки задаётся состав выгружаемых данных, там тоже можно ограничиться одним видом объектов.
Чем XML отличается от выгрузки в `.dt`?
.dt — это бинарная выгрузка всей информационной базы целиком, для бэкапа и переноса базы «как есть». XML — текстовый формат для обмена отдельными данными, его можно читать и обрабатывать внешними программами.
В какой кодировке выгружать XML?
По умолчанию берите UTF-8 — она без проблем держит кириллицу и принимается большинством систем. Кодировку указывайте явно и в объявлении XML, и при открытии файла на запись.
Нужна ли схема XSD, чтобы выгрузить данные?
Для выгрузки — нет, файл сформируется и без неё. Схема нужна, когда принимающая сторона требует проверять структуру и типы полей. Тогда формат описывают XSD и валидируют по ней.
Как передать во внешнюю систему данные в их собственном формате?
Не сериализуйте объект целиком. Открывайте ЗаписьXML и пишите нужные теги и атрибуты вручную методами ЗаписатьНачалоЭлемента, ЗаписатьАтрибут, ЗаписатьТекст. Так структура файла будет ровно такой, как договорились с партнёром.