К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как сохранить документ из 1С в формате XML программно

Как программно сохранить документ из 1С в формат XML: сериализация через ЗаписатьXML, выгрузка печатных форм, обмен данными. Готовые примеры кода на встроенном языке.

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

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

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

Способ 1. Сериализация объекта через ЗаписьXML

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

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл("C:\Выгрузка\Документ.xml");

ЗаписьXML.ЗаписатьОбъявлениеXML();

ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

ЗаписатьXML(ЗаписьXML, ДокументОбъект);

ЗаписьXML.Закрыть();

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

Ограничение метода: формат файла — внутренний формат платформы, а не общепринятый стандарт. Внешняя система (не 1С) такой файл, скорее всего, не разберёт без дополнительной обработки. Также при сериализации ссылки выгружается сам объект, а не только ссылка на него — учитывайте это при оценке объёма данных.

bsl
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписатьXML(ЗаписьXML, ДокументОбъект);
ЗаписьXML.Закрыть();

Способ 2. Ручная запись XML произвольной структуры

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

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");

ЗаписьXML.ЗаписатьОбъявлениеXML();

ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");

ЗаписьXML.ЗаписатьАтрибут("Номер", Строка(ДокументОбъект.Номер));

ЗаписьXML.ЗаписатьАтрибут("Дата", Формат(ДокументОбъект.Дата, "ДФ=yyyy-MM-dd"));

Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл

ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");

ЗаписьXML.ЗаписатьАтрибут("Номенклатура", Строка(СтрокаТЧ.Номенклатура));

ЗаписьXML.ЗаписатьАтрибут("Количество", Формат(СтрокаТЧ.Количество, "ЧГ="));

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

КонецЦикла;

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

ЗаписьXML.Закрыть();

Ключевые моменты при ручной записи. Кодировку указывайте явно — чаще всего требуется UTF-8, но некоторые принимающие системы ожидают windows-1251. Каждый открытый элемент должен быть закрыт вызовом ЗаписатьКонецЭлемента(), иначе файл будет повреждён. Числа и даты форматируйте по требованиям формата: для дат типичен ISO-вид yyyy-MM-dd, для чисел — без групповых разделителей.

Способ 3. Выгрузка через XDTO и фабрику типов

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

ТипДокумента = ФабрикаXDTO.Тип("http://example.org/schema", "Документ");

ОбъектXDTO = ФабрикаXDTO.Создать(ТипДокумента);

ОбъектXDTO.Номер = Строка(ДокументОбъект.Номер);

ОбъектXDTO.Дата = ДокументОбъект.Дата;

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла);

ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);

ЗаписьXML.Закрыть();

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

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

Способ 4. Планы обмена и универсальный формат EnterpriseData

Если задача — регулярный обмен документами между базами 1С (например, между УТ и БП), правильный инструмент — планы обмена. Платформа сама формирует XML-сообщения с данными документов, регистрирует изменения и обеспечивает загрузку на другой стороне. Разработчику достаточно зарегистрировать документ в плане обмена и выполнить обмен.

Современные типовые конфигурации используют универсальный формат EnterpriseData на базе XDTO. В нём документ выгружается в стандартизированной структуре, понятной другим типовым решениям. Программно выгрузку можно инициировать через стандартные процедуры обмена данными либо сформировать сообщение обмена в файл вручную через узел плана обмена.

Этот способ оправдан при постоянной интеграции, но тяжеловесен для разовой задачи «сохранить один документ в файл». Настройка плана обмена, регистрация узлов и сопоставление данных требуют времени, поэтому для одиночной выгрузки выбирайте сериализацию или ручную запись.

Сравнение способов

Сериализация через ЗаписатьXML

Быстро, подходит для переноса между одинаковыми конфигурациями; формат внутренний, внешние системы не читают

Ручная запись XML

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

XDTO по схеме

Валидация по XSD, стандарт для регламентированных форматов; нужна актуальная схема и её поддержка

Планы обмена / EnterpriseData

Регулярный обмен между базами 1С с регистрацией изменений; избыточен для разовой выгрузки

Где выполнять код: клиент, сервер, внешняя обработка

В клиент-серверном режиме файловая система сервера и клиента — разные среды. Если код выполняется на сервере (директива &НаСервере), файл создаётся на сервере, и пользователь его не увидит напрямую. Для передачи файла пользователю результат помещают во временное хранилище, а на клиенте сохраняют через ПолучитьФайл() или диалог сохранения.

Для разовых задач удобна внешняя обработка (файл .epf), открываемая через «Файл → Открыть». В ней можно разместить форму с выбором документа и кнопкой выгрузки. Альтернатива без разработки — типовая обработка «Универсальный обмен данными в формате XML», которая выгружает документы по правилам обмена между конфигурациями.

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

Проверка результата и типичные ошибки

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

Контрольные точки

Как проверить результат

Открытие файла в браузере
Норма

Документ отображается как дерево элементов

Тревожный признак

Ошибка разбора XML с номером строки

Кодировка
Норма

Кириллица читается, в объявлении указана правильная кодировка

Тревожный признак

Кракозябры вместо русского текста

Полнота данных
Норма

Все табличные части и реквизиты присутствуют

Тревожный признак

Пустые элементы или отсутствующие строки

Структура по схеме
Норма

Файл проходит валидацию XSD

Тревожный признак

Ошибки валидации по обязательным полям

К наиболее частым проблемам относятся: незакрытый объект ЗаписьXML из-за исключения в середине кода, неверная кодировка, запись на сервере при ожидании файла на клиенте, выгрузка ссылки вместо объекта (получается пустой или неполный XML) и неправильное форматирование дат и чисел для внешнего формата.

Типичные ошибки
01
Забытый Закрыть() — файл пуст или обрезан, особенно при исключении в цикле записи
02
Сериализация ссылки вместо объекта — в файл попадают не все данные, используйте ПолучитьОбъект()
03
Кодировка по умолчанию — принимающая система не читает кириллицу, указывайте кодировку явно
04
Файл записан на сервере, а ищут на клиенте — в клиент-серверном режиме передавайте файл через временное хранилище
05
Дата и числа в формате 1С — внешний формат требует ISO-даты и числа без разделителей групп

Выгрузка печатной формы или электронного документа

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

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

Маршрут решения

Как выбрать способ

Нужно перенести документ в другую базу 1С с той же конфигурациейИспользуйте сериализацию через ЗаписатьXML/ПрочитатьXML
Файл нужен внешней системе по заданному форматуФормируйте XML вручную через ЗаписьXML или по XSD через XDTO
Нужен регулярный двусторонний обмен между базамиНастройте план обмена с форматом EnterpriseData
Требуется электронный документ (УПД, счёт-фактура)Используйте штатную подсистему ЭДО конфигурации, а не ручную сборку XML

Итоговые рекомендации

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

В любом варианте закладывайте обработку ошибок с гарантированным закрытием файла, тестируйте на копии базы и проверяйте итоговый XML до передачи получателю. Это занимает немного времени, но исключает ситуацию, когда выгрузка формально выполнена, а файл непригоден.

Итог

Что важно запомнить

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

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

Можно ли сохранить документ в XML без программирования?

Да, частично. Универсальная обработка обмена данными в формате XML позволяет выгрузить документы по правилам без написания кода, а электронные документы (УПД, акты) сохраняются из подсистемы ЭДО типовой конфигурации. Но для произвольного формата файла без кода не обойтись.

Почему выгруженный XML не открывается в другой базе 1С?

Чаще всего причина в несовпадении структуры конфигураций: сериализованный объект можно прочитать только там, где существует тот же тип с совместимыми реквизитами. Если конфигурации разные, используйте обмен по правилам конвертации или универсальный формат EnterpriseData.

Как выгрузить сразу много документов одним файлом?

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

В какой кодировке сохранять XML?

Стандартный выбор — UTF-8, её понимают практически все системы. Указывайте кодировку явно при открытии файла: ОткрытьФайл(ИмяФайла, "UTF-8"). Если принимающая система требует windows-1251 или UTF-16, следуйте её спецификации — несовпадение кодировки делает кириллицу нечитаемой.

Чем отличается ЗаписатьXML от ФабрикаXDTO.ЗаписатьXML?

ЗаписатьXML сериализует объект во внутреннем формате платформы без проверки структуры. ФабрикаXDTO.ЗаписатьXML записывает XDTO-объект строго по схеме XSD с валидацией типов и обязательных полей. Первый вариант — для обмена между базами 1С, второй — для формализованных внешних форматов.

Файл создаётся, но пустой — в чём причина?

Типовые причины: код прервался исключением до вызова Закрыть(), сериализуется ссылка вместо объекта (нужно ПолучитьОбъект()), либо файл записывается на сервере, а проверяется на клиенте. Проверьте обработку исключений и место выполнения кода.