Выгрузка данных в XML-файл из 1С:Предприятия: от штатного обмена до программной сериализации

· 9 мин

Содержание

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

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

Куда нужно выгрузить XML из 1С?

Штатный обмен через планы обмена

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

В типовых конфигурациях обмен настраивают в разделе Администрирование → Синхронизация данных. Там включают синхронизацию, выбирают сценарий (например, «Бухгалтерия — Управление торговлей») и указывают каталог или ресурс, куда ложится файл сообщения.

Сообщение обмена — это и есть XML. По умолчанию оно пишется в служебный каталог, но путь можно задать вручную при настройке через локальный или сетевой каталог. Файл имеет имя вида Message_<префикс>_<префикс>.xml.

План обмена подходит, когда выгрузка повторяется. Для разовой задачи «забрать справочник один раз» он избыточен — проще взять обработку из следующего раздела.

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

Частный случай плана обмена — распределённая информационная база (РИБ). Это обмен между копиями одной и той же конфигурации: центральный узел и периферийные. РИБ переносит в XML не только данные, но и изменения конфигурации, поэтому периферийные базы обновляются автоматически вслед за центром. Для разнородных баз (разные конфигурации) РИБ не применяют — там обычная синхронизация по правилам.

Если каталог обмена задан как сетевая папка, следите за правами доступа службы. Частая причина «обмен молчит, файл не появляется» — у учётной записи сервера 1С нет прав на запись в этот каталог.

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

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

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

  1. Откройте обработку через Файл → Открыть и выберите файл ВыгрузкаЗагрузкаДанныхXML.epf.
  2. На закладке выгрузки укажите имя создаваемого файла, например C:\Обмен\data.xml.
  3. Отметьте флажками справочники, документы и регистры, которые нужно выгрузить. Можно отметить всё или только нужные ветки.
  4. Нажмите кнопку выгрузки. Обработка соберёт объекты и запишет XML.

Чтобы Файл → Открыть сработал, у пользователя должно быть право на интерактивное открытие внешних отчётов и обработок. Оно задаётся в профиле доступа. Без него платформа откроет файл только в режиме «Толстый клиент» или вовсе откажет.

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

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

Программная сериализация через XDTO

Когда XML уезжает во внешнюю систему со своим форматом (банк, госпортал, сайт), штатные обработки не помогут — структуру диктует приёмник. Тогда файл формируют кодом.

Базовый объект для записи — ЗаписьXML. Сериализацию объектов 1С берёт на себя глобальный СериализаторXDTO. Минимальный пример выгрузки номенклатуры:

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

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

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

Что здесь происходит:

  • ОткрытьФайл принимает путь и кодировку (UTF-8 по умолчанию).
  • ЗаписатьОбъявлениеXML ставит в начало строку <?xml version="1.0" encoding="UTF-8"?>.
  • СериализаторXDTO.ЗаписатьXML превращает объект 1С в XML-представление со всеми реквизитами и табличными частями.
  • Закрыть сбрасывает буфер на диск. Без него файл может остаться пустым или обрезанным.

Если формат приёмника фиксированный (например, XSD-схема банка), объекты базы не сериализуют напрямую — строят XML по схеме через ФабрикаXDTO или вручную, элемент за элементом методами ЗаписатьНачалоЭлемента, ЗаписатьАтрибут, ЗаписатьТекст, ЗаписатьКонецЭлемента.

Доступ к данным другой базы 1С с этой же машины можно получить через COM-соединение (V83.COMConnector), а полученные объекты уже сериализовать в XML описанным кодом. Это нужно редко: обычно хватает прямого запроса к своей базе.

Внешние источники данных и COM: что это на самом деле

Вокруг XML-выгрузки часто путают два разных механизма, и из-за путаницы выбирают не тот инструмент.

Внешние источники данных в 1С — это не про XML. Это механизм подключения к сторонней базе через ODBC: SQL Server, PostgreSQL, Oracle и т.п. Он позволяет читать таблицы чужой СУБД прямо из 1С как обычные данные. К формированию XML-файла он отношения не имеет, хотя название звучит похоже.

COM-соединение (V83.COMConnector) — способ из одной программы обратиться к работающей базе 1С и получить её объекты. Его используют, когда XML нужно собрать из данных другой базы 1С на этой же машине. Но сама выгрузка в файл всё равно идёт через ЗаписьXML и сериализатор — COM лишь даёт доступ к данным.

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

Перед тем как городить COM-соединение, проверьте: а нельзя ли запустить код выгрузки прямо в той базе, откуда нужны данные? В девяти случаях из десяти это проще и надёжнее внешнего подключения.

Кодировка и спецсимволы в XML-файле

Главная причина «кракозябр» на приёмной стороне — расхождение между заявленной и фактической кодировкой. Если в объявлении стоит encoding="UTF-8", а файл физически записан в windows-1251, кириллица превратится в мусор.

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

Пять символов нельзя класть в XML как есть — они служебные:

СимволЗамена в XML
&&amp;
<&lt;
>&gt;
"&quot;
'&apos;

Хорошая новость: ЗаписьXML и СериализаторXDTO экранируют их сами. Ручное экранирование нужно только если вы собираете XML конкатенацией строк — так делать не стоит именно по этой причине.

Управляющие символы с кодом ниже пробела (табуляция части диапазона, перевод строки внутри данных, символы с кодами 0–8) в XML 1.0 недопустимы. Если в реквизите базы случайно оказался такой символ (частый случай — данные, загруженные из сторонней системы), запись XML упадёт с ошибкой. Такие строки нужно чистить перед выгрузкой.

Ещё одна незаметная ловушка — метка порядка байтов (BOM) в начале UTF-8 файла. Некоторые приёмники (банковские и госпорталы с жёстким разбором) считают файл с BOM некорректным, потому что перед <?xml оказываются три служебных байта. Если получатель жалуется на «лишние символы до объявления», а глазами файл выглядит нормальным, причина обычно именно в BOM. Запись через ЗаписьXML BOM не добавляет, но при пересохранении файла сторонним редактором он может появиться — проверьте, чем файл трогали после выгрузки.

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

Разовую выгрузку делают руками, а постоянную вешают на регламентное задание. Код выгрузки оформляют как процедуру в общем модуле, а запуск настраивают в Администрирование → Обслуживание → Регламентные и фоновые задания (в части конфигураций — Администрирование → Поддержка и обслуживание).

В карточке задания задают расписание: периодичность, время запуска, дни недели. Для ночной выгрузки, например, ставят запуск в 2:00 ежедневно.

Важно учитывать вариант работы базы:

  • Клиент-серверная база . Регламентные задания выполняет сервер 1С автоматически по расписанию, без участия пользователя. Это штатный и надёжный режим.
  • Файловая база. Регламентные задания работают только пока открыт хотя бы один сеанс, в котором включено их выполнение. Для файловой базы под автоматику обычно поднимают отдельный фоновый сеанс или выполняют задания из специально запущенного клиента.

Для надёжной автоматической выгрузки по расписанию файловую базу лучше перевести в клиент-серверный режим или держать постоянно открытый служебный сеанс. Иначе ночное задание просто не запустится, если вечером все вышли из базы.

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

Типичные ошибки при формировании файла

Разберём, что чаще всего ломает выгрузку и как это чинить.

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

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

Короткий контроль перед отправкой файла получателю:

Проверка XML перед отправкой
Выполнено: 0 / 5

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

Чем выгрузка в XML отличается от выгрузки в DT?
Файл DT — это полная бинарная копия информационной базы, её грузят только в пустую базу той же версии платформы. XML — текстовый обмен отдельными объектами, он читается и редактируется, подходит для переноса части данных и для внешних систем.
Можно ли выгрузить XML без прав программиста, обычному пользователю?
Да, если дано право на интерактивное открытие внешних обработок и настроен штатный обмен. Саму обработку выгрузки или план обмена готовит специалист, а запускать выгрузку может пользователь с нужными правами.
Почему приёмная база не видит часть выгруженных данных?
Чаще всего приёмник — другая конфигурация или другая версия той же конфигурации. Прямая загрузка XML переносит объекты только в идентичную структуру; для разных конфигураций обязательны правила конвертации.
В какой кодировке лучше сохранять XML?
UTF-8 — универсальный выбор, его понимают почти все системы. windows-1251 берут, только если приёмник прямо требует эту кодировку. Главное — чтобы объявление в файле соответствовало фактической записи.
Как выгружать XML автоматически каждую ночь?
Оформите код выгрузки процедурой в общем модуле и повесьте на регламентное задание с ночным расписанием. В клиент-серверной базе оно отработает само; в файловой нужен постоянно открытый сеанс.