Имя: Пароль:
1C
 
v7: как считать курс валют с сайта из 1с 7.7
0 mimary
 
19.05.10
07:51
Добрый день, подскажите, пожалуйста, как из 1с 7.7 ежедневно считывать курсы валют с сайта нацбанка. не графика.
1 aka AMIGO
 
19.05.10
07:55
в стандартных конфах есть кнопка загрузки курсов
2 Gavrinev
 
19.05.10
08:20
У меня вот так:
Перем Авто,Соединение;
Функция ВыделитьЧисло(Стр)
   Возврат(Число(Сред(Стр,2,10)));    
КонецФункции

Функция УстановитьКомпоненту()
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"ExtForms\v7plus.dll")=0 Тогда
       Если ЗагрузитьВнешнююКомпоненту("v7plus.dll")=0 Тогда
           Возврат 0;
       КонецЕсли;
   КонецЕсли;
   Попытка
       Соединение = СоздатьОбъект("Addin.V7HttpReader");
       Соединение.КоличествоПопытокАвторизации = 3;
   Исключение
       Возврат 0;
   КонецПопытки;
   Возврат 1;
КонецФункции  // УстановитьКомпоненту
//******************************************************************************
Процедура ПолучитьКурсНаДату()
   Перем Адрес1,Адрес2,Адрес,ТМП;
   Перем Вал,Результат;              
   Если УстановитьКомпоненту()=1 Тогда
       Адрес1 = "http://cbrates.rbc.ru/tsv/cb/";  // в интервале
       Адрес2 = "http://cbrates.rbc.ru/tsv/";     // по 1 дате
       Адрес = Адрес2;
       ТМП = "/"+ДатаГод(ДатаКурса)+"/"+Формат(ДатаМесяц(ДатаКурса),"Ч(0)2.0")+"/"+Формат(ДатаЧисло(ДатаКурса),"Ч(0)2.0");
       //Иначе    // в интервале
       //    Адрес = Адрес1;
       //    ТМП = "";
       //КонецЕсли;
       КодВалюты="";
       Вал=Валюта.ПолучитьЗначение(Валюта.ТекущаяСтрока());
       Если Вал="Доллар" Тогда
           КодВалюты="840";
       КонецЕсли;          
       Если Вал="Евро" Тогда
           КодВалюты="978";
       КонецЕсли;          
       Если ПустоеЗначение(КодВалюты)=0 Тогда
           Стр = "";  
           Попытка                    
               Соединение.ПолучитьКакСтроку(Адрес+КодВалюты+ТМП+".tsv", Стр);
               Результат=ВыделитьЧисло(Стр);
               ТЗ.НоваяСтрока();
               ТЗ.Валюта=Вал;
               ТЗ.ДатаКурса=ДатаКурса;
               ТЗ.Курс=Результат;
               ТЗ.ТекущаяСтрока(ТЗ.КоличествоСтрок());
           Исключение
               Сообщить("Неудачная попытка соединения.");                          
           КонецПопытки;
       КонецЕсли;    
   КонецЕсли;
КонецПроцедуры
3 zak555
 
19.05.10
09:57
(0) чем стандартная загрузка не нравится ?
4 mimary
 
19.05.10
10:01
конфа не типовая
5 ДенисЧ
 
19.05.10
10:01
(4) И? Взять готовый код и впендюрить его в нетиповую - религия не позволяет?
6 mimary
 
19.05.10
10:03
мы не так нет типовой то, вот и прошу код
7 miki
 
19.05.10
10:06
>>нет типовой то, вот и прошу код
это можно топикстартом по дефолту сделать!..
8 zak555
 
19.05.10
10:08
(6) что-что ?
9 zak555
 
19.05.10
10:09
Перем Авто,Соединение;
//******************************************************************************
//  ДоступностьЗагрузки()
//
//    Описание:  Осуществляет проверку возможности загрузки курсов валют
//             Если есть помеченные строки, возвращает 1, если нет - 0
Функция ДоступностьЗагрузки()
   Д=0;
   Для Н=1 По СписокВалют.РазмерСписка() Цикл  
       Д=Д+СписокВалют.Пометка(Н);
       Если Д=1 Тогда
           Прервать;
       КонецЕсли;
   КонецЦикла;
   Возврат Д;
