Имя: Пароль:
1C
1С v8
Чтение XML.
0 Balabass
 
05.12.11
10:26
Товарищи! Нужна помощь и ссылки.
Написал на клюшках выгрузку справочника в XML.
Структура примерно вот такая:

-Элемент
-Атрибут
-Атрибут
-Атрибут
-Элемент
-Атрибут
-Атрибут

Теперь встал вопрос про загрузку всего этого дела в 8.
Поиск юзал - не помогло особо.
Подскажите - как прочитать XML в 8?
Дайте готовый код для разбора на дому?
Либо ссылку на пример.
Все будет изучено. И закреплено на практике! :)
1 Filipf
 
05.12.11
10:27
Очень много примеров в инете. Лень искать? Щас все полезут ссылки искать)))
2 Axel2009
 
05.12.11
10:29
ЧтениеXML
3 Balabass
 
05.12.11
10:31
(1) Это только так кажеться что полно. Но они все специфические.
(2) Читаю ЖЖК, но хотелось бы увидеть живой пример.
4 vicof
 
05.12.11
10:31
Используй КД, Люк.
5 Maxus43
 
05.12.11
10:32
через 5 минут не поленюсь - выложу пример чтения хмл произвольной структуры
6 Balabass
 
05.12.11
10:34
(4)КД не подходит для моих нужд. Я с начала руками научиться хочу.
7 Balabass
 
05.12.11
10:34
(5) Буду премного благодарен.
8 Maxus43
 
05.12.11
10:37
Чтение = Новый ЧтениеXML;

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

Пока Чтение.Прочитать() Цикл // Прочитать «структурные части» элементов.

   // Проверить, какая часть элемента – текущая.
   Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
       ИмяУзла = Чтение.Имя;
       
       Сообщить("--" + ИмяУзла);

       // Атрибуты элементов можно читать только если текущая часть – начало элемента
       Пока Чтение.ПрочитатьАтрибут() Цикл

           // Прочитать данные узла атрибута.
           ТипУзла  = Чтение.ТипУзла;
           Имя     = Чтение.Имя;
           Значение = Чтение.Значение;
   
       // Обработать полученные значения.
       //    ...
       
       КонецЦикла;
       
   ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда    

       // В примере просто выводим текст в окно сообщений.    
       Сообщить("Текст:" + Чтение.Значение);
       
   ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

       // В примере просто выводим признак конца элемента
       // в окно сообщений
       Сообщить("--Конец:" + Чтение.Имя);
       
   КонецЕсли;    
   
КонецЦикла    

(с) Простые примеры разработки
9 Balabass
 
05.12.11
10:37
Например вот код:

<?xml version="1.0" encoding="windows-1251"?>
<Сотрудники>
 <Элемент Код="00004969" Наименование="Договорники" ЭтоГруппа="1"/>
 <Элемент Код="00006755" Наименование="Иванов Иван Иванович" Родитель="00004969" ЭтоГруппа="0" АдресФакт="" АдресПрописка=",123456,Саха /Якутия/,,Угоян с,Лесная ул,1,," Гражданство="" ДатаРождения="27.10.59" СтраховойНомерПФР="000-000-000 00" КодИМНС="" ДокТипДокумента="Паспорт гражданина России" ДокНомер="00 00" ДокСерия="000000" ДокКогдаВыдан="14.04.2005" ДокКемВыдан="ПОМ РС(Я)" ИНН="140220326124" Пол="Мужской"/>
</Сотрудники>

Как его прочиать в ТЗ?
10 Balabass
 
05.12.11
10:38
(8) Спасибо.
11 БибиГон
 
05.12.11
10:42
а где код выгрузки из 7ки?
12 Balabass
 
05.12.11
10:49
(11) На месте)
13 БибиГон
 
05.12.11
10:50
(12) жадничаешь? )
14 Balabass
 
05.12.11
10:51
(13) Надо?
15 Сияющий Асинхраль
 
05.12.11
10:58
В кд 2 на порядок быстрее - за пол часа и выгрузка и загрузка, тем более речь идет, фактически, об одном справочнике
16 БибиГон
 
05.12.11
10:59
(14) да )
17 Balabass
 
05.12.11
11:01
(15) Да. Но не умею. Потихоньку учусь.
18 Balabass
 
05.12.11
11:02
(15)+Я хочу понять как протекает сам процесс загрузки. Как данные анализируются. + еще надо заменять элементы существующие, а не существующие добавлять. И еще по мелочи.
19 Balabass
 
