Имя: Пароль:
1C
 
Обход табличной части XML файла
0 asder117
 
03.07.17
23:22
Доброго времени суток.
Имеем файл такой конфигурации точнее его часть с элементами таблицы.
<табличная часть>
<СтрокаТабличнойЧасти Объект = "Зал" Место = "Место" КлючСтроки="1"/>
<СтрокаТабличнойЧасти Объект = "Зал" Место = "Место2" КлючСтроки="2"/>
<СтрокаТабличнойЧасти Объект = "Зал" Место = "Место3" КлючСтроки="3"/>
</табличная часть>

Все уже перерыл как мог. Первую строку читаю и записываю. дальше никак. нигде не смог найти как можно пройти по всем строкам и занести ее в табличную часть дока. Заранее спасибо.
1 youalex
 
03.07.17
23:26
>Первую строку читаю и записываю. дальше никак

Код покажи
2 Имитация работы
 
03.07.17
23:29
(1) Во ты гонишь. Тебе ж сказали - дальше никак. Это ты сейчас код писать должен, а не ТС.
3 Rassvetniy
 
04.07.17
04:16
<табличная часть> некорректный тег, пробелы в именах элементов не допускаются, уберите пробел и все прочитаете
4 Rassvetniy
 
04.07.17
04:20
запись = новый чтениеXML;
запись.ОткрытьФайл(путьДоФайлов()+"\tch2.xml");
    пока запись.Прочитать() цикл        
        Если запись.ТипУзла = ТипУзлаXML.НачалоЭлемента  тогда
            если запись.Имя = "табличнаячасть" тогда
            иначе
                  если запись.Имя = "СтрокаТабличнойЧасти" тогда
            код1 =     запись.ПолучитьАтрибут("Объект");
            код2 =     запись.ПолучитьАтрибут("Место");
            код3 =     запись.ПолучитьАтрибут("КлючСтроки");
            запись.Прочитать();
            сообщить(код1);
            сообщить(код2);
            сообщить(код3);
                конецЕсли;
            конецЕсли;
            конецЕсли;
        конецЦикла;
5 asder117
 
04.07.17
06:54
(3) знаю просто написал. спасибо за замечание
а за (4) спасибо. я про эту строку " запись.Прочитать();" не знал куда вотнуть...а код (1)
Процедура ЗагрузитьРеквизитыИТабличныеЧасти( ИмяФайлаXML=Неопределено) Экспорт
    объект = Документы.бит_РегистрацияДоговоровАренды.СоздатьДокумент();
    //объект.Дата = ТекущаяДата();
    Если Не ИмяФайлаXML = Неопределено Тогда
        ФайлXML = Новый ЧтениеXML;
        ФайлXML.ОткрытьФайл("D:\test.XML");
        Пока ФайлXML.Прочитать() Цикл
            Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, ФайлXML.Имя);
            КонецЕсли
        КонецЦикла;
    КонецЕсли;
    объект.Записать();
КонецПроцедуры

