Имя: Пароль:
1C
1C 7.7
v7: Как получить данные из XML файла?
,
0 katerinaUniv
 
01.05.12
13:31
Есть файл, его структура - часть, которую мне надо загрузить:
<ZAP>
<N_ZAP>
2
</N_ZAP>
<PR_NOV>
0
</PR_NOV>
<PACIENT>
<ID_PAC>
12-3308
</ID_PAC>
<VPOLIS>
1
</VPOLIS>
<SPOLIS>
МАКС
</SPOLIS>
<NPOLIS>
0461844
</NPOLIS>
<SMO>
30004
</SMO>
<SMO_OGRN/>
<SMO_OK/>
<SMO_NAM/>
<NOVOR>
0
</NOVOR>
</PACIENT>

как мне получить эти значения? файл выбирается из формы. процедуру как написать непонятно
1 nicxxx
 
01.05.12
13:32
2 katerinaUniv
 
01.05.12
13:45
у меня пишет, что  Значение не представляет агрегатный объект (ПолучитьАтрибут)
вот код загрузки
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"v7plus.dll")<>1 Тогда
       Предупреждение("Внешняя компонента не найдена");
       Возврат;
   КонецЕсли;
   Анализатор=СоздатьОбъект("AddIn.XMLParser");
   Файл = Анализатор.СоздатьДокумент();
   Файл.Загрузить(ИмяФайла);
   СпрХМЛ = Файл.ВыбратьУзел("ZAP");    
   СпрХМЛ.ПолучитьАтрибут("N_ZAP");
в чем ошибка?
3 katerinaUniv
 
01.05.12
13:49
поиск не помогает. искать долго, а сделать нужно очень быстро... помогите кто знает...
4 Aleksey
 
01.05.12
13:51
Читай как текст
5 katerinaUniv
 
01.05.12
13:54
а по узлам не получится? мне просто надо найти все PACIENT  и  оттуда вытащить 4 поля
6 Мигрень
 
01.05.12
13:54
Я в клюшки xml лет пять не загружал, поэтому выбрал бы простой вариант: или вбил бы руками или загрузил бы в Excel, а из него обработкой с ИТС - в 1С.
7 katerinaUniv
 
01.05.12
13:55
исправила код на
      СпрХМЛ = Файл.ВыбратьУзел("PACIENT");    
   СпрХМЛ.ПолучитьАтрибут("ID_PAC");
в отладчике СпрХМЛ пустое, ничего не хранит и соответственно ругается
8 katerinaUniv
 
01.05.12
13:55
(6)не подойдет. надо читать хмл из базы
9 katerinaUniv
 
01.05.12
14:14
в чем у меня ошибка? почему я вижу только первый тег файла и не могу поставить отбор по подчиненным?
10 katerinaUniv
 
01.05.12
14:17
никто такими вещами не занимается? не пишет выгрузку? или сложно так подсказать???
11 Мигрень
 
01.05.12
14:22
(10)Отзанималиь уже сто лет назад, а в восьмерке все по-другому. Теоретически - тебе нужен XSLT-запрос, когда-то делал такие вещи, но кому это сейчас нужно, прошлый век.
12 katerinaUniv
 
01.05.12
14:29
ну у меня старая конфа на 7.7, и мне нужно. как вытащить все подчиненные узлы? я смогла получить только верхний тег
13 katerinaUniv
 
01.05.12
14:29
а нужно добраться до подчиненных
14 BlackSeaCat
 
01.05.12
14:30
Я одного не понимаю в таких ветках - почему не посмотреть, как аналогичные вещи делаются в типовых решениях от 1С? Хотя бы в той же обработке ПроверкаКомплектаДокументовПФР из бухии, где читается и разбирается XML-файл.
15 katerinaUniv
 
01.05.12
14:42
я уже смотрю и попробовала несколько вариантов. не получается разобраться в коде, поэтому спрашиваю
16 BlackSeaCat
 
01.05.12
14:44
17 katerinaUniv
 
01.05.12
14:59
(16)к загрузке данных XML кажется не относится...
18 katerinaUniv
 
01.05.12
15:38
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"v7plus.dll")<>1 Тогда
       Предупреждение("Компонента не обнаружена");
       Возврат;
   КонецЕсли;

   гXMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
   гФайл = гXMLАнализатор.СоздатьПоследовательноСчитываемыйДокумент();
   ПолноеИмяФайла = КаталогЗагрузки+ИмяФайла;
   гФайл.СвязатьСФайлом(ПолноеИмяФайла);
   //найти ZAP
   //найти PACIENT
   ТипТега0 = гФайл.Спуститься();
//    ТипТега1 = ТипТега0.Спуститься();
   Пока ТипТега0 <> 4 Цикл        //    пока не достигнут конец файла
       Если ТипТега0 <> 1 Тогда
           ТипТега0 = гФайл.Следующий();
           Продолжить;
       КонецЕсли;                //    пропускаем концы уровней и инструкции
       
       ИмяТега = гФайл.СвойстваТекущегоУзла.Имя;
       
       Если            ИмяТега = "ZL_LIST"        Тогда
           //спуститься и найти PACIENT
       //    ЗагрузитьОбъектСправочника();  
           ТипТега0 = гФайл.Спуститься();
       ИначеЕсли ИмяТега = "ZAP" Тогда
           //спускаемся к тегу
           ТипТега0 = гФайл.Спуститься();
       ИначеЕсли ИмяТега = "PACIENT" Тогда
           //берем данные по пациенту новые
           ТипТега0 = гФайл.Спуститься();
       ИначеЕсли ИмяТега = "ID_PAC" Тогда
           //надо добавить новую строку и заполнить данные пациента  
           НоваяСтрока();
           //КодЗаписиОПациенте =
       ИначеЕсли ИмяТега = "VPOLIS" Тогда
           //это версия полиса 1, 2, 3
       ИначеЕсли ИмяТега = "SPOLIS" Тогда
           //это серия полиса
       ИначеЕсли ИмяТега = "NPOLIS" Тогда
           //номер полиса
       ИначеЕсли ИмяТега = "SMO" Тогда
           //это код плательщика
       Иначе
           ТипТега0 = гФайл.Следующий();
           Продолжить;
       КонецЕсли;
         
       ТипТега0 = гФайл.Следующий();
   КонецЦикла;

как получить значени, когда дойду до тега PACIENT?
19 katerinaUniv
 
01.05.12
15:49
(14)а я другого не понимаю, почему если человек не может разобраться, не подсказать ему? просто нормально все объяснить. на работе вряд ли вы говорите бухам и другим юзерам иди посмотри, книжку почитай...
20 noxxx
 
01.05.12
15:57
(19) Да тролли тут все. Что ты думала попала на форум где программисты сидят? Пфф ..
21 Злопчинский
 
01.05.12
16:47
помогите девушке, у ней фото в личке!
22 katerinaUniv
 
01.05.12
17:10
пока тут все "топтались" разобралась и написала код загрузки из xml файла
на всякий случай выкладываю тем, кому понадобится:
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"v7plus.dll")<>1 Тогда
       Предупреждение("Компонента не обнаружена");
       Возврат;
   КонецЕсли;

   гXMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
   гФайл = гXMLАнализатор.СоздатьПоследовательноСчитываемыйДокумент();
   ПолноеИмяФайла = КаталогЗагрузки2+ИмяФайла2;
   гФайл.СвязатьСФайлом(ПолноеИмяФайла);
   //найти ZAP
   //найти PACIENT
   ТипТега0 = гФайл.Спуститься();
