Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯчейки, Док, ТекстВЯчейке, ТабКурсов; Url = "http://www.bank.gov.ua/control/uk/curmetal/currency/search?formType=searchFormDate&time_step=" + ?(Ежедневно = 1, "daily", "monthly") + "&date=" + Формат(ДатаКурса, "ДДДММГГГГ") + "&outer=table&execute=run&time=" + _GetPerformanceCounter(); Сообщить(Url); Reader = СоздатьОбъект("MSXML2.XMLHTTP"); Reader.Open("Get", Url, 0); Reader.Send(); Пока Reader.ReadyState <> 4 Цикл Состояние("Чтение данных за <" + ДатаКурса + "> "); КонецЦикла; Док = СоздатьОбъект("HtmlFile"); Док.open("text/html"); Док.write(Reader.ResponseText); Док.close(); HtmlTab = Док.getElementsByTagName("table").item(5); ТабКурсов = СоздатьОбъект("ТаблицаЗначений"); ТабКурсов.НоваяКолонка("ЦифрКод" , "Строка", 3, , "Цифр. код"); ТабКурсов.НоваяКолонка("БуквКод" , "Строка", 3, , "Букв. код"); ТабКурсов.НоваяКолонка("Название" , "Строка"); ТабКурсов.НоваяКолонка("Курс" , "Число" ,14, 4); ТабКурсов.НоваяКолонка("Кратность" , "Число" , 9, 0); Строк = HtmlTab.rows.length; Для НомСтроки = 1 По Строк Цикл Р = HtmlTab.rows(НомСтроки - 1); Если (НомСтроки = 1) Или (Р.cells.length <> 5) Тогда // 1 - я заголовок, остальные не с данными Продолжить; КонецЕсли; ТабКурсов.НоваяСтрока(); ТабКурсов.ЦифрКод = СокрЛП(Р.cells(0).innerText); ТабКурсов.БуквКод = СокрЛП(Р.cells(1).innerText); ТабКурсов.Название = СокрЛП(Р.cells(3).innerText); ТабКурсов.Курс = 0 + СтрЗаменить(СокрЛП(Р.cells(4).innerText), " ", ""); ТабКурсов.Кратность = 0 + СтрЗаменить(СокрЛП(Р.cells(2).innerText), " ", ""); КонецЦикла; Reader = 0; ТабКурсов.ВыбратьСтроку(, "Курсы за " + ДатаКурса); Возврат ТабКурсов; КонецФункции
Файл = "C:\files\demo.mdb" ; //СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Файл + "; Extended Properties=""Excel 8.0;HDR=NO;"""; СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Файл + ";"""; Connection = Новый COMОбъект("ADODB.Connection"); Попытка Connection.Open(СтрокаПодключения); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Command.CommandText = "S_elect * FROM Table1"; Command.CommandType = 1; RecordSet = Новый COMОбъект("ADODB.RecordSet"); RecordSet = Command.Execute(); стр =""; Пока RecordSet.EOF() = 0 Цикл для н=0 по Recordset.Fields.Count -1 цикл стр = стр + " " + Recordset.Fields(н).Value; КонецЦикла; Сообщить(стр); стр =""; RecordSet.MoveNext(); КонецЦикла; RecordSet.Close(); Connection.Close();
Акцесс = СоздатьОбъект("ADODB.CONNECTION"); Попытка СтрокаПодключения="Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mybase.mdb;Uid=Admin;Pwd="; Акцесс.Open(СтрокаПодключения); Исключение Сообщить("Все плохо:"+ОписаниеОшибки()); Возврат; КонецПопытки; Команда = СоздатьОбъект("ADODB.Command"); Команда.ActiveConnection=Акцесс; ТекстСелект = "S_elect * FROM tblCustoms"; НаборЗаписей = СоздатьОбъект("ADODB.RecordSet"); Команда.CommandText=ТекстСелект; Попытка НаборЗаписей=Команда.Execute; Исключение Сообщить("Обломись:"+ОписаниеОшибки()); КонецПопытки; Попытка НаборЗаписей.MoveFirst(); Исключение //нет записей в рекордсете НаборЗаписей.Close(); Возврат; КонецПопытки; Пока НаборЗаписей.EOF()=0 Цикл ИНН = НаборЗаписей.Fields("INN").Value; //ну и т.д. НаборЗаписей.MoveNext(); КонецЦикла; НаборЗаписей.Close(); // Для тех, у кого в базе Акцесс создана рабочая группа (есть файлик mdw), строка подключения будет такая: СтрокаПодключения="Driver= Microsoft Access Driver (*.mdb)};systemDB=C:\wg.mdw;Dbq=C:\mybase.mdb;Uid=Admin;Pwd=";
Процедура Выполнить() //фасВладелец = СтрЗаменить(фасВладелец," ","_"); Спр = СоздатьОбъект("Справочник.ТоварыВПрайсе"); Спр.ИспользоватьВладельца(ФасВладелец); dbe = СоздатьОбъект("dao.DBEngine.36"); wksp = dbe.Workspaces(0); db = 0; Если ФС.СуществуетФайл(КаталогИБ()+"Pric_list.mdb")=0 Тогда // db = wksp.CreateDataBase(КаталогИБ()+"Pric_list.mdb",";LANGID=0x0419;Cp=1251;Country=0"); // db.Execute("Create table [" + Строка(фасВладелец) + "] |(Rec_ind integer, |Код text, |Артикул text, |Цена integer, |Товар text, |Единица text, |Val text);" ); db.Execute("Create index Rec_ind on ["+Строка(фасВладелец)+"] (Rec_ind);"); Иначе db= wksp.OpenDataBase(КаталогИБ()+"Pric_list.mdb"); Попытка rs = db.OpenRecordset(Строка(фасВладелец)); Исключение Сообщить("Создается новая таблица"); КонецПопытки; Если ПустоеЗначение(rs)= 1 Тогда db.Execute("Create table [" + Строка(фасВладелец) + "] |(Rec_ind integer, |Код text, |Артикул text, |Цена integer, |Товар text, |Единица text, |Val text);" ); db.Execute("Create index Rec_ind on ["+Строка(фасВладелец)+"] (Rec_ind);"); КонецЕсли; db.Execute("Delete * From ["+Строка(фасВладелец)+"];"); КонецЕсли; rs = db.OpenRecordset(Строка(фасВладелец)); Y = 1; Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл лсЕдиницы = ""; Если Спр.асТовар.апТип=Перечисление.ТипТовара.Услуга Тогда лсЕдиницы = ""; ИначеЕсли Спр.асТовар.апТип=Перечисление.ТипТовара.Весовой Тогда лсЕдиницы = "г"; ИначеЕсли Спр.асТовар.апТип=Перечисление.ТипТовара.Штучный Тогда лсЕдиницы = "шт."; КонецЕсли; Если Спр.ЭтоГруппа() = 0 Тогда rs.AddNew(); rs.Rec_ind = Y; rs.Код= Спр.асТовар.ПолныйКод(); rs.Артикул = Спр.асТовар.сАртикул; rs.Цена = Спр.чЦена; rs.Товар=Спр.асТовар.сПолнНаименование; rs.Единица = лсЕдиницы; rs.Val = Спр.асВалюта.Код; rs.Update(); Y=Y+1; КонецЕсли; КонецЦикла; db.Close(); Сообщить("Выгрузка завершена"); КонецПроцедуры
Процедура ACCESS() dbe=CreateObject("DAO.DBEngine.36"); wksp=dbe.Workspaces(0); db=0; // в ковычках имя фаила с расширением MDB Если ФС.СуществуетФайл(КаталогПользователя()+"sr.mdb")=0 Тогда // создание файла базы данных с русским порядком сортировки db=wksp.CreateDataBase(КаталогПользователя()+"mars_sr.mdb",";LANGID=0x0419;CP=1251;COUNTRY=0"); // DDL - запрос на создание таблицы // описание языка DDL (подмножество SQL) смотрите в хелпе по MS Access // не пытайтесь делать это с другими форматами - DDL через DAO поддерживается только для MDB //Создадим еще таблицу db.Execute("CREATE TABLE BANKS |(REC_IND INTEGER, |BANKCODE INTEGER, |BANKNAME TEXT , |ModifiedFlg BIT, |ChangeSeqFlg BIT);" ); // индекс на нужные поля db.Execute("CREATE INDEX REC_IND ON BANKS (REC_IND);"); Иначе // просто открываем базу данных в разделенном режиме db=wksp.OpenDataBase(КаталогПользователя()+"sr.mdb"); // и очищаем имеющиеся данные db.Execute("DELETE * FROM BANKS;"); КонецЕсли; // rs-это как раз сама таблица, куда мы будем добавлять записи rs=db.OpenRecordset("BANKS"); // добавление записи rs.AddNew(); // присвоение значений полям rs.REC_IND = "1"; rs.BANKCODE = "34"; rs.BANKNAME = "Инвест"; rs.ModifiedFlg = "1"; // запомним запись rs.Update(); // и так далее ... db.Close(); // закрытие базы данных КонецПроцедуры
Соединение = Новый 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"+СтрокаСоединения); КонецПопытки; КурсыТекст=Новый ТекстовыйДокумент; //читаем результат запроса КурсыТекст.Прочитать(ИмяФайла);
// еще пример Функция ПолучитьКакСтроку(Адресс) соминет = Новый 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; КонецЦикла; КонецЕсли; КонецЦикла; КонецПроцедуры
// Взято с 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); // копируем получившийся формат в таблицу на форме тзПустышка.Выгрузить(тзКурсов);