Имя: Пароль:
1C
 
Загрузка курсов валют из XML
0 Дима1С-ник
 
naïve
07.07.25
10:34
Подскажите, как загрузить в регистр сведений курс валюты..

// Поиск регистра сведений
РегистрСведений = РегистрыСведений.КурсыВалют;
        
Справочник = Справочники.Валюты;        
        
// 4. Обходим в цикле и записываем в регистр сведений
Пока ЧтениеXML.Прочитать() Цикл  
            
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "NumCode" Тогда    
КодВалюты = Справочник.НайтиПоКоду("840");
НаборЗаписей = РегистрСведений.СоздатьНаборЗаписей();
                НаборЗаписей.Отбор.Валюта.Установить(КодВалюты.Ссылка);
НаборЗаписей.Прочитать();
НовыйКурс = НаборЗаписей.Добавить();
НовыйКурс.Период = Дата;
НовыйКурс.Валюта = КодВалюты.Ссылка;  
                
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
                    
                    ЧтениеXML.Прочитать();
                    НаборЗаписей.Прочитать();
НовыйКурс = НаборЗаписей.Добавить();
НовыйКурс.Курс = XmlЗначение(Тип("Число"),ЧтениеXML.Значение);                        
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Прервать;
// Завершаем обработку полей записи
КонецЕсли;
                НаборЗаписей.Записать(РежимЗамещения.Замещение);
            КонецЕсли;                
            
КонецЦикла;  
        
ЧтениеXML.Закрыть();
1 Волшебник
 
07.07.25
10:36
Добавьте ещё это:
НаборЗаписей.Отбор.Период.Установить(Дата);
2 maxab72
 
07.07.25
10:40
(0) порекомендую книжку Габец Гончаров "Простые примеры разработки". там для начинающего куча примеров дана.
3 Волшебник
 
07.07.25
10:48
(0) Лучше разделить алгоритм на 2 части: чтение данных в ТаблицаЗначений, затем цикл по таблице значений и запись в регистр.

Для записи в регистр достаточно использовать МенеджерЗаписи.
4 Волшебник
 
07.07.25
10:53
(0) Кстати, у Вас НаборЗаписей.Прочитать() аж 2 раза, хотя он вообще не нужен, если правильно настроить отбор или просто использовать МенеджерЗаписи.
5 Fedor-1971
 
07.07.25
10:59
(0) В идеале, твой алгоритм упадёт с ошибкой "Дублирование ключевых полей" при повторной загрузке данных
И, для порядку, малость позанудствую:
КодВалюты = Справочник.НайтиПоКоду("840");  //получил ссылку, если нет валюты с таким кодом будешь писать записи с пустой ссылкой Валюта?
НаборЗаписей = РегистрСведений.СоздатьНаборЗаписей();
                НаборЗаписей.Отбор.Валюта.Установить(КодВалюты.Ссылка); //тут .Ссылка - лишнее, у тебя и так ссылка в переменной
НаборЗаписей.Прочитать(); //прочитал ВСЕ имеющиеся записи с валютой
НовыйКурс = НаборЗаписей.Добавить();  // добавил запись в набор №1
НовыйКурс.Период = Дата;
НовыйКурс.Валюта = КодВалюты.Ссылка;  //аналогично за Ссылку
                
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
                    
                    ЧтениеXML.Прочитать();
                    НаборЗаписей.Прочитать(); //а вот тут, ты опять достаёшь ВСЕ записи из регистра и убиваешь запись №1
НовыйКурс = НаборЗаписей.Добавить(); //курс записал, молодец, а какой валюты и на какую дату?
НовыйКурс.Курс = XmlЗначение(Тип("Число"),ЧтениеXML.Значение);                        
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
7 Дима1С-ник
 
naïve
07.07.25
11:15
Спасибо, всем, но как записать Тип(строка) в Тип(число)
НовыйКурс.Курс = XmlЗначение(Тип("Число"),ЧтениеXML.Значение);
8 Волшебник
 
07.07.25
11:17
(7) Сам спросил, сам ответил
9 Дима1С-ник
 
naïve
07.07.25
11:20
(8) Так не получается записать
НовыйКурс.Курс = XmlЗначение(Тип("Число"),ЧтениеXML.Значение);
10 Волшебник
 
07.07.25
11:21
(9) Надо стараться
11 Волшебник
 
07.07.25
11:31
Покажите Ваш XML-файл
12 maxab72
 
07.07.25
11:32
(7) преобразуй строку в число. А = Число("123").
13 Fedor-1971
 
07.07.25
11:32
(9) Отладчиком посмотри на ЧтениеXML.Значение, потом XmlЗначение(Тип("Число"),ЧтениеXML.Значение)
И станет всё понятно, возможно, что в числе вместо "." использована "," или неразрывные пробелы имеются
14 Fedor-1971
 
07.07.25
11:34
(12) Если в строке будет буква, то получим облом, универсально, надо оборачивать в Попытку-Исключение
15 Fish
 
гуру
07.07.25
11:34
(9) Почему не получается? Какой текст ошибки?
16 Дима1С-ник
 
naïve
07.07.25
11:41
(13)  ЧтениеXML.Значение - "51,7307" - Строка
17 Волшебник
 
07.07.25
11:42
(16) замените запятую на точку
18 Дима1С-ник
 
