Имя: Пароль:
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 дерево получить.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn