8.х ОБМЕН чтение файла xml

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем wary, 19 сен 2011.

  1. TopicStarter Overlay
    wary
    Offline

    wary Опытный в 1С

    Регистрация:
    5 авг 2009
    Сообщения:
    139
    Симпатии:
    1
    Баллы:
    26
    Добрый день!
    1С:Предприятие 8.2 (8.2.13.219)

    Дерево элементов (если неправильно выразился - поправьте :) ) файла имеет несколько уровней вложенности, например:

    Код:
    <ORDER>
    
    <POSITION>
    <POSITIONNUMBER>1</POSITIONNUMBER>
    <PRODUCT>1111111111111</PRODUCT>
    </POSITION>
    <POSITION>
    <POSITIONNUMBER>2</POSITIONNUMBER>
    <PRODUCT>2222222222222</PRODUCT>
    </POSITION>
    <POSITION>
    <POSITIONNUMBER>3</POSITIONNUMBER>
    <PRODUCT>3333333333333</PRODUCT>
    </POSITION>
    <POSITION>
    <POSITIONNUMBER>4</POSITIONNUMBER>
    <PRODUCT>4444444444444</PRODUCT>
    </POSITION>
    </ORDER>
    
    
    

    Теги POSITION содержат продукцию, в примере видно что всего 4 позиции по продукции. На данный момент через синтаксис-помощник добрался до следующего:

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

    Вопрос: как мне обойти xml файл (как спускаться по уровням????), чтобы собрать по тегам POSITION продукцию (потом загоню ее в таблицу значений).

    Заранее спасибо!
  2. vartanet
    Offline

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

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

    дальше работайте через свойства и методы ДокументDOM.

    все элементы POSITION можно найти с помощью метода ПолучитьЭлементыПоИмени("POSITION").
  3. TopicStarter Overlay
    wary
    Offline

    wary Опытный в 1С

    Регистрация:
    5 авг 2009
    Сообщения:
    139
    Симпатии:
    1
    Баллы:
    26
    Пытаюсь разобраться в этом направлении. Всю голову сломал как работать с этим DOM. Вот что в СП написано:

    Код:
    ДокументDOM.По имени документа DOM и URI пространства имен (DOMDocument.Based on DOM document name and namespace URI)
    ДокументDOM (DOMDocument)
    По имени документа DOM и URI пространства имен
    Синтаксис:
    
    Новый ДокументDOM(<URIПространстваИмен>, <Имя>) 
    Параметры:
    
    <URIПространстваИмен> (обязательный)
    
    Тип: Строка. URI пространства имен корневого элемента документа. 
    <Имя> (обязательный)
    
    Тип: Строка. Квалифицированное имя корневого элемента документа DOM. 
    Описание:
    
    Создает документ DOM с корневым элементом. 
    
    Что передавать в URIПространстваИмен и Имя ?? В нете как не странно не одного примера как с этим работать. Покажите пожалуйста пример как мне в этот DOM подцепить мой XML файл....:(
  4. comol
    Offline

    comol Опытный в 1С

    Регистрация:
    8 сен 2011
    Сообщения:
    153
    Симпатии:
    0
    Баллы:
    26
    Это как-то сложно... можно просто через "ЧтениеXML". Узлы сами укажете. Подробно и доступно описано в "профессиональная Разработка" у А. Габец-а
  5. TopicStarter Overlay
    wary
    Offline

    wary Опытный в 1С

    Регистрация:
    5 авг 2009
    Сообщения:
    139
    Симпатии:
    1
    Баллы:
    26
    а можно пример небольшой? просто не совсем понятно как отследить что текст такого-то узла относится именно к тому-то узлу??

    Мне вот нужно содержимое XML файлика нужно загнать в таблицу значений. В какой момент создать новую строку в ТЗ я понимаю:

    Код:
    Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "POSITION" Тогда
    
    НоваяСтрока = ТаблицаПродукции.Добавить();	
    
    А вот как мне указать, что именно для текста узла <POSITIONNUMBER>1</POSITIONNUMBER> мне нужно взять текст узла <PRODUCT>1111111111111</PRODUCT> и вставить в НоваяСтрока.Код
  6. TopicStarter Overlay
    wary
    Offline

    wary Опытный в 1С

    Регистрация:
    5 авг 2009
    Сообщения:
    139
    Симпатии:
    1
    Баллы:
    26
    Вроде разобрался! Всем спасибо, тема закрыта! Вот код, может кому будет интересно:

    Код:
    Процедура ПолеФайлXML(Элемент, СтандартнаяОбработка)
    
    Режим = РежимДиалогаВыбораФайла.Открытие; 
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); 
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Фильтр  = "Формат xml (*.xml)|*.xml"; 
    ДиалогОткрытияФайла.Заголовок = "Выберите файл"; 
    
    ТаблицаПродукции = Новый ТаблицаЗначений;
    ТаблицаПродукции.Колонки.Добавить("Позиция");	
    ТаблицаПродукции.Колонки.Добавить("ПродукцияКод");
    ТаблицаПродукции.Колонки.Добавить("Количество");
    ТаблицаПродукции.Колонки.Добавить("ЦенаБезНДС");
    
    Если ДиалогОткрытияФайла.Выбрать() Тогда 
    ПутьКФайлуXML = Строка(ДиалогОткрытияФайла.ПолноеИмяФайла);
    МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
    
    Для Каждого ИмяФайла Из МассивФайлов Цикл
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяФайла); 
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM  = ПостроительDOM.Прочитать(ЧтениеXML);
    
    POSITION = ДокументDOM.ПолучитьЭлементыПоИмени("POSITION");
    
    
    Для Позиц=0 По POSITION.Количество()-1 Цикл
    
    ДочерниеУзлы = POSITION[Позиц].ДочерниеУзлы;
    НоваяСтрока = ТаблицаПродукции.Добавить();
    
    Для каждого Узел Из ДочерниеУзлы Цикл
    
    Если Узел.ИмяУзла = "POSITIONNUMBER" Тогда
    
    НоваяСтрока.Позиция = Узел.ТекстовоеСодержимое;
    
    ИначеЕсли Узел.ИмяУзла = "PRODUCT" Тогда
    
    НоваяСтрока.ПродукцияКод = Узел.ТекстовоеСодержимое;
    
    ИначеЕсли Узел.ИмяУзла = "ORDEREDQUANTITY" Тогда
    
    НоваяСтрока.Количество = Узел.ТекстовоеСодержимое;
    
    
    ИначеЕсли Узел.ИмяУзла = "ORDERPRICE" Тогда
    
    НоваяСтрока.ЦенаБезНДС = Узел.ТекстовоеСодержимое;
    
    КонецЕсли;
    
    КонецЦикла; 
    
    КонецЦикла; 
    
    КонецЦикла;
    
    КонецЕсли;  
    
    КонецПроцедуры
    
    
    kladovoy нравится это.
  7. n.s.gnedash
    Offline

    n.s.gnedash Опытный в 1С Команда форума

    Регистрация:
    15 авг 2010
    Сообщения:
    1.359
    Симпатии:
    5
    Баллы:
    29
    Пытаюсь прочитать данные файла xml, вот само древо.

    Код:
    <ПКО>
    <Номер>00000002089</Номер>
    <Дата>16.09.2011</Дата>
    <КурсВзаиморасчетов>1</КурсВзаиморасчетов>
    <СуммаПлатежа>3 500</СуммаПлатежа>
    <СтавкаНДС>Без НДС</СтавкаНДС>
    <СуммаНДС>0</СуммаНДС>
    <СтатьяДвиженияДенежныхСредств>Поступления от покупателей</СтатьяДвиженияДенежныхСредств>
    <СчетУчетаРасчетовПоАвансам>Расчеты по авансам полученным</СчетУчетаРасчетовПоАвансам>
    <Организация>
    <Наименование>ЗАО 12345</Наименование>
    <ИНН>123455678</ИНН>
    <КПП>123455678</КПП>
    </Организация>
    <СчетКасса>Касса организации</СчетКасса>
    </ПКО>
    

    Вывожу все в таблицу значений

    Код:
    Чтение=Новый ЧтениеXML;
    Чтение.ОткрытьФайл("C:\Users\1\Desktop\Выгрузка\test.xml");
    
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM  = ПостроительDOM.Прочитать(Чтение);
    
    Позиция = ДокументDOM.ПолучитьЭлементыПоИмени("ПКО");
    
    Для Позиц=0 По Позиция.Количество()-1 Цикл
    ДочерниеУзлы = Позиция[Позиц].ДочерниеУзлы;
    НоваяСтрока = Таб1.Добавить();
    Для каждого Узел Из ДочерниеУзлы Цикл
    Если Узел.ИмяУзла = "Номер" Тогда
    НоваяСтрока.Номер = Узел.ТекстовоеСодержимое;
    ИначеЕсли Узел.ИмяУзла = "Дата" Тогда
    НоваяСтрока.Дата = Узел.ТекстовоеСодержимое;
    ИначеЕсли Узел.ИмяУзла = "СуммаПлатежа" Тогда
    НоваяСтрока.СуммаПлатежа = Узел.ТекстовоеСодержимое;
    ИначеЕсли Узел.ИмяУзла = "СчетУчетаРасчетовСКонтрагентом" Тогда
    НоваяСтрока.СчетУчетаРасчетовСКонтрагентом = Узел.ТекстовоеСодержимое;
    ИначеЕсли Узел.ИмяУзла = "СчетУчетаРасчетовПоАвансам" Тогда
    НоваяСтрока.СчетУчетаРасчетовПоАвансам = Узел.ТекстовоеСодержимое;
    
    ИначеЕсли Узел.ИмяУзла = "Организация" Тогда
    НоваяСтрока.Организация = Узел.ТекстовоеСодержимое;
    КонецЕсли;
    КонецЦикла; 
    КонецЦикла;
    Чтение.Закрыть();
    
    
    
    Подскажите как попасть в ветку Организация? Чтоб Наименование, ИНН и КПП выводились в разных колонках. Сейчас все одной выводит.
  8. Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    Код:
    ИначеЕсли Узел.ИмяУзла = "Организация" Тогда
    Для Каждого ДочернийПоОрганизации Из Узел.ДочерниеУзлы Цикл
    НоваяСтрока.Наименование = ДочернийПоОрганизации[0].ТекстовоеСодержимое;
    НоваяСтрока.ИНН = ДочернийПоОрганизации[1].ТекстовоеСодержимое;
    НоваяСтрока.КПП= ДочернийПоОрганизации[2].ТекстовоеСодержимое;
    КонецЕсли;
    
    
    наверно уже не требуется, но на всякий случай выложу

    по идее так как написал, может чего-то и напутал...

    "НоваяСтрока" тут сами решите как вам вносить этот узел в ТЗ

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