Имя: Пароль:
1C
1С v8
Чтение xml и заполнение реквизита
0 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");
                        ВыпискаРублевая = Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
                    КонецЕсли;
1 Beduin
 
28.07.21
16:19
Вы троллите нас сегодня. Второй человек с регистрацией 1 день
                Валюта = Справочники.Валюты.НайтиПоКоду("933");
                 ВыпискаРублевая = Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
2 Warior
 
28.07.21
16:22
Так это с условием, что в Header7 у меня стоит "BYN"
3 Beduin
 
28.07.21
16:24
(2) А как ты пришел вот к этому.
ВыпискаРублевая = Валюта
Что ты хочешь в этой строчке сделать?
4 Warior
 
28.07.21
16:26
Если ВыпискаРублевая Тогда
                СтрокаВыписки.Приход = Чтение.ПолучитьАтрибут("Credit");
                СтрокаВыписки.Расход = Чтение.ПолучитьАтрибут("Db");
КонецЕсли;
5 Beduin
 
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"));
7 Warior
 
28.07.21
16:31
Дело в том, что не во всех xml есть CURR.
8 Warior
 
28.07.21
16:31
Если CURR нет, оно выставляет основную валюту, которая указана в Header7
9 Warior
 
28.07.21
16:32
А мне нужно, если CURR нет, то проверяло CurrCode из INPUT
10 Warior
 
28.07.21
16:33
Если нет CURR и CurrCode, то тогда брало значение из Header7
11 Warior
 
28.07.21
16:35
Почему-то пропускает этот интервал:
Если Чтение.Имя = "CurrCode" Тогда
Чтение.Прочитать();
Если Чтение.Имя = "#text"  И Чтение.Значение = "RUB"  Тогда
Валюта = Справочники.Валюты.НайтиПоКоду("643");
ВыпискаРублевая = Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецЕсли;
КонецЕсли;
12 Мультук
 
гуру
28.07.21
16:41
(11)

   ИначеЕсли Чтение.Имя = "INPUT" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда            
>>> Вот тут если условие сработало, а оно сработало и имя = INPUT то мы идем дальше и запускаем цикл, который

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

>>> читает следующий элемент и это уже <Date>. Это не конец элемента, но уже и не "INPUT"
>>> Цикл прекращается на условии И Чтение.Имя = "INPUT"   даже не начавшись.
13 Fragster
 
гуру
28.07.21
16:49
у меня возникло желание сжечь код из (0), описать XSD схему или пакет XDTO и грузить практически одной строкой (ну ладно, строк больше, по одной на каждое присвоение реквизитов).
14 Warior
 
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
а что бы фабрику не заюзать?
16 Warior
 
28.07.21
17:01
Не понял (15)
17 Вафель
 
28.07.21
17:01
18 Warior
 
28.07.21
17:05
Там слишком просто)
19 Warior
 
28.07.21
17:08
Всё получалось, но вот что-то застрял на одном месте.
20 Warior
 
28.07.21
17:11
Все заполняет, но вот только значение не хочет заполнять в реквизит.
21 Fragster
 
гуру
28.07.21
17:12
(19) тебе за количество строк платят, чтоли? или за время работы программы? помню, ускорил один процесс с 6 часов до 12 минут (а потом организационно его вообще устранили) - так меня тот, кто этим занимался сильно не полюбил.
22 Warior
 
28.07.21
17:12
Если в xml указан CURR или Header7 то работает все прекрасно, всё подставляет.

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