КонецФункции  // ДоступностьЗагрузки      
//******************************************************************************
//    ВыделитьПодСтроку(ИсхСтр)
//
//    Параметры:  ИсхСтр - исходная строка
//
//    Описание:  Выделяет подстроку из строки и возвращает ее
Функция ВыделитьПодСтроку(ИсхСтр)
   Перем Стр;
   Поз=Найти(ИсхСтр,СимволТабуляции);
   Если Поз>0 Тогда
       Стр=Лев(ИсхСтр,Поз-1);
       ИсхСтр=Сред(ИсхСтр,Поз+1);
   Иначе
       Стр=ИсхСтр;
       ИсхСтр="";
   КонецЕсли;
   Возврат Стр;
КонецФункции   //  ВыделитьПодСтроку    
//******************************************************************************
//  ОткрытьСправочник()
//
//    Описание:  Осуществляет открытие справочника валют
Процедура ОткрытьСправочник()
   Перем Конт;
   ОткрытьФорму("Справочник.Валюты",Конт);
   Конт.АктивизироватьОбъект(СписокВалют.ПолучитьЗначение(СписокВалют.ТекущаяСтрока()));
КонецПроцедуры  // ОткрытьСправочник
//******************************************************************************
//    Установить(Режим="")
//
//    Параметры: Режим - строка, режим работы: "Все" - отметить все строки
//                       "Сброс" - снять отметку всех строк
//                       "" - инвертировать отметку всех строк
//
//    Описание: Устанавливает, снимает или инвертирует отметки выбора строк
Процедура Установить(Режим="")
   Для Н=1 По СписокВалют.РазмерСписка() Цикл
       Если Режим="Все" Тогда
           СписокВалют.Пометка(Н,1);
       ИначеЕсли Режим="Сброс" Тогда
           СписокВалют.Пометка(Н,0);
       Иначе
           СписокВалют.Пометка(Н,?(СписокВалют.Пометка(Н)=1,0,1));
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры  //  Установить
//******************************************************************************
//    ОбновитьСписокВалют()
//
//    Описание:  Обновляет список валют (значения курсов и даты курсов)
Процедура ОбновитьСписокВалют()    
   Для Н=1 По СписокВалют.РазмерСписка() Цикл  
       Если СписокВалют.Пометка(Н)=1 Тогда
           СписокВалют.УстановитьЗначение(Н,СписокВалют.ПолучитьЗначение(Н),);
           Курсы=СоздатьОбъект("Периодический");    
           Курсы.ИспользоватьОбъект("Курс",СписокВалют.ПолучитьЗначение(Н));
           Курсы.ОбратныйПорядок();
           Если Курсы.ВыбратьЗначения()=1 Тогда    
               Курсы.ПолучитьЗначение();
               ДатаЗнач = Курсы.ДатаЗнач;
           Иначе
               ДатаЗнач = 0;      
           КонецЕсли;
           СписокВалют.УстановитьЗначение(Н,СписокВалют.ПолучитьЗначение(Н),"     "+СокрЛП(СписокВалют.ПолучитьЗначение(Н).Наименование)+";     на: "+Строка(ДатаЗнач)+"  =  "+Формат(Курсы.Значение,"Ч10.4"));
           СписокВалют.Пометка(Н,1);
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры   //  ОбновитьСписокВалют                                            
//******************************************************************************
//    Загрузить()
//
//    Описание:  Осуществляет загрузку курсов валют с сервера РБК
Процедура Загрузить()
   Перем Адрес1,Адрес2,Адрес,ТМП;
   Если ДоступностьЗагрузки()=0 Тогда
       Если Авто=0 Тогда
           Предупреждение("Необходимо указать валюты, "+РазделительСтрок+"по которым требуется получить курсы!");
       КонецЕсли;
       Возврат;
   КонецЕсли;
   Если НачДата>КонДата Тогда
       Если Авто=0 Тогда
           Предупреждение("Неверно указан период!");
       КонецЕсли;
       Возврат;
   КонецЕсли;
   Адрес1 = "http://cbrates.rbc.ru/tsv/cb/";  // в интервале
   Адрес2 = "http://cbrates.rbc.ru/tsv/";     // по 1 дате
   Если НачДата=КонДата Тогда  // по 1 дате
       Адрес = Адрес2;
       ТМП = "/"+ДатаГод(КонДата)+"/"+Формат(ДатаМесяц(КонДата),"Ч(0)2.0")+"/"+Формат(ДатаЧисло(КонДата),"Ч(0)2.0");
   Иначе    // в интервале
       Адрес = Адрес1;
       ТМП = "";
   КонецЕсли;
   Валюта=СоздатьОбъект("Справочник.Валюты");
   Стр = "";  
   МахДата = Дата(0);
   Для Н=1 По СписокВалют.РазмерСписка() Цикл
       Если СписокВалют.Пометка(Н)=0 Тогда
           Продолжить;
       КонецЕсли;    
       ВалютаТМП = СписокВалют.ПолучитьЗначение(Н);
       Если (Результат=1)И(Авто=0) Тогда
           Сообщить("Загрузка курсов валюты: "+ВалютаТМП);
           Сообщить("Дата"+СимволТабуляции+СимволТабуляции+"Курс"+СимволТабуляции+"Кратность");
       КонецЕсли;
       Если Авто=1 Тогда
           Состояние("Загрузка курсов валюты: "+ВалютаТМП);
       КонецЕсли;
       
       Попытка                    
           Соединение.ПолучитьКакСтроку(Адрес+Прав(ВалютаТМП.Код,3)+ТМП+".tsv", Стр);
       Исключение
           Сообщить("Неудачная попытка соединения.");                          
       КонецПопытки;
       Текст=СоздатьОбъект("Текст");
       Текст.ДобавитьСтроку(Стр);  
       
       Курсы=СоздатьОбъект("Периодический");
       Курсы.ИспользоватьОбъект("Курс",ВалютаТМП);
       Кратности=СоздатьОбъект("Периодический");
       Кратности.ИспользоватьОбъект("Кратность",ВалютаТМП);
                                 
       НачальныйКурс=0;
       НачальнаяКратность=0;
       НачальнаяДатаКурса=Дата(0);
       НачатьТранзакцию();
       Для Инд=1 По Текст.КоличествоСтрок() Цикл
             Стр=Текст.ПолучитьСтроку(Инд);
             Если (Стр="")ИЛИ(Найти(Стр,СимволТабуляции)=0) Тогда
                 Продолжить;
             КонецЕсли;
             Если НачДата=КонДата Тогда  
                 ДатаКурса=КонДата;
             Иначе
                 ДатаКурсаСтр=ВыделитьПодСтроку(Стр);
                 ДатаКурса=Дата(Лев(ДатаКурсаСтр,4),Сред(ДатаКурсаСтр,5,2),Сред(ДатаКурсаСтр,7,2));
             КонецЕсли;
             Кратность=Число(ВыделитьПодСтроку(Стр));
             Курс=Число(ВыделитьПодСтроку(Стр));
             
             Если ДатаКурса>КонДата Тогда
                 Прервать;
             КонецЕсли;
             
             Если ДатаКурса<НачДата Тогда  //Запоминание курса на начало интервала
                 Продолжить;
             КонецЕсли;
             
           Курсы.ВыбратьЗначения(ДатаКурса,ДатаКурса);
           Курсы.ПолучитьЗначение();
           Кратности.ВыбратьЗначения(ДатаКурса,ДатаКурса);
           Кратности.ПолучитьЗначение();
           Если (Курс<>Курсы.Значение) или (Кратность<>ВалютаТМП.Кратность.Получить(ДатаКурса)) Тогда
               Курсы.ДатаЗнач=ДатаКурса;
               Курсы.Значение=Курс;
               Курсы.Записать();
               Кратности.ДатаЗнач=ДатаКурса;
               Кратности.Значение=Кратность;
               Если ВалютаТМП.Кратность.Получить(ДатаКурса)<>Кратность Тогда
                   Кратности.Записать();
               КонецЕсли;
               Если (Результат=1)И(Авто=0) Тогда
                   Сообщить(Строка(ДатаКурса)+СимволТабуляции+Курс  +СимволТабуляции+СимволТабуляции+ Кратность,"I");
               КонецЕсли;
                 МахДата = макс(ДатаКурса,МахДата);
           КонецЕсли;
           Если (Результат=1)И(Авто=0) Тогда
               Состояние("Загрузка курса на "+ДатаКурса+" - "+Курс);
           КонецЕсли;
       КонецЦикла;                          
       ЗафиксироватьТранзакцию();                          
   КонецЦикла;                          
   ОбновитьСписокВалют();
   Если Авто=0 Тогда
       Предупреждение("Загрузка курсов закончена!",3);
   Иначе
       Состояние("Загрузка курсов закончена!");
   КонецЕсли;
   СохранитьЗначение("ДатаСкачиванияКурсовВалют",МахДата);
