Имя: Пароль:
1C
1С v8
Курсы валют с мосбиржи
, , ,
0 VAVANSTR
 
04.03.22
13:24
Может быть у кого есть кусок кода получения курсов валют с мосбиржи? Желательно на сегодняшнюю дату и на завтрашнюю
1 Вафель
 
04.03.22
13:55
(0) а что такое курс на сегодня?
Открытие, закрытие, ми-макс. средневзвешенный?
2 Вафель
 
04.03.22
13:55
И на завтрашнюю я пожалуй бы тоже взял
3 Быдло замкадное
 
04.03.22
13:59
есть код на послезавтрашнюю? У меня финансовая идея есть..
4 VAVANSTR
 
04.03.22
14:03
(1) имеется в виду курс на текущий момент времени. Я его собираюсь загружать в базу каждый час. А «на завтра»  у них там какой-то параметр вроде был TOMORROW
5 МихаилМ
 
04.03.22
14:04
(0) Вам же подсказали код в

Курсы валют с мосбиржи
6 МихаилМ
 
04.03.22
14:05
7 VAVANSTR
 
04.03.22
14:12
(6) там похожее, но немного другое. Из разных мест эти цифры берутся.
8 Asmody
 
04.03.22
14:26
(0) У меня есть. Забирай:

package moex

import (
    "encoding/json"
    "errors"
    "fmt"
    "io/ioutil"
    "net/http"
    "time"
)

// Quote gets current quote value from MOEX.
// It returns quote value and any error encountered.
func Quote(segment string) (float64, error) {

    moexJSON, err := getMOEXJSON(segment)
    if err != nil {
        return -1, err
    }
    return parseMOEXJSON(moexJSON)
}

func getMOEXJSON(segment string) ([]byte, error) {
    tickers := map[string]string{
        "USD":     "USD000000TOD",
        "USD_TOD": "USD000000TOD",
        "USD_TOM": "USD000UTSTOM",
        "EUR":     "EUR_RUB__TOD",
        "EUR_TOD": "EUR_RUB__TOD",
        "EUR_TOM": "EUR_RUB__TOM",
    }

    ticker, ok := tickers[segment]
    if !ok {
        return []byte{}, errors.New("Unsupported ticket")
    }

    now := time.Now().Unix()
    moexurl := "http://www.moex.com/iss/engines/currency/markets/selt/boards/CETS/securities/%s.jsonp?iss.meta=off&iss.only=marketdata&lang=ru&_=%d"
    url := fmt.Sprintf(moexurl, ticker, now)
    resp, err := http.Get(url)
    if err != nil {
        return []byte{}, err
    }
    defer resp.Body.Close()
    return ioutil.ReadAll(resp.Body)
}

func parseMOEXJSON(moexJSON []byte) (float64, error) {
    var dat map[string]interface{}

    if err := json.Unmarshal(moexJSON, &dat); err != nil {
        return -1, err
    }

    marketdata, ok := dat["marketdata"].(map[string]interface{})
    if !ok {
        return -1, errors.New("Error Unmarshaling marketdata")
    }

    marketdata_data, ok := marketdata["data"].([]interface{})
    if !ok {
        return -1, errors.New("Error Unmarshaling marketdata->data")
    }

    marketdata_data_array, ok := marketdata_data[0].([]interface{})
    if !ok {
        return -1, errors.New("Error Unmarshaling marketdata->data->[0]")
    }
    t1 := marketdata_data_array[8].(float64)

    return t1, nil
}
9 VAVANSTR
 
04.03.22
14:34
(8) Спасибо, сейчас буду думать как это в 1С код переделать
10 VAVANSTR
 
04.03.22
16:19
Есть подобный кусок кода, но я не знаю как переделать ссылку под свою задачу


&НаСервере
Процедура ПолучитьКурсФиксингаЗаПериод(ДатаНачала, ДатаОкончания, Валюта)
    
    ИмяВходящегоФайла = ПолучитьИмяВременногоФайла("xml");
    //СоздатьКаталог(ВремКаталог);
    //УдалитьФайлы(ВремКаталог,"*.*");
    //ИмяФайла="USDFIXME.xml";
    //ИмяВходящегоФайла = "" + ВремКаталог + "\" + ИмяФайла;
    
    СерверИсточник="iss.moex.com";
    
    НачалоПериода = Формат(ДатаНачала, "ДФ=yyyy-MM-dd");
    КонецПериода = Формат(ДатаОкончания, "ДФ=yyyy-MM-dd");
    
    СтрокаПараметраПолучения = "iss/statistics/engines/currency/markets/fixing/"+Валюта+"FIXME.xml?from="+НачалоПериода+"&till="+КонецПериода+"%20";
    
    HTTP = Новый HTTPСоединение(СерверИсточник);
    HTTP.Получить(СтрокаПараметраПолучения, ИмяВходящегоФайла);
    
    ВыбФайл = Новый Файл(ИмяВходящегоФайла);
    Если ВыбФайл.Существует() Тогда    
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.ОткрытьФайл(ИмяВходящегоФайла);    
        Пока ЧтениеXML.Прочитать() Цикл          
            Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя="row" Тогда    
                Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда
                    
                    НоваяСтрока = КурсыФиксинга.Добавить();
                    Для Сч=0 По ЧтениеXML.КоличествоАтрибутов()-1 Цикл
                                
                        Если ЧтениеXML.ИмяАтрибута(Сч) = "tradedate" Тогда
                            НоваяСтрока.Дата = Дата(СтрЗаменить(ЧтениеXML.ЗначениеАтрибута(Сч),"-",""));
                        КонецЕсли;
                        Если ЧтениеXML.ИмяАтрибута(Сч) = "rate" Тогда
                            НоваяСтрока.Курс = ЧтениеXML.ЗначениеАтрибута(Сч);
                        КонецЕсли;
                        
                    КонецЦикла;
                    
                КонецЕсли;    
            КонецЕсли;    
        КонецЦикла;    
    КонецЕсли;
                            
КонецПроцедуры
11 VAVANSTR
 
05.03.22
03:17
Получилось

&НаСервере
Процедура ПолучитьКурсыВалютСвечкиНаСервере(Валюта)
    
    ТаблицаКурсов = Новый ТаблицаЗначений;
    ТаблицаКурсов.Колонки.Добавить("Open");
    ТаблицаКурсов.Колонки.Добавить("Close");
    ТаблицаКурсов.Колонки.Добавить("Begin"    , Новый ОписаниеТипов("Дата"));
    ТаблицаКурсов.Колонки.Добавить("End"    , Новый ОписаниеТипов("Дата"));
    ТаблицаКурсов.Колонки.Добавить("High");
    ТаблицаКурсов.Колонки.Добавить("Low");
    ТаблицаКурсов.Колонки.Добавить("Value");
    ТаблицаКурсов.Колонки.Добавить("Volume");
    //ТаблицаКурсов.Колонки.Добавить("Close");
    //ТаблицаКурсов.Колонки.Очистить();
    //ТаблицаКурсов.Колонки.Очистить();
    ТаблицаКурсов.Очистить();
    
    
    Периодичность = 60;//минуты
    
    ТорговаяСистема = "currency";//ЭлементыФормы.ТорговаяСистема.Значение;
    
    Если ТорговаяСистема=Неопределено или ТорговаяСистема="" Тогда
        Возврат;
    КонецЕсли;
    
    Рынок = "index";//ЭлементыФормы.Рынок.Значение;
    
    Если Рынок=Неопределено или Рынок="" Тогда
        Возврат;
    КонецЕсли;
    
    РежимТоргов = "FIXI";//ЭлементыФормы.РежимТоргов.Значение;
    
    Если РежимТоргов=Неопределено или РежимТоргов="" Тогда
        Возврат;
    КонецЕсли;

    //СтрокаИнструмент = ЭлементыФормы.СписокИнструментов.ТекущаяСтрока;
    //
    //Если СтрокаИнструмент=Неопределено Тогда
    //    Возврат;
    //КонецЕсли;
    
    Инструмент = Валюта + "FIX";//СтрокаИнструмент.secid;    //USD
    
    Если ПустаяСтрока(Инструмент) Тогда
        Возврат;
    КонецЕсли;
        
    
    //#Если Клиент Тогда    
    //    //    Попытка    
    //    //https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities/BANEP/candles.xml?from=2017-11-01&till=2017-12-02&interval=24
        
        ВремКаталог = КаталогВременныхФайлов() + "tempKurs";
        СоздатьКаталог(ВремКаталог);
        УдалитьФайлы(ВремКаталог,"*.*");
        ИмяФайла="candles.xml";
        ИмяВходящегоФайла = "" + ВремКаталог + "\" + ИмяФайла;
        
        СерверИсточник="iss.moex.com";
        СтрокаПараметраПолучения = "iss/engines/"+ТорговаяСистема+"/markets/"+Рынок+"/boards/"+РежимТоргов+"/securities/"+Инструмент+"/candles.xml";
        СтрокаПараметраПолучения = СтрокаПараметраПолучения + "?from="+Формат(ДатаНачала, "ДФ=yyyy-MM-dd");
        СтрокаПараметраПолучения=СтрокаПараметраПолучения+"&till="+Формат(ДатаОкончания, "ДФ=yyyy-MM-dd");
        СтрокаПараметраПолучения=СтрокаПараметраПолучения+"&interval="+Периодичность;
        
        
        HTTP = Новый HTTPСоединение(СерверИсточник);
        HTTP.Получить(СтрокаПараметраПолучения, ИмяВходящегоФайла);
        
        ВыбФайл = Новый Файл(ИмяВходящегоФайла);
        Если ВыбФайл.Существует() Тогда
            
            ЧтениеXML = Новый ЧтениеXML;
            ЧтениеXML.ОткрытьФайл(ИмяВходящегоФайла);  
            
            МассивОткрытыхСтрок = Новый Массив; // тут будем хранить все имена открытых срок
            //Открываем файл
            Пока ЧтениеXML.Прочитать() Цикл  
                
                Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда  
                    //Определяем начало элемента
                    МассивОткрытыхСтрок.Добавить(ЧтениеXML.Имя);
                    Если ЧтениеXML.Имя="data" тогда
                        АтрибутыЭлемента = АтрибутыУзлаВСтруктуру2(ЧтениеXML);
                        Если НЕ АтрибутыЭлемента=Неопределено Тогда
                            ИмяДата=Неопределено;
                            Если АтрибутыЭлемента.Свойство("id", ИмяДата) Тогда
                                Если ИмяДата="candles" Тогда
                                    МассивОткрытыхСтрок[МассивОткрытыхСтрок.Количество()-1]="candles";
                                КонецЕсли;
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                    
                    //Если ЧтениеXML.Имя="column" тогда //и МассивОткрытыхСтрок.Количество()=5 тогда
                    //    Если МассивОткрытыхСтрок[1]="candles" Тогда
                    //        АтрибутыЭлемента = АтрибутыУзлаВСтруктуру2(ЧтениеXML);
                    //        Если НЕ АтрибутыЭлемента=Неопределено Тогда
                    //            ТаблицаКурсов.Колонки.Добавить(АтрибутыЭлемента.NAME,,,);
                    //            //ЭлементыФормы.ТаблицаКурсов.СоздатьКолонки();
                    //        КонецЕсли;
                    //    КонецЕсли;
                    //КонецЕсли;
                    
                    Если ЧтениеXML.Имя="row" тогда //и МассивОткрытыхСтрок.Количество()=4 тогда
                        Если МассивОткрытыхСтрок[1]="candles" Тогда
                            АтрибутыЭлемента = АтрибутыУзлаВСтруктуру2(ЧтениеXML);
                            Если НЕ АтрибутыЭлемента=Неопределено Тогда
                                Строка = ТаблицаКурсов.Добавить();
                                ЗаполнитьЗначенияСвойств(Строка,АтрибутыЭлемента);
                                Строка.Begin    = Дата(ОчиститьДату(АтрибутыЭлемента.Begin));
                                Строка.End        = Дата(ОчиститьДату(АтрибутыЭлемента.End));
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                    
                ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда  
                    
                    МассивОткрытыхСтрок.Удалить(МассивОткрытыхСтрок.Количество()-1);    
                    
                КонецЕсли;
                
            КонецЦикла;
            
            ЧтениеXML.Закрыть();
            
        Иначе
            Сообщить("Файл не найден!");
        КонецЕсли;
        
        //        Исключение
        //            Сообщить("Не удалось загрузить и обработать данные по инструменту" );     
        //        КонецПопытки;
        
        текВалюта = Справочники.Валюты.НайтиПоНаименованию(Валюта);
        
        Если Не ЗначениеЗаполнено(текВалюта) Тогда
            Сообщить("Не найдена валюта!");
            Возврат;
        КонецЕсли;
        
        Для Каждого текСтрока Из ТаблицаКурсов Цикл
            
            текПериод    = текСтрока.End;
            текКурс        = Число(текСтрока.Close);
            
            Если текПериод = Дата(1,1,1)
                ИЛИ текКурс = 0 Тогда
                
                Продолжить;
            КонецЕсли;
                
            НаборЗаписей = РегистрыСведений.КурсыВалют_Внутренний.СоздатьНаборЗаписей();
            НаборЗаписей.Отбор.Период.Установить(текПериод);
            НаборЗаписей.Отбор.Валюта.Установить(текВалюта);
            
            НоваяЗапись = НаборЗаписей.Добавить();
            НоваяЗапись.Период            = текПериод;
            НоваяЗапись.Валюта            = текВалюта;
            НоваяЗапись.Курс            = текКурс;
            НоваяЗапись.КурсВнутренний    = текКурс/100*110;
            НоваяЗапись.Кратность        = 1;
            НаборЗаписей.Записать();
            
            
        КонецЦикла;
        
        
        
        УдалитьФайлы(ВремКаталог,"*.*");
    //#КонецЕсли
    
КонецПроцедуры


Функция АтрибутыУзлаВСтруктуру2(УзелXML)
    
    Ответ = Неопределено;
    
    Если УзелXML.КоличествоАтрибутов() > 0 Тогда
        
        Ответ = Новый Структура();
        
        Для Сч=0 По УзелXML.КоличествоАтрибутов()-1 Цикл
            Ответ.Вставить(УзелXML.ИмяАтрибута(Сч), УзелXML.ЗначениеАтрибута(Сч));
        КонецЦикла;
        
    КонецЕсли;
    
    Возврат Ответ;
    
КонецФункции
12 VAVANSTR
 
22.03.22
12:01
Вот более точная процедура

Процедура ПолучитьКурсыВалютСМосБиржиПоследнийАктуальный(МассивВалют) Экспорт
    
    текПериод    = ТекущаяДата();
    
    Для Каждого Валюта Из МассивВалют Цикл
        
        текВалюта    = Справочники.Валюты.НайтиПоНаименованию(Валюта);
        текКурс        = 0;
        
        Тикер = "";
        Если НРег(Валюта) = "usd" Тогда
            Тикер = "USD000UTSTOM";    
        ИначеЕсли НРег(Валюта) = "eur" Тогда  
            Тикер = "EUR_RUB__TOM";    
        КонецЕсли;
        
        
        СтрокаПараметраПолучения = "iss/engines/currency/markets/selt/boards/CETS/securities/"+Тикер+"/s.jsonp?iss.data=on&iss.meta=off&iss.only=securities,marketdata&securities.columns=PREVPRICE&marketdata.columns=LAST";
        
        ПоляСДатами = "";
        
        HTTPСоединение = Новый HTTPСоединение("iss.moex.com");
        Запрос = Новый HTTPЗапрос(СтрокаПараметраПолучения);
        Попытка
            Ответ = HTTPСоединение.Получить(Запрос);
            Если Ответ.КодСостояния <> 200 тогда
                РегламентныеПроцедуры.СделатьЗаписьОбОшибкеПриВыполненииРЗ("ЗагрузкаВнутреннихКурсовВалютСМосБиржи", ТекущаяДата(), "Ответ.КодСостояния <> 200", Истина);;
                Возврат;
            КонецЕсли;
            Чтение = Новый ЧтениеJSON;
            Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
            Данные = ПрочитатьJSON(Чтение, Ложь, ПоляСДатами);
            
            текКурс = Данные.marketdata.data[0][0];
            
            Если текКурс = 0 Тогда
                текКурс = Данные.securities.data[0][0];    
            КонецЕсли;
            
            Если текКурс <> 0 Тогда
                
                ПредыдущийКурс = ПолучитьКурсВалюты_ИзРегистра_КурсыВалютВнутренние(текВалюта,текПериод);
                
                Если текКурс <> ПредыдущийКурс Тогда
                    
                    НаборЗаписей = РегистрыСведений.КурсыВалютВнутренние.СоздатьНаборЗаписей();
                    НаборЗаписей.Отбор.Период.Установить(текПериод);
                    НаборЗаписей.Отбор.Валюта.Установить(текВалюта);
                    
                    НоваяЗапись = НаборЗаписей.Добавить();
                    НоваяЗапись.Период            = текПериод;
                    НоваяЗапись.Валюта            = текВалюта;
                    НоваяЗапись.Курс            = текКурс;
                    НоваяЗапись.КурсВнутренний    = текКурс*1.2;
                    НоваяЗапись.Кратность        = 1;
                    НаборЗаписей.Записать();
                    
                КонецЕсли;
                
            КонецЕсли;
            
            Чтение.Закрыть();
        Исключение    
            РегламентныеПроцедуры.СделатьЗаписьОбОшибкеПриВыполненииРЗ("ЗагрузкаВнутреннихКурсовВалютСМосБиржи", ТекущаяДата(), ОписаниеОшибки(), Истина);
            Возврат;
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры
13 Bigbro
 
22.03.22
12:07
не забудь только что завтрашний курс он конечно будет завтра но за переход позиции через ночь возьмут денег.
а то получится как с тем трейдером который 40 миллионов за валютные спекуляции остался должен.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший