Имя: Пароль:
1C
1С v8
Почему не заполняется табличное поле
0 Вася Чез
 
12.12.13
15:01
Подскажите почему в табличном поле заполняется только одна последняя строка? Что я пропустил?

Загружаю XML в таблицу значений. А таблицу значений вывожу в табличное поле. Заполняется только последняя строка.
Например:
ТЗ = Новый ТаблицаЗначений;
ЭлементыФормы.ТабличноеПоле.Значение = ТЗ;

ТЗ.Колонки.Добавить("Счет");
ТЗ.Колонки.Добавить("Контрагент");

Стр = ТЗ.Добавить();

Для Каждого Стр Из ТЗ Цикл
//Account1 несколько записей в XML
Стр.Счет = Account1;
КонецЦикла;

Для Каждого Стр Из ТЗ Цикл
//Partner1 несколько записей в XML
Стр.Контрагент = Partner1;
КонецЦикла;

Смотрел отладчиком цикл перебирает все строки, но выводит только последнюю.
1 Fragster
 
модератор
12.12.13
15:02
почему добавление строки не в цикле?
2 George Wheels
 
12.12.13
15:04
(1) Тогда будет бесконечный цикл.
3 Вася Чез
 
12.12.13
15:04
(1) будет бесконечный цикл
4 1Сергей
 
12.12.13
15:05
что-то не нашел в коде XML
5 Ёпрст
 
12.12.13
15:06
^)
дык щас всего одна строка в ТЗ..
6 Ёпрст
 
12.12.13
15:07
>>>ТЗ = Новый ТаблицаЗначений; //создали тз
>>Стр = ТЗ.Добавить();//добавили одну строку..

Какие еще строки там ?
:)))
7 George Wheels
 
12.12.13
15:07
Где-то заполнил ТЗ. Потом добавил в неё ещё одну строку. Потом перебор строк этой ТЗ. Че за бред?
8 Вася Чез
 
12.12.13
15:08
(6) а как надо?
9 1Сергей
 
12.12.13
15:10
(8) надо обходить XML и там уже добавлять строки в ТЗ
10 Ёпрст
 
12.12.13
15:11
(8) ну подумай..что ле
У тебя сейчас = добавлена только одна строка в ТЗ.
Откуда ты еще Account1,Partner1 взял - нам отсюда не видно
11 Вася Чез
 
12.12.13
15:12
(7) While Read.Read() do
    NameNode = Read.Name;
        
    If  Read.NodeType = XMLNodeType.StartElement  Then
      If NameNode = "Account"  then
         Read.Read();
         Account1 = Read.Value;
    Для Каждого Стр Из ТЗ Цикл
            Стр.Счет = Account1;
        Сообщить(Стр.Счет);
    КонецЦикла;
        
    ElsIf Read.Name = "Partner" then
        Read.Read();
        Partner1 = Read.Value;
        Для Каждого Стр Из ТЗ Цикл
           Стр.Контрагент = Partner1;
           Сообщить(Стр.Контрагент);
        КонецЦикла;
               EndIf;
       EndIf;
EndDo;

вот с XML
12 AaNnDdRrEeYy
 
12.12.13
15:12
(8) вот так надо, вроде и палка длинная


Для Каждого Стр Из КоллекцияПрочитаннаяизХМЛ Цикл
Стр = ТЗ.Добавить();
//Account1 несколько записей в XML
Стр.Счет = Account1;
//Partner1 несколько записей в XML
Стр.Контрагент = Partner1;
КонецЦикла;
13 AaNnDdRrEeYy
 
12.12.13
15:13
(12) ой первой стр надо другое имя дать, копипаст не проверил

Для Каждого Стр1 Из КоллекцияПрочитаннаяизХМЛ Цикл
Стр = ТЗ.Добавить();
//Account1 несколько записей в XML
Стр.Счет = Стр1.Account1;
//Partner1 несколько записей в XML
Стр.Контрагент = Стр1.Partner1;
КонецЦикла;
14 1Сергей
 
12.12.13
15:14
Перестаньте экономить на буквах - давайте переменным нормальные имена
15 Вася Чез
 
12.12.13
15:20
(13) ушел в бесконечность цикл
16 Ёпрст
 
12.12.13
15:26
ну так хотя бы (хотя хз,чего там у тебя за структура в xml)
    While Read.Read() do
        NameNode = Read.Name;
        If  Read.NodeType = XMLNodeType.StartElement  Then
            If NameNode = "Account"  then
                str =  ТЗ.Add();
                Read.Read();
                str.Счет =  Read.Value;;
            ElsIf Read.Name = "Partner" then
                Read.Read();
                str.Контрагент =  Read.Value;;
            EndIf;
        EndIf;
    EndDo;
17 kvikster
 
12.12.13
15:26
Как то почти так:
ТЗ = Новый ТаблицаЗначений;
While Read.Read() do
    NameNode = Read.Name;
        
    If  Read.NodeType = XMLNodeType.StartElement  Then
Стр = ТЗ.Добавить();
      If NameNode = "Account"  then
         Read.Read();
         Account1 = Read.Value;
            Стр.Счет = Account1;
        Сообщить(Стр.Счет);
    ElsIf Read.Name = "Partner" then
        Read.Read();
        Partner1 = Read.Value;
           Стр.Контрагент = Partner1;
           Сообщить(Стр.Контрагент);
               EndIf;
       EndIf;
EndDo;
18 George Wheels
 
12.12.13
15:28
While Read.Read() do
    
    NameNode = Read.Name;
    
    If  Read.NodeType = XMLNodeType.StartElement  Then
      Read.Read();
      If NameNode = "Account"  then
         Стр = ТЗ.Добавить();
         Стр.Счет = Read.Value;
        
      ElsIf Read.Name = "Partner" then
         Стр.Контрагент = Read.Value;
      EndIf;
    EndIf;
EndDo;
(16) не успел я
19 George Wheels
 
12.12.13
15:29
А если последовательность тегов Account и Partner другая?
20 George Wheels
 
12.12.13
15:36
Пока ЧтениеXML.Прочитать() Цикл
  Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "ИмяТегаЗаписи" Тогда
    Стр = ТЗ.Добавить();
    Пока ЧтениеXML.Прочитать() Цикл
      Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "ИмяТегаЗаписи" Тогда
        Прервать;
      КонецЕсли;

      Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Account" Тогда
        ЧтениеXML.Прочитать();
        Стр.Счет = ЧтениеXML.Значение;
      ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Partner" Тогда
        ЧтениеXML.Прочитать();
        Стр.Счет = ЧтениеXML.Значение;
      КонецЕсли;
    КонецЦикла;
  КонецЕсли;
КонецЦикла;
21 sapphire
 
12.12.13
15:46
Отчего так не любят DOM и XSL/XSLT?
22 Вася Чез
 
12.12.13
16:29
спасибо всем за помощь
23 Вася Чез
 
12.12.13
16:29
(21) скоро полюблю и это
24 Fragster
 
модератор
12.12.13
16:30
(21) потому что надо юзать XDTO :)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший