1С 8.3 XML - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 XML

Реклама:
В 1С XML используется в основном для обмена информацией с WEB, электронными библиотеками, различными внешними системами для экспорта/импорта данных. XML это текстовые файлы с разметками, которые позволяют хранить данные в уникальном структурированном виде. Могут редактироваться в любом текстовом редакторе.   
Пример структуры файла XML для 1С 8.3:
<?xml version="1.0" encoding="UTF-8"?>
-<Рестораны>
  -<Ресторан Кухня="Азиатская" Счет="3500" Категория="Высшая" Название="Китайская грамота">
     -<Меню>
            <Блюдо Название="Суши из форели"/>
            <Блюдо Название="Лапша фирменная"/>
            <Блюдо Название="Суп из малюсков"/>
     </Меню>
     <Описание>Ресторан азиатской кухни Высшей наценочной категории</Описание>
  </Ресторан>
  -<Ресторан Кухня="Европейская" Счет="5000" Категория="Люкс" Название="Итальянский Экспресс">
     -<Меню>
            <Блюдо Название="Мясная нарезка из мраморной говядины"/>
            <Блюдо Название="Салат де-люкс Комплимент"/>
            <Блюдо Название="Пицца от шеф повара"/>
     </Меню>
     <Описание>Ресторан европейской кухни категории Люкс</Описание>
  </Ресторан>
</Рестораны>
Чтение файла в формате XML по порядку (способ №1) в 1С 8.3:
//Подходит для файлов более 100Mb
&НаСервере
Процедура ПрочитатьФайлXMLПоПорядкуСпособ1(ПутьКФайлу)

   
XML = Новый ЧтениеXML;
   
XML.ОткрытьФайл(ПутьКФайлу);

    Пока
XML.Прочитать() Цикл

        Если
XML.ТипУзла = ТипУзлаXML.НачалоЭлемента И XML.Имя = "Ресторан" Тогда

           
Название = XML.ЗначениеАтрибута("Название");
            Если
Название <> Неопределено Тогда
               
Сообщить("Название ресторана:" + Название);
            КонецЕсли;

           
Категория = XML.ЗначениеАтрибута("Категория");
            Если
Категория <> Неопределено Тогда
               
Сообщить("...наценочная категория ресторана: " + Категория);
            КонецЕсли;

           
Счет = XML.ЗначениеАтрибута("Счет");
            Если
Счет <> Неопределено Тогда
               
Сообщить("...средний счет ресторана: " + Счет);
            КонецЕсли;

           
Кухня = XML.ЗначениеАтрибута("Кухня");
            Если
Кухня <> Неопределено Тогда
               
Сообщить("...кухня ресторана: " + Кухня);
            КонецЕсли;

            Пока
XML.Прочитать() Цикл// <Ресторан>

               
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента И XML.Имя = "Меню" Тогда
                   
Сообщить("Меню:");

                    Пока
XML.Прочитать() Цикл// <Меню>
                       
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента И XML.Имя = "Блюдо" Тогда
                           
Название = XML.ЗначениеАтрибута("Название");
                            Если
Название <> Неопределено Тогда
                               
Сообщить("...название блюда:" + Название);
                            КонецЕсли;
                        ИначеЕсли
XML.ТипУзла = ТипУзлаXML.КонецЭлемента И XML.Имя = "Меню" Тогда
                            Прервать;
                        КонецЕсли;
                    КонецЦикла;
// 

               
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента И XML.Имя = "Описание" Тогда

                   
XML.Прочитать();
                    Если
XML.ТипУзла = ТипУзлаXML.Текст Тогда
                       
Сообщить("Описание:" + XML.Значение);
                    КонецЕсли;

                ИначеЕсли
XML.ТипУзла = ТипУзлаXML.КонецЭлемента И XML.Имя = "Ресторан" Тогда

                    Прервать;

                КонецЕсли;

            КонецЦикла;
//

       
КонецЕсли;

    КонецЦикла;

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

КонецПроцедуры
Чтение файла в формате XML по порядку (способ №2) в 1С 8.3:
//Подходит для файлов более 100Mb
&НаСервере
Процедура ПрочитатьФайлXMLПоПорядкуСпособ2(ПутьКФайлу)

   
XML = Новый ЧтениеXML;
   
XML.ОткрытьФайл(ПутьКФайлу);

   
СписокИмен = Новый СписокЗначений;

    Пока
XML.Прочитать() Цикл
        Если
XML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

           
СписокИмен.Добавить(XML.Имя);
           
ПутьXML = СобратьПуть(СписокИмен);

            Если
ПутьXML = "/Рестораны/Ресторан" Тогда
               
Название = XML.ЗначениеАтрибута("Название");
                Если
Название <> Неопределено Тогда
                   
Сообщить("Название ресторана: " + Название);//"Китайская грамота"
               
КонецЕсли;

               
Категория = XML.ЗначениеАтрибута("Категория");
                Если
Категория <> Неопределено Тогда
                   
Сообщить("...наценочная категория ресторана: " + Категория);// Высшая
               
КонецЕсли;

               
Счет = XML.ЗначениеАтрибута("Счет");
                Если
Счет <> Неопределено Тогда
                   
Сообщить("...средний счет ресторана: " + Счет);// 3500
               
КонецЕсли;

               
Кухня = XML.ЗначениеАтрибута("Кухня");
                Если
Кухня <> Неопределено Тогда
                   
Сообщить("...кухня ресторана: " + Кухня);// Азиатская
               
КонецЕсли;

            ИначеЕсли
ПутьXML = "/Рестораны/Ресторан/Меню" Тогда

               
Сообщить("Меню:");

            ИначеЕсли
ПутьXML = "/Рестораны/Ресторан/Меню/Блюдо" Тогда

               
Название = XML.ЗначениеАтрибута("Название");
                Если
Название <> Неопределено Тогда
                   
Сообщить("...название блюда: " + Название);
                КонецЕсли;

            ИначеЕсли
ПутьXML = "/Рестораны/Ресторан/Описание" Тогда

               
XML.Прочитать();
                Если
XML.ТипУзла = ТипУзлаXML.Текст Тогда
                   
Сообщить("Описание: " + XML.Значение);
                КонецЕсли;

            КонецЕсли;

        ИначеЕсли
XML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

           
СписокИмен.Удалить(СписокИмен.Количество() - 1);

        КонецЕсли;

    КонецЦикла;

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

КонецПроцедуры

&НаСервере
Функция СобратьПуть(СписокИмен)

   
НашПуть = "";

    Для Каждого
Имя Из СписокИмен Цикл
       
НашПуть = НашПуть + "/" + Имя;
    КонецЦикла;

    Возврат
НашПуть;

КонецФункции
Чтение файла в формате XML через document object model (DOM) (способ №3) в 1С 8.3:
//Подходит для файлов менее 100Mb, для больших Не подходит
&НаСервере
Процедура ПрочитатьФайлXMLЧерезDOMСпособ3(ПутьКФайлу)

   
//Поочередная обработка всех узлов документа, представленных в XML:
    //1.Объявление механизмов, с помощью которых происходит чтение XML файла; Цикл для обхода узлов;
    //2.Считывание данных и атрибутов в узле;
    //3.Вывод информации. Если есть необходимость, на этом этапе может происходить запись в переменные или сразу в нужные таблицы;
    //4.Завершение работы механизма

   
ЧтениеXML = Новый ЧтениеXML;
   
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);

   
Построитель_DOM = Новый ПостроительDOM;
   
ДокументXML = Построитель_DOM.Прочитать(ЧтениеXML);

    Для Каждого
ТекУзел Из ДокументXML.ЭлементДокумента.ДочерниеУзлы Цикл

        Если
ТекУзел.ИмяУзла = "Ресторан" Тогда

           
Ресторан = ТекУзел;

           
Название = Ресторан.Атрибуты.ПолучитьИменованныйЭлемент("Название");
            Если
Название <> Неопределено Тогда
               
Сообщить("Название ресторана:" + Название.Значение);//"Китайская грамота"
           
КонецЕсли;

           
Категория = Ресторан.Атрибуты.ПолучитьИменованныйЭлемент("Категория");
            Если
Категория <> Неопределено Тогда
               
Сообщить("...наценочная категория ресторана: " + Категория.Значение);// Высшая
           
КонецЕсли;

           
СрСчет = Ресторан.Атрибуты.ПолучитьИменованныйЭлемент("Счет");
            Если
СрСчет <> Неопределено Тогда
               
Сообщить("...средний счет ресторана: " + СрСчет.Значение);// 3500
           
КонецЕсли;

           
Кухня = Ресторан.Атрибуты.ПолучитьИменованныйЭлемент("Кухня");
            Если
Кухня <> Неопределено Тогда
               
Сообщить("...кухня ресторана: " + Кухня.Значение);// Азиатская
           
КонецЕсли;

            Для Каждого
ТекУзел1 Из Ресторан.ДочерниеУзлы Цикл

                Если
ТекУзел1.ИмяУзла = "Меню" Тогда

                   
Меню = ТекУзел1;
                   
Сообщить("Меню:");

                    Для Каждого
ТекУзел2 Из Меню.ДочерниеУзлы Цикл

                        Если
ТекУзел2.ИмяУзла = "блюдо" Тогда
                           
Блюдо = ТекУзел2;

                           
Название = Блюдо.Атрибуты.ПолучитьИменованныйЭлемент("Название");
                            Если
