Работа с форматом XML является стандартной задачей для разработчика 1С при организации обмена данными. Однако начинающие специалисты часто сталкиваются с путаницей в методах объекта ЗаписьXML: когда данные пишутся в память (строку), а когда — сразу на физический диск. В этой статье мы подробно разберем все способы сохранения XML, проанализируем возможные ошибки и выясним, какой метод является наиболее эффективным в современных условиях.
Это самый правильный и надежный способ с точки зрения потребления ресурсов системы. При использовании этого метода данные не накапливаются в оперативной памяти целиком, а записываются на диск по мере формирования структуры. Рассмотрим последовательность действий, которую необходимо выполнить для корректного сохранения.
Для начала нам необходимо инициализировать объект ЗаписьXML и сразу указать ему путь к файлу, в который будет производиться выгрузка. Проанализируем пример кода:
ПутьКФайлу = "C:\Exchange\Data.xml";
ЗаписьXML = Новый ЗаписьXML;
// Указываем кодировку UTF-8 для корректной поддержки кириллицы
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
ЗаписьXML.ЗаписатьТекст("Данные нашего документа");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем Root
// Команда Закрыть() в данном случае финализирует запись на диск
ЗаписьXML.Закрыть();
Важный нюанс: если вы использовали метод ОткрытьФайл, то метод Закрыть() просто закрывает поток и освобождает файл в операционной системе. Он не возвращает строку XML, так как все данные уже находятся на диске.
Иногда возникает ситуация, когда нам нужно сначала получить XML в виде текста (например, для отладки или передачи в веб-сервис), а только потом решить, записывать его в файл или нет. В этом случае мы используем метод УстановитьСтроку().
Разберем, как это работает по шагам:
ЗаписьXML.УстановитьСтроку(), тем самым сообщая системе, что запись будет идти во внутренний буфер.Закрыть(), который в данном режиме возвращает полную XML-строку.ЗаписьТекста.Посмотрим на пример реализации:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Формируем структуру
ЗаписьXML.ЗаписатьНачалоЭлемента("Catalog");
ЗаписьXML.ЗаписатьАтрибут("Name", "Товары");
ЗаписьXML.ЗаписатьКонецЭлемента();
// Получаем результат
СтрокаXML = ЗаписьXML.Закрыть();
// Теперь сохраняем строку как обычный текст
ТекстовыйДокумент = Новый ЗаписьТекста;
ТекстовыйДокумент.Открыть("C:\Temp\MyData.xml", КодировкаТекста.UTF8);
ТекстовыйДокумент.ЗаписатьСтроку(СтрокаXML);
ТекстовыйДокумент.Закрыть();
Проанализируем ситуацию с памятью: если ваш XML-файл занимает сотни мегабайт, этот способ может привести к ошибке "Недостаточно памяти", так как вся строка должна одновременно поместиться в ОЗУ. Для больших объемов всегда используйте первый метод (потоковую запись).
В современной разработке на платформе 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 автоматически заменяет & на &, а " на ". Если вы используете простую запись текста (ЗаписьТекста), вам придется писать функцию экранирования этих символов самостоятельно, что часто приводит к ошибкам.
Чтобы файл был читаемым для человека (с отступами и правильными переносами строк), воспользуемся объектом ПараметрыЗаписиXML. Разберем, как его подключить:
Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина); // Истина включает отступы
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Data\Formatted.xml", Параметры);
// Далее процесс записи не меняется
Использование параметров позволяет явно задать версию XML и кодировку, что критично для интеграции со строгими внешними системами.
Существует еще один продвинутый метод — использование объекта ДокументDOM. В отличие от последовательной записи, DOM позволяет создать дерево документа в памяти. Рассмотрим ситуацию: вам нужно в самом конце формирования файла добавить какой-то атрибут в корневой (самый первый) тег. В обычном ЗаписьXML это невозможно, так как поток уже ушел вперед.
С помощью ДокументDOM вы можете свободно перемещаться по узлам документа, добавлять и удалять их в любом порядке, а затем вызвать объект ЗаписьDOM, чтобы сохранить результат в файл. Однако помните, что DOM-модель потребляет много памяти, так как хранит все дерево целиком.
Подводя итог нашему анализу, можно выделить следующие правила:
ОткрытьФайл).УстановитьСтроку."<tag>" + Значение + "</tag>", чтобы не нарушить валидность файла спецсимволами.ЗаписьXML, чтобы освободить ресурсы системы и корректно завершить запись файла на диск.Выяснив эти особенности, вы сможете эффективно и безопасно работать с XML-выгрузками любой сложности.