Как выгрузить данные из 1С:Предприятия в формат XML

· 8 мин

Содержание

Выгрузить данные из 1С в XML можно четырьмя разными путями, и выбор зависит не от версии платформы, а от того, кто и чем будет читать файл. Если принимающая сторона — другая база 1С, берите план обмена или стандартную обработку «Выгрузка и загрузка данных XML». Если файл уходит в стороннюю систему или в госорган — нужен XML строго заданной структуры, и его собирают кодом через ЗаписьXML и сериализацию XDTO.

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

Готовые механизмы: когда хватает встроенной обработки

В типовых конфигурациях на платформе 8.3 есть штатная обработка «Выгрузка и загрузка данных XML». Она сериализует справочники, документы и регистры в один XML-файл без программирования.

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

Этот способ подходит, когда:

  • 📦 обе стороны — базы 1С с одинаковой или совместимой структурой метаданных;
  • 🔁 нужна разовая перегрузка данных из базы в базу (например, перенос справочников в чистую базу);
  • 🗂 важно сохранить ссылочную целостность — обработка выгружает связанные объекты по ссылкам.

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

Перед запуском любой выгрузки есть короткий набор проверок, который снимает большую часть проблем:

Что проверить перед выгрузкой в XML
Выполнено: 0 / 6

Отдельный случай — выгрузка отдельного элемента. Если нужно отдать один документ или справочник, откройте его, затем в меню Ещё формы объекта поищите команду вывода в XML (в части конфигураций она есть для отладки). Но для регулярной задачи это неудобно — проще обработка.

Планы обмена: выгрузка по правилам конвертации

Когда структуры баз различаются, прямая сериализация не годится — поля не совпадут. Здесь работает механизм планов обмена и правил конвертации.

Современный формат обмена между типовыми конфигурациями — EnterpriseData. Это универсальный XML-формат, в который каждая конфигурация умеет выгружать свои данные и из которого умеет загружать. Бухгалтерия, ЗУП и УТ понимают его «из коробки».

Настройка выполняется в режиме «1С:Предприятие», а не в конфигураторе:

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

Программа создаст в каталоге файл сообщения вида Message_<префикс>_<номер>.xml. Внутри — данные в формате EnterpriseData, которые другая база 1С загрузит через такую же настройку синхронизации.

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

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

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

Выгрузка кодом: ЗаписьXML и сериализация XDTO

Если XML нужен своей структуры — под API стороннего сервиса, под загрузку в чужую БД, под конкретный формат заказчика — его собирают на встроенном языке. Это основной рабочий инструмент разработчика.

Базовые объекты:

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

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

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

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

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

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

Если нужен не свой формат, а полная сериализация объекта 1С (со всеми реквизитами и табличными частями), используйте СериализаторXDTO:

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

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

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

Разница принципиальная: первый способ даёт XML, который вы контролируете под внешнего получателя, второй — внутренний формат 1С, который прочитает только 1С. Выбирайте под задачу.

Метод ЗаписатьАтрибут и ЗаписатьТекст сами не преобразуют типы — число или дату приводите к строке заранее через Формат() или XMLСтрока(). Для даты в XML корректный вид даёт XMLСтрока(Выборка.Дата) — он возвращает значение в формате ISO.

Выгрузка регламентированной отчётности в XML

Декларации и расчёты для ФНС, СФР (бывший ФСС и ПФР) и статистики сдаются в XML строго заданного формата. Собирать такой файл руками или кодом не нужно — его формирует сама подсистема отчётности.

Порядок в типовой конфигурации:

  1. Откройте раздел Отчёты → Регламентированные отчёты (в части конфигураций — 1С-Отчётность).
  2. Сформируйте и заполните нужный отчёт за период.
  3. В командной панели отчёта найдите команду выгрузки — обычно Выгрузить → Выгрузить для передачи или аналогичную.
  4. Укажите каталог. Программа создаст XML по действующему формату соответствующего ведомства.

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

Этот XML самодостаточен: приёмный комплекс оператора или госоргана проверит его по своей схеме. Ваша задача — только сформировать отчёт в актуальном релизе и выгрузить.

Автоматизация: регламентное задание вместо ручного запуска

Разовую выгрузку делают руками. Регулярную (ночную, ежечасную) вешают на регламентное задание внутри базы или на запуск по расписанию средствами ОС.

Вариант внутри 1С — регламентное задание:

  • Код выгрузки оформляется как процедура в общем модуле.
  • В конфигураторе (Общие → Регламентные задания) или в режиме Администрирование → Обслуживание → Регламентные и фоновые задания создаётся задание с нужным расписанием.
  • В клиент-серверном варианте задания выполняет сервер — файл окажется в каталоге, доступном серверу 1С, а не вашей рабочей станции. Это частая ошибка: путь C:\... на сервере указывает на диск сервера.

Вариант средствами ОС — запуск по планировщику Windows:

"C:\Program Files\1cv8\<номер>\bin\1cv8.exe" ENTERPRISE /S"<сервер>\<база>" /N"Обмен" /P"пароль" /Execute"C:\Обмен\Выгрузка.epf"

Здесь 1cv8.exe запускает платформу в пакетном режиме, /Execute указывает внешнюю обработку , которая делает выгрузку и закрывается. Планировщик Windows вызывает эту команду по расписанию.

В пакетном запуске пароль пользователя попадает в параметры команды и в задание планировщика. Заведите под обмен отдельного пользователя с минимальными правами (только чтение нужных объектов), а не администратора.

Оптимизация XML при больших объёмах данных

На тысячах документов наивная выгрузка упирается в память: если собирать весь XML в строке или в дереве DOM, процесс съедает гигабайты и падает с ошибкой нехватки памяти.

Правила для больших выгрузок:

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

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

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

Частые вопросы по выгрузке данных в XML

В какой кодировке выгружать XML?
UTF-8 — она указывается в объявлении XML и в методе ОткрытьФайл. Эти два значения должны совпадать, иначе получатель увидит «кракозябры» в русских буквах. Windows-1251 используйте только если её жёстко требует принимающая система.
Почему стандартная обработка «Выгрузка и загрузка данных XML» не загружается в стороннюю систему?
Она пишет внутренний формат 1С с её идентификаторами объектов. Для сторонних систем формируйте XML своей структуры кодом через ЗаписьXML либо выгружайте в формат EnterpriseData по опубликованной схеме.
Можно ли выгрузить только часть данных — за период или по фильтру?
Да, если выгружаете кодом: отбор задаётся в тексте запроса (ГДЕ Дата МЕЖДУ ... И ...). Планы обмена и синхронизация тоже позволяют задать период и состав данных в настройке.
Куда попадает файл, если выгрузка идёт по расписанию на сервере?
В каталог на диске сервера 1С, а не на вашей рабочей станции. Указывайте путь, доступный серверному процессу, или сетевую папку, к которой у пользователя сервера есть права записи.
Как получить XSD-схему формата EnterpriseData?
Схему формата можно выгрузить из самой конфигурации средствами подсистемы обмена — она отдаёт описание структуры, по которому стороннюю интеграцию настраивают без доступа к базе.