XML файлы 1С — ЧтениеXML 1С, ЗаписьXML 1С, ЧтениеFastInfoset 1С, ЗаписьFastInfoset 1С, ЧтениеHTML 1С, ЗаписьHTML 1С


XML — текстовые файлы, позволяющие с помощью специальной разметки сохранять сложные данные в структурированном виде.

FastInfoset — XML файл в бинарном («сжатом») виде.

HTML — всем известные веб-страницы, которые также представляют из себя аналог XML с нестрогими проверками.

Объекты чтения/записи XML, FastInfoset, HTML расширяют возможности чтения текстового файла встроенной обработкой тегов разметки.

Также они используются для объектов ПостроительDOM/ЗаписьDOM (см. далее) как источники данных.



Файлы XML 1С содержат текстовую информацию, то есть являются текстовыми файлами. Объекты ЧтениеXML 1С и ЗаписьXML 1С являются «надстройкой», позволяющей упростить работу с тегами XML файла 1С.

Объекты ЧтениеFastInfoset 1С и ЗаписьFastInfoset 1С, ЧтениеHTML 1С и ЗаписьHTML 1С полностью аналогичны ЧтениеXML 1С и ЗаписьXML 1С и служат для работы таким же способом с другими форматами.

Файл XML 1С, который использовался в примерах
<Конфигурация>
     <Справочник Имя="Организации" Синоним="Организации">
     </Справочник>
     <Справочник Имя="Контрагенты" Синоним="Контрагенты">
          <Реквизит Имя="Организация12" Синоним="Организация" />
     </Справочник>
     <Справочник Имя="ДоговорыКонтрагентов" Синоним="Договоры контрагентов">
          <Реквизит Имя="Организация" Синоним="Организация">Текстовое значение</Реквизит>
     </Справочник>
</Конфигурация>

 

Пример 1. Считывание файла XML 1С в дерево значений с помощью ЧтениеXML 1С



Только зарегистрированные пользователи VIP группы могут видеть этот контент.




//открываем файл XML 1С на чтение с помощью ЧтениеXML 1С
Файл = Новый ЧтениеXML();
Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml");

//подготовим дерево значений
//у каждой ветки XML может быть наименование, атрибуты и значение
дзXML = Новый ДеревоЗначений();
дзXML.Колонки.Добавить("Наименование");
дзXML.Колонки.Добавить("Значение");
дзXML.Колонки.Добавить("Атрибуты");

//так как атрибутов у строки XML может быть несколько - будем записывать их в таблицу значений
//каждый атрибут имеет имя и значение
тАтрибутов = Новый ТаблицаЗначений();
тАтрибутов.Колонки.Добавить("Имя");
тАтрибутов.Колонки.Добавить("Значение");

//уровень вложенности поможет нам понимать когда требуется добавить вложенную ветку, а когда нужно вернуться на уровень вверх
УровеньВложенности = 0;
//текущая строка - строка дерева, будет меняться при увеличении вложенности
ТекущаяСтрока = Неопределено;
//чтение файла XML 1С производится не построчно, а по структуре, при окончании файла чтение вернет ЛОЖЬ
Пока Файл.Прочитать() Цикл
     
     //нас интересуют три вида узлов - начало элемента, текст (значение элемента) и конец элемента (чтобы вернуться на уровень вверх)
     Если Файл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
          //в начале элемента увеличиваем уровень вложенности, в конце элемента уменьшаем
          УровеньВложенности = УровеньВложенности + 1;
          
          //если это первая строка, то добавим ее в самый верх дерева и сохраним только наименование
          Если ТекущаяСтрока = Неопределено Тогда
               ТекущаяСтрока = дзXML.Строки.Добавить();
               ТекущаяСтрока.Наименование = Файл.Имя;
               Продолжить;
          Иначе
               //вложенные строки
               ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить();
               ТекущаяСтрока.Наименование = Файл.Имя; //сохраним наименование
               
               //есть ли у этого элемента XML атрибуты?
               Если Файл.КоличествоАтрибутов() > 0 Тогда
                    //если да - скопируем подготовленную пустую таблицу для сохранения атрибутов
                    тАтрибутыУзла = тАтрибутов.Скопировать();
                    //цикл по количеству атрибутов у этого элемента
                    Для Сч = 0 по Файл.КоличествоАтрибутов()-1 Цикл
                         //для каждого атрибута запомним имя и значение
                         Строка = тАтрибутыУзла.Добавить();
                         Строка.Имя = Файл.ИмяАтрибута(Сч);
                         Строка.Значение = Файл.ЗначениеАтрибута(Сч);
                    КонецЦикла;
                    //сохраним таблицу атрибутов элемента в текущую строку
                    ТекущаяСтрока.Атрибуты = тАтрибутыУзла;
               КонецЕсли;
          КонецЕсли;
          
     ИначеЕсли Файл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
          //в начале элемента увеличиваем уровень вложенности, в конце элемента уменьшаем
          УровеньВложенности = УровеньВложенности - 1;
          //возвращаем текущую строку на уровень вверх
          ТекущаяСтрока = ТекущаяСтрока.Родитель;
          
     ИначеЕсли Файл.ТипУзла = ТипУзлаXML.Текст Тогда
          //если у элемента есть значение - просто сохраним его
          ТекущаяСтрока.Значение = Файл.Значение;
          
     КонецЕсли;
     
