|
xml в регистр сведений 1С
orakool, nick86, runuts, stix2010, yanikolay, timurhv, obs191, АгентБезопаснойНацио, scanduta, Fedor-1971, Timon1405, Дима1С-ник, Mankubus, Chameleon1980, trad, Федя Тяпкин, vis, Bad_Aleks, Sneer, Vstur, Asmody, Михаил Козлов, _Batoo, LienXo, Бычье сердце, Калиостро, Волшебник, takefive, alexela, 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, 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) Ух ты, спасибо Вам.....буду разбираться
|
|