Имя: Пароль:
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, так сразу беда.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший