Выгрузка данных в формат XML из 1С 8.3: все рабочие способы

· 9 мин

Содержание

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

Выбор зависит от того, кто и как будет читать файл. Для обмена между двумя базами 1С подойдёт сериализация и планы обмена. Для строгого внешнего формата, описанного XSD-схемой, нужен XDTO. Для разовой или нестандартной выгрузки проще написать обработку, которая соберёт XML поэлементно.

Ниже — все рабочие способы для 1С 8.3 на платформе «Такси»: от готовой обработки до собственного кода, плюс автоматизация по расписанию и разбор частых ошибок.

Готовые механизмы в типовых конфигурациях

В типовых БП 3.0, ЗУП 3.1, УТ 11 выгрузку в XML закрывают три штатных инструмента.

Обработка «Выгрузка и загрузка данных XML». Универсальный сериализатор: выгружает выбранные типы объектов (или всю базу) в один файл XML. Берётся на диске ИТС, открывается через Файл → Открыть в режиме «1С:Предприятие». В форме отмечаете нужные справочники и документы, при необходимости период, указываете каталог — на выходе получаете файл с полной структурой объектов. Та же обработка умеет грузить файл обратно, поэтому её часто используют парой «выгрузил здесь — загрузил там».

Одно ограничение держите в голове сразу: обработка переносит объекты «как есть», по внутренним идентификаторам, и рассчитана на идентичные конфигурации. Для баз с разным составом метаданных она не годится — там нужна синхронизация по правилам.

Планы обмена и РИБ. Если базы однотипные (например, центральная и филиалы), настраивается распределённая информационная база. Платформа сама формирует XML с изменениями и выгружает их через Администрирование → Обслуживание → Распределённая информационная база (точный путь зависит от конфигурации). Выгружается не всё подряд, а только то, что изменилось с прошлого обмена.

«Конвертация данных » и формат EnterpriseData. Для обмена между разными конфигурациями (УТ → БП, например) используется механизм правил обмена. В типовых решениях он встроен в раздел НСИ и администрирование → Синхронизация данных. Формат EnterpriseData — это и есть описанный XDTO-пакет, файлы на выходе — XML.

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

Коротко, какой способ под какую задачу:

СпособКогда подходитЧто на выходе
Обработка «Выгрузка и загрузка данных XML»Перенос данных между базами одной конфигурации, без кодаУниверсальный XML со всей структурой объектов
План обмена / РИБРегулярный обмен между однотипными базамиXML только с изменениями с прошлого сеанса
Синхронизация (EnterpriseData)Обмен между разными конфигурациями 1СXML по правилам в формате EnterpriseData
Сериализация кодомВыгрузка конкретного списка по отборуXML с сериализованными объектами 1С
Своя обработка (ЗаписьXML)Нестандартный внешний формат (банк, госсистема)XML с любой структурой, какую зададите

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

Когда выгрузку описывает XDTO-пакет

XDTO (XML Data Transfer Objects) — это типизированная модель данных. Проще говоря, схема, которая заранее задаёт, какие элементы и атрибуты будут в XML, какого они типа и в каком порядке идут. Платформа проверяет данные на соответствие этой модели ещё до записи файла.

XDTO нужен, когда:

  • 📐 принимающая система дала XSD-схему и файл обязан ей соответствовать;
  • 🔁 вы обмениваетесь в формате EnterpriseData (он целиком построен на XDTO-пакетах);
  • ✅ важна строгая валидация — чтобы в файл не попало значение неправильного типа.

Готовые XDTO-пакеты видны в конфигураторе в ветке Общие → XDTO-пакеты. Там можно создать свой пакет вручную или импортировать внешнюю XSD-схему: конфигуратор разберёт её на типы и построит структуру пакета. После этого обращаетесь к типам через глобальную ФабрикаXDTO, создаёте объект нужного типа, заполняете его свойства и записываете методом ФабрикаXDTO.ЗаписатьXML.

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

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

Сериализация объектов средствами встроенного языка

Когда нужно выгрузить конкретный список — например, только номенклатуру с остатками — проще всего пройтись по выборке и сериализовать каждый объект. За это отвечает глобальный СериализаторXDTO и объект ЗаписьXML.

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

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

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

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

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

