![]() |
![]() |
![]() |
|
Загрузка курсов валют из XML dedmoroz777, Волшебник, d4rkmesa, Timon1405, Смотрящий от 1С, Гость из Мариуполя, Олдж, craxx, Asmody, MWWRuza, 1snik_d, WB789, denk32, МаленькийВопросик, ivanov-i-i, Amra, maxab72, youalex, dyevgeniy, VladZ, ProxyInspector, Дима1С-ник, vicof, arsik, Чеширский, sxfoxi, r_p, , Климов Сергей, Gattuso, phabeZ, orakool, nick86, runuts, stix2010, yanikolay, timurhv, obs191, АгентБезопаснойНацио, scanduta, Fedor-1971
| ☑ | ||
---|---|---|---|---|
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) откуда ты взял эту дичь? источник хмээля быстро!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |