Задача выгрузки произвольных данных из 1С в XML-файл является одной из самых частых при интеграции с веб-сайтами, кассовыми системами или сторонними сервисами. Для формирования XML-документов в платформах 1С используется специализированный объект Запись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.Закрыть();
Посмотрим на порядок работы методов:
ЗаписатьОбъявлениеXML() добавляет стандартную строку вида <?xml version="1.0" encoding="UTF-8"?>.ЗаписатьНачалоЭлемента() задает самый верхний тег (в данном примере Discontlist).ЗаписатьНачалоЭлемента() и ЗаписатьКонецЭлемента(). Каждому открытому тегу обязана соответствовать закрывающая команда.Закрыть() сбрасывает данные из буфера на диск и освобождает файл.Проанализируем частую проблему: при попытке вызвать ЗаписьXML.ОткрытьФайл() платформа выбрасывает исключение: «Ошибка при вызове метода контекста (ОткрытьФайл): Файл не обнаружен...».
Хотя метод ОткрытьФайл() предназначен для создания нового файла, эта ошибка возникает по следующим причинам:
ОткрытьФайл() не создает каталоги автоматически. Если папка, например C:\Temp\, физически отсутствует на диске, операция вернет ошибку.&НаСервере), путь к файлу указывает на файловую систему сервера приложений 1С, а не клиентского компьютера. На серверном диске может не быть указанного пути, либо у службы 1С (например, USR1CV8) нет прав на запись в эту папку.\, /, :, *, ?, ", <, >, |).Чтобы избежать ошибки при записи файла, перед открытием следует проверить существование каталога и создать его с помощью функции СоздатьКаталог(), либо использовать функции платформы для работы с временными файлами:
ИмяФайла = Объект.ИмяФайла;
КаталогНаДиске = "C:\Temp\";
// Убедимся, что каталог существует
СоздатьКаталог(КаталогНаДиске);
ПолныйПуть = КаталогНаДиске + ИмяФайла + ".xml";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПолныйПуть);
// Далее выполнение записи...
Для гарантированной работы в тонком клиенте и на сервере рекомендуется формировать файл во временном каталоге платформы методом ПолучитьИмяВременногоФайла("xml"), после чего передавать файл на клиент через временное хранилище.
Выясним причину использования функции XMLСтрока(). При выгрузке реквизитов типов Дата, Число или Булево обычное приведение через метод Строка() формирует представление данных согласно локальным настройкам пользователя (например, 15.11.2017 0:00:00).
Использование XMLСтрока(Значение) преобразует данные к общепринятому стандарту XML-типов (например, дата преобразуется в формат YYYY-MM-DD). Это обеспечивает корректное чтение созданного XML-файла сторонними системами.