КонецЦикла;

Файл.Закрыть();

 

Пример 2. Запись файла 1С XML с помощью объекта ЗаписьXML 1С



Только зарегистрированные пользователи VIP группы могут видеть этот контент.




//создаем файл ЗаписьXML 1С
Файл = Новый ЗаписьXML();
Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml", "UTF-8");
Файл.ЗаписатьНачалоЭлемента("Конфигурация");

//по метаданным обходим все справочники (подробнее см. "Работа с метаданными")
Для каждого Справочник из Метаданные.Справочники Цикл
     
     //ЗаписатьНачалоЭлемента - открывает новую [подчиненную] ветку
     Файл.ЗаписатьНачалоЭлемента("Справочник");
     //ЗаписатьАтрибут - записывает атрибут в открытую ранее ветку
     Файл.ЗаписатьАтрибут("Имя", Справочник.Имя);
     Файл.ЗаписатьАтрибут("Синоним", Справочник.Синоним);
     
     //по метаданным обходим все реквизиты справочника
     Для каждого Реквизит из Справочник.Реквизиты Цикл
          Файл.ЗаписатьНачалоЭлемента("Реквизит");
          Файл.ЗаписатьАтрибут("Имя", Реквизит.Имя);
          Файл.ЗаписатьАтрибут("Синоним", Реквизит.Синоним);
          Файл.ЗаписатьКонецЭлемента();
     КонецЦикла;
     
     //по метаданным обходим все табличные части справочника
     Для каждого ТЧ из Справочник.ТабличныеЧасти Цикл
          Файл.ЗаписатьНачалоЭлемента("ТабличнаяЧасть");
          Файл.ЗаписатьАтрибут("Имя", ТЧ.Имя);
          Файл.ЗаписатьАтрибут("Синоним", ТЧ.Синоним);
          
          Для каждого Реквизит из ТЧ.Реквизиты Цикл
               Файл.ЗаписатьНачалоЭлемента("Реквизит");
               Файл.ЗаписатьАтрибут("Имя", Реквизит.Имя);
               Файл.ЗаписатьАтрибут("Синоним", Реквизит.Синоним);
               Файл.ЗаписатьКонецЭлемента();
          КонецЦикла;
          
          Файл.ЗаписатьКонецЭлемента();
     КонецЦикла;
     
     //ЗаписатьКонецЭлемента - "закрывает" открытую ранее с помощью ЗаписатьНачалоЭлемента ветку
     Файл.ЗаписатьКонецЭлемента();
КонецЦикла;

Файл.ЗаписатьКонецЭлемента();
Файл.Закрыть();


Проголосовать за этот пост:

1 Star2 Stars3 Stars4 Stars5 Stars (19 голосов, среднее: 3,42 из 5)
Загрузка...

Добавить комментарий