05.12.11
11:03
2(16)

перем xml_fso;  
перем xml_file;
перем xml_СтекТегов;
перем xml_ТегОткрыт;
перем xml_Отступы;
перем прм_ИмяФайла;
перем стрИмяФайла;

///////////////////////////////////////////////////////////////////////                                          
//Открывает файл XML в режиме записи. Если файл существовал, перезаписывает его.                                  
//Принимает параметр прм_ИмяФайла - имя файла (укажите полный путь и расширение .XML)

Процедура xml_СоздатьФайл(прм_ИмяФайла)            
   xml_fso=СоздатьОбъект("Scripting.FileSystemObject");                                                          
   xml_file=xml_fso.CreateTextFile(прм_ИмяФайла, -1, 0); //создать файл, перезаписывая существующий.

   xml_file.WriteLine("<?xml version=""1.0"" encoding=""windows-1251""?>"); //Пишем заголовок XML.
   
   xml_СтекТегов=СоздатьОбъект("СписокЗначений");
   xml_Отступы="";        
   xml_ТегОткрыт=0;
КонецПроцедуры  

///////////////////////////////////////////////////////////////////////                    
//Записывает начало элемента (тега XML). Имя можно указывать в угловых скобках.                

Процедура xml_ЗаписатьНачалоЭлемента(прм_ИмяТега)  
   перем стр;  
   
   Если xml_ТегОткрыт=1 Тогда                    
       xml_ТегОткрыт=0;                          
       xml_file.WriteLine(">");                  
       xml_Отступы=xml_Отступы+"  ";              
   КонецЕсли;  
   
   стр=прм_ИмяТега;                              
   стр=СтрЗаменить(стр, "<", "");                
   стр=СтрЗаменить(стр, ">", "");                
               
   xml_СтекТегов.ДобавитьЗначение(стр);          
   xml_file.Write(xml_Отступы+"<"+стр);          
   xml_ТегОткрыт=1;                              
КонецПроцедуры  
               
///////////////////////////////////////////////////////////////////////

//Записывает атрибут (параметр) тега XML.          
Процедура xml_ЗаписатьАтрибут(прм_ИмяАтрибута, прм_ЗначениеАтрибута)                                              
   Если xml_ТегОткрыт=0 Тогда                    
      Сообщить("Перед записью атрибута необходимо записать начало элемента!","!"); а=10/0;        
   КонецЕсли;  
   
   стр=СокрЛП(прм_ЗначениеАтрибута);                      
   стр=СтрЗаменить(стр, "&", "&"+"a"+"m"+"p"+";");
   стр=СтрЗаменить(стр, """", "&"+"q"+"u"+"o"+"t;");
   стр=СтрЗаменить(стр, "<", "&"+"l"+"t"+";");                
   стр=СтрЗаменить(стр, ">", "&"+"g"+"t"+";");
   стр=СтрЗаменить(стр, "'", "&"+"a"+"p"+"o"+"s;");    
   xml_file.Write(" "+прм_ИмяАтрибута+"="+""""+стр+"""");                            
КонецПроцедуры    // xml_ЗаписатьЗаписатьАтрибут  
               
///////////////////////////////////////////////////////////////////////
                                         
//Записывает конец элемента (тега XML). Имя закрываемого тега можно указывать в угловых скобках,                  
//а можно - не указывать вовсе.                    
               
Процедура xml_ЗаписатьКонецЭлемента(прм_ОжидаемоеИмяТега="")
   перем стрИмяТега, а;
   Если xml_СтекТегов.РазмерСписка()<1 Тогда
       Сообщить("Попытка закрыть неоткрытый элемент!","!"); а=10/0;                                              
   КонецЕсли;  
               
   стрИмяТега=xml_СтекТегов.ПолучитьЗначение(xml_СтекТегов.РазмерСписка());

   Если ПустаяСтрока(прм_ОжидаемоеИмяТега)=0 Тогда
       стр=прм_ОжидаемоеИмяТега;
       стр=СтрЗаменить(стр, "<", "");            
       стр=СтрЗаменить(стр, ">", "");            
       стр=СтрЗаменить(стр, "/", "");            
               
       Если стр<>стрИмяТега Тогда                
           Сообщить("Ожидается имя тега "+стр+", а закрыто "+стрИмяТега,"!"); а=10/0;    
       КонецЕсли;
   КонецЕсли;  
               
               
   xml_СтекТегов.УдалитьЗначение(xml_СтекТегов.РазмерСписка());
   Если xml_ТегОткрыт=1 Тогда
       xml_ТегОткрыт=0;
       xml_file.WriteLine("/>");
       Возврат;
   КонецЕсли;  
   xml_Отступы=лев(xml_Отступы, СтрДлина(xml_Отступы)-2);

   xml_file.WriteLine(xml_Отступы+"</"+стрИмяТега+">");
               
КонецПроцедуры    // xml_ЗаписатьКонецЭлемента    
               
               
///////////////////////////////////////////////////////////////////////          
//Закрывает открытый файл XML. После окончания работы с файлом его необходимо закрыть.                            
Функция xml_Закрыть()
   xml_file.Close();
   Если xml_СтекТегов.РазмерСписка()<>0 Тогда    
       Сообщить("Имеются незакрытые элементы XML!","!"); а=10/0;
   КонецЕсли;  
КонецФункции    // xml_Закрыть    

///////////////////////////////////////////////////////////////////////          
//Процедура записи XML документа для наших данных
Процедура ПриОткрытии()
//    Сообщить("Начало записи: "+стрИмяФайла);      
//  Сообщить("Время начала: "+ТекущееВремя());    
   xml_СоздатьФайл(стрИмяФайла);                  
   xml_ЗаписатьНачалоЭлемента("<Сотрудники>");        
     спр=СоздатьОбъект("Справочник.Сотрудники");      
     спр.ВыбратьЭлементы();                      
     
   Пока спр.ПолучитьЭлемент()=1 Цикл            
         xml_ЗаписатьНачалоЭлемента("<Элемент>");
         xml_ЗаписатьАтрибут("Код", спр.Код);    
       xml_ЗаписатьАтрибут("Наименование", СокрЛП(спр.Наименование));                                          
           
       Если ПустоеЗначение(спр.Родитель) = 0 Тогда
             xml_ЗаписатьАтрибут("Родитель", спр.Родитель.Код);
       КонецЕсли;              
       
       Если спр.ЭтоГруппа()=1 Тогда            
           xml_ЗаписатьАтрибут("ЭтоГруппа", "1");
       Иначе
           xml_ЗаписатьАтрибут("ЭтоГруппа", "0");
           xml_ЗаписатьАтрибут("АдресФакт", спр.АдресФакт);      
           xml_ЗаписатьАтрибут("АдресПрописка", спр.АдресПрописка);      
           xml_ЗаписатьАтрибут("Гражданство", спр.Гражданство);
           xml_ЗаписатьАтрибут("ДатаРождения", спр.ДатаРождения);
           xml_ЗаписатьАтрибут("СтраховойНомерПФР", спр.СтраховойНомерПФР);
           xml_ЗаписатьАтрибут("КодИМНС", спр.КодИМНС);
           
           
           Если ПустоеЗначение(спр.ДокументУдЛичность)= 0 Тогда
           списокДокументУдЛичность = глРазложитьДокУдостоверяющийЛичность(спр.ДокументУдЛичность);
               Если списокДокументУдЛичность.РазмерСписка() = 5 тогда
                   xml_ЗаписатьАтрибут("ДокТипДокумента",списокДокументУдЛичность.ПолучитьЗначение(1));      
                   xml_ЗаписатьАтрибут("ДокНомер",списокДокументУдЛичность.ПолучитьЗначение(2));      
                   xml_ЗаписатьАтрибут("ДокСерия",списокДокументУдЛичность.ПолучитьЗначение(3));      
                   xml_ЗаписатьАтрибут("ДокКогдаВыдан",списокДокументУдЛичность.ПолучитьЗначение(4));      
                   xml_ЗаписатьАтрибут("ДокКемВыдан",списокДокументУдЛичность.ПолучитьЗначение(5));      
                 КонецЕсли;
           xml_ЗаписатьАтрибут("ИНН", спр.ИНН);      
           xml_ЗаписатьАтрибут("Пол", спр.Пол);
           КонецЕсли;
       
       КонецЕсли;
       xml_ЗаписатьКонецЭлемента("</Элемент>");
   КонецЦикла;
   
   xml_ЗаписатьКонецЭлемента("</Сотрудники>");
   xml_Закрыть();

   ФС.ПереименоватьФайл(стрИмяФайла,"\\server\Archiv1C\sinhron\obmen\Сотрудники.xml",1);
   ФС.УдалитьФайл(стрИмяФайла);
   
Форма.Закрыть(0)
КонецПроцедуры

стрИмяФайла="C:\Spisok.xml";