8.х Как прочитать содержимое узла xml

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем pashsho, 24 янв 2011.

  1. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Подскажие как прочитать значение 176068 у NCTRT?
    Имя читаю. а как быть с содержимым не соображу.

    хмл:
    Код:
    <DOCUMENTS>
    <DOC IDWBILL="2497894" CREATED="24-01-2011 07:56:31">
    <HEAD WAYBILL_NUM="10053" WAYBILL_DATE="24-01-2011" POST="98004" SKLAD="04070" SKLAD_POST="98004" SHIFTMAN="Иноземцев А.П." OTPUSK="Ключевская Л.В." KTO="Кузьмичева" DOVEREN="" TRANSPORT="3873СТ63" BUHG="Кошелева И.И." TTN="" WITHLABELS="1">
    <DOGOVOR>
    <NCTRT>176068</NCTRT>
    <DCTRT>13-11-2010</DCTRT>
    <SPFC_MONTH>1</SPFC_MONTH>
    </DOGOVOR>
    </HEAD>
    <BODY>
    <STROKA NDET="11170620113300" NAME="COEДИHИTEЛЬ ПAHEЛEЙ" EI="13" QUANTITY="730.00" PRICE="8.43" IDSPFC="13668369">
    <LABEL NOM="6015860618" IDBOX_OWNERS="6015860618" IDTARA="81456525" EI="13" QUANTITY="730" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="11180610112600" NAME="СОЕДИНИТ-ЛЬ ПАНЕЛЕЙ ПЕРЕДН" EI="13" QUANTITY="1450.00" PRICE="23.04" IDSPFC="13668331">
    <LABEL NOM="6015846636" IDBOX_OWNERS="6015846636" IDTARA="81456525" EI="13" QUANTITY="350" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015846643" IDBOX_OWNERS="6015846643" IDTARA="81456525" EI="13" QUANTITY="350" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015846673" IDBOX_OWNERS="6015846673" IDTARA="81456525" EI="13" QUANTITY="350" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015846690" IDBOX_OWNERS="6015846690" IDTARA="81456525" EI="13" QUANTITY="400" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="11180610112700" NAME="СОЕДИНИТ-ЛЬ ПАНЕЛЕЙ ПЕРЕДН" EI="13" QUANTITY="1450.00" PRICE="23.04" IDSPFC="13668371">
    <LABEL NOM="6015846770" IDBOX_OWNERS="6015846770" IDTARA="81456525" EI="13" QUANTITY="350" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015846780" IDBOX_OWNERS="6015846780" IDTARA="81456525" EI="13" QUANTITY="350" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015846784" IDBOX_OWNERS="6015846784" IDTARA="81456525" EI="13" QUANTITY="350" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015846797" IDBOX_OWNERS="6015846797" IDTARA="81456525" EI="13" QUANTITY="400" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="11180620113200" NAME="СОЕД-ЛЬ ПАНЕЛЕЙ ЗАДН ПР" EI="13" QUANTITY="1650.00" PRICE="9.04" IDSPFC="13668405">
    <LABEL NOM="6015851326" IDBOX_OWNERS="6015851326" IDTARA="81456525" EI="13" QUANTITY="1650" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="11180620113300" NAME="СОЕД-ЛЬ ПАНЕЛЕЙ ЗАДН ЛЕВ" EI="13" QUANTITY="1500.00" PRICE="9.04" IDSPFC="13668400">
    <LABEL NOM="6015860596" IDBOX_OWNERS="6015860596" IDTARA="81456525" EI="13" QUANTITY="1500" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="11180620124000" NAME="СОЕД-ЛЬ ПАНЕЛЕЙ ВЕРХНИЙ ПРАВ" EI="13" QUANTITY="1200.00" PRICE="12.42" IDSPFC="13668412">
    <LABEL NOM="6015846888" IDBOX_OWNERS="6015846888" IDTARA="81456525" EI="13" QUANTITY="1200" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="11180620124100" NAME="СОЕД-ЛЬ ПАНЕЛЕЙ ВЕРХНИЙ ЛЕВЫЙ" EI="13" QUANTITY="1200.00" PRICE="12.42" IDSPFC="13668381">
    <LABEL NOM="6015846896" IDBOX_OWNERS="6015846896" IDTARA="81456525" EI="13" QUANTITY="1200" BRUTTO="" NETTO=""/>
    </STROKA>
    </BODY>
    </DOC>
    </DOCUMENTS>
    

    процедура

    Код:
    Процедура Загрузить(Файл)
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(Файл); //ПутьКФайлу - Путь к загружаемому XML-документу указан в переменной
    //Используется модель последовательного доступа.
    Пока Чтение.Прочитать() Цикл // Прочитать «структурные части» элементов.
    
    // Проверить, какая часть элемента текущая.
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
    ИмяУзла = Чтение.Имя;
    Если ИмяУзла = "NCTRT" Тогда
    номердог=Чтение.ИмеетЗначение; 
    номердог1=Чтение.ИмеетИмя; 
    номердог2=Чтение.Имя; 
    номердог3=Чтение.Значение; 
    
    КонецЕсли;
    
    Если //ИмяУзла = "DOC" Тогда
    
    ИмяУзла = "STROKA" Тогда
    Если Документ.Товары.Количество() > 0 Тогда
    Документ.Товары.Очистить();
    КонецЕсли;
    Строка = Документ.Товары.Добавить();
    
    КонецЕсли;
    //Сообщить("--" + ИмяУзла);
    
    // Атрибуты элементов можно читать, только если текущая часть – начало элемента.
    Пока Чтение.ПрочитатьАтрибут() Цикл
    
    // Прочитать данные узла атрибута.
    ТипУзла = Чтение.ТипУзла;
    Имя = Чтение.Имя;
    Значение = Чтение.Значение;
    
    Если Имя = "WAYBILL_NUM" Тогда
    
    Номер = Значение;
    Склад=Сред(Номер,0,1);
    
    //ИначеЕсли Имя = "DOGOVOR" Тогда
    //Ндог=Значение;
    //	 НомДог=Сред(Значение,0,2);
    
    
    ИначеЕсли Имя = "WAYBILL_DATE" Тогда
    ИщемДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер,(СтрЗаменить(Значение, "-", "."))+" 0:00:00");
    Если ИщемДок = Документы.РеализацияТоваровУслуг.ПустаяСсылка() Тогда
    Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    Дата = СтрЗаменить(Значение, "-", ".");
    Документ.Дата = Дата+" 0:00:00";
    Документ.Организация=Справочники.Организации.НайтиПоКоду("000000001");
    Документ.ТипЦен=Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("АВТОВАЗ");
    Документ.Контрагент=Справочники.Контрагенты.НайтиПоКоду("050000781");
    Документ.ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.НайтиПоКоду("000001447");
    Документ.СчетУчетаРасчетовСКонтрагентом=ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
    Документ.СчетУчетаРасчетовПоАвансам=ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");
    Документ.ВалютаДокумента=Справочники.Валюты.НайтиПоКоду("643");
    Если Склад="1" Тогда
    // 1 Иноземцев 000000006
    Документ.Склад=Справочники.Склады.НайтиПоКоду("000000006");
    ИначеЕсли Склад="2" Тогда
    // 2 Прохоров	000000022 
    Документ.Склад=Справочники.Склады.НайтиПоКоду("00000022");
    Иначе 	//3 Сухов 000000029
    Документ.Склад=Справочники.Склады.НайтиПоКоду("000000029");
    
    КонецЕсли;
    Документ.Ответственный=Справочники.Пользователи.НайтиПоНаименованию("Жилина Ирина Ивановна");
    Документ.Грузоотправитель=Справочники.Организации.НайтиПоКоду("000000001");
    Документ.Грузополучатель=Справочники.Контрагенты.НайтиПоКоду("050000781");
    
    
    Иначе
    Документ = ИщемДок.ПолучитьОбъект();
    
    Сообщить("Документ ---" + Документ + " --- уже существует");
    
    КонецЕсли;
    Документ.ОтражатьВНалоговомУчете = Истина;
    
    
    
    ИначеЕсли Имя = "POST" Тогда
    //Документ.
    ИначеЕсли Имя = "SKLAD" Тогда
    //Документ.
    ИначеЕсли Имя = "SKLAD_POST" Тогда
    //Документ.
    ИначеЕсли Имя = "SHIFTMAN" Тогда
    //Документ.
    ИначеЕсли Имя = "OTPUSK" Тогда
    //Документ.
    ИначеЕсли Имя = "KTO" Тогда
    //Документ.
    ИначеЕсли Имя = "DOVEREN" Тогда
    //Документ.
    ИначеЕсли Имя = "TRANSPORT" Тогда
    //Документ.
    ИначеЕсли Имя = "BUHG" Тогда
    //Документ.
    ИначеЕсли Имя = "TTN" Тогда
    //Документ.
    ИначеЕсли Имя = "WITHLABELS" Тогда
    //Документ.
    
    ИначеЕсли Имя = "LABEL" Тогда
    //Документ.
    ИначеЕсли Имя = "QUANTITY" Тогда
    Строка.Количество = Значение;
    ИначеЕсли Имя = "PRICE" Тогда
    Строка.Цена = Значение;
    
    ИначеЕсли Имя = "NAME" Тогда
    
    Наименование = Значение;
    
    ИначеЕсли Имя = "NDET" Тогда
    
    Строка.Номенклатура = ВыгрузитьТовар(Значение,Наименование);
    
    
    ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.ЗаполнитьНомерГТДИСтрануПроисхождения(Строка, Ложь, Документ.Организация, Документ.Дата);
    Документ.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(Строка, "Товары", Истина, Документ.ОтражатьВНалоговомУчете);
    // Рассчитываем реквизиты табличной части.
    ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(Строка, Документ);
    СчетБУ = Строка.СчетДоходовБУ;
    СчетНУ = Строка.СчетДоходовНУ;
    
    
    КонецЕсли;
    
    //Документ.Дата = СтрЗаменить(Значение,"-",".");
    //Сообщить(Значение);
    // Обработать полученные значения.
    // ...
    
    КонецЦикла;
    
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
    
    // В примере просто выводим текст в окно сообщений.
    //Сообщить("Текст:" + Чтение.Значение);
    
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
    
    // В примере просто выводим признак конца элемента в окно сообщений.
    //Сообщить("--Конец:" + Чтение.Имя);
    Если Чтение.Имя = "DOC" Тогда
    ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(Строка, Документ);
    Документ.Номер = Номер;
    Документ.ВидОперации=Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия;
    Документ.Комментарий="1"+номердог3;
    Попытка
    //Документ.Записать(РежимЗаписиДокумента.Проведение);
    Документ.Записать();
    
    Исключение
    Предупреждение("Невозможно провести документ.");
    КонецПопытки;
    
    
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    
    
    Сообщить("Операция завершена");
    
    КонецПроцедуры
    
  2. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Чтение.Значение не подходит чтоли?
  3. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Код:
    Если ИмяУзла = "NCTRT" Тогда
    
    Код:
    номердог=Чтение.ИмеетЗначение; 
    
    вовзращает ложь
    Код:
    номердог1=Чтение.ИмеетИмя; 
    
    вовзращает истина
  4. shurikvz
    Online

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    ХЗ.

    Сделайте чтение через "ДокументDOM".
    Код:
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(Файл); //ПутьКФайлу - Путь к загружаемому XML-документу указан в переменной
    
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(Чтение);
    
    
    "ПервыйДочерний" - у вас будет собственно сам документ ("DOCUMENTS") - ну а дальше разбирайте: DOC, HEAD, BODY. Из HEAD получаете список дочерних узлов (у вас он один: "DOGOVOR" и разбираете его), с BODY точно так же. Разбор красивее будет, и все читается (свойство "ТекстовоеЗначение" узла).
  5. shurikvz
    Online

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    З.Ы.
    При вашем способе доступа в свойстве "Значение" там и ничего не должно быть.
    А у вас тип узла "ТипУзлаXML.НачалоЭлемента". Ваше значение будет в следущем после него элементе ("#text").
  6. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    используйте ДокументDOM для обхода xml. получить узел по имени, прочитать ТекстовоеСодержимое.

Поделиться этой страницей