КонецПроцедуры   //  Загрузить                                            
//******************************************************************************
//    ЗагрузитьСписокВалют()
//
//    Описание:  Осуществляет загрузку списка валют при открытии формы
Процедура ЗагрузитьСписокВалют()
   ДатаЗнач=СоздатьОбъект("Периодический");
   Валюта=СоздатьОбъект("Справочник.Валюты");
   Валюта.ВыбратьЭлементы();
   ДатаМин = ТекущаяДата();
   Пока Валюта.ПолучитьЭлемент()=1 Цикл
       Если (Прав(Валюта.Код,3)="001")ИЛИ(Прав(Валюта.Код,3)="000")ИЛИ(Прав(Валюта.Код,3)="0")
               ИЛИ(Прав(Валюта.Код,3)="810")ИЛИ(Прав(Валюта.Код,3)="643") Тогда
           Продолжить;
       Иначе
           Курсы=СоздатьОбъект("Периодический");    
           Курсы.ИспользоватьОбъект("Курс",Валюта.ТекущийЭлемент());
           Курсы.ОбратныйПорядок();
           Если Курсы.ВыбратьЗначения()=1 Тогда    
               Курсы.ПолучитьЗначение();
               ДатаЗнач = Курсы.ДатаЗнач;
           Иначе
               ДатаЗнач = 0;      
           КонецЕсли;
           ДатаМин=?(ДатаЗнач<ДатаМин,ДатаЗнач,ДатаМин);
           СписокВалют.ДобавитьЗначение(Валюта.ТекущийЭлемент(),"     "+СокрЛП(Валюта.Наименование)+";     на: "+Строка(ДатаЗнач)+"  =  "+Формат(Курсы.Значение,"Ч10.4"));
           СписокВалют.Пометка(СписокВалют.РазмерСписка(),1);
       КонецЕсли;
   КонецЦикла;
   НачДата = ДатаМин;
КонецПроцедуры  // ЗагрузитьСписокВалют
//******************************************************************************
Функция УстановитьКомпоненту()
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"ExtForms\v7plus.dll")=0 Тогда
       Если ЗагрузитьВнешнююКомпоненту("v7plus.dll")=0 Тогда
           Сообщить("Не удалось обнаружить компоненту V7Plus.dll!");
           Возврат 0;
       КонецЕсли;
   КонецЕсли;
   Попытка
       Соединение = СоздатьОбъект("Addin.V7HttpReader");
       Соединение.КоличествоПопытокАвторизации = 3;
   Исключение
       Сообщить("Не удалось создать объект Addin.V7HttpReader!");
       Возврат 0;
   КонецПопытки;
   Возврат 1;
КонецФункции  // УстановитьКомпоненту
//******************************************************************************
Процедура ПриОткрытии(ФлагЧтенияНастройки)  // Предопределенная
   Если ФлагЧтенияНастройки=0 Тогда
       КонДата=ТекущаяДата();
       НачДата=ТекущаяДата()-30;
   КонецЕсли;
   
   Если Метаданные.Справочник("Валюты").Выбран()=0 Тогда
       Предупреждение("Не существует справочника ""Валюты""");
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;

   Если Метаданные.Справочник("Валюты").Реквизит("Курс").Выбран()=0 Тогда
       Предупреждение("Не существует реквизит ""Курс"" справочника ""Валюты""");
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;

   Если Метаданные.Справочник("Валюты").Реквизит("Кратность").Выбран()=0 Тогда
       Предупреждение("Не существует реквизит ""Кратность"" справочника ""Валюты""");
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;
   Авто = 0;  
   УстановитьКомпоненту();
   Если ПустоеЗначение(Форма.Параметр)=0 Тогда
       Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
           Если Форма.Параметр.Получить("Автоматически")=1 Тогда
               Авто = 1;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   Результат = ?(ПустоеЗначение(Результат)=1,1,Результат);
   ЗагрузитьСписокВалют();  
   // Если запуск обработки осуществляется при запуске программы, то диалог не выводится,
   // а прозводится автоматическая загрузка курсов всех валют справочника
   Если Авто=1 Тогда
       Загрузить();
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;
КонецПроцедуры // ПриОткрытии
//******************************************************************************

Процедура ПриПовторномОткрытии()  // Предопределенная
   ЗагрузитьСписокВалют();  
КонецПроцедуры // ПриОткрытии
//******************************************************************************
10 aka AMIGO
 
19.05.10
10:55
а гм в ветку выложить? слабо? :))
есть ведь обменники, куда как проще! slil.ru типа
11 zak555
 
19.05.10
10:56
(10) кстати, глобальник ЗиКа весит 7 МБ
12 aka AMIGO
 
19.05.10
10:58
(11) да, это примерно треть всего мд-шника :)

посмотрел я тут по случаю Рарус-авто, мд-шник 98 мегабайт!! :))
13 Nikitos
 
19.05.10
11:04
(12) Весь Рарус - зло.
14 zak555
 
19.05.10
11:07
(13) +1024
15 Nikitos
 
19.05.10
11:13
+(13) пара кусков кода из одной из Рарусовских конфигураций:

   ТекущийЭлемент    = ЭлементыФормы.ТабличныйДокумент;
   
   // Произведем эмуляцию нажатия клавишь. По ходу дела это единственный способ открыть окно просмотра печати
   WHSShell = Новый COMОбъект("WScript.Shell");
   WHSShell.SendKeys("%");
   WHSShell.SendKeys("~");
   WHSShell.SendKeys("{DOWN 10}");
   WHSShell.SendKeys("~");



Процедура ДействияФормыОткрытьВExcel(Кнопка)
   
   Попытка
       Excel = Новый COMОбъект("Excel.Application");
   Исключение
       Сообщить("ОШИБКА! Приложение MS Excel отутствует или недостаточно прав доступа!
                |    - " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
       Возврат;
   КонецПопытки;
   
   // Откроем табличный документ
   ЭлементыФормы.ТабличныйДокумент.Записать(КаталогВременныхФайлов() + "tmpxls.xls", ТипФайлаТабличногоДокумента.XLS);
   
   Excel.Workbooks.Open(КаталогВременныхФайлов() + "tmpxls.xls");
   
   tmpBook = Excel.Workbooks.Item(Excel.Workbooks.Count);
   
   КнигаExcel = Excel.Workbooks.Add();
   ЛистExcel = КнигаExcel.WorkSheets.Item(1);
   
   tmpBook.Sheets(1).Cells.Copy(ЛистExcel.Cells);
   tmpBook.Close();
   
   //ЛистExcel.Name=ЭтаФорма.ОбъектПредставление;
   Если ЭлементыФормы.ТабличныйДокумент.ОриентацияСтраницы=ОриентацияСтраницы.Портрет Тогда
       ЛистExcel.PageSetup.Orientation = 1;
   Иначе
       ЛистExcel.PageSetup.Orientation = 2;
   КонецЕсли;
   ПолеСлева=ЭлементыФормы.ТабличныйДокумент.ПолеСлева/25.4;
   ПолеСправа=ЭлементыФормы.ТабличныйДокумент.ПолеСправа/25.4;
   ПолеСверху=ЭлементыФормы.ТабличныйДокумент.ПолеСверху/25.4;
   ПолеСнизу=ЭлементыФормы.ТабличныйДокумент.ПолеСнизу/25.4;
   ЛистExcel.PageSetup.LeftMargin = Excel.Application.InchesToPoints(ПолеСлева);
   ЛистExcel.PageSetup.RightMargin = Excel.Application.InchesToPoints(ПолеСправа);
   ЛистExcel.PageSetup.TopMargin = Excel.Application.InchesToPoints(ПолеСверху);
   ЛистExcel.PageSetup.BottomMargin = Excel.Application.InchesToPoints(ПолеСнизу);
   
   КнигаExcel.Activate();
   ЛистExcel.Activate();
   
   Excel.Visible = 1;
   
   //УдалитьФайлы(КаталогВременныхФайлов() + "tmpxls.xls");
   
   Excel = "";
   
КонецПроцедуры    //    ДействияФормыОткрытьВExcel()