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

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

1С: как строку сохранить в XML — способы, примеры кода и проверка результата

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

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

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

Какой способ выбрать под вашу задачу

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

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

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

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

Строка с XML уже готова, нужно просто положить её в файлИспользуйте ЗаписьТекста с кодировкой UTF-8 и расширением .xml
XML нужно собрать из данных программноИспользуйте объект ЗаписьXML — он сам экранирует спецсимволы
Нужно выгрузить объект конфигурации (документ, справочник)Применяйте СериализаторXDTO.ЗаписатьXML
Файл должен читаться сторонней системой со строгой схемойСобирайте через ЗаписьXML и сверяйте с XSD-схемой получателя

Запись готовой строки XML в файл

Самый простой сценарий: переменная СтрокаXML уже содержит корректный XML-текст. Записать её в файл можно объектом ЗаписьТекста:

Запись = Новый ЗаписьТекста("C:\Обмен\document.xml", КодировкаТекста.UTF8);

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

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

Обратите внимание на кодировку. Большинство внешних систем ждут UTF-8, и именно эта кодировка указана в примере. Если в строке уже есть XML-декларация вида <?xml version="1.0" encoding="windows-1251"?>, а файл записан в UTF-8, получатель получит кракозябры или ошибку парсинга — кодировка декларации и фактическая кодировка файла должны совпадать.

Альтернатива — записать строку через ЗаписьXML методом ЗаписатьБезОбработки. Этот метод вставляет текст «как есть», без экранирования. Он удобен, когда нужно встроить готовый фрагмент внутрь формируемого документа, но требует уверенности в валидности вставляемой строки.

Формирование XML программно через ЗаписьXML

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

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

Запись.УстановитьСтроку("UTF-8");

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

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

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

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

Запись.ЗаписатьТекст("Кабель ВВГ 3х2,5");

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

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

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

Метод Закрыть() возвращает готовую строку — её можно сохранить в файл способом из предыдущего раздела или отправить по сети. Если нужно писать сразу в файл, вместо УстановитьСтроку() вызовите ОткрытьФайл("путь").

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

Порядок действий при формировании XML
  1. 1
    Создайте объект ЗаписьXML и укажите назначение: УстановитьСтроку() или ОткрытьФайл()
  2. 2
    Вызовите ЗаписатьОбъявлениеXML() для корректного заголовка документа
  3. 3
    Записывайте элементы парами: ЗаписатьНачалоЭлемента → содержимое → ЗаписатьКонецЭлемента
  4. 4
    Вызовите Закрыть() и получите строку или закройте файл
  5. 5
    Откройте результат в браузере или редакторе и убедитесь, что разметка валидна

Сериализация объектов конфигурации в XML

Если цель — выгрузить объект 1С (элемент справочника, документ) в XML для обмена, ручная сборка не нужна. Платформа предоставляет СериализаторXDTO:

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

Запись.ОткрытьФайл("C:\Обмен\объект.xml");

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

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

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

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

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

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

Внутри 1С валидность проверяют обратным чтением: создайте ЧтениеXML, откройте файл и в цикле вызывайте Прочитать() до конца. Если разметка битая, платформа выбросит исключение с указанием позиции ошибки. Этот приём стоит встроить в процедуру выгрузки как самопроверку перед передачей файла.

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

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

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

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

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

Браузер показывает ошибку разбора с номером строки

Кодировка файла
Норма

Русские буквы читаются, декларация encoding совпадает с реальной кодировкой

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

Кракозябры или ошибка Invalid character

Структура элементов
Норма

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

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

Элементы вложены друг в друга из-за пропущенного ЗаписатьКонецЭлемента

Спецсимволы в данных
Норма

Амперсанды и кавычки экранированы автоматически

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

Ошибка парсинга на значениях с символами & или кавычками

Типичные ошибки и ограничения

Самая частая ошибка — попытка записать готовую XML-строку методом ЗаписатьТекст. Метод экранирует все угловые скобки, и вместо документа получается текст с &lt; и &gt;. Для готовой разметки нужен ЗаписатьБезОбработки или обычная ЗаписьТекста.

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

Типичные ошибки
01
Запись готовой строки через ЗаписатьТекст — разметка экранируется и файл не читается
02
Несовпадение кодировки в XML-декларации и фактической кодировке файла — ошибка парсинга у получателя
03
Пропущенный ЗаписатьКонецЭлемента в цикле — элементы вкладываются друг в друга
04
Склейка XML конкатенацией строк без экранирования — документ ломается на спецсимволах
05
Запись в локальный путь при выполнении кода на сервере — файл создаётся не там или не создаётся вовсе

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

Как сохранить XML-строку в файл без BOM?

Используйте ЗаписьТекста с параметром КодировкаТекста.UTF8 — по умолчанию BOM не записывается. Если BOM появляется и мешает получателю, проверьте, не добавляет ли его сторонний способ записи; при необходимости пишите через потоки (ФайловыйПоток) с полным контролем байтов.

Чем отличается ЗаписатьТекст от ЗаписатьБезОбработки?

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

Как получить XML в переменную, а не в файл?

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

Можно ли выгрузить объект 1С в XML одной строкой кода?

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

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

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

Как проверить XML на соответствие схеме получателя?

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

Итог

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

Готовую строку с XML пишите через ЗаписьТекста или ЗаписатьБезОбработки, программно формируемый документ — через ЗаписьXML с парным открытием и закрытием элементов, а объекты конфигурации — через СериализаторXDTO. Следите за кодировкой и всегда проверяйте файл обратным чтением или в браузере до передачи получателю.