Несколько тонкостей, о которых легко забыть:

  • 📁 каталог выгрузки должен существовать — платформа не создаст его сама, добавьте проверку и СоздатьКаталог;
  • 🔒 если справочник иерархический или подчинённый, выгружайте его целиком, иначе ссылки на родителя или владельца не разрешатся при загрузке;
  • 🧩 большие объёмы пишите порциями и не держите открытый файл дольше необходимого — незакрытый ЗаписьXML оставит файл заблокированным.

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

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

Своя внешняя обработка под нестандартный формат

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

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

Запись.ЗаписатьНачалоЭлемента("Прайс");
Запись.ЗаписатьАтрибут("Дата", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));

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

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

Здесь вы полностью управляете разметкой: ЗаписатьНачалоЭлемента / ЗаписатьКонецЭлемента открывают и закрывают тег, ЗаписатьАтрибут добавляет атрибут, ЗаписатьТекст пишет значение внутрь. Число приводится к строке через Формат с явным разделителем — иначе разделитель разрядов и запятая сломают парсинг на принимающей стороне.

Метод ЗаписатьТекст сам экранирует спецсимволы XML — амперсанд, угловые скобки, кавычки превращаются в сущности (&, < и т. д.). Поэтому не склеивайте разметку строками вручную: наименование товара с символом & при ручной сборке сломает файл, а через ЗаписатьТекст выгрузится корректно.

Оформить это лучше расширением конфигурации или внешней обработкой, подключённой в справочник дополнительных обработок (Администрирование → Печатные формы, отчёты и обработки). Так вы не меняете типовую конфигурацию и обработка переживёт обновление. Расширение удобнее, когда выгрузка должна запускаться регламентным заданием на сервере; отдельная внешняя обработка — когда её гоняют руками или через /Execute.

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

Разовую выгрузку запускают руками, регулярную — по расписанию. Два рабочих варианта.

Регламентное задание (клиент-серверная база ). В расширении или типовой конфигурации создаётся регламентное задание с обработчиком, который вызывает процедуру выгрузки. Расписание настраивается в Администрирование → Обслуживание → Регламентные и фоновые задания. Задание выполняется на сервере в фоне, пользователь для этого не нужен.

Планировщик Windows + ключ /Execute. Для файловой базы или разовой автоматизации проще запускать внешнюю обработку через bat-файл по расписанию планировщика задач Windows:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE ^
 /S"server\base" /N"ОбменПользователь" /P"пароль" ^
 /Execute"C:\Обмен\Выгрузка.epf" /DisableStartupMessages

Ключ /Execute запускает внешнюю обработку и закрывает сеанс после её завершения. Номер версии в пути (8.3.24.1548) подставьте свой — посмотрите установленную в C:\Program Files\1cv8. Пароль в открытом bat-файле хранить небезопасно: ограничьте доступ к файлу правами ОС, а техпользователю выдайте только необходимые роли.

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

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

Разбор частых ошибок выгрузки

Большинство сбоев при выгрузке XML — это кодировка, права на каталог или рассогласование конфигураций. Сопоставьте симптом с причиной.

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

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

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

Чем выгрузка XML отличается от выгрузки в dt?
Файл .dt — это полная бинарная копия всей информационной базы, её грузят целиком в пустую базу той же конфигурации. XML выгружает отдельные данные (справочники, документы, регистры) и подходит для обмена с другими системами, в том числе не-1С.
Можно ли выгрузить в XML только часть справочника, по отбору?
Да. В обработке «Выгрузка и загрузка данных XML» задаётся отбор по типам и периоду. Если нужен произвольный отбор — пишите выгрузку кодом: накладываете условие на выборку и сериализуете только отобранные объекты.
Какую кодировку указывать в файле?
По умолчанию UTF-8 — её понимает большинство внешних систем. Если принимающая сторона требует windows-1251, задайте её и при открытии файла в ЗаписьXML, и в объявлении XML. Главное, чтобы фактическая кодировка файла и заявленная совпадали.
Нужно ли программирование, чтобы выгрузить XML?
Нет, если хватает штатной обработки «Выгрузка и загрузка данных XML» или настроенной синхронизации. Код нужен только под нестандартный внешний формат или произвольный отбор данных.
Как запускать выгрузку автоматически в файловой базе?
Через планировщик задач Windows и запуск внешней обработки ключом /Execute из bat-файла. В клиент-серверной базе удобнее регламентное задание — оно работает на сервере без участия пользователя.