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