![]() |
![]() |
|
xml в регистр сведений 1С scanduta, Fedor-1971, Timon1405, Дима1С-ник, Mankubus, Chameleon1980, trad, Федя Тяпкин, vis, Bad_Aleks, Sneer, Vstur, Asmody, Михаил Козлов, _Batoo, LienXo, Бычье сердце, Калиостро, Волшебник, takefive, alexela, yanikolay, maxab72, KJlag, breezee, LuckyStar, rsv, Franchiser, youalex, Redkiy, crotnn, dedmoroz777, formista2000, arsik, John D, ldo6, Многолетний Апельсин, ndrv, makfromkz, Лирик, Fish, vbus, kir-g, DimR_71, Terrixus, vyaz, DimVad, Андрюха, sanyaka, Климов Сергей, tan76, H A D G E H O G s, d4rkmesa, abfm, программистище, Fregat, nick86, El_Duke, NorthWind, mmg, Tefal, Михаил_, Ногаминебить, Hawk_1c, Elf_80_lvl, Ненавижу 1С, Гипервизор, DemonShinji2, SeriyP, p-soft, b_ru, Prog_man, lEvGl, bmitkin, Andy13, ads55, DiMel_77, Kongo2019, Builder, denk32, Has, Djelf
| ☑ | ||
---|---|---|---|---|
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
✎
11:48
|
(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) Ух ты, спасибо Вам.....буду разбираться
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |