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