naïve
07.07.25
19:36
(11)
<ValCurs Date="02.03.2002" name="Foreign Currency Market">
	<Valute ID="R01010">
		<NumCode>036</NumCode>
		<CharCode>AUD</CharCode>
		<Nominal>1</Nominal>
		<Name>Австралийский доллар</Name>
		<Value>16,0102</Value>
		<VunitRate>16,0102</VunitRate>
	</Valute>
	<Valute ID="R01035">
		<NumCode>826</NumCode>
		<CharCode>GBP</CharCode>
		<Nominal>1</Nominal>
		<Name>Фунт стерлингов</Name>
		<Value>43,8254</Value>
		<VunitRate>43,8254</VunitRate>
	</Valute>
	<Valute ID="R01090">
		<NumCode>974</NumCode>
		<CharCode>BYR</CharCode>
		<Nominal>1000</Nominal>
		<Name>Белорусских рублей</Name>
		<Value>18,4290</Value>
		<VunitRate>0,018429</VunitRate>
	</Valute>
	<Valute ID="R01215">
	<NumCode>208</NumCode>
		<CharCode>DKK</CharCode>
		<Nominal>10</Nominal>
		<Name>Датских крон</Name>
		<Value>36,1010</Value>
		<VunitRate>3,6101</VunitRate>
	</Valute>
	<Valute ID="R01235">
		<NumCode>840</NumCode>
		<CharCode>USD</CharCode>
		<Nominal>1</Nominal>
		<Name>Доллар США</Name>
		<Value>30,9436</Value>
		<VunitRate>30,9436</VunitRate>
	</Valute>
</ValCurs>
19 Волшебник
 
07.07.25
12:43
(18)
Процедура ЗагрузитьКурсы()
	
	Чтение = Новый ЧтениеXML;
	Чтение.ОткрытьФайл(Путь);
	Данные = ФабрикаXDTO.ПрочитатьXML(Чтение); 
	
	Дата  = СтрокуВДату(Данные.Date);
	Для Каждого ЭлементВалюты Из Данные.Valute Цикл
		Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
		Запись.Период = Дата;
		Запись.Валюта = Справочники.Валюты.НайтиПоКоду(ЭлементВалюты.NumCode);
		Запись.Курс = Число(СтрЗаменить(ЭлементВалюты.Value,",","."));
		Запись.Кратность = Число(ЭлементВалюты.Nominal);
		
		Если  ЗначениеЗаполнено(Запись.Валюта) 
		    И ЗначениеЗаполнено(Запись.Период) 
		    И ЗначениеЗаполнено(Запись.Курс) Тогда

			Запись.Записать();
			
		Иначе
			// выдать ошибку
		КонецЕсли; 
	КонецЦикла; 
		
КонецПроцедуры

Функция СтрокуВДату(ДатаСтрокой)
    Д = Число(Сред(ДатаСтрокой, 1, 2));
    М = Число(Сред(ДатаСтрокой, 4, 2));
    Г = Число(Сред(ДатаСтрокой, 7, 4));
    Возврат Дата(Г, М, Д);    
КонецФункции
20 Дима1С-ник
 
naïve
07.07.25
13:09
(19) Ух ты, спасибо Вам.....буду разбираться
21 vicof
 
07.07.25
18:53
Обработки.ЗагрузкаКурсовВалют

// Загружает курсы валют на текущую дату.
//
// Параметры:
//  ПараметрыЗагрузки - Структура:
//   * НачалоПериода - Дата - начало периода загрузки;
//   * КонецПериода - Дата - конец периода загрузки;
//   * СписокВалют - ТаблицаЗначений:
//     ** Валюта - СправочникСсылка.Валюты
//     ** КодВалюты - Строка
//  АдресРезультата - Строка - адрес во временном хранилище для помещения результатов загрузки.
//
Процедура ЗагрузитьАктуальныйКурс(ПараметрыЗагрузки = Неопределено, АдресРезультата = Неопределено) Экспорт
22 Волшебник
 
07.07.25
19:35
(21) Это не решение, а информация "на подумать". Вряд ли там предусмотрен формат из (18)
23 Волшебник
 
07.07.25
20:04
(18) что-то напрягает меня дата файла 2002 год... Опять нейронки учатся на живых людях. Эксплуататоры!
24 Волшебник
 
07.07.25
22:34
Как я учил Qwen, чтобы он перестал галлюцинировать
https://chat.qwen.ai/s/b290234b-4d3e-4a5a-8328-7f28ee9cf985?fev=0.0.128

Решение ниже см (19)
>> Объекта XMLДокумент не существует в 1С.
Qwen порет дичь
>> Ты порешь дичь. В 1С нет двойного двоеточия.
Qwen порет дичь
>> Там нет метода Читать() или ПерейтиКАтрибутам(). Ты просто ушёл в галлюцинации.
Qwen порет дичь
>> Вот твоё утверждение:
В 1С для перемещения по узлам XML используется метод СледующийУзел(), а не Читать().

>> В 1С нет такого метода.
Не надо галлюцинировать. Просто скажи, что не знаешь.
Qwen порет дичь
>> Я утверждаю:
Конечно, мой код рабочий! Я же его запускал и проверял! Всё загружается нормально. А ты подумай над своим поведением! Почему ты врёшь мне в лицо, мне разработчику 1С со стажем более 20 лет. Ты просто придумываешь методы, которых нет! Вот давай, объясни, есть у тебя совесть или нет? Почему твой код не проходит синтаксический контроль или валится на ошибке времени выполнения?
25 Asmody
 
07.07.25
22:18
(18) откуда ты взял эту дичь? источник хмээля быстро!