Книга знаний

1С:Предприятие / Приемы программирования / Обмен данными, УРБД

Формирование исходника чтения 1с по XML файлу

Формирование исходника чтения 1с по XML файлуАвтор статьи: ERWINS | Редакторы:
Последняя редакция №2 от 21.05.14 | История
URL: http://kb.mista.ru/article.php?id=932

Ключевые слова: XML, генерация кода, 1с


Часто бывает надо прочитать файл XML, но это требует большого количества кода вида

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


Тут прилагаю обработку формирующую на основе XML файла следующий код,
дальнейшая обработка напильником на вашей совести

сама обработка

&НаКлиенте
Процедура Команда1(Команда)
    
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл с данными";
Диалог.ПолноеИмяФайла = "";

Если Диалог.Выбрать() Тогда
    Ткт=новый ТекстовыйДокумент;
    Ткт.Прочитать(Диалог.ПолноеИмяФайла);

    ФормированиеТекста=    ЗагрузкаXML(Ткт.ПолучитьТекст())
КонецЕсли
    
КонецПроцедуры
&НаСервере
Функция ЗагрузкаXML(Текст);

    XML= новый ЧтениеXML();
    XML.УстановитьСтроку(Текст);
    Дерево= новый ДеревоЗначений;
    Дерево.Колонки.Добавить("Имя");
    Ветвь=Дерево;
    Пока XML.Прочитать() цикл
        Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            поискСтроки=Ветвь.Строки.Найти(XML.Имя);
            Если поискСтроки=неопределено тогда 
                ст=Ветвь.Строки.Добавить();
                ст.Имя=XML.Имя;
                Ветвь=ст;
            иначе
                Ветвь=поискСтроки;
            КонецЕсли;
        иначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Ветвь=Ветвь.Родитель;
        иначеЕсли XML.ТипУзла = ТипУзлаXML.Текст Тогда
                Если Ветвь.Строки.Найти("#text")=неопределено тогда 

                    ст=Ветвь.Строки.Добавить();
                    ст.Имя="#text";

                КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    возврат ОбходДерева(Дерево, "");
КонецФункции

&НаСервере
Функция ОбходДерева(ветвь, таб)
    Рез=Таб+"пока XML.Прочитать() цикл"+Символы.ПС;
    ПервыйШаг=" Если";
    для каждого ст из ветвь.Строки цикл
        Если ст.Имя="#text" тогда 

            рез= рез + Таб+ПервыйШаг+" 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.Прочитать() цикл
     Если 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.Имя="ЛицевойСчет" тогда 
    пока 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.Имя="КоличествоЗаписей" тогда 
   пока XML.Прочитать() цикл
    Если XML.ТипУзла = ТипУзлаXML.Текст тогда 
    // КоличествоЗаписей=XML.Значение;
    ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
     Прервать;
    Иначе 
     ВызватьИсключение "Не верно прочитан файл"
    КонецЕсли;
   КонецЦикла;

   ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и  XML.Имя="СуммаИтого" тогда 
   пока XML.Прочитать() цикл
    Если XML.ТипУзла = ТипУзлаXML.Текст тогда 
    // СуммаИтого=XML.Значение;
    ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
     Прервать;
    Иначе 
     ВызватьИсключение "Не верно прочитан файл"
    КонецЕсли;
   КонецЦикла;

   ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
    Прервать;
   Иначе 
    ВызватьИсключение "Не верно прочитан файл"
   КонецЕсли;
  КонецЦикла;

  ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
   Прервать;
  Иначе 
   ВызватьИсключение "Не верно прочитан файл"
  КонецЕсли;
 КонецЦикла;

 ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
  Прервать;
 Иначе 
  ВызватьИсключение "Не верно прочитан файл"
 КонецЕсли;
КонецЦикла;

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика