Имя: Пароль:
1C
1С v8
Импорт xml файла в виде дерева значений
, ,
0 sergejkonet
 
28.07.14
09:46
Всем доброго времени суток! необходимо выполнить импорт дерева чертежей, представленного в виде xml-файла в справочник чертежи 1С. создал табличное поле с типом дерево значений, в табличное поле добавил необходимые столбцы, прописал следующий код на открытие файла XML.
Процедура ЗагрузитьИзЛоцманаXML_Иерархически()
    
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    Фильтр = "Файл данных (*.xml)|*.xml";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файл загрузки";
    ДиалогОткрытияФайла.ПредварительныйПросмотр = Ложь;
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        ИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
    Иначе
        Возврат;
    КонецЕсли;

    ТаблицаЗагрузки.Строки.Очистить();
    
        
    XML_Документ = Новый ЧтениеXML;
    XML_Документ.ОткрытьФайл(ИмяФайла);
    
    Пока XML_Документ.Прочитать() Цикл
        
        Если XML_Документ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            //Если XML_Документ.Имя = "object" Тогда
                
                ТипЭлемента = XML_Документ.ПолучитьАтрибут("Type");
                Если ТипЭлемента = "Сборочная единица" Тогда
                    
                    Стр = ТаблицаЗагрузки.Строки.Добавить();
                    //Стр.ЭтоГруппа            = Истина;
                    Стр.ID                    = СокрЛП(XML_Документ.ПолучитьАтрибут("Id"));
                    Стр.Наименование        = СокрЛП(XML_Документ.ПолучитьАтрибут("Name"));
                    Стр.НомерЧертежа    = СокрЛП(XML_Документ.ПолучитьАтрибут("Product"));
                    //ПрочитатьВложенныеУровни(XML_Документ, Стр)
                                        
                ИначеЕсли ТипЭлемента = "Деталь" Тогда
                    Стр = ТаблицаЗагрузки.Строки.Добавить();
                    //Стр.ЭтоГруппа        = Ложь;
                    Стр.ID                = СокрЛП(XML_Документ.ПолучитьАтрибут("Id"));
                    Стр.Наименование    = СокрЛП(XML_Документ.ПолучитьАтрибут("Name"));
                    Стр.НомерЧертежа    = СокрЛП(XML_Документ.ПолучитьАтрибут("Product"));

                    КонецЕсли;
            
        
        КонецЕсли;

    КонецЦикла;



КонецПроцедуры

Но файл открывается в виде неранжированного списка, а как ы мне его представить в виде дерева значений? Что бы потом можно было дальше это дерево экспортировать в систему.
1 Asmody
 
28.07.14
10:01
Если это дерево, то должны быть уровни где-то как-то.
В 1С у строки дерева значений тоже есть свойство Строки.
2 Asmody
 
28.07.14
10:03
Если xml-файл небольшой, то его можно открыть через документ DOM, который имеет "деревянную" структуру.
3 sergejkonet
 
28.07.14
10:10
(2) Ну размер файлов колеблется от 200 до 400 кб. С уровнями в xml файле уровни есть, но никаких общих ID на этих уровнях я не прослеживаю, т.е. как перенести эти уровни в 1С?
4 Asmody
 
28.07.14
10:22
пример xml кинь. только не сюда, а на http://pastebin.com/
5 acsent
 
28.07.14
10:23
(2) Думаешь большой файл проще в дерево загнать без дома?
6 acsent
 
28.07.14
10:24
А вообще юзай XDTO - 2 строчки кода и объект с данными готов
7 Asmody
 
28.07.14
10:30
(6) для XDTO схему надо рисовать
8 sergejkonet
 
28.07.14
10:43
9 sergejkonet
 
28.07.14
10:44
(6)Думал про XDTO, но там надо точную схему нарисовать, а xml не из 1с((
10 Asmody
 
28.07.14
10:47
(8) там что, в значениях атрибутов правда кавычки неэкранированные, или это pastebin перевирает?
11 sergejkonet
 
28.07.14
10:53
нет, pastebin вставил все верно.
12 sergejkonet
 
28.07.14
10:54
(10) значения атрибутов там и правда в неэкранированных кавычках.
13 Asmody
 
28.07.14
10:56
(12) Я тебя "поздравляю". Чините выгрузку, с таким ни один нормальный xml-парсер работать не будет.
14 sergejkonet
 
28.07.14
11:08
(13) ну данные вроде как он извлекает, значения атрибутов Product, Name, Id. он мне выдает, но выдает в виде неранжированной таблицы.
15 Asmody
 
28.07.14
11:11
(14) так для этого тебе либо надо самому анализировать что это за узел, есть ли у него вложенные узлы, отслеживать текущий уровень вложенности, либо пользоваться DOM.
16 sergejkonet
 
28.07.14
11:23
(15) а для использования DOM необходимо навести с неэкранированными кавычками? Т.к. навести порядок с этим практически нереально, т.к. как мне сказали конструктора работающие с лоцманом, править xml загрузки нельзя, то остается только описывать вручную все уровни вложенные. в данном файле их вроде как 7, но вот привязать иерархию к какому-то ID, тут так просто и не подцепишься, поля родитель и подавну нет.
17 Asmody
 
28.07.14
11:43
(16) а ты уверен, что у тебя ПолучитьАтрибут("Name") возвращает именно
[Автоматизированная газораспределительная станция (АГРС) "Снежеть" Q=85000м3 / /ч Комплекс технологического оборудования ТУ 3647-240-05772641-01]

По-идее, должен на второй кавычке обрубаться.
18 sergejkonet
 
28.07.14
11:59
(17) Нет, возвращает все верно. полностью все значение атрибута Name. Попробую сейчас через DOM дерево получить.