Название <> Неопределено Тогда
                               
Сообщить("...название блюда:" + Название.Значение);
                            КонецЕсли;

                        КонецЕсли;

                    КонецЦикла;

                ИначеЕсли
ТекУзел1.ИмяУзла = "Описание" Тогда

                   
Сообщить("Описание :" + ТекУзел1.ТекстовоеСодержимое);

                КонецЕсли;

            КонецЦикла;

        КонецЕсли;

    КонецЦикла;

   
ЧтениеXML.Закрыть();

КонецПроцедуры
Запись данных в файл формата XML в 1С 8.3:
&НаКлиенте
Процедура ЗаписатьДанныеВФорматеXML(ПутьКФайлу)

   
Рестораны = СоздатьДанныеДляЗаписиВXML();
   
ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);//необязательно их прописовать

   
XML = Новый ЗаписьXML;
   
XML.ОткрытьФайл(ПутьКФайлу,ПараметрыЗаписи);
   
XML.ЗаписатьОбъявлениеXML();
   
XML.ЗаписатьНачалоЭлемента("Рестораны");

    Для Каждого
Ресторан Из Рестораны Цикл

       
XML.ЗаписатьНачалоЭлемента("Ресторан");
       
XML.ЗаписатьАтрибут("Название", Ресторан.Значение.Название);
       
XML.ЗаписатьАтрибут("Категория", Ресторан.Значение.Категория);
       
XML.ЗаписатьАтрибут("Счет", Ресторан.Значение.Счет);
       
XML.ЗаписатьАтрибут("Кухня", Ресторан.Значение.Кухня);

       
XML.ЗаписатьНачалоЭлемента("Меню");
        Для Каждого
БлюдоИзМеню Из Ресторан.Значение.Меню Цикл

           
XML.ЗаписатьНачалоЭлемента("Блюдо");
           
XML.ЗаписатьАтрибут("Название", БлюдоИзМеню.Значение.Название);
           
XML.ЗаписатьКонецЭлемента(); // Блюдо

       
КонецЦикла;

       
XML.ЗаписатьКонецЭлемента(); // Меню

       
XML.ЗаписатьНачалоЭлемента("Описание");
       
XML.ЗаписатьТекст(Ресторан.Значение.Описание);
       
XML.ЗаписатьКонецЭлемента(); // Описание

       
XML.ЗаписатьКонецЭлемента(); // Ресторан

   
КонецЦикла;

   
XML.ЗаписатьКонецЭлемента(); // Рестораны

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

КонецПроцедуры


&НаКлиенте
Функция СоздатьДанныеДляЗаписиВXML()

   
Рестораны = Новый СписокЗначений;

   
Китайский_ресторан = Новый Структура("Название, Категория, Счет, Кухня, Меню, Описание");
   
Китайский_ресторан.Название  = "Китайская грамота";
   
Китайский_ресторан.Категория  = "Высшая";//наценочная категория
   
Китайский_ресторан.Счет = "3500";//средний счет
   
Китайский_ресторан.Кухня = "Азиатская";
   
Китайский_ресторан.Меню = Новый СписокЗначений;
   
Китайский_ресторан.Меню.Добавить(Новый Структура("Название", "Суши из форели"));
   
Китайский_ресторан.Меню.Добавить(Новый Структура("Название", "Лапша фирменная"));
   
Китайский_ресторан.Меню.Добавить(Новый Структура("Название", "Суп из малюсков"));
   
Китайский_ресторан.Описание = "Ресторан азиатской кухни Высшей наценочной категории";
   
Рестораны.Добавить(Китайский_ресторан);

   
Европейский_ресторан = Новый Структура("Название, Категория, Счет, Кухня, Меню, Описание");
   
Европейский_ресторан.Название  = "Итальянский Экспресс";
   
Европейский_ресторан.Категория  = "Люкс";//наценочная категория
   
Европейский_ресторан.Счет = "5000";//средний счет
   
Европейский_ресторан.Кухня = "Европейская";
   
Европейский_ресторан.Меню = Новый СписокЗначений;
   
Европейский_ресторан.Меню.Добавить(Новый Структура("Название", "Мясная нарезка из мраморной говядины"));
   
Европейский_ресторан.Меню.Добавить(Новый Структура("Название", "Салат де-люкс Комплимент"));
   
Европейский_ресторан.Меню.Добавить(Новый Структура("Название", "Пицца от шеф повара"));
   
Европейский_ресторан.Описание = "Ресторан европейской кухни категории Люкс";
   
Рестораны.Добавить(Европейский_ресторан);

    Возврат
Рестораны;

КонецФункции
Поиск кода
0
комментарии
____________________
Copyright by 1Cnik.by©, «Программист 1С в г.Минске», 25.03.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому