В 1С хранится номенклатура, которая в последствии выгружается на сайт.
Для каждой выгружаемой номенклатуры нужно указать описание! Но не обычный текст, а хорошо оформленный, со списками, курсив, выделение:
Реализовано следующим образом:
Код, который при изменении форматированного документа, помещает кусок HTML кода находящегося в BODY в реквизит ОписаниеОсновное:
&НаКлиенте Процедура фдОсновноеОписаниеПриИзменении(Элемент) Вложение = Новый Структура; текТекст =""; фдОсновноеОписание.ПолучитьHTML(текТекст,Вложение); //Поправим валидность кода текТекст=СтрЗаменить (текТекст, "center'", "center;'"); текТекст=СтрЗаменить (текТекст, "right'", "right;'"); текТекст=СтрЗаменить (текТекст, "justify'", "justify;'"); //Получим текст из BODY Содержимое=текТекст; НачалоБлока = "<body>"; КонецБлока = "</body>"; текТекст = Сред(Содержимое, Найти(Содержимое, НачалоБлока) + СтрДлина(НачалоБлока), Найти(Содержимое, КонецБлока) - Найти(Содержимое, НачалоБлока) - СтрДлина(НачалоБлока)); Объект.ОписаниеОсновное = СокрЛП(текТекст); КонецПроцедуры
При открытии:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) фдОсновноеОписание.УстановитьHTML(Объект.ОписаниеОсновное,Новый Структура); КонецПроцедуры
Соединение = Новый 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); // копируем получившийся формат в таблицу на форме тзПустышка.Выгрузить(тзКурсов);
// ФайлDoc1 - Реквизит ХранилищеЗначения, в нем хранится сам файл // ФайлDoc1Название - Название файла находящегося в ФайлDoc1 ИмяФайла = Строка(КаталогВременныхФайлов())+СокрЛП(Строка(ФайлDoc1Название)); ФайлDoc1.Получить().Записать(ИмяФайла); ЗапуститьПриложение(ИмяФайла);