Имя: Пароль:
1C
 
Загрузка курса валют с сайта ЦБ РФ
0 Михаил Анянов
 
26.06.09
13:08
Недавно занялся изучением 1С, задался вопросом как в своей конфигурации загружать курс валют автоматически. Нигде не нашел ответа, написал функцию сам.

Может кому пригодится.

Итак - Регистр сведений - КурсыВалют

Написал функцию
// <Описание функции>
//
// Параметры
//  НаДату - тип Дата - указывает на какую дату необходимо  получить
//                      - курс доллара. Если же дата не указана,
//                    - то будет возвращен курс на текущую дату.
//                    - В случае, если указана дата с давностью
//                    - более 1 месяца, то будет возвращен курс
//                    - на дату месячной давности.
//
// Возвращаемое значение:
//   Число с точностью 4 - Курс доллара на указанную дату
//
//   В случае ошибки (нет подключения к сети Интернет)
//   возвращаемое значение будет неопределено.
//
Функция КурсДоллараНаДату(НаДату = Неопределено) Экспорт

   перем СтрокаВалют;
   перем СтрокаКурса;
   перем ВремСтрока;
   перем КурсНаДату;
   перем АдресЦБРФ;
   
   // Если при вызове функции дата не указана
   // то значение курса будет получено для текущей даты
   Если (НаДату = Неопределено) ИЛИ (НаДату = '00010101') Тогда
       НаДату = ТекущаяДата();
   КонецЕсли;
   
   // АдресЦБРФ равен путь к файлу XML + КурсНаДату
   // КурсНаДату должен содержать дату вида "01.01.2009"
   КурсНаДату = Лев(НаДату,10);
   АдресЦБРФ = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=" + КурсНаДату;
   
   // Пробуем загрузить XML-файл с курсами валют
   // В случае исключение возвращаем значение Неопределено
   Чт = Новый ЧтениеXML;
   Попытка
       Чт.ОткрытьФайл(АдресЦБРФ);
   Исключение
       Возврат Неопределено;
   КонецПопытки;
   
   Пока Чт.Прочитать() Цикл
       
       // при обработке XML-файла с курсами валют от ЦБ РФ нам необходимы строки
       // только с пустым полем ЛокальноеИмя
       Если Чт.ЛокальноеИмя = "" Тогда
           
           // считываем во временную переменную значение
           ВремСтрока = Чт.Значение;
           
//----------------------------------------------
           // если предыдущая строка содержала указанную запись, то теперь
           // ВремСтрока будет содержать его курс на данный момент.
           Если СтрокаВалют = "USD" Тогда
               СтрокаКурса = ВремСтрока;
           КонецЕсли;
           
       //    Если СтрокаВалют = "EUR" Тогда
       //        СтрокаКурса = ВремСтрока;
       //    КонецЕсли;
//----------------------------------------------
           // если временная строка содержит указанную запись, сохраняем результат
           Если ВремСтрока = "Доллар США" Тогда
               СтрокаВалют = "USD";
           КонецЕсли;
           
       //    Если ВремСтрока = "Евро" Тогда
       //        СтрокаВалют = "EUR";
       //    КонецЕсли;
//----------------------------------------------
           // если мы получили имя валюты и ее курс - то заносим в регистр сведений
           Если СтрДлина(СтрокаКурса) > 0 Тогда
               Возврат СтрокаКурса;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
КонецФункции // КурсДоллараНаДату()
1 ТелепатБот
 
гуру
26.06.09
13:08
2 Михаил Анянов
 
26.06.09
13:10
Для формы курса валют написал цикл при воборе дат:

Процедура Кнопка1Нажатие(Элемент)
   ДатаНачала = ВыборДатыОт;
   ДатаОкончания = ВыборДатыДо;
   
   Если (ДатаНачала < ДатаОкончания) Тогда
       
       ЭлементыФормы.НадписьЗагрузка.Видимость = Истина;
       ЭлементыФормы.ИндЗагрузки.Видимость = Истина;
       ЭлементыФормы.ИндЗагрузки.МинимальноеЗначение = 0;
       ЭлементыФормы.ИндЗагрузки.МаксимальноеЗначение = (Цел((ДатаОкончания - ДатаНачала) / 86400)) * 2;
       Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
       
       Пока ДатаНачала <> ДатаОкончания Цикл
           ДатаНачала = ДатаНачала + 86400;
           КурсДоллара = КурсДоллараНаДату(ДатаНачала);
           НовЗапись = Набор.Добавить();
           НовЗапись.Валюта = "USD";
           НовЗапись.Период = ДатаНачала;
           НовЗапись.Курс = КурсДоллара;
           ЭлементыФормы.ИндЗагрузки.Значение = ЭлементыФормы.ИндЗагрузки.Значение + 1;
     
           КурсЕвро = КурсЕвроНаДату(ДатаНачала);
           НовЗапись = Набор.Добавить();
           НовЗапись.Валюта = "EUR";
           НовЗапись.Период = ДатаНачала;
           НовЗапись.Курс = КурсЕвро;
           ЭлементыФормы.ИндЗагрузки.Значение = ЭлементыФормы.ИндЗагрузки.Значение + 1;
       КонецЦикла;
       
       Набор.Записать(Истина);
       ЭлементыФормы.НадписьЗагрузка.Заголовок = "Загрузка курсов валют завершена успешно.";

КонецПроцедуры
3 Михаил Анянов
 
26.06.09
13:12
Если поправите где в нецелесообразности, или логике алгоритма - буду рад услышать и поправить.

Решил написать аналогично для сайта РБК, но там проблема в том, что XML не вормирует. В итоге - ставим на форму ПолеHTMLДокумента, загружаем в него составленный запрос, и обрабатываем, но пока не реализовал, через некоторое время думаю сделаю.
4 Sammo
 
26.06.09
13:13
Заходим в любую типовую и берем оттуда КурсыВалютРБК
5 Михаил Анянов
 
26.06.09
13:16
Не было у меня типовых конфигураций под рукой
6 Михаил Анянов
 
26.06.09
13:17
К тому же я вижу что побыстрее импорт можно сделать, чем в типовых конфигурациях конкретно для РБК. Сделаю, выложу :)
7 Михаил Анянов
 
26.06.09
13:19
Ну и - альтернативы тоже нужны.
8 Sidney
 
26.06.09
13:55
"Нигде не нашел ответа"
А где искал то ?
9 Михаил Анянов
 
26.06.09
14:01
Где ищут7 Яндекс, Гугл. Запросы вида - "автоматическая загрузка курсов валют в 1с". Где исходных текстов не было. Где деньги просили за это.
10 kiruha
 
26.06.09
14:06
А официальные банковские счета клиента  грузануть
можно откуда нибудь?

Откуда регистрацию клиента по ИНН брать - знаю, но там нет р/с
11 DSatan
 
26.06.09
14:08
(10) попробней можно про "Откуда регистрацию клиента по ИНН" ?
12 kiruha
 
26.06.09
14:18
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.