Процедура ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, знач ИмяУзла)
    ИмяТипа = "";
    ПространствоИмен = "";
    Пока ФайлXML.ПрочитатьАтрибут() Цикл
        Если ФайлXML.Имя = "ИмяТипа" Тогда
            ИмяТипа = ФайлXML.Значение;
        ИначеЕсли ФайлXML.Имя = "URI" Тогда
            ПространствоИмен = ФайлXML.Значение;
        КонецЕсли;
    КонецЦикла;
    Пока ФайлXML.Прочитать() Цикл
        Если ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ФайлXML.Имя = ИмяУзла Тогда
            Возврат;
        ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.Текст Тогда
            ТипОбъекта = ИзXMLТипа(ИмяТипа, ПространствоИмен);
            Если НЕ ТипОбъекта = Неопределено тогда
                Объект = XMLЗначение(ТипОбъекта, ФайлXML.Значение);
            КонецЕсли;
        ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяТекУзла = ФайлXML.Имя;
            /////запишем помещения
            Если ФайлXML.Имя = "ТабличнаяЧастьПомещений" Тогда
                ////
            ФайлXML.Прочитать();
          //  Если ФайлXML.Имя = "СтрокаПомещений" тогда
           // ФайлXML.Прочитать();
           //для сч = 0 по ФайлXML.КоличествоАтрибутов()-1 цикл
            Пока ФайлXML.ПрочитатьАтрибут() Цикл
            //СтрокаОбъекта = Объект.Помещения.Добавить();
            //СтрокаОбъекта[ФайлXML.Имя]=ФайлXML.Значение;
            Если ФайлXML.Имя = "КлючСтроки" тогда
                СтрокаОбъекта = Объект.Помещения.Добавить();
            СтрокаОбъекта.КлючСтроки=Число(ФайлXML.Значение);
        ИначеЕсли ФайлXML.Имя = "Объект" тогда
            СтрокаОбъекта.Объект=Справочники.бит_ОбъектыНедвижимости.НайтиПоНаименованию("Зал А");
        иначе
            СтрокаОбъекта.Помещение=Справочники.бит_Помещения.НайтиПоНаименованию("А-" + получитьЧисло(ФайлXML.Значение) );
            КонецЕсли;
        //КонецЦикла;
        КонецЦикла;
        //КонецЕсли;

        ////
    ИначеЕсли ФайлXML.Имя = "ТабличнаяЧастьПлощадей" Тогда
        ФайлXML.Прочитать();
            Если ФайлXML.Имя = "СтрокаПлощадей" тогда
            //ФайлXML.Прочитать();

            Пока ФайлXML.ПрочитатьАтрибут() Цикл
            //СтрокаОбъекта = Объект.Помещения.Добавить();
            //ФайлXML.ЗаписатьАтрибут("КлючСтроки", Строка(СтрокаТЧ.КлючСтроки));
            //ФайлXML.ЗаписатьАтрибут("ВидПлощади", СтрокаТЧ.ВидПлощади.Наименование);
            //ФайлXML.ЗаписатьАтрибут("Площадь", Строка(СтрокаТЧ.Площадь));
            //ФайлXML.ЗаписатьАтрибут("Ставка", Строка(СтрокаТЧ.Ставка));
            //ФайлXML.ЗаписатьАтрибут("СтавкаСНДС", Строка(СтрокаТЧ.СтавкаСНДС));

            //СтрокаОбъекта[ФайлXML.Имя]=ФайлXML.Значение;
            Если ФайлXML.Имя = "КлючСтроки" тогда
                СтрокаОбъекта = Объект.Площади.Добавить();
            СтрокаОбъекта.КлючСтроки=Число(ФайлXML.Значение);
        ИначеЕсли ФайлXML.Имя = "ВидПлощади" тогда
            СтрокаОбъекта.ВидПлощади=Справочники.бит_ВидыПлощадей.НайтиПоНаименованию(ФайлXML.Значение);
        ИначеЕсли ФайлXML.Имя = "Площадь" тогда
            СтрокаОбъекта.Площадь=Число(ФайлXML.Значение);
        ИначеЕсли ФайлXML.Имя = "Ставка" тогда
            СтрокаОбъекта.Ставка=Число(ФайлXML.Значение);
        иначе
            СтрокаОбъекта.СтавкаСНДС=Число(ФайлXML.Значение);
        КонецЕсли;
            //СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина;
        КонецЦикла;
             СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина;
        КонецЕсли;

            //СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина;
      ИначеЕсли ФайлXML.Имя = "ДатаДоговора" Тогда
            Пока ФайлXML.ПрочитатьАтрибут() Цикл
            Объект.Дата=Дата(ФайлXML.Значение);
            КонецЦикла;

          ///конец записи площадей
        
        //КонецЕсли;
            Иначе
                Если ФайлXML.ПрочитатьАтрибут() Тогда
                    ЗагрузитьОбъектРекурсивно(ФайлXML, Объект[ФайлXML.Значение], ИмяТекУзла);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        ////загрузим табчасть
        //Если ФайлXML.Имя = "ТабличнаяЧастьПомещений" тогда
        //    Пока ФайлXML.ПрочитатьАтрибут() Цикл
        //    СтрокаОбъекта = Объект.Помещения.Добавить();
        //    КонецЦикла;
        //КонецЕсли;
    
//Внутри элемента считываем атрибуты

//КонецЦикла;
    КонецЦикла;
КонецПроцедуры

функция получитьЧисло(Помещение)
RegExp = Новый COMОбъект("VBScript.RegExp");
      

     RegExp.IgnoreCase = Истина; //Игнорировать регистр
      

     RegExp.Global = Истина; //Поиск всех вхождений шаблона
      

     RegExp.MultiLine = Истина; //Многострочный режим
      

    
      

     RegExp.Pattern = "[^0-9]"; // отбор только чисел
      

    
      

     стр=RegExp.Replace(Помещение, "");
      

     //Сообщить(стр);
     //Если стр = "309" тогда
     //    аккк=0       ;
     //    конецесли;
     возврат стр;
     //НужнаяСтрока = СокрЛП(Сред(Помещение, 16, 3));
     //Сообщить(НужнаяСтрока);
     //возврат НужнаяСтрока;
КонецФункции
а хмл часть
<ТабличнаяЧастьПомещений>
        <СтрокаПомещений КлючСтроки="1" Объект="Гастрономия  (29-46)" Помещение="Место 29"/>
        <СтрокаПомещений КлючСтроки="2" Объект="Гастрономия  (29-46)" Помещение="Место 30"/>
        <СтрокаПомещений КлючСтроки="3" Объект="Гастрономия  (10 мест)" Помещение="Место 79"/>
        <СтрокаПомещений КлючСтроки="4" Объект="Гастрономия  (10 мест)" Помещение="Место 80"/>
        <СтрокаПомещений КлючСтроки="5" Объект="Гастрономия  (10 мест)" Помещение="Место 81"/>
    </ТабличнаяЧастьПомещений>
    <ТабличнаяЧастьПлощадей>
        <СтрокаПлощадей КлючСтроки="1" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="22 033,9" СтавкаСНДС="26 000"/>
        <СтрокаПлощадей КлючСтроки="2" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="11 016,95" СтавкаСНДС="13 000"/>
        <СтрокаПлощадей КлючСтроки="3" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="20 338,98" СтавкаСНДС="24 000"/>
        <СтрокаПлощадей КлючСтроки="4" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="10 169,49" СтавкаСНДС="12 000"/>
        <СтрокаПлощадей КлючСтроки="5" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="10 169,49" СтавкаСНДС="12 000"/>
    </ТабличнаяЧастьПлощадей>
6 asder117
 
04.07.17
12:37
Уважаемые интересует обход в цикле
<ТабличнаяЧастьПомещений>
        <СтрокаПомещений КлючСтроки="1" Объект="Гастрономия  (29-46)" Помещение="Место 29"/>
        <СтрокаПомещений КлючСтроки="2" Объект="Гастрономия  (29-46)" Помещение="Место 30"/>
        <СтрокаПомещений КлючСтроки="3" Объект="Гастрономия  (10 мест)" Помещение="Место 79"/>
        <СтрокаПомещений КлючСтроки="4" Объект="Гастрономия  (10 мест)" Помещение="Место 80"/>
        <СтрокаПомещений КлючСтроки="5" Объект="Гастрономия  (10 мест)" Помещение="Место 81"/>
    </ТабличнаяЧастьПомещений>
Всех строк
7 youalex
 
04.07.17
13:13
если файлы не огромные, можно DOM использовать.
вгружаешь и обходишь:

    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку("ТвояСтрокаXML"); //или ЧтениеXML.ОткрытьФайл()
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    
    //дальше обходишь:
    Узлы1 = ДокументDOM.ПолучитьЭлементыПоИмени("ИмяУзла");
    Для каждого Узел Из Узлы1 Цикл
    
    КонецЦикла;
8 asder117
 
04.07.17
13:46
(7) Пока не обромный т.к. тестирую на одном документе.  Если буду выгружать все то будет большой файлик и количество строк. 1 бы мог выгрузить простым обменом, но 2 поля в табличной части надо будет заменять на другие. отлавливать их по имени или атрибутам сложновато
9 asder117
 
04.07.17
13:49
(7) а простыми средствами обойти как можно? в (5) коде я гружу сначала реквизиты (это вообще без проблем) потом ухожду на табличные части и ту ступор. Если делать дом то мне придется периписывать заливку всех реквизитов по-новому, а т.к. времени мало хочется реализовать по-легче
10 asder117
 
04.07.17
19:38
ну если других вариантов нет..буду пробовать (7)
11 PiotrLoginov
 
04.07.17
19:47
(10) Уже довольно давно читаю через XDTO.  Справляется с любыми размерами
12 asder117
 
04.07.17
21:41
(11) Но под него как я понял надо писать еще и схему
13 asder117
 
