|   |   | 
| 
 | Загрузка курсов валют из 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✎ 23:12 | 
        Как я учил 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) откуда ты взял эту дичь? источник хмээля быстро!     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |