Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Чтение xml и заполнение реквизита

Чтение xml и заполнение реквизита
Я
   Warior
 
28.07.21 - 16:18
Всем привет! Столкнулся с такой проблемой:

При чтении xml файла не заполняет реквизит "Валюта"

Кусок xml файла:

<?xml version = '1.0' encoding = 'windows-1251'?>
<ROOT>
<QUERY TYPE="1" ACCOUNT="1" NAME="Один">
<INPUT>
<Date>01.01.2012</Date>
<CurrCode>RUB</CurrCode>
<SortBy>0</SortBy>
<Name>Один</Name>у
<UNN>123123123</UNN>
<Version>1</Version>
</INPUT>


Часть кода, где хочу записать значение в реквизит "Валюта"

Если Чтение.Имя = "QUERY" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда    
            СчетОрганизации = Справочники.БанковскиеСчета.НайтиПоРеквизиту("НомерСчета", Чтение.ПолучитьАтрибут("ACCOUNT"));
            Валюта = Справочники.Валюты.НайтиПоКоду(Чтение.ПолучитьАтрибут("CURR"));
            ВыпискаРублевая = Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
                            
        ИначеЕсли Чтение.Имя = "INPUT" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда            
            Пока Чтение.Прочитать() И НЕ (Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "INPUT") Цикл
                Если Чтение.Имя = "CurrCode" Тогда
                    Чтение.Прочитать();
                    Если Чтение.Имя = "#text"  И Чтение.Значение = "RUB"  Тогда
                        Валюта = Справочники.Валюты.НайтиПоКоду("643");
                        
                    КонецЕсли;
                КонецЕсли;

                Если Чтение.Имя = "UNN" Тогда
                    Чтение.Прочитать();
                    Если Чтение.Имя = "#text" Тогда
                        Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", Чтение.Значение);
                    КонецЕсли;
                ИначеЕсли Чтение.Имя = "Date" Тогда
                    Чтение.Прочитать();
                    Если Чтение.Имя = "#text" Тогда
                        ВхДата = Чтение.Значение;
                        ДатаВыписки = Дата(Прав(ВхДата, 4), Сред(ВхДата, 4, 2), Лев(ВхДата, 2));
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        ИначеЕсли Чтение.Имя = "OUTPUT" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда            
            Пока Чтение.Прочитать() И НЕ (Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "OUTPUT") Цикл
                Если Чтение.Имя = "Header7" Тогда
                    Чтение.Прочитать();
                    Если Чтение.Имя = "#text" И Чтение.Значение = "BYN" Тогда
                        Валюта = Справочники.Валюты.НайтиПоКоду("933");
                        ВыпискаРублевая = Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
                    КонецЕсли;
   Beduin
 
1 - 28.07.21 - 16:19
Вы троллите нас сегодня. Второй человек с регистрацией 1 день
                Валюта = Справочники.Валюты.НайтиПоКоду("933");
                 ВыпискаРублевая = Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
   Warior
 
2 - 28.07.21 - 16:22
Так это с условием, что в Header7 у меня стоит "BYN"
   Beduin
 
3 - 28.07.21 - 16:24
(2) А как ты пришел вот к этому.
ВыпискаРублевая = Валюта
Что ты хочешь в этой строчке сделать?
   Warior
 
4 - 28.07.21 - 16:26
Если ВыпискаРублевая Тогда 
                СтрокаВыписки.Приход = Чтение.ПолучитьАтрибут("Credit");
                СтрокаВыписки.Расход = Чтение.ПолучитьАтрибут("Db");
КонецЕсли;
   Beduin
 
5 - 28.07.21 - 16:29
(4) Покажи просто строчку кода, где пишешь в реквизит "Валюта".
   Мультук
 
6 - 28.07.21 - 16:30
(0) Смотрим в XML
<QUERY TYPE="1" ACCOUNT="1" NAME="Один">

Тэг - "QUERY" есть
Атрибут --  ACCOUNT - есть
Где здесь атрибут "CURR" ?



Если Чтение.Имя = "QUERY" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда    
            СчетОрганизации = Справочники.БанковскиеСчета.НайтиПоРеквизиту("НомерСчета", Чтение.ПолучитьАтрибут("ACCOUNT"));
            Валюта = Справочники.Валюты.НайтиПоКоду(Чтение.ПолучитьАтрибут("CURR"));
   Warior
 
7 - 28.07.21 - 16:31
Дело в том, что не во всех xml есть CURR.
   Warior
 
8 - 28.07.21 - 16:31
Если CURR нет, оно выставляет основную валюту, которая указана в Header7
   Warior
 
9 - 28.07.21 - 16:32
А мне нужно, если CURR нет, то проверяло CurrCode из INPUT
   Warior
 
10 - 28.07.21 - 16:33
Если нет CURR и CurrCode, то тогда брало значение из Header7
   Warior
 
11 - 28.07.21 - 16:35
Почему-то пропускает этот интервал:
Если Чтение.Имя = "CurrCode" Тогда
Чтение.Прочитать();
Если Чтение.Имя = "#text"  И Чтение.Значение = "RUB"  Тогда

Валюта = Справочники.Валюты.НайтиПоКоду("643");
ВыпискаРублевая = Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецЕсли;
КонецЕсли;
   Мультук
 
12 - 28.07.21 - 16:41
(11)
   ИначеЕсли Чтение.Имя = "INPUT" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда            
>>> Вот тут если условие сработало, а оно сработало и имя = INPUT то мы идем дальше и запускаем цикл, который

            Пока Чтение.Прочитать() И НЕ (Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "INPUT") Цикл

>>> читает следующий элемент и это уже <Date>. Это не конец элемента, но уже и не "INPUT"
>>> Цикл прекращается на условии И Чтение.Имя = "INPUT"   даже не начавшись.
   Fragster
 
13 - 28.07.21 - 16:49
у меня возникло желание сжечь код из (0), описать XSD схему или пакет XDTO и грузить практически одной строкой (ну ладно, строк больше, по одной на каждое присвоение реквизитов).
   Warior
 
14 - 28.07.21 - 16:58
(12) Получается так?

<code>ИначеЕсли Чтение.Имя = "INPUT" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда            
            Пока Чтение.Прочитать() И НЕ (Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "INPUT") Цикл
                Если Чтение.Имя = "UNN" Тогда
                    Чтение.Прочитать();
                    Если Чтение.Имя = "#text" Тогда

                        Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", Чтение.Значение);
                    КонецЕсли;
                ИначеЕсли Чтение.Имя = "Date" Тогда
                    Чтение.Прочитать();
                    Если Чтение.Имя = "#text" Тогда

                        ВхДата = Чтение.Значение;
                        ДатаВыписки = Дата(Прав(ВхДата, 4), Сред(ВхДата, 4, 2), Лев(ВхДата, 2));
                    КонецЕсли;
                ИначеЕсли Чтение.Имя = "CurrCode" Тогда
                    Чтение.Прочитать();
                    Если Чтение.Имя = "#text"  И Чтение.Значение = "RUB"  Тогда

                        Валюта = Справочники.Валюты.НайтиПоКоду("643");
                        ВыпискаРублевая = Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;</code>
   Вафель
 
15 - 28.07.21 - 17:00
а что бы фабрику не заюзать?
   Warior
 
16 - 28.07.21 - 17:01
Не понял (15)
   Вафель
 
17 - 28.07.21 - 17:01
   Warior
 
18 - 28.07.21 - 17:05
Там слишком просто)
   Warior
 
19 - 28.07.21 - 17:08
Всё получалось, но вот что-то застрял на одном месте.
   Warior
 
20 - 28.07.21 - 17:11
Все заполняет, но вот только значение не хочет заполнять в реквизит.
   Fragster
 
21 - 28.07.21 - 17:12
(19) тебе за количество строк платят, чтоли? или за время работы программы? помню, ускорил один процесс с 6 часов до 12 минут (а потом организационно его вообще устранили) - так меня тот, кто этим занимался сильно не полюбил.
   Warior
 
22 - 28.07.21 - 17:12
Если в xml указан CURR или Header7 то работает все прекрасно, всё подставляет.

Как только хочу прочитать данные из CurrCode, так сразу беда.


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.