HelpF.pro

Получения курса валют из Интернет

Код 1C v 8.х
 Соединение = Новый HTTPСоединение("export.rbc.ru"); //готовим соединение
ИмяФайла = ПолучитьИмяВременногоФайла(".txt");
//строка-образец
//http://export.rbc.ru/free/cb.0/free.fcgi?period=DAILY&tickers=USD&d1=18&m1=01&y1=2009&d2=17&m2=02&y2=2009&lastdays=30&separator=TAB&data_format=BROWSER&header=1
//http://export.rbc.ru/free/cb.5/free.fcgi?period=DAILY&tickers=USDEUR_BASKET&d1=08&m1=07&y1=2009&d2=22&m2=07&y2=2009&lastdays=14&separator=TAB&data_format=BROWSER&header=1
СтрокаСоединения="/free/"+Источник+"/free.fcgi?period=DAILY&tickers="+Валюта1+"&d1="+День1+"&m1="+Месяц1+"&y1="+Год1+"&d2="+День2+"&m2="+Месяц2+"&y2="+Год2+"&separator=%7C&data_format=BROWSER";
СтрокаСоединения=СтрЗаменить(СтрокаСоединения," ","");

Попытка //соединяемся
Соединение.Получить(СтрокаСоединения,ИмяФайла);
Исключение
Сообщить("Невозможно получить курс по адресу http://export.rbc.ru"+СтрокаСоединения);
КонецПопытки;

КурсыТекст=Новый ТекстовыйДокумент; //читаем результат запроса
КурсыТекст.Прочитать(ИмяФайла);


Код 1C v 8.х
  // еще пример
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект("MSXML2.XMLHTTP");
соминет.open ("GET", Адресс, Ложь);
соминет.send();
Возврат соминет.responseText;
КонецФункции

Функция ПреобразоватьДату(дат)
// Медот преобразования даты времен 1Сv7
//Т=Строка(Дат);
//Возврат Сред(Т,7,4)+"/"+Сред(Т,4,2)+"/"+Лев(Т,2);
Возврат Формат(Дат,"ДФ=""гггг/ММ/дд""");
КонецФункции

Процедура КнопкаЗагрузитьКурсы(Элемент)
//Список - список валют
Для А = 1 по Список.Количество() цикл
Если Список[а-1].Пометка тогда
Сообщить("Загружаем курсы для "+Строка(Список[а-1].Значение));
Код = Строка(Список[а-1].Значение.Код);
Дат = ПериодС;
Пока Дат <= ПериодПо цикл
Стр = ПолучитьКакСтроку("http://cbrates.rbc.ru/tsv/"+Код+"/"+ПреобразоватьДату(Дат)+".tsv");
Поз = Найти(Стр,Символы.Таб);
Если Поз = 0 Тогда
Дат = Дат + 86400;
Продолжить;
КонецЕсли;
Кратность = Число(СокрЛП(Лев(стр,Поз-1)));
курс = Число(СокрЛП(Сред(Стр,Поз+1,СтрДлина(Стр)-Поз)));
Сообщить("Дата="+Строка(Дат)+" Курс="+Строка(курс)+" Кратность="+Строка(Кратность));
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = Дат;
Запись.Валюта = Список[а-1].Значение.Ссылка;
Запись.Курс = Курс;
Запись.Кратность = Кратность;
Запись.Записать(Истина);
Дат = Дат + 86400;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры


Код 1C v 7.x
 // Взято с http://www.1c-club.kz     IUnknown
//Небольшая обработка для получения курса валют размещенной на странице Национального Банка РК.
//Внимание: работоспособность данной обработки может быть нарушена, если дизайнеры сайта НБ РК изменят формат страницы с //официальным курсом валюта. Но не большой анализ нового формата и работоспособность обработки будет восстановлена.
// шаблон для отображаемой на форме таблице значения
перем тзПустышка;

//*******************************************
// ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
//
// Параметры:
// стрНазвание - Строка. Наименование реквизита формы инициюрующей
// вызов процедуры.
// чисФлаг - Число. Флаг станадартной обработки иницации нажатия
// кнопки выбора значения.
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Переопределенная процедура инициирующая при нажатии кнопки
// выбора значения реквизита формы.
//
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
// Если инициировали из реквизита "стрУРЛа"
если стрНазвание = "стрУРЛа" тогда
// откроем страницу с введенным URL
запуститьприложение(стрУРЛа);
конецесли;
конецпроцедуры

//*******************************************
// кнПолучить()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Процедура получающая курсы валют с URL находящегося в
// строковом реквизите формы "стрУРЛа". Пытается по указаноому URL
// получить страницу и распарсить ее.
//
// ПРЕДУПРЕЖДЕНИЕ:
// В случае измения формата данных представленных на странице, возможно
// будет работать не правильно.
//
процедура кнПолучить()
// сгенирим имя файла для временного хранения содержимого
// страницы курса валют Национального банка
стрИмяФайла = каталогпользователя() + "$$$$.###";
// создадим объект XMLHttpRequest
олеХМЛ = создатьобъект("Microsoft.XMLHTTP");
// иницируем его типом запроса и нужным нам URL
олеХМЛ.Open("GET", стрУРЛа, 0);
// отправим запрос для обработки серверу
олеХМЛ.Send();
// создадим "поток" через ADODDB для работы с данными
олеАДО = создатьобъект("ADODB.Stream");
// зададим тип и режим потока
олеАДО.Mode = 3;
олеАДО.Type = 1;
// откроем его
олеАДО.Open();
// создадим объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// установим язык сценариев
олеШелл.Language = "vbscript";
// добавим созданные объекты
олеШелл.AddObject("oleADO", олеАДО);
олеШелл.AddObject("oleXML", олеХМЛ);
// с помощью скрипта запишем в поток ADO данные из
// объекта XMLHttpRequest
// то есть содержимое страницы
олеШелл.Eval("oleADO.Write(oleXML.ResponseBody)");
// запишем данные во временный файл
олеАДО.SaveToFile(стрИмяФайла, 2);
// закроем данный поток
олеАДО.Close();
// для ускорения парсера занесем весь файл в строковую
// переменую с разделителем строк
// для этого инициализуруем поток установкой
// соотвествующим режимом и типом
олеАДО.Mode= 3;
олеАДО.Type = 2;
// так как страница курса валют НБК имеет формат
// символов UTF-8, то установим соотвествующий набор
олеАДО.CharSet="UTF-8";
// откроем поток
олеАДО.Open();
// загрузим содержимое нашего файла в поток
олеАДО.LoadFromFile(стрИмяФайла);
// обнулим временную строковую переменную
стрТемп = "";
// в цикле получим из потока все строки
пока олеАДО.EOS() = 0 цикл
// и запишем их во временную переменую, добавив разделитель строк
стрТемп = стрТемп + олеАДО.ReadText(-2) + разделительстрок;
конеццикла;
// закроем поток
олеАДО.Close();
// удалим временный файл
фс.УдалитьФайл(стрИмяФайла);
// найдем в строке позицию начала блока с данными о курсе
чисПозиция = найти(стрТемп, "Официальные курсы валют на");
если чисПозиция = 0 тогда
// если позиции нет ... то мы имем другую страницу
// или другой формат страницы...
предупреждение("Не получилось получить курсы валют");
иначе
// создаим временную таблицу значений
// для более шустрого заполения из-за отстуствия вызова
// функции перерисовки таблицы при изменении данных
тзТемп = создатьобъект("ТаблицаЗначений");
// установим для нее нужный формат
тзПустышка.Выгрузить(тзТемп);
// отрежем все лишнее
стрТемп = сред(стрТемп, чисПозиция);
// получим дату курса
дтКурса = дата(стрзаменить(стрполучитьстроку(стрТемп, 2), "/", "."));
// первая строка с курсом валюты находится на 18 строке от начала
// после удаления мусора
чисПозиция = 18;
// узнаем сколько всего строк в многострочке
чисКоличествоСтрок = стрколичествострок(стрТемп);
// получим строку
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
// если в строке есть подстрока ... то значит это наверное очередная валюта
пока найти(стрТекущая, "input type=""checkbox"" name=""idval""") > 0 цикл
// добавляем новую строку
тзТемп.НоваяСтрока();
// получаем строку со смещением 1 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 1);
// используя фичу 1С по преобразованию, получим число
// за сколько единиц валюты имеем курс в тенге
тзТемп.Количество = число(стрТекущая);
// путем убирания "мусора" получаем наименование валюты
тзТемп.Наименование = сокрлп(стрзаменить(стрзаменить(стрТекущая, тзТемп.Количество, ""), "</td>", ""));
// получаем строку со смещением 2 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 2);
// убираем html мусор
стрТекущая = сокрлп(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// получаем код валюты
тзТемп.Код1 = лев(стрТекущая, 3);
// получаем код валюты "Тенге"
тзТемп.Код2 = прав(стрТекущая, 3);
// получаем строку со смещением 5 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 5);
// очищаем от мусора и преобразуем в число... получаем курс
тзТемп.Курс = число(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// увеличиваем позицию на 17 ...
чисПозиция = чисПозиция + 17;
если чисПозиция > чисКоличествоСтрок тогда
// если позици дальше имеющихся строк
// то все курсов больше нет
стрТекущая = "";
иначе
// получаем очередную строку для разбора
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
конецесли;
конеццикла;
// сформированую таблицу копируем в таблицу на форме
тзТемп.Выгрузить(тзКурсов);
конецесли;
конецпроцедуры

//*******************************************
// установим значение реквизита текущим URL по которому можно получить курс валют
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D";
// формируем формат таблицы
тзПустышка = создатьобъект("ТаблицаЗначений");
тзПустышка.НоваяКолонка("Количество", "число", 3, 0, "", 5);
тзПустышка.НоваяКолонка("Наименование", "строка", , , "Наименование", 70);
тзПустышка.НоваяКолонка("Код1", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Код2", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Курс", "число", 7, 2, "Курс", 10);
// копируем получившийся формат в таблицу на форме
тзПустышка.Выгрузить(тзКурсов);

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq7/view/411.html