Имя: Пароль:
1C
 
Загрузка курсов с РБК
0 АЛьФ
 
17.03.22
09:11
Пытался спросить в старой теме, но не заметил, что она утопленная. Спрашиваю в отдельной.
Второй день уже с РБК в начале дня грузятся курсы вчерашнего дня. Это какие-то новые правила или есть место, откуда можно актуальные курсы загрузкить?
1 Asmody
 
17.03.22
09:17
2 Сукпун
 
17.03.22
09:17
так  сейчас курс ЦБ устанвливает  не утром  , а в 17-00
3 АЛьФ
 
17.03.22
09:20
2(1) Преогроменное спасибочки.
4 Плехоть
 
17.03.22
09:22
Убрал в БП загрузку с альтернативного сервера - подгрузились корректные курсы
5 Alexor
 
17.03.22
09:26
(4) а конкретно где это указывается?
6 Плехоть
 
17.03.22
09:28
(5) Я через константs включал/выключал. "Использовать альтернативный сервер для загрузки курсов валют (Константы)". В интерфейсе не нашел )
7 Alexor
 
17.03.22
09:33
(6) спасибо. А то как раз сейчас позвонили
8 Быдло замкадное
 
17.03.22
09:41
в УПП такая же проблема.
Вручную обработкой, если выбрать 1С то грузится нормально.
Придется что-то переписывать.. маразм
9 Быдло замкадное
 
17.03.22
09:45
(2) в 17:00 они устанавливают курс на ЗАВТРА.
А 2 дня подряд курс с РБК грузится сегодня ВЧЕРАШНИЙ.
Вобщем это ошибка
10 Быдло замкадное
 
17.03.22
09:49
есть у кого код загрузки с СБРФ?
11 АЛьФ
 
17.03.22
15:11
Функция ЗагрузитьУзлыXMLвСЗ(Корень, Узлы)
    
    сзРезультат     = СоздатьОбъект("СписокЗначений");
    ПрефИмениУзла    = "";
    АтрибутыУзла    = Корень.Attributes;
    Если АтрибутыУзла.length <> 0 Тогда
        Для атр = 0 По АтрибутыУзла.length - 1 Цикл
            узелАтрибута    = АтрибутыУзла.item(атр);
            ИмяАтрибута        = узелАтрибута.nodename;
            сзРезультат.ДобавитьЗначение(узелАтрибута.text, ИмяАтрибута);
        КонецЦикла;
    КонецЕсли;
    Для инд = 0 По Узлы.length - 1 Цикл
        узел            = Узлы.item(инд);
        ИмяУзла            = узел.nodename;
        ПодчиненныеУзлы    = узел.childNodes;
        
        Если ПодчиненныеУзлы.length = 0 Тогда
            Если ИмяУзла = "#text" Тогда
                сзРезультат = узел.text;
            Иначе
                сзРезультат.ДобавитьЗначение(узел.text, ИмяУзла);
            КонецЕсли;
        Иначе
            сзРезультат.ДобавитьЗначение(ЗагрузитьУзлыXMLвСЗ(узел, ПодчиненныеУзлы), ИмяУзла);
        КонецЕсли;
    КонецЦикла;
    
    Возврат сзРезультат;

КонецФункции // ЗагрузитьУзлыXMLвСЗ

Функция ЗагрузитьXMLвСЗ(текстXML)
    
    XMLDOM = СоздатьОбъект("Microsoft.XMLDOM");
    XMLDOM.loadXML(текстXML);
    
    Возврат ЗагрузитьУзлыXMLвСЗ(XMLDOM.DocumentElement, XMLDOM.DocumentElement.childNodes);
    
КонецФункции // ЗагрузитьXMLвСЗ

Функция ПреобразоватьОтвет(ОтветСервера)
    тзРезультат = глСоздатьТаблицу("Дата,Курс,Кратность");
    сзСтруктураОтвета = ЗагрузитьXMLвСЗ(ОтветСервера);
    Для инд = 1 По сзСтруктураОтвета.РазмерСписка() Цикл
        ИмяУзла = "";
        ЭлементОтвета = сзСтруктураОтвета.ПолучитьЗначение(инд, ИмяУзла);
        Если ИмяУзла <> "Record" Тогда
            Продолжить;
        КонецЕсли;
        тзРезультат.НоваяСтрока();
        тзРезультат.Дата        = Дата(ЭлементОтвета.Получить("Date"));
        тзРезультат.Курс        = Число(СтрЗаменить(ЭлементОтвета.Получить("Value"), ",", "."));
        тзРезультат.Кратность    = Число(СтрЗаменить(ЭлементОтвета.Получить("Nominal"), ",", "."));
    КонецЦикла;
    Возврат тзРезультат;
КонецФункции // ПреобразоватьОтвет

Функция ФорматДаты(дат)
    Возврат СтрЗаменить(Формат(дат,"ДДДММГГГГ"), ".", "/");
КонецФункции // ФорматДаты

Процедура Загрузить(НачальнаяДатаЗагрузки)
    Адрес = "https://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=" + ФорматДаты(НачальнаяДатаЗагрузки) + "&date_req2=" + ФорматДаты(ТекущаяДата()) + "&VAL_NM_RQ=";
    СписокВалют = ЗагрузитьСписокВалют();
    Для индВалюты = 1 По СписокВалют.РазмерСписка() Цикл
        Если СписокВалют.Пометка(индВалюты) = 0 Тогда
            Продолжить;
        КонецЕсли;    
        
        ТекущаяВалюта = СписокВалют.ПолучитьЗначение(индВалюты);
        Сообщить("Загрузка курсов валюты: " + ТекущаяВалюта);
        
        Если СокрЛП(ТекущаяВалюта.Код) = "978" Тогда
            ТекстЗапроса = Адрес + "R01239";
        ИначеЕсли СокрЛП(ТекущаяВалюта.Код) = "840" Тогда
            ТекстЗапроса = Адрес + "R01235";
        ИначеЕсли СокрЛП(ТекущаяВалюта.Код) = "826" Тогда
            ТекстЗапроса = Адрес + "R01035";
        Иначе
            Сообщить("Не удалось определить идентификатор валюты");
            Продолжить;
        КонецЕсли;
        Сообщить(ТекстЗапроса);
        
        ОтветСервера    = ПолучитьКакСтроку(ТекстЗапроса);
        тзКурсыВалюты    = ПреобразоватьОтвет(ОтветСервера);
        
        Курсы = СоздатьОбъект("Периодический");
        Курсы.ИспользоватьОбъект("Курс",ТекущаяВалюта);
        КурсыВнутр = СоздатьОбъект("Периодический");
        КурсыВнутр.ИспользоватьОбъект("КурсВнутренний",ТекущаяВалюта);
        Кратности = СоздатьОбъект("Периодический");
        Кратности.ИспользоватьОбъект("Кратность",ТекущаяВалюта);
        
        тзКурсыВалюты.ВыбратьСтроки();
        Пока тзКурсыВалюты.ПолучитьСтроку() = 1 Цикл
            Курсы.ВыбратьЗначения(тзКурсыВалюты.Дата,тзКурсыВалюты.Дата);
            Курсы.ПолучитьЗначение();
            Если тзКурсыВалюты.Курс <> Курсы.Значение Тогда
                Если (тзКурсыВалюты.Курс <> Курсы.Значение) и (Курсы.Значение <> 0) Тогда
                    ТекстПисьма = ТекстПисьма + "
                    |" + ТекущаяВалюта + " за " + тзКурсыВалюты.Дата + ": " + Курсы.Значение + " >> " + тзКурсыВалюты.Курс;
                    Продолжить;
                КонецЕсли;
                Курсы.ДатаЗнач = тзКурсыВалюты.Дата;
                Курсы.Значение = тзКурсыВалюты.Курс;
                Курсы.Записать();
                Если тзКурсыВалюты.Дата >= '03.03.2022' Тогда
                    КурсыВнутр.ДатаЗнач = тзКурсыВалюты.Дата;
                    КурсыВнутр.Значение = тзКурсыВалюты.Курс*?(Константа.КоэффициентКурса = 0, 1, Константа.КоэффициентКурса);
                    КурсыВнутр.Записать();
                КонецЕсли;
                Кратности.ДатаЗнач = тзКурсыВалюты.Дата;
                Кратности.Значение = тзКурсыВалюты.Кратность;
                Если ТекущаяВалюта.Кратность.Получить(тзКурсыВалюты.Дата) <> тзКурсыВалюты.Кратность Тогда
                    Кратности.Записать();
                КонецЕсли;
                Сообщить(Строка(тзКурсыВалюты.Дата) + СимволТабуляции + тзКурсыВалюты.Курс + СимволТабуляции + тзКурсыВалюты.Кратность + СимволТабуляции + "загружен","I");
            Иначе
                Сообщить(Строка(тзКурсыВалюты.Дата) + СимволТабуляции + тзКурсыВалюты.Курс + СимволТабуляции + тзКурсыВалюты.Кратность + СимволТабуляции + "не изменился","I");
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры // Загрузить
12 Guk
 
17.03.22
16:02
о, АЛьФ тоже до сих пор на клюшках ваяет. я не одинок ;)...
13 АЛьФ
 
18.03.22
10:52
2(12) Но переход на "заваленную бесконечность" мелкими шажочками все же идет.
14 Guk
 
18.03.22
10:53
(13) ну и у нас так же...
15 АЛьФ
 
21.03.22
09:03
В (11) код неверный. Оказывается ЦБ не заполняет курсы на выходные и праздничные дни, в отличие от РБК.
16 Быдло замкадное
 
21.03.22
11:49
я пока переделал на загрузку с сайта 1С
17 Azverin
 
21.03.22
11:58
Центральный банк Российской Федерации установил с 19.03.2022:
840     USD     1     Доллар США     103,9524
Что у вас там поломалось? в УПП всё так.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший