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

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

1С 8.3 XML

В 1С XML используется в основном для обмена информацией с WEB, электронными библиотеками, различными внешними системами для экспорта/импорта данных. XML это текстовые файлы с разметками, которые позволяют хранить данные в уникальном структурированном виде. Могут редактироваться в любом текстовом редакторе.

Для описания структуры XML документа используют язык XSD. Его также называют XML Schema. При использовании XML Schema, XML парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных. Для проверки XML на соответствие XSD (схеме XML данных) можно воспользоваться онлайн сервисами. Например: https://omega-abacus.ru/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";//средний счет
   
Европейский_ресторан.Кухня = "Европейская";
   
Европейский_ресторан.Меню = Новый СписокЗначений;
   
Европейский_ресторан.Меню.Добавить(Новый Структура("Название", "Мясная нарезка из мраморной говядины"));
   
Европейский_ресторан.Меню.Добавить(Новый Структура("Название", "Салат де-люкс Комплимент"));
   
Европейский_ресторан.Меню.Добавить(Новый Структура("Название", "Пицца от шеф повара"));
   
Европейский_ресторан.Описание = "Ресторан европейской кухни категории Люкс";
   
Рестораны.Добавить(Европейский_ресторан);

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

КонецФункции
📰 Актуальные новости с тегом #Xml:
  • В версии 8.3.25 в  утилите ibcmd реализован режим непосредственной работы с журналом регистрации. Можно выгружать события журнала регистрации в консоль или в указанный файл в формате XML или JSON.
  • В версии 8.3.21 реализована возможность выгрузки конфигурации в zip-архив xml-файлов. При выгрузке на стороне кластера серверов реализована возможность многопоточной выгрузки конфигурации.Команда Конфигуратора Выгрузить конфигурацию в файлы позволяет указать способ выгрузки (на сервере/на клиенте), количество одновременных потоков выгрузки и необходимость архивировать файл выгрузки. Для выполнения данной задачи реализован специальный параметр для следующих инструментов загрузки:
        1. Командная строка запуска конфигуратора. Для команды /DumpConfigToFiles реализован параметр -Server, -Archive, -JobsCount.
        2. Конфигуратор в режиме агента. Для команды config dump-config-to-files реализованы параметры --archive, --server, --threads.
        3. Утилита управления автономным сервером (ibcmd). Для команды infobase config export реализованы параметры --archive, --server, --threads.
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 25.03.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому