Имя: Пароль:
1C
1С v8
Не верно считываются данные из XML-документа.
0 america2013
 
25.10.13
14:14
Рад приветствовать вас, уважаемые форумчане!!!

Прошу помочь с такой проблемой:

1) имею XML-файл (пример, формировал программно ранее его сам):
<?xml version="1.0" encoding="UTF-8"?>
-<Корневой> <Элемент ПроцентСкидки="0" СуммаСкидки="0" СуммаВсего="600" СуммаНДС="64.29" КодСтавкиНДС="00000009" Сумма="600" Цена="200" Количество="3" КодНоменклатуры="99005724" ДатаЗакрытия="2013-08-28T23:50:00" Номер="А010000591"/> <Элемент ПроцентСкидки="0" СуммаСкидки="0" СуммаВсего="2400" СуммаНДС="257.14" КодСтавкиНДС="00000009" Сумма="2400" Цена="150" Количество="16" КодНоменклатуры="99005725" ДатаЗакрытия="2013-08-28T23:50:00" Номер="А010000591"/> <Элемент ПроцентСкидки="0" СуммаСкидки="0" ...

2) программно пытаюсь считать этот файл таким способом:
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(Путь + ИмяФайлаДляЗагрузки);
    СЗ   = Новый СписокЗначений;
    //НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    
    Пока ЧтениеXML.Прочитать() Цикл
        
    // Реквизит
        ЧтениеXML.ПрочитатьАтрибут(); Атрибут = ЧтениеXML.Значение;
        Если ЧтениеXML.Имя = "Номер" Тогда СЗ.Добавить(ЧтениеXML.Значение); КонецЕсли;
        // Реквизит
        ЧтениеXML.ПрочитатьАтрибут(); Атрибут = ЧтениеXML.Значение;
        Если ЧтениеXML.Имя = "ДатаЗакрытия" Тогда СЗ.Добавить(ЧтениеXML.Значение); КонецЕсли;
        // Реквизит
        ЧтениеXML.ПрочитатьАтрибут(); Атрибут = ЧтениеXML.Значение;
        Если ЧтениеXML.Имя = "КодНоменклатуры" Тогда СЗ.Добавить(ЧтениеXML.Значение); КонецЕсли;
        // Реквизит
        ЧтениеXML.ПрочитатьАтрибут(); Атрибут = ЧтениеXML.Значение;
        Если ЧтениеXML.Имя = "Количество" Тогда СЗ.Добавить(ЧтениеXML.Значение); КонецЕсли;
...
        
        Если СЗ.Количество() = 11 Тогда
            СоздатьДокументРеализацияТоваровИзЗакрытияСмены(СЗ);
            СЗ.Очистить();
        КонецЕсли;
        
        ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение = ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение + 1;
    КонецЦикла;

3) при таком считывании при первом прохождении цикла получаю (атрибут КодНоменклатуры) ЧтениеXML.Значение = "99005724"

4) при следующем выполнении цикла, снова получаю это же значение (получаю (атрибут КодНоменклатуры) ЧтениеXML.Значение = "99005724"), хотя в самом файле такое значение повторяется только единожды

Итог проблемы: в список значений (СЗ) попадают задвоенные значения.
1 Ёпрст
 
25.10.13
14:17
Как бэ, код в топку
2 america2013
 
25.10.13
14:21
(1) Возможно код и не верный, по каким-то критериям и если не сложно, то прошу, приведите более рациональное решение.

Но почему же при чтении данные считываются по 2 раза?
3 Ёпрст
 
25.10.13
14:21
Пока ЧтениеXML.Прочитать() Цикл
   Если ЧтениеXML.КоличествоАтрибутов()>0 Цикл
      Пока ЧтениеXML.ПрочитатьАтрибут()Цикл
          <имеем атрибуты>
      КонецЦикла;
   КонецЕсли;
  ......
4 america2013
 
25.10.13
14:31
(3) Да, предложенный вариант значительно упросил код. Спасибо! Но проблема осталась: ЧтениеXML.Значение считывается по 2 раз, прежде чем перейти к следующему.
5 Зойч
 
25.10.13
14:32
Там открытие тега и заккрытие
6 america2013
 
25.10.13
14:36
(5) Пожалуйста, поясните, что значит открытие-закрытие?

На данный момент код имеет вид:

    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(Путь + ИмяФайлаДляЗагрузки);
    СЗ   = Новый СписокЗначений;
    //НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    
    Пока ЧтениеXML.Прочитать() Цикл
        
        Пока ЧтениеXML.ПрочитатьАтрибут()Цикл
            СЗ.Добавить(ЧтениеXML.Значение); //Здесь значение считывается 2 раза : (((
        КонецЦикла;
        
        Если СЗ.Количество() = 11 Тогда
            СоздатьДокументРеализацияТоваровИзЗакрытияСмены(СЗ);
            СЗ.Очистить();
        КонецЕсли;
        
        ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение = ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение + 1;
    КонецЦикла;
7 Ёпрст
 
25.10.13
14:40
Зачетный код... и толку от списка значения такого ?
Мот того, структуру лучше завести, или соответствие ?
8 Ёпрст
 
25.10.13
14:41
как ты потом из списка своего получишь значения ?
Они же в разнобой могут быть.. а не так, как ты ожидаешь.
9 Ёпрст
 
25.10.13
14:43
ПараметрыОбработки = Новый Соответствие;Пока ЧтениеXML.Прочитать() Цикл
        
        Пока ЧтениеXML.ПрочитатьАтрибут()Цикл
            ПараметрыОбработки.Вставить(ЧтениеXML.Имя,ЧтениеXML.Значение);
        КонецЦикла;
10 Serginio1
 
25.10.13
14:48
Загрузи в тз через v8: Веб-сервис и передача-прием XML и посмотри что у тебя получается
11 america2013
 
25.10.13
14:59
(8) Данные из списка (СЗ) потом попадают в разные места. Структура и соответствие использовать можно, но мне привычнее здесь списком. Данные однотипные и в порядке правильности попадания в список нету. Суть не важно, как я храню потом данные, проблема в том, как считать данные...

(9) Испробовал ваш метод:
    ПараметрыОбработки = Новый Соответствие;
    Пока ЧтениеXML.Прочитать() Цикл
    
        Пока ЧтениеXML.ПрочитатьАтрибут()Цикл
            ПараметрыОбработки.Вставить(ЧтениеXML.Имя,ЧтениеXML.Значение); //Значения так же считываются 2 раза (((((((((
        КонецЦикла;
        
    КонецЦикла;

(10) Сложно с наскока такое решить. Попробую проще решить проблему.
12 Ёпрст
 
25.10.13
15:04
(11) Отладчик в рукти и вперёд..
Нам отсюда не видно, что есть в твоём понимании "значения так же считываются 2 раза "
13 Serginio1
 
25.10.13
15:19
(10) Там подаешь строку на вход и у тебя создается ТаблицаЗначений. В отладчике смотришь что у тебя получилось.
14 america2013
 
25.10.13
15:21
(12) и так думаю (13) тоже: именно в отладчике я и вижу, что при первом проходе цикла ЧтениеXML.Значение = "99005724", и при втором проходе этого же значения в расчете отображается "99005724".
15 Ёпрст
 
25.10.13
15:30
(14) дай исходный xml
16 Ёпрст
 
25.10.13
15:31
И у какого именно атрибута ты смотришь значение ?????
17 america2013
 
25.10.13
15:33
(15) Вот часть:

<?xml version="1.0" encoding="UTF-8"?>
-<Корневой> <Элемент ПроцентСкидки="0" СуммаСкидки="0" СуммаВсего="600" СуммаНДС="64.29" КодСтавкиНДС="00000009" Сумма="600" Цена="200" Количество="3" КодНоменклатуры="99005724" ДатаЗакрытия="2013-08-28T23:50:00" Номер="А010000591"/> <Элемент ПроцентСкидки="0" СуммаСкидки="0" СуммаВсего="2400" СуммаНДС="257.14" КодСтавкиНДС="00000009" Сумма="2400" Цена="150" Количество="16" КодНоменклатуры="99005725" ДатаЗакрытия="2013-08-28T23:50:00" Номер="А010000591"/> <Элемент ПроцентСкидки="0" СуммаСкидки="0" ...


(16) КодНоменклатуры
18 Serginio1
 
25.10.13
15:33
(14) То есть в Таблице значений в узле появилось две одинаковых строки с одинаковыми значениями?

Ты использовал (10)?
19 america2013
 
25.10.13
15:35
(18) Выходит, что так... хотя в самом файле такое значение повторяется только 1 раз.

Пример в (10) ещё не использовал.
20 Ёпрст
 
25.10.13
15:37
(17) и че, для разных ЭЛЕМЕНТОВ в твоём xml не может быть одинакового кода номенклатуры ???
:)))))))))))))))))))))))))))))))))))))))))))))))))))
21 Ёпрст
 
25.10.13
15:39
и судя по коду, у тебя 1 документ - один товар всегда..
И чего, в разных документах не может быть этой же номенклатуры ?
22 america2013
 
25.10.13
15:43
(21) Нет, в одном документе может быть несколько товаров. И товары в документах могут повторяться, но как я понял, каждый Элемент считывается по 2 раза, один и тот же номер документа, одна и та же сумма. Если Элементы считываются по порядку, то следующем шагом цикла, я рассчитываю увидеть следующий код номенклатуры.
23 George Wheels
 
25.10.13
15:58
При первом ЧтениеXML.Прочитать() читается начало элемента, при втором ЧтениеXML.Прочитать() читается конец элемента, а атрибуты его-же.

В начале цикла сделай проверку:
Пока ЧтениеXML.Прочитать() Цикл
  Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
    Продолжить;
  КонецЕсли;
24 Ёпрст
 
25.10.13
16:04
(22) У тебя это не так.
25 america2013
 
25.10.13
16:11
(24) Великодушно прошу просить моё не знание этого формата и методов с ним работать, но мне не понятно, что именно там не так?
26 Serginio1
 
25.10.13
16:16
(10) Ну так используй уже испытанное.
Модифицируй пример из 10

Функция ПрочитатьXMLСтрока(Путь,ИмяФайлаДляЗагрузки)
    Чтение= новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(Путь + ИмяФайлаДляЗагрузки);
и посмотри, что у тебя получается
27 america2013
 
25.10.13
16:17
(23) Я МЫСЛЕННО НОШУ ВАС НА РУКАХ!!! Ваш метод сделал то, что мне нужно! И что должно быть наверное характерно, это то, что весь процесс стал работать в 2 раза быстрее.
В итоге получилось в моем странном коде:

    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(Путь + ИмяФайлаДляЗагрузки);
    СЗ   = Новый СписокЗначений;
    //НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    
    Пока ЧтениеXML.Прочитать() Цикл
        
        Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
            Продолжить;
        КонецЕсли;
        
        Пока ЧтениеXML.ПрочитатьАтрибут()Цикл
            СЗ.Добавить(ЧтениеXML.Значение);
        КонецЦикла;
        
        Если СЗ.Количество() = 11 Тогда
            СоздатьДокументРеализацияТоваровИзЗакрытияСмены(СЗ);
            СЗ.Очистить();
        КонецЕсли;
        
        ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение = ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение + 1;
    КонецЦикла;
28 america2013
 
25.10.13
16:17
Благодарю всех участников за помощь!!!
29 George Wheels
 
25.10.13
16:18
(28) На здоровье.
30 Serginio1
 
25.10.13
16:19
(28) Да а стоило всего применить код из 10
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой