Как выгрузить данные из 1С в файл XML с помощью объекта ЗаписьXML?

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

Задача выгрузки произвольных данных из 1С в XML-файл является одной из самых частых при интеграции с веб-сайтами, кассовыми системами или сторонними сервисами. Для формирования XML-документов в платформах 1С используется специализированный объект ЗаписьXML. Рассмотрим подробнее, как правильно составить программный код для записи данных, сформировать древовидную структуру элементов и предотвратить типичные ошибки при сохранении файла.

Использование объекта ЗаписьXML для формирования файла

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

Рассмотрим пример кода, формирующий иерархическую структуру скидочных карт или клиентов (корневой элемент Discontlist, содержащий вложенные элементы Discont):


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Temp\DiscontList.xml");
ЗаписьXML.ЗаписатьОбъявлениеXML();

// Корневой элемент списка
ЗаписьXML.ЗаписатьНачалоЭлемента("Discontlist");

Для Каждого СрокаИзДанных Из ТаблицаКлиентов Цикл
    
    // Элемент отдельной записи
    ЗаписьXML.ЗаписатьНачалоЭлемента("Discont");
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Surname");
    ЗаписьXML.ЗаписатьТекст(СрокаИзДанных.Фамилия);
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Surname
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Name");
    ЗаписьXML.ЗаписатьТекст(СрокаИзДанных.Имя);
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Name
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("middleName");
    ЗаписьXML.ЗаписатьТекст(СрокаИзДанных.Отчество);
    ЗаписьXML.ЗаписатьКонецЭлемента(); // middleName
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("phone");
    ЗаписьXML.ЗаписатьТекст(СрокаИзДанных.Телефон);
    ЗаписьXML.ЗаписатьКонецЭлемента(); // phone
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("email");
    ЗаписьXML.ЗаписатьТекст(СрокаИзДанных.ЭлектроннаяПочта);
    ЗаписьXML.ЗаписатьКонецЭлемента(); // email
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("DiscontNomber");
    ЗаписьXML.ЗаписатьТекст(СрокаИзДанных.НомерКарты);
    ЗаписьXML.ЗаписатьКонецЭлемента(); // DiscontNomber
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("birthday");
    ЗаписьXML.ЗаписатьТекст(XMLСтрока(СрокаИзДанных.ДатаРождения));
    ЗаписьXML.ЗаписатьКонецЭлемента(); // birthday
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("amount");
    ЗаписьXML.ЗаписатьТекст(XMLСтрока(СрокаИзДанных.СлужебнаяСумма));
    ЗаписьXML.ЗаписатьКонецЭлемента(); // amount
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Discont

КонецЦикла;

// Закрываем корневой элемент
ЗаписьXML.ЗаписатьКонецЭлемента(); // Discontlist

// Обязательно закрываем файловый поток
ЗаписьXML.Закрыть();

Посмотрим на порядок работы методов:

  1. Метод ЗаписатьОбъявлениеXML() добавляет стандартную строку вида <?xml version="1.0" encoding="UTF-8"?>.
  2. Первый вызов ЗаписатьНачалоЭлемента() задает самый верхний тег (в данном примере Discontlist).
  3. Для каждого подчиненного элемента вызывается пара методов: ЗаписатьНачалоЭлемента() и ЗаписатьКонецЭлемента(). Каждому открытому тегу обязана соответствовать закрывающая команда.
  4. Метод Закрыть() сбрасывает данные из буфера на диск и освобождает файл.

Причины ошибки «Файл не обнаружен» при вызове ОткрытьФайл()

Проанализируем частую проблему: при попытке вызвать ЗаписьXML.ОткрытьФайл() платформа выбрасывает исключение: «Ошибка при вызове метода контекста (ОткрытьФайл): Файл не обнаружен...».

Хотя метод ОткрытьФайл() предназначен для создания нового файла, эта ошибка возникает по следующим причинам:

  1. Отсутствует целевая папка на диске: Метод ОткрытьФайл() не создает каталоги автоматически. Если папка, например C:\Temp\, физически отсутствует на диске, операция вернет ошибку.
  2. Разделение контекстов «Клиент» / «Сервер»: Когда код исполняется на сервере (в модуле объекта или с директивой &НаСервере), путь к файлу указывает на файловую систему сервера приложений 1С, а не клиентского компьютера. На серверном диске может не быть указанного пути, либо у службы 1С (например, USR1CV8) нет прав на запись в эту папку.
  3. Недопустимые символы в имени: Если имя файла формируется динамически из реквизита формы или справочника, в нем могут присутствовать запрещенные символы (\, /, :, *, ?, ", <, >, |).

Чтобы избежать ошибки при записи файла, перед открытием следует проверить существование каталога и создать его с помощью функции СоздатьКаталог(), либо использовать функции платформы для работы с временными файлами:


ИмяФайла = Объект.ИмяФайла;
КаталогНаДиске = "C:\Temp\";

// Убедимся, что каталог существует
СоздатьКаталог(КаталогНаДиске);

ПолныйПуть = КаталогНаДиске + ИмяФайла + ".xml";

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПолныйПуть);
// Далее выполнение записи...

Для гарантированной работы в тонком клиенте и на сервере рекомендуется формировать файл во временном каталоге платформы методом ПолучитьИмяВременногоФайла("xml"), после чего передавать файл на клиент через временное хранилище.

Особенности приведения типов данных к формату XML

Выясним причину использования функции XMLСтрока(). При выгрузке реквизитов типов Дата, Число или Булево обычное приведение через метод Строка() формирует представление данных согласно локальным настройкам пользователя (например, 15.11.2017 0:00:00).

Использование XMLСтрока(Значение) преобразует данные к общепринятому стандарту XML-типов (например, дата преобразуется в формат YYYY-MM-DD). Это обеспечивает корректное чтение созданного XML-файла сторонними системами.

← На главную