//    ТипТега1 = ТипТега0.Спуститься();
   Пока ТипТега0 <> 4 Цикл        //    пока не достигнут конец файла
       Если ТипТега0 <> 1 Тогда
           ТипТега0 = гФайл.Следующий();
           Продолжить;
       КонецЕсли;                //    пропускаем концы уровней и инструкции
       
       ИмяТега = гФайл.СвойстваТекущегоУзла.Имя;
       
       Если            ИмяТега = "PERS_LIST"        Тогда
           //спуститься и найти PACIENT
       //    ЗагрузитьОбъектСправочника();  
           ТипТега0 = гФайл.Спуститься();
   
       ИначеЕсли ИмяТега = "PERS" Тогда
           //берем данные по пациенту новые
           ТипТега0 = гФайл.Спуститься();
           Продолжить;
       //ТипТега0.Следующий();
       ИначеЕсли ИмяТега = "ID_PAC" Тогда
           //надо добавить новую строку и заполнить данные пациента  
       
           стр = гФайл.ТекущийЭлементВВидеСтроки();
           стр = стрЗаменить(стр, "<ID_PAC>", " ");
           стр = стрЗаменить(стр, "</ID_PAC>", " ");
           стр = стрЗаменить(стр, "<ID_PAC/>", " ");
           стр = СокрЛП(стр);
           КодЗаписиОПациенте = стр;
           КодЗаписиОПациенте1 = стр;
           Спр_Пац = СоздатьОбъект("Справочник.Пациенты");
           пац = Спр_Пац.НайтиПоКоду(стр);
           Если пац = 1 Тогда
               Пациент = Спр_Пац.ТекущийЭлемент();
               Если Пациент.ФлагИногородние = 0 Тогда
                   НомерДокументаОМС =  ?(СокрЛП(Пациент.АГС_ЕдиныйНомерПолиса)<>"", СокрЛП(Пациент.АГС_ЕдиныйНомерПолиса), СокрЛП(Пациент.НомерПолисаИногород));
                   СерияДокументаОМС = Пациент.СерияПолиса; //иногородние?
               Иначе
                   НомерДокументаОМС = Пациент.НомерПолисаИногород;
                   СерияДокументаОМС =  Пациент.СерияПолисаИногород;
               КонецЕсли;
               
               СМО_РеестровыйНомер = Пациент.Плательщик_Терапия.КодСМО;
               ТипДокументаОМС    = ?(СокрЛП(Пациент.АГС_ЕдиныйНомерПолиса)<>"",3, 1);
               Если Сокрлп(Пациент.СерияПолиса)="016" Тогда
                   ТипДокументаОМС="2";
               КонецЕсли;
               Плательщик = Пациент.Плательщик_Терапия;
           КонецЕсли;
           
       ИначеЕсли ИмяТега = "VPOLIS" Тогда
           //это версия полиса 1, 2, 3  
           стр = гФайл.ТекущийЭлементВВидеСтроки();
           стр = стрЗаменить(стр, "<VPOLIS>", " ");
           стр = стрЗаменить(стр, "</VPOLIS>", " ");
           стр = стрЗаменить(стр, "<VPOLIS/>", " ");
           стр = СокрЛП(стр);
           ТипДокументаОМС1 = стр;
           
       ИначеЕсли ИмяТега = "SPOLIS" Тогда
           //это серия полиса
           стр = гФайл.ТекущийЭлементВВидеСтроки();
           стр = стрЗаменить(стр, "<SPOLIS>", " ");
           стр = стрЗаменить(стр, "</SPOLIS>", " ");
           стр = стрЗаменить(стр, "<SPOLIS/>", " ");
           стр = СокрЛП(стр);
           СерияДокументаОМС1 = стр;
       ИначеЕсли ИмяТега = "NPOLIS" Тогда
           //номер полиса  
               стр = гФайл.ТекущийЭлементВВидеСтроки();
           стр = стрЗаменить(стр, "<NPOLIS>", " ");
           стр = стрЗаменить(стр, "</NPOLIS>", " ");
           стр = стрЗаменить(стр, "<NPOLIS/>", " ");
           стр = СокрЛП(стр);
           НомерДокументаОМС1 = стр;
       ИначеЕсли ИмяТега = "SMO" Тогда
           //это код плательщика    
               стр = гФайл.ТекущийЭлементВВидеСтроки();
           стр = стрЗаменить(стр, "<SMO>", " ");
           стр = стрЗаменить(стр, "</SMO>", " ");  
           стр = стрЗаменить(стр, "<SMO/>", " ");
           стр = СокрЛП(стр);
           СМО_РеестровыйНомер1 = стр;
           ТипТега0 = гФайл.Подняться();          
           Спр_Плат = Создатьобъект("Справочник.Плательщики_Терапия");
           пл = Спр_Плат.НайтиПоРеквизиту("КодСМО",стр,1);  
           Если пл = 1 Тогда
               Плательщик1 = Спр_Плат.ТекущийЭлемент();
           КонецЕсли;
           
       Иначе
           ТипТега0 = гФайл.Следующий();
           Продолжить;
       КонецЕсли;
         
       ТипТега0 = гФайл.Следующий();
   КонецЦикла;
23 katerinaUniv
 
01.05.12
17:10
причем разбиралась сама, а не по типовым кодам конфигураций. последнее не всегда удобочитаемо.
24 Мигрень
 
01.05.12
17:13
(22) От спасибо, теперь бум поциэнтов грузить!
(23) Купи себе морожено за это.
25 nicxxx
 
02.05.12
02:44
(22)мда
26 andrewks
 
02.05.12
08:55
в7плюс в топку


Функция ВывестиЭлем(ТекЭлем,Знач Смещ);
   
   Рез=1;
   Попытка
       Если (ТекЭлем.nodeType=1) Тогда
           Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":","!");
       ИначеЕсли (ТекЭлем.nodeType=3) Тогда
           Сообщить(Смещ+"Текст элемента: "+ТекЭлем.nodeValue);
       ИначеЕсли (ТекЭлем.nodeType=4) Тогда
           Сообщить(Смещ+"CDATA: "+ТекЭлем.nodeValue);
       ИначеЕсли (ТекЭлем.nodeType=8) Тогда
           Сообщить(Смещ+"Комментарий: "+ТекЭлем.nodeValue,"I");
       Иначе
           Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":");
           Сообщить(Смещ+"Тип: "+ТекЭлем.nodeType);
       КонецЕсли;
       
       Для ном=0 По ТекЭлем.attributes.length-1 Цикл
           ТекАтр=ТекЭлем.attributes(ном);
           Сообщить(Смещ+"Атрибут: "+ТекАтр.nodeName+", значение: "+ТекАтр.nodeValue);
       КонецЦикла;
       
   Исключение
       Рез=0;
   КонецПопытки;
   
   
   Смещ=Смещ+"    ";
   
   Для ном=0 По ТекЭлем.childNodes.length-1 Цикл
       ДочЭлем=ТекЭлем.childNodes(ном);
       Рез=Рез*ВывестиЭлем(ДочЭлем,Смещ);
   КонецЦикла;
   
   Возврат Рез;
КонецФункции

//*******************************************
Функция Сформировать()

   ИмяФайла="D:\1.xml";
   
   Попытка
       ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0");
       Узел=ДОМ.CreateProcessingInstruction("xml","version=""1.0"" encoding=""windows-1251""");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   ДОМ.insertBefore(Узел,);
   
   
   ТекЭлем=ДОМ.appendChild(ДОМ.createElement("Файл"));
   Текст=ДОМ.createTextNode("Здесь содержимое Файл");
   ТекЭлем.appendChild(Текст);
   ТекЭлем.setAttribute("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1");
   Комм=ДОМ.createComment("Далее следует содержимое файла");
   ТекЭлем.appendChild(Комм);
   
   ТекЭлем=ТекЭлем.appendChild(ДОМ.createElement("СодержимоеФайла"));
   Текст=ДОМ.createTextNode("Здесь содержимое СодержимоеФайла");
   ТекЭлем.appendChild(Текст);
   ТекЭлем.setAttribute("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
   Текст=ДОМ.createCDATASection("Это секция CDATA");
   ТекЭлем.appendChild(Текст);
   ДОМ.save(ИмяФайла);
   
   Попытка
       ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   
   ДОМ.async=0;
   ДОМ.validateOnParse=-1;
   ДОМ.resolveExternals=-1;
   ДОМ.load(ИмяФайла);
   
   Если (ДОМ.parseError.errorCode<>0) Тогда
       // ошибки при проверке валидности

       Сообщить("При проверке валидности файла "+ИмяФайла+" выявлены ошибки!","!");
       Возврат 0;
   КонецЕсли;

   Рут=ДОМ.documentElement();
   Смещ="";
   Рез=ВывестиЭлем(Рут,Смещ);
   
   Возврат Рез;
КонецФункции

27 alkov
 
02.05.12
09:16
Дарю:

//*******************************************
Процедура Сформировать()
   Если ЗагрузитьВнешнююКомпоненту("v7plus.dll") = 0 Тогда
       Предупреждение("v7plus!");
       Возврат;
   КонецЕсли;
   
   ИмяФайла = "C:\kat.xml";
   Анализатор=СоздатьОбъект("AddIn.XMLParser");
   Файл = Анализатор.СоздатьДокумент();
   Файл.Загрузить(ИмяФайла);
   КорневойУзел = Файл.ЭлементДокумента;
   ВыборкаУзлов = КорневойУзел.ВыбратьУзлы("PACIENT/ID_PAC");
   Для Сч=0 По ВыборкаУзлов.КоличествоУзлов()-1 Цикл
       Сообщить(ВыборкаУзлов.ПолучитьУзел(Сч).Значение);
   КонецЦикла;
КонецПроцедуры
28 alkov
 
02.05.12
09:16
блин, тег криво прописал, ну да ладно
29 alkov
 
02.05.12
09:20
Но это всё не взлетит, если в (0) не закрыть тег, дописав в конце </ZAP>