Как сохранить данные 1С в файл XML: от типового обмена до сериализации XDTO
Содержание
Выгрузить данные в 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 и сама же их принимает на другой стороне.
Путь к настройке: Администрирование → Синхронизация данных. Если пункт не виден, синхронизацию сначала включают флажком в том же разделе настроек.
Порядок действий:
- Включите синхронизацию данных в разделе
Администрирование. - Создайте новую настройку, выберите вид обмена (с какой конфигурацией обмениваемся).
- Укажите способ подключения — через файловый каталог, FTP или напрямую по сети.
- Для файлового варианта задайте папку, куда будут складываться XML-файлы сообщений.
- Настройте правила отбора: какие организации, какие периоды, какие виды данных выгружать.
- Запустите обмен кнопкой синхронизации.
На выходе в указанной папке появляются XML-файлы сообщений обмена. Их структура соответствует формату EnterpriseData — это общий язык для типовых конфигураций. Вручную такие файлы править не стоит: у них есть служебные заголовки с номерами сообщений, и рассогласование нумерации остановит обмен.
Формат EnterpriseData описывает универсальный набор объектов (контрагенты, номенклатура, документы продаж и т. д.), на который конфигурации «переводят» свои данные правилами конвертации. Благодаря этому Бухгалтерия и Управление торговлей понимают друг друга, хотя внутри у них разные справочники. Если типовой состав формата вас не устраивает, правила конвертации дорабатывают в отдельном инструменте — «Конвертация данных
3.0». Но это уже задача для специалиста, а не настройка в пользовательском режиме.
Файловая синхронизация — это полноценный обмен с подтверждением приёма, а не просто экспорт. Если вы хотите только выгрузить данные и никуда их не загружать обратно, этот способ избыточен — смотрите два следующих раздела.
Технологическая выгрузка по плану обмена
Для переноса данных между двумя одинаковыми конфигурациями есть обработка «Выгрузка и загрузка данных XML» (её также называют выгрузкой по плану обмена). Она входит в состав типовых решений и доступна в режиме Конфигуратора или как внешняя обработка.
Запустить её можно двумя путями. Первый — открыть как внешнюю обработку
через Файл → Открыть в режиме 1С:Предприятие (понадобятся права на открытие внешних обработок). Второй — через Конфигуратор, если обработка поставляется в составе конфигурации. В обоих случаях открывается форма с деревом метаданных, где флажками отмечают, что выгружать.
Работает она так: вы выбираете план обмена или набор метаданных, и платформа выгружает все объекты вместе со ссылками в один XML-файл. Главное свойство — формат файла жёстко привязан к структуре конкретной конфигурации. Загрузить такой файл можно только в базу с той же структурой метаданных.
Что важно помнить:
- Файл содержит уникальные идентификаторы объектов (GUID). Поэтому при загрузке в приёмник ссылки восстанавливаются корректно, а не создаются дубли.
- Выгрузка по плану обмена не предназначена для внешних систем — там нет человекочитаемого формата, только внутренняя структура 1С.
- Полную базу через эту обработку обычно не гоняют: для бэкапа всей базы есть выгрузка в
.dt. XML-выгрузку применяют точечно — отдельные справочники или наборы документов.
Сериализация объектов через XDTO в коде
Самый гибкий путь — выгрузка из встроенного языка. Платформа умеет сериализовать объекты (элементы справочников, документы, записи регистров) в XML одним вызовом через глобальный сериализатор СериализаторXDTO.
Базовый пример: выгрузим всю номенклатуру в файл.
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\exchange\nomenklatura.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Данные");
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
СериализаторXDTO.ЗаписатьXML(Запись, Выборка.ПолучитьОбъект());
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Разберём, что здесь происходит:
ЗаписьXML— объект, который пишет XML в файл. Кодировку задаём явно,UTF-8— безопасный выбор для кириллицы.ЗаписатьОбъявлениеXML()добавляет строку<?xml version="1.0" encoding="UTF-8"?>.- Оборачиваем выгрузку в корневой элемент
Данные. Без общего корневого элемента файл с несколькими объектами будет невалидным XML — у документа XML может быть только один корень. Сериализатор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
ЗаписатьНачалоЭлемента до цикла, ЗаписатьКонецЭлемента после).ОткрытьФайл(ИмяФайла, "UTF-8") и убедитесь, что принимающая сторона читает в той же кодировке.Ещё две ситуации, которые путают новичков:
- «Почему в типовом файле синхронизации не видно моих документов» — синхронизация выгружает только изменения с момента последнего обмена и только то, что прошло правила отбора. Полную выгрузку даёт не она, а технологическая обработка.
- «XDTO-сериализатор не выгружает табличную часть целиком» — вы, скорее всего, сериализуете
Ссылку, а не объект. Ссылка содержит только идентификатор; чтобы в XML попали реквизиты и табличные части, выгружайте результатПолучитьОбъект().
Частые вопросы
Можно ли выгрузить в XML только один справочник, а не всю базу?
СериализаторXDTO вы сами выбираете, что писать в файл — хоть один элемент. В технологической обработке выгрузки задаётся состав выгружаемых данных, там тоже можно ограничиться одним видом объектов.Чем XML отличается от выгрузки в `.dt`?
.dt — это бинарная выгрузка всей информационной базы целиком, для бэкапа и переноса базы «как есть». XML — текстовый формат для обмена отдельными данными, его можно читать и обрабатывать внешними программами.В какой кодировке выгружать XML?
UTF-8 — она без проблем держит кириллицу и принимается большинством систем. Кодировку указывайте явно и в объявлении XML, и при открытии файла на запись.Нужна ли схема XSD, чтобы выгрузить данные?
Как передать во внешнюю систему данные в их собственном формате?
ЗаписьXML и пишите нужные теги и атрибуты вручную методами ЗаписатьНачалоЭлемента, ЗаписатьАтрибут, ЗаписатьТекст. Так структура файла будет ровно такой, как договорились с партнёром.