04.07.17
22:05
(7) попробовал так
Если ФайлXML.Имя = "ТабличнаяЧастьПомещений" Тогда
                ////
                /////Проба работы через ДОМ
                ПостроительДОМ = Новый ПостроительDOM;
                документДОМ = ПостроительДОМ.Прочитать(ФайлXML);
                
                Узлы1 = документДОМ.ПолучитьЭлементыПоИмени("СтрокаПомещений");
                для каждого узел из Узлы1 цикл
                    СтрокаОбъекта = Объект.Помещения.Добавить();
                    
                    СтрокаОбъекта.КлючСтроки=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("КлючСтроки").ЗначениеУзла);
                    СтрокаОбъекта.Объект=Справочники.бит_ОбъектыНедвижимости.НайтиПоНаименованию("Зал А");
                    СтрокаОбъекта.Помещение=Справочники.бит_Помещения.НайтиПоНаименованию("А-" + получитьЧисло(узел.Атрибуты.ПолучитьИменованныйЭлемент("Помещение").ЗначениеУзла) );
                    //а=0;
                КонецЦикла;
                     /////запишем помещения
            ИначеЕсли ФайлXML.Имя = "ТабличнаяЧастьПлощадей" Тогда

        Узлы2 = документДОМ.ПолучитьЭлементыПоИмени("СтрокаПлощадей");
        для каждого узел из Узлы2 цикл
            СтрокаОбъекта1 = Объект.Площади.Добавить();
            
            СтрокаОбъекта1.КлючСтроки=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("КлючСтроки").ЗначениеУзла);
            СтрокаОбъекта.ВидПлощади=Справочники.бит_ВидыПлощадей.НайтиПоНаименованию(узел.Атрибуты.ПолучитьИменованныйЭлемент("ВидПлощади").ЗначениеУзла);
            СтрокаОбъекта.Площадь=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("Площадь").ЗначениеУзла);
            СтрокаОбъекта.Ставка=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("Ставка").ЗначениеУзла);
            СтрокаОбъекта.СтавкаСНДС=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("СтавкаСНДС").ЗначениеУзла);
            СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина;
            //СтрокаОбъекта1.Объект=Справочники.бит_ОбъектыНедвижимости.НайтиПоНаименованию("Зал А");
            //СтрокаОбъекта1.Помещение=Справочники.бит_Помещения.НайтиПоНаименованию("А-" + получитьЧисло(узел.Атрибуты.ПолучитьИменованныйЭлемент("Помещение").ЗначениеУзла) );
            //а=0;
        //КонецЦикла;
        КонецЦикла;

    //ИначеЕсли ФайлXML.Имя = "ТабличнаяЧастьПлощадей" Тогда
    //    ФайлXML.Прочитать();
    //        Если ФайлXML.Имя = "СтрокаПлощадей" тогда
    //        //ФайлXML.Прочитать();

    //        Пока ФайлXML.ПрочитатьАтрибут() Цикл
    //        //СтрокаОбъекта = Объект.Помещения.Добавить();
    //        //ФайлXML.ЗаписатьАтрибут("КлючСтроки", Строка(СтрокаТЧ.КлючСтроки));
    //        //ФайлXML.ЗаписатьАтрибут("ВидПлощади", СтрокаТЧ.ВидПлощади.Наименование);
    //        //ФайлXML.ЗаписатьАтрибут("Площадь", Строка(СтрокаТЧ.Площадь));
    //        //ФайлXML.ЗаписатьАтрибут("Ставка", Строка(СтрокаТЧ.Ставка));
    //        //ФайлXML.ЗаписатьАтрибут("СтавкаСНДС", Строка(СтрокаТЧ.СтавкаСНДС));

    //        //СтрокаОбъекта[ФайлXML.Имя]=ФайлXML.Значение;
    //        Если ФайлXML.Имя = "КлючСтроки" тогда
    //            СтрокаОбъекта = Объект.Площади.Добавить();
    //        СтрокаОбъекта.КлючСтроки=Число(ФайлXML.Значение);
    //    ИначеЕсли ФайлXML.Имя = "ВидПлощади" тогда
    //        СтрокаОбъекта.ВидПлощади=Справочники.бит_ВидыПлощадей.НайтиПоНаименованию(ФайлXML.Значение);
    //    ИначеЕсли ФайлXML.Имя = "Площадь" тогда
    //        СтрокаОбъекта.Площадь=Число(ФайлXML.Значение);
    //    ИначеЕсли ФайлXML.Имя = "Ставка" тогда
    //        СтрокаОбъекта.Ставка=Число(ФайлXML.Значение);
    //    иначе
    //        СтрокаОбъекта.СтавкаСНДС=Число(ФайлXML.Значение);
    //    КонецЕсли;
    //        //СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина;
    //    КонецЦикла;
    //         СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина;
    //    КонецЕсли;

            //СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина;
      ИначеЕсли ФайлXML.Имя = "ДатаДоговора" Тогда
            Пока ФайлXML.ПрочитатьАтрибут() Цикл
            Объект.Дата=Дата(ФайлXML.Значение);
            КонецЦикла;

          ///конец записи площадей
        
        //КонецЕсли;
            Иначе
                Если ФайлXML.ПрочитатьАтрибут() Тогда
                    ЗагрузитьОбъектРекурсивно(ФайлXML, Объект[ФайлXML.Значение], ИмяТекУзла);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
Одну табличную часть читает вторую нет. в чем проблема понять не могу