Перем ИмяПути,ИмяФайла; Перем xmlParser; //пример чтения xml файла. Функция УстановитьКомпоненту() Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"ExtFormsv7plus.dll")=0 Тогда Если ЗагрузитьВнешнююКомпоненту("v7plus.dll")=0 Тогда Сообщить("Не удалось обнаружить компоненту V7Plus.dll!"); Возврат 0; КонецЕсли; КонецЕсли; Попытка xmlParser = СоздатьОбъект("Addin.XmlParser") ; Исключение Сообщить("Не удалось создать объект Addin.XmlParser!"); Возврат 0; КонецПопытки; Возврат 1; КонецФункции // УстановитьКомпоненту Процедура Выполнить() стрИмяФайла=ИмяПути+ИмяФайла; таб=СоздатьОбъект("ТаблицаЗначений"); таб.НоваяКолонка("Ф","Строка",50,0); таб.НоваяКолонка("И","Строка",50,0); таб.НоваяКолонка("О","Строка",50,0); таб.НоваяКолонка("ДатаР","Дата"); таб.НоваяКолонка("_01","Число",16,2); таб.НоваяКолонка("_02","Число",16,2); таб.НоваяКолонка("_03","Число",16,2); таб.НоваяКолонка("_04","Число",16,2); таб.НоваяКолонка("_05","Число",16,2); таб.НоваяКолонка("_06","Число",16,2); таб.НоваяКолонка("_07","Число",16,2); таб.НоваяКолонка("_08","Число",16,2); таб.НоваяКолонка("_09","Число",16,2); таб.НоваяКолонка("_10","Число",16,2); таб.НоваяКолонка("_11","Число",16,2); таб.НоваяКолонка("_12","Число",16,2); таб.НоваяКолонка("СумГод","Число",18,2); таб.НоваяКолонка("ОблГод","Число",18,2); таб.НоваяКолонка("УдерГод","Число",18,2); таб.НоваяКолонка("Индекс","Строка",6,0); таб.НоваяКолонка("Регион","Строка",2,0); таб.НоваяКолонка("Город","Строка",20,0); таб.НоваяКолонка("Улица","Строка",20,0); таб.НоваяКолонка("Дом","Строка",5,0); таб.НоваяКолонка("Корпус","Строка",5,0); таб.НоваяКолонка("Квартира","Строка",5,0); Документ=xmlParser.СоздатьДокумент(); Документ.Загрузить(стрИмяФайла); Данные=Документ.ПолучитьПодчиненныйПоНомеру(2); Для Сч=1 По Данные.КоличествоПодчиненных() Цикл таб.НоваяСтрока(); Элем=Данные.ПолучитьПодчиненныйПоНомеру(Сч); УзелПолучДох=Элем.ВыбратьУзлы("ПолучДох"); Для Сч3=0 По УзелПолучДох.КоличествоУзлов-1 Цикл // Сообщить(УзелПолучДох.ПолучитьУзел(Сч3).ПредставлениеXML); // Сообщить(УзелПолучДох.ПолучитьУзел(Сч3).КоличествоПодчиненных()); ФИО=УзелПолучДох.ПолучитьУзел(Сч3).ПолучитьПодчиненныйПоНомеру(1); таб.Ф=ФИО.ПолучитьПодчиненныйПоНомеру(1).Текст; таб.И=ФИО.ПолучитьПодчиненныйПоНомеру(2).Текст; таб.О=ФИО.ПолучитьПодчиненныйПоНомеру(3).Текст; таб.ДатаР=УзелПолучДох.ПолучитьУзел(Сч3).ПолучитьПодчиненныйПоНомеру(3).Значение; адр=УзелПолучДох.ПолучитьУзел(Сч3).ПолучитьПодчиненныйПоНомеру(6); Для Сч4=1 По адр.КоличествоПодчиненных() Цикл Если адр.ПолучитьПодчиненныйПоНомеру(Сч4).Наименование="Индекс" Тогда таб.Индекс=адр.ПолучитьПодчиненныйПоНомеру(Сч4).Текст; ИначеЕсли адр.ПолучитьПодчиненныйПоНомеру(Сч4).Наименование="КодРегион" Тогда таб.Регион=адр.ПолучитьПодчиненныйПоНомеру(Сч4).Текст; ИначеЕсли адр.ПолучитьПодчиненныйПоНомеру(Сч4).Наименование="Город" Тогда таб.Город=адр.ПолучитьПодчиненныйПоНомеру(Сч4).Текст; ИначеЕсли адр.ПолучитьПодчиненныйПоНомеру(Сч4).Наименование="Улица" Тогда таб.Улица=адр.ПолучитьПодчиненныйПоНомеру(Сч4).Текст; ИначеЕсли адр.ПолучитьПодчиненныйПоНомеру(Сч4).Наименование="Дом" Тогда таб.Дом=адр.ПолучитьПодчиненныйПоНомеру(Сч4).Текст; ИначеЕсли адр.ПолучитьПодчиненныйПоНомеру(Сч4).Наименование="Корпус" Тогда таб.Корпус=адр.ПолучитьПодчиненныйПоНомеру(Сч4).Текст; ИначеЕсли адр.ПолучитьПодчиненныйПоНомеру(Сч4).Наименование="Кварт" Тогда таб.Квартира=адр.ПолучитьПодчиненныйПоНомеру(Сч4).Текст; Иначе /////// КонецЕсли; КонецЦикла; КонецЦикла; УзелСвДохСтав=Элем.ВыбратьУзлы("СвДохСтав"); Для Сч3=0 По УзелСвДохСтав.КоличествоУзлов-1 Цикл //ел=УзелСвДохСтав.ПолучитьУзел(Сч3); УзелДохВыч=УзелСвДохСтав.ПолучитьУзел(Сч3).ВыбратьУзлы("ДохВыч"); Для Сч4=0 По УзелДохВыч.КоличествоУзлов-1 Цикл МесДоход=УзелДохВыч.ПолучитьУзел(Сч4); ИмяМес=""; СумМес=0; Если МесДоход.ПолучитьПодчиненныйПоНомеру(1).Наименование="НомМес" Тогда ИмяМес=МесДоход.ПолучитьПодчиненныйПоНомеру(1).Текст; КонецЕсли; Если МесДоход.ПолучитьПодчиненныйПоНомеру(3).Наименование="СумДоход" Тогда СумМес=МесДоход.ПолучитьПодчиненныйПоНомеру(3).Значение; КонецЕсли; Если ПустоеЗначение(ИмяМес)=0 Тогда Если ИмяМес="01" Тогда таб._01=СумМес; ИначеЕсли ИмяМес="02" Тогда таб._02=СумМес; ИначеЕсли ИмяМес="03" Тогда таб._03=СумМес; ИначеЕсли ИмяМес="04" Тогда таб._04=СумМес; ИначеЕсли ИмяМес="05" Тогда таб._05=СумМес; ИначеЕсли ИмяМес="06" Тогда таб._06=СумМес; ИначеЕсли ИмяМес="07" Тогда таб._07=СумМес; ИначеЕсли ИмяМес="08" Тогда таб._08=СумМес; ИначеЕсли ИмяМес="09" Тогда таб._09=СумМес; ИначеЕсли ИмяМес="10" Тогда таб._10=СумМес; ИначеЕсли ИмяМес="11" Тогда таб._11=СумМес; ИначеЕсли ИмяМес="12" Тогда таб._12=СумМес; КонецЕсли; КонецЕсли; КонецЦикла; УзелНалПер=УзелСвДохСтав.ПолучитьУзел(Сч3).ВыбратьУзлы("СГДНалПер"); НалПер=УзелНалПер.ПолучитьУзел(0); Если НалПер.Наименование="СГДНалПер" Тогда таб.СумГод=НалПер.ПолучитьПодчиненныйПоНомеру(1).Значение; таб.ОблГод=НалПер.ПолучитьПодчиненныйПоНомеру(2).Значение; таб.УдерГод=НалПер.ПолучитьПодчиненныйПоНомеру(3).Значение; КонецЕсли; //тут еще берем данные КонецЦикла; Состояние(Сч); КонецЦикла; Т=СоздатьОбъект("Таблица"); Т.ИсходнаяТаблица("Таблица"); таб.выбратьСтроки(); Т.ВывестиСекцию("Шапка"); нпп=1; Пока таб.ПолучитьСтроку()=1 Цикл Т.ВывестиСекцию("Текст"); нпп=нпп+1; КонецЦикла; Т.ТолькоПросмотр(1); Т.Опции(0, 0, 1, 0); // Т.ОбластьПечати(2); Т.ПараметрыСтраницы(2,,,5,5,5,5,,, 1); Т.Показать("Прочитали из XML"); КонецПроцедуры Процедура Выбрать() ФС.ВыбратьФайл(0,ИмяФайла,ИмяПути,"Выберите файл","xml файлы (*.xml) |*.xml|Все файлы (*.*) |*.*","xml", ); Если ПустоеЗначение(ИмяФайла)=0 Тогда PathSbitn=ИмяПути+ИмяФайла; КонецЕсли; КонецПроцедуры //Выбрать Процедура ПриОткрытии() ИмяФайла =""; ИмяПути = "P:"; res=УстановитьКомпоненту(); // Сообщить(res); КонецПроцедуры //ПриОткрытии
Соединение = Новый 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); // копируем получившийся формат в таблицу на форме тзПустышка.Выгрузить(тзКурсов);
Выборка = ПользователиИнформационнойБазы.ПолучитьПользователей(); Для Каждого ЭлементМассива Из Выборка Цикл ИмяПользователя = ЭлементМассива.Имя; ПолноеИмяПользователя = ЭлементМассива.ПолноеИмя; ЕстьПароль = ЭлементМассива.ПарольУстановлен; Роли = ЭлементМассива.Роли; Для Каждого Роль Из Роли Цикл ИмяРоли = Роль.Имя; КонецЦикла; КонецЦикла;
// Функция возвращает список зарегистрированных для выбранной // базы пользователей. Если пользователи не определены, список // будет пуст. // функция сзПолучитьПользователей(стрПутьКБазе) // Создаем список значений для возврата Ответ = создатьобъект("СписокЗначений"); // Формируем полное имя файла, в котором 1С // хранит информацию о пользователях базы. стрИмяФайла = стрПутьКБазе + "\UsrDEF\Users.USR"; // Проверим его наличие. если фс.СуществуетФайл(стрИмяФайла) > 0 тогда // Создаем объект FSO для работы с файлами. обФСО = создатьобъект("Scripting.FileSystemObject"); // Открываем файл пользователей как текстовый. тхтФайл = обФСО.OpenTextFile(стрИмяФайла); // Инициализация первоначальных переменных // Загружаем в буфер(тестовую строку) информацию из файла. стрБуфер = ""; чисПозиция = 0; // Перебеирать файл придеться посимвольно, так как 1С не совсеми // символами может работать коректно если они находяться в строке. пока тхтФайл.AtEndOfStream = 0 цикл // Получаем очередную позицию в файле. чисПозиция = чисПозиция + 1; // Получаем символ из данной позиции. стрСимв = тхтФайл.Read(1); // Если код символа больше 31 если кодсимв(стрСимв) > 31 тогда // Тогда добавляем его к буферу. стрБуфер = стрБуфер + стрСимв; конецесли; конеццикла; // После формирования буфера начнем искать пользователей в нем. // Признаком для пользователя будет строка '{"UserItemType","Page.' стрПоиска = "{""UserItemType"",""Page."; // Получаем позицию первого пользователя. чисПозиция = найти(стрБуфер, стрПоиска); // Проверяем если в буфере нужная нам строка если чисПозиция > 0 тогда // Если есть, вырезаем из строки ненужную информацию. стрБуфер = сред(стрБуфер, чисПозиция); // Позиция после отрезания становиться в единицу чисПозиция = 1; конецесли; // В цикле получаем информацию о пользователях БД пока чисПозиция > 0 цикл // Удаляем из буфера 'мусор' стрБуфер = сред(стрБуфер, чисПозиция + 22); // Находим признак начала информации об имени пользователя. чисСмещение = найти(стрБуфер, """,""") + 3; // Перемещаем начало буфера на начало информации об имени пользователя стрБуфер = сред(стрБуфер, чисСмещение); // Получаем имя пользователя стрИмяПользователя = лев(стрБуфер, найти(стрБуфер, """,""") - 1); // Добовляем имя к нашему списку. Ответ.ДобавитьЗначение(стрИмяПользователя); // Получаем очередную позицию информации о пользователе чисПозиция = найти(стрБуфер, стрПоиска); конеццикла; конецесли; // Возращаем полученный список значений содержащий в себе список пользователей базы возврат Ответ; конецфункции