![]() |
|
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() |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |