Как выгрузить данные из 1С:Предприятия в формат XML
Содержание
Выгрузить данные из 1С в XML можно четырьмя разными путями, и выбор зависит не от версии платформы, а от того, кто и чем будет читать файл. Если принимающая сторона — другая база 1С, берите план обмена или стандартную обработку «Выгрузка и загрузка данных XML». Если файл уходит в стороннюю систему или в госорган — нужен XML строго заданной структуры, и его собирают кодом через ЗаписьXML и сериализацию XDTO.
Ниже — когда достаточно готового механизма, а когда без обработчика на встроенном языке не обойтись, плюс типичные ошибки кодировки и памяти на больших объёмах.
Готовые механизмы: когда хватает встроенной обработки
В типовых конфигурациях на платформе 8.3 есть штатная обработка «Выгрузка и загрузка данных XML». Она сериализует справочники, документы и регистры в один XML-файл без программирования.
Запускается она как внешняя или встроенная обработка — через Файл → Открыть в режиме «1С:Предприятие», если файл обработки у вас на диске, либо из раздела сервисных обработок, если она встроена в конфигурацию. В форме отмечаете галочками нужные объекты метаданных и жмёте «Выгрузить».
Этот способ подходит, когда:
- 📦 обе стороны — базы 1С с одинаковой или совместимой структурой метаданных;
- 🔁 нужна разовая перегрузка данных из базы в базу (например, перенос справочников в чистую базу);
- 🗂 важно сохранить ссылочную целостность — обработка выгружает связанные объекты по ссылкам.
Файл, полученный этой обработкой, использует внутренние идентификаторы объектов 1С. Сторонняя система (сайт, ERP другого вендора) такой XML корректно не разберёт — для них структура будет нечитаемой. Для внешних систем нужен другой подход, см. раздел про код.
Перед запуском любой выгрузки есть короткий набор проверок, который снимает большую часть проблем:
Отдельный случай — выгрузка отдельного элемента. Если нужно отдать один документ или справочник, откройте его, затем в меню Ещё формы объекта поищите команду вывода в XML (в части конфигураций она есть для отладки). Но для регулярной задачи это неудобно — проще обработка.
Планы обмена: выгрузка по правилам конвертации
Когда структуры баз различаются, прямая сериализация не годится — поля не совпадут. Здесь работает механизм планов обмена и правил конвертации.
Современный формат обмена между типовыми конфигурациями — EnterpriseData. Это универсальный XML-формат, в который каждая конфигурация умеет выгружать свои данные и из которого умеет загружать. Бухгалтерия, ЗУП и УТ понимают его «из коробки».
Настройка выполняется в режиме «1С:Предприятие», а не в конфигураторе:
- Откройте
Администрирование → Синхронизация данных(в некоторых конфигурациях —Настройка синхронизации данных). - Включите синхронизацию, если она выключена, и создайте новую настройку.
- Выберите вид обмена — для файлового варианта это обмен через каталог или через файл.
- Укажите каталог, куда программа будет складывать XML-сообщения.
- Настройте состав данных (организации, период, фильтры) и запустите первую выгрузку.
Программа создаст в каталоге файл сообщения вида 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С-Отчётность). - Сформируйте и заполните нужный отчёт за период.
- В командной панели отчёта найдите команду выгрузки — обычно
Выгрузить → Выгрузить для передачиили аналогичную. - Укажите каталог. Программа создаст 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?
ОткрытьФайл. Эти два значения должны совпадать, иначе получатель увидит «кракозябры» в русских буквах. Windows-1251 используйте только если её жёстко требует принимающая система.Почему стандартная обработка «Выгрузка и загрузка данных XML» не загружается в стороннюю систему?
ЗаписьXML либо выгружайте в формат EnterpriseData по опубликованной схеме.Можно ли выгрузить только часть данных — за период или по фильтру?
ГДЕ Дата МЕЖДУ ... И ...). Планы обмена и синхронизация тоже позволяют задать период и состав данных в настройке.