8.х Элементы и атрибуты в дереве значений

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

  1. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Нужно из xml-файла заполнить дерево значений из элементов и атрибутов. Дерево, которое должно получится - в файле "Правильное дерево". То что выходит у меня - в файлах "Неправильное дерево", "Неправильное дерево (продолжение)". Вот код, которым обрабатываю xml-файл. Думаю, что-то не так в процедуре Рекурсия(СтрокаДерева, Чтение). Помогите, пожалуйста.

    Код:
    Перем Документ, ИмяНачало, ИмяАт, ИмяАтрибут, ИмяТекст, СчИдентиф, СчИдентиф2;
    
    Процедура ФайлXMLНачалоВыбора(Элемент, СтандартнаяОбработка)
        Диалог=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        Диалог.Фильтр="Файлы XML (*.xml) |*.xml";
        Если Диалог.Выбрать()=ложь Тогда
            Сообщить("Файл не выбран");
               Возврат;
        КонецЕсли;
       
        ФайлXML=Диалог.ПолноеИмяФайла;
        ИмяКаталог=Диалог.Каталог;
        НачалПоз=СтрДлина(ИмяКаталог)+1;
        ИмяСхемы=Сред(ФайлXML, НачалПоз);
        ИмяСхемы=Лев(ИмяСхемы,СтрДлина(ИмяСхемы)-4);
       
        Текст=Новый ТекстовыйДокумент;
        Текст.Прочитать(ФайлXML);
        Документ=Текст.ПолучитьТекст();
    КонецПроцедуры
    
    Процедура ОчиститьТаблицы() Экспорт
        Дерево.Строки.Очистить();
        Дерево.Колонки.Очистить();
    КонецПроцедуры
    
    Функция ТекстУзла(ИмяНачало)
        СчИдентиф2=СчИдентиф2+1;
        ИмяТекст=ИмяНачало+"_Эл"+СчИдентиф2;
        Возврат ИмяТекст;
    КонецФункции
    
    Функция ТекстАтрибута(ИмяАт)
        СчИдентиф=СчИдентиф+1;
        ИмяАтрибут=ИмяАт+"_Ат"+СчИдентиф;
        Возврат ИмяАтрибут;
    КонецФункции
    
    Процедура Рекурсия(СтрокаДерева, Чтение)   
        //Состояние(Чтение.Имя);
        Пока Чтение.Прочитать() Цикл
            Если Чтение.ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда
                ИмяНачало=Чтение.Имя;
                Дочерний=СтрокаДерева.Строки.Добавить();
                Дочерний.Элемент=Чтение.Имя;
                Пока Чтение.ПрочитатьАтрибут() Цикл
                    ИмяАт=Чтение.Имя;
                    ТекстАтрибута(ИмяАт);
                    СтрокаДереваДоб=СтрокаДерева.Строки.Добавить();
                    СтрокаДереваДоб.Элемент=ИмяАт;
                    СтрокаДереваДоб.Наименование=ИмяАтрибут;
                    СтрокаДереваДоб.Текст=Чтение.Значение;
                КонецЦикла;
                Рекурсия(Дочерний, Чтение);
            ИначеЕсли Чтение.ТипУзла=ТипУзлаXML.Текст Тогда
                ТекстУзла(ИмяНачало);
                СтрокаДерева.Наименование=ИмяТекст;
                СтрокаДерева.Текст=Чтение.Значение;
            ИначеЕсли
                Чтение.ТипУзла=ТипУзлаXML.КонецЭлемента Тогда
            Прервать;
            КонецЕсли;
            ОбработкаПрерыванияПользователя();
        КонецЦикла;
    КонецПроцедуры
    
    Функция Парсинг() Экспорт
        Чтение=Новый ЧтениеXML();
        Чтение.УстановитьСтроку(Документ);
        ДеревоЗначений=Новый ДеревоЗначений();
        Попытка
            Чтение.Прочитать();
        Исключение
            Предупреждение("Документ XML поврежден");
            Возврат ДеревоЗначений;
        КонецПопытки;
        //ТипЗначДерева=Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(0));
        ДеревоЗначений.Колонки.Добавить("Элемент");
        ДеревоЗначений.Колонки.Добавить("Наименование");
        ДеревоЗначений.Колонки.Добавить("Текст");
        Корень=ДеревоЗначений.Строки.Добавить();
        Корень.Элемент=Чтение.Имя;
        Рекурсия(Корень, Чтение);
        Возврат ДеревоЗначений;
    КонецФункции
    
    Процедура СоздадимДеревоЗначений(Элемент)
        СчИдентиф=0;
        СчИдентиф2=0;
       
        ЭлементыФормы.Дерево.Колонки.Очистить();
        ОчиститьТаблицы();
       
        Если НЕ ПустаяСтрока(Документ) Тогда
            ОчиститьТаблицы();
            Дерево=Парсинг();
            Если Дерево.Строки.Количество()>0 Тогда
                ЭлементДерево=ЭлементыФормы.Дерево;
                ЭлементДерево.СоздатьКолонки();
                ЭлементыФормы.Панель1.ТекущаяСтраница=ЭлементыФормы.Панель1.Страницы.Дерево;
            КонецЕсли;
        КонецЕсли;
    КонецПроцедуры
    
    Процедура СоздатьСхемуВыгрузкиПоДеревуНажатие(Элемент)
        ЭлементыФормы.Панель1.ТекущаяСтраница=ЭлементыФормы.Панель1.Страницы.Дерево;
        Сообщить("Всё! Схема готова!");
    КонецПроцедуры

    Вложения:

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