Как правильно записать XML-строку в файл в 1С:Предприятие 8

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1. Потоковая запись напрямую в файл

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

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


ПутьКФайлу = "C:\Exchange\Data.xml";
ЗаписьXML = Новый ЗаписьXML;

// Указываем кодировку UTF-8 для корректной поддержки кириллицы
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");

ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
ЗаписьXML.ЗаписатьТекст("Данные нашего документа");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем Root

// Команда Закрыть() в данном случае финализирует запись на диск
ЗаписьXML.Закрыть();

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

Метод 2. Формирование XML-строки с последующим сохранением

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

Разберем, как это работает по шагам:

  1. Создаем объект ЗаписьXML.
  2. Вызываем УстановитьСтроку(), тем самым сообщая системе, что запись будет идти во внутренний буфер.
  3. Формируем структуру XML (теги, атрибуты, текст).
  4. Вызываем Закрыть(), который в данном режиме возвращает полную XML-строку.
  5. Записываем полученную строку в текстовый файл через ЗаписьТекста.

Посмотрим на пример реализации:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();

// Формируем структуру
ЗаписьXML.ЗаписатьНачалоЭлемента("Catalog");
ЗаписьXML.ЗаписатьАтрибут("Name", "Товары");
ЗаписьXML.ЗаписатьКонецЭлемента();

// Получаем результат
СтрокаXML = ЗаписьXML.Закрыть();

// Теперь сохраняем строку как обычный текст
ТекстовыйДокумент = Новый ЗаписьТекста;
ТекстовыйДокумент.Открыть("C:\Temp\MyData.xml", КодировкаТекста.UTF8);
ТекстовыйДокумент.ЗаписатьСтроку(СтрокаXML);
ТекстовыйДокумент.Закрыть();

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

Метод 3. Использование механизма XDTO (современный стандарт)

В современной разработке на платформе 1С 8.3 ручное написание тегов через ЗаписьXML используется всё реже. На смену пришел механизм XDTO (XML Data Transfer Objects). Он позволяет превратить любой объект 1С (справочник, документ, массив или структуру) в XML одной командой.

Выясним преимущество этого подхода: система автоматически заботится о соблюдении стандартов XML, преобразует типы данных (например, даты в формат ISO) и корректно экранирует спецсимволы. Рассмотрим пример записи объекта в файл:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\Object.xml", "UTF-8");

// Сериализуем объект 1С напрямую в файл
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СсылкаНаСправочник);

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

Это самый быстрый и "чистый" способ записи, если структура вашего XML совпадает со структурой объектов 1С или описана в схеме XDTO.

Проблема спецсимволов и "ручной" записи

Рассмотрим предостережение из темы форума: можно ли просто склеивать строки, чтобы получить XML? Теоретически — да, практически — это крайне опасно. Выясним почему.

В XML существуют зарезервированные символы: <, >, &, ", '. Если в наименовании вашей номенклатуры встретится название ООО "Рога & Копыта", и вы просто вставите его в строку, ваш XML-файл станет невалидным.

Объект ЗаписьXML автоматически заменяет & на &amp;, а " на &quot;. Если вы используете простую запись текста (ЗаписьТекста), вам придется писать функцию экранирования этих символов самостоятельно, что часто приводит к ошибкам.

Настройка форматирования (красивый XML)

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


Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина); // Истина включает отступы
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Data\Formatted.xml", Параметры);
// Далее процесс записи не меняется

Использование параметров позволяет явно задать версию XML и кодировку, что критично для интеграции со строгими внешними системами.

Работа через DOM (Document Object Model)

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

С помощью ДокументDOM вы можете свободно перемещаться по узлам документа, добавлять и удалять их в любом порядке, а затем вызвать объект ЗаписьDOM, чтобы сохранить результат в файл. Однако помните, что DOM-модель потребляет много памяти, так как хранит все дерево целиком.

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

Подводя итог нашему анализу, можно выделить следующие правила:

Выяснив эти особенности, вы сможете эффективно и безопасно работать с XML-выгрузками любой сложности.

← На главную