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

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

Как сохранить XML в файл в 1С

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

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

Базовый инструмент — объект ЗаписьXML. Он позволяет последовательно сформировать документ любой структуры и сохранить результат в файл с нужной кодировкой. Для типовых объектов (справочников, документов) удобнее сериализация через XMLСтрока/ЗаписатьXML, а для обмена по формализованным форматам — механизм XDTO.

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

Способ 1. Произвольный XML через ЗаписьXML

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

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

Запись.ОткрытьФайл("C:\Выгрузка\данные.xml", "UTF-8");

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

Запись.ЗаписатьНачалоЭлемента("Товары");

Для Каждого Строка Из ТаблицаТоваров Цикл

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

Запись.ЗаписатьАтрибут("Код", Строка.Код);

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

Запись.ЗаписатьТекст(Строка.Наименование);

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

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

КонецЦикла;

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

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

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

Если файл нужен не сразу на диске, а в виде строки (например, для передачи через HTTP), используйте Запись.УстановитьСтроку("UTF-8") вместо ОткрытьФайл и заберите результат методом Закрыть(), который вернёт строку XML.

Способ 2. Выгрузка объекта конфигурации сериализацией

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

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

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

ЗаписатьXML(Запись, КонтрагентОбъект);

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

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

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

Способ 3. Выгрузка через XDTO по схеме

Если обмен идёт по формализованному формату (ФНС, банковские выписки, CommerceML), правильный инструмент — механизм XDTO. Структура документа описывается пакетом XDTO, а запись выполняется через ЗаписатьXML с указанием фабрики.

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

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

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

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

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

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

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

ЗаписьXML вручную

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

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

Одна строка кода для объекта конфигурации. Подходит только для обмена между базами 1С с совместимой структурой метаданных.

XDTO

Контроль по схеме, стандарт для формализованного обмена. Требует описания пакета и более сложной разработки.

Кодировка, путь к файлу и права доступа

По умолчанию большинство внешних систем ожидают UTF-8, и её стоит указывать явно. Некоторые старые форматы (отдельные банковские и государственные схемы) требуют windows-1251 — это всегда прописано в спецификации обмена. Если кодировку не указать, 1С использует значение по умолчанию, и кириллица у получателя может отобразиться некорректно.

Путь к файлу зависит от того, где выполняется код. В клиент-серверном режиме код на сервере пишет в файловую систему сервера, а не компьютера пользователя — частая причина «файл сохранился, но я его не вижу». Если файл нужен пользователю локально, сначала сохраните его на сервере во временный файл, затем передайте на клиент через ПоместитьВоВременноеХранилище и НачатьПолучениеФайла, либо формируйте XML целиком на клиенте.

Учётная запись, под которой работает сервер 1С, должна иметь право записи в целевой каталог. Проверить это заранее можно попыткой создать тестовый файл через ТекстовыйДокумент или обработкой исключения с понятным сообщением пользователю.

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

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

Наиболее частые проблемы при сохранении XML из 1С:

  • пропущен Закрыть() — файл пустой или обрезанный;
  • несбалансированные элементы — невалидный XML, не открывается парсером;
  • неверная кодировка — «кракозябры» вместо кириллицы у получателя;
  • запись на сервер вместо клиента — файл «потерян» для пользователя;
  • спецсимволы (&, <, >) в данных — при использовании методов ЗаписьXML они экранируются автоматически, а при склейке XML строкой — нет, что ломает документ.
Типичные ошибки
01
Склейка XML обычной строкой вместо ЗаписьXML — спецсимволы в данных разрушают структуру документа.
02
Отсутствие вызова Закрыть() — данные остаются в буфере, файл оказывается пустым или неполным.
03
Запись в каталог сервера при клиент-серверном режиме — пользователь не находит файл на своём компьютере.
04
Явное указание неверной кодировки — принимающая система отклоняет файл или искажает текст.

Как выбрать подход в вашей ситуации

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

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

Как выбрать действие

Формат XML определяете вы самиИспользуйте ЗаписьXML с ручным формированием элементов
Нужно перенести объект между базами 1СПримените сериализацию ЗаписатьXML и ПрочитатьXML
Формат задан внешней схемой (ФНС, банк, CommerceML)Формируйте документ через механизм XDTO
Разовая выгрузка без доработокИспользуйте типовую обработку выгрузки и загрузки данных XML
Контрольные точки

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

Файл на диске
Норма

Файл существует, размер больше нуля, дата изменения свежая

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

Файл отсутствует или нулевого размера — запись не выполнилась

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

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

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

Сообщение об ошибке XML — структура невалидна

Кириллица в тексте
Норма

Русский текст читается корректно

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

Кракозябры — несовпадение кодировки записи и чтения

Программное чтение через ЧтениеXML
Норма

Документ читается до конца без исключений

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

Исключение при разборе — несбалансированные элементы или спецсимволы

Итог

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

Основной инструмент — ЗаписьXML с методом ОткрытьФайл и обязательным Закрыть() в конце. Кодировку указывайте явно, помните о различии файловых систем клиента и сервера, а результат проверяйте повторным чтением документа.

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

Как сохранить XML в файл без модального режима на клиенте?

Используйте ЗаписьXML с УстановитьСтроку(), получите строку XML, затем сохраните её через ТекстовыйДокумент и метод НачатьЗапись с обработчиком оповещения — это соответствует требованиям немодального режима в тонком и веб-клиенте.

Почему файл создаётся, но остаётся пустым?

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

Как сохранить XML на компьютер пользователя в клиент-серверной базе?

Код на сервере видит только диски сервера. Сформируйте XML в строку или сохраните во временный файл на сервере, поместите данные во временное хранилище, а на клиенте запишите их через ТекстовыйДокумент или получите файл методом НачатьПолучениеФайла.

Какую кодировку выбрать при записи XML?

Стандарт де-факто — UTF-8, если спецификация обмена не требует иного. Некоторые устаревшие форматы банков и госорганов требуют windows-1251; это всегда указано в документации на формат. Кодировку передавайте вторым параметром в ОткрытьФайл или УстановитьСтроку.

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

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

Как проверить, что полученный XML валиден?

Самый быстрый способ — открыть файл в браузере: он покажет ошибку разбора с номером строки. Программно перечитайте файл через ЧтениеXML в цикле Прочитать() — успешное чтение до конца подтверждает корректность структуры.