Выгрузка данных в формат XML из 1С 8.3: все рабочие способы
Содержание
Самый быстрый штатный способ выгрузить данные в 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 с явной кодировкой “UTF-8” и ту же кодировку указывайте в объявлении XML. Если внешняя система требует windows-1251 — задайте её и в методе открытия файла, и в атрибуте encoding.Формат с явной маской: даты — "ДФ=yyyy-MM-dd", числа — "ЧГ=0" без разделителя разрядов и с нужным разделителем дробной части.Перед боевым обменом всегда проверяйте выгруженный файл в текстовом редакторе или браузере: видно и кодировку, и структуру, и не попали ли в выгрузку лишние объекты.
Частые вопросы
Чем выгрузка XML отличается от выгрузки в dt?
.dt — это полная бинарная копия всей информационной базы, её грузят целиком в пустую базу той же конфигурации. XML выгружает отдельные данные (справочники, документы, регистры) и подходит для обмена с другими системами, в том числе не-1С.Можно ли выгрузить в XML только часть справочника, по отбору?
Какую кодировку указывать в файле?
ЗаписьXML, и в объявлении XML. Главное, чтобы фактическая кодировка файла и заявленная совпадали.Нужно ли программирование, чтобы выгрузить XML?
Как запускать выгрузку автоматически в файловой базе?
/Execute из bat-файла. В клиент-серверной базе удобнее регламентное задание — оно работает на сервере без участия пользователя.