Погода, курсы валют, RSS 8.3 (Получение информации из интернета для чайников)

02.04.15

Интеграция - WEB-интеграция

Простенькая RSS читалка + прогноз погоды + курсы валют.
Пример использования HTTPСоединение, HTTPЗапрос, Msxml2.XMLHTTP, Msxml2.DOMDocument

Скачать исходный код

Наименование Файл Версия Размер
info.epf
.epf 15,02Kb
54
.epf 1.0 15,02Kb 54 Скачать

Некоторое время назад возникла идея собрать необходимую для "полноценной работы" любого сотрудника информацию в одном месте. Как понятно из названия - это прогноз погоды, курс валют и новости.

"В принципе ничего сложного" - скажете вы, но пришлось повозиться.

Проще всего было с курсами валют и погодой: примеры в интернете + различные сервисы, предоставляющие эту информацию в том или ином виде.

ПОГОДА

Погоду я взял с отечественного Яndex.

Для того, чтобы получить погоду в нужном городе, сначала нужно узнать его ID. Для этого заходим на страницу https://pogoda.yandex.ru/static/cities.xml и ищем город по наименованию. ID Москвы 27612

Я экспериментировал с другими сервисами, везде схожая технология. Где-то сначала нужно получить ID страны, а потом уже ID города, где-то сразу ищем город.

По сути Яндекс хранит прогноз погоды в XML файлах с именем файла равным ID города, поэтому забираем его через обычное HTTPСоединение.

Соединение = Новый HTTPСоединение("export.yandex.ru");
HTTPЗапрос = Новый HTTPЗапрос("weather-ng/forecasts/27612.xml");
HTTPЗапрос.Заголовки.Вставить("Accept-Charset", "utf-8");
ПутьДляСохранения = ПолучитьИмяВременногоФайла();
Результат  = Соединение.Получить(HTTPЗапрос, ПутьДляСохранения);

Далее вскрываем файл:

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьДляСохранения);
ОбъектXDTO_Погода=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

Далее кому что нужно. Можно взять текущие данные, например:

Актуальность  = ОбъектXDTO_Погода.fact.uptime;
Влажность     = ОбъектXDTO_Погода.fact.humidity;
СкоростьВетра = ОбъектXDTO_Погода.fact.wind_speed;
ТипПогоды     = ОбъектXDTO_Погода.fact.weather_type;

А можно вывести прогноз на несколько дней вперед. Я вывожу в таблицу прогноз на 5 дней, поэтому вывод выглядит немного некрасиво + заменяю заголовки колонок:

Ном = 0;
Для Каждого День ИЗ ОбъектXDTO_Погода.day Цикл 
	Если Ном < 5 Тогда
		Ном = Ном + 1;
		СтрДень["Д"+Ном] = День.day_part[4].temperature;
		СтрНочь["Д"+Ном] = День.day_part[5].temperature;
		СтрТип["Д"+Ном] = День.day_part[5].weather_type;

		Элементы["ПрогнозПогодыД"+Ном].Заголовок = Формат(Дата(СтрЗаменить(День.date, "-", "")), "ДФ=dd/MM");
	Иначе
		Прервать;
	КонецЕсли;
КонецЦикла;

в итоге получаем:

Курсы валют

Тут всё почти один-в-один с погодой. Сервис я выбрал rbc.ru. Хранятся курсы в файлах *.tsv, в подпапках с иерархией: tsv/код валюты/год/месяц/день.tsv 

Код доллара: 840

Код евро: 978

Соединение = Новый HTTPСоединение("cbrates.rbc.ru");
HTTPЗапрос = Новый HTTPЗапрос("tsv/"+КодВалюты+"/"+Формат(ТекущаяДата(), "ДФ=/yyyy/MM/dd")+".tsv");

Сохраненный файл, в отличии от погоды, читаем как текстовый документ:

Текст = Новый ТекстовыйДокумент(); 
Текст.Прочитать(ПутьДляСохранения, КодировкаТекста.ANSI);
Стр = Текст.ПолучитьСтроку(1);

Результат:

P.S.: Лично для меня укрпление иностранной валюты это негативная информация, поэтому, в отличие от сайтов: стрелочка вверх - красная, а вниз - зеленая.

RSS

У RSS есть один большущий плюс: Это стандарт, а следовательно, можно взять RSS с любого сайта и не допиливать код.

Но нюансы все же есть. Например, сайт Lenta.ru разбивает новости на категории внутри возвращаемого RSS, а 3Dnews на каждую категорию сделал отдельный RSS адрес, 1c.ru не возвращает текст новости, а только заголовки (т.е. текст пустой). Пришлось добавить немного условий при обработке RSS.

Получение RSS с сайтов немного не тривиально, поскольку путь обычно выглядит так: http://lenta.ru/rss/ или http://www.3dnews.ru/news/rss/ у 1С например http://www.1c.ru/news/rss-2.0.jsp

Получение реализовано через COMОбъект("Msxml2.XMLHTTP"). Код привожу без разнообразных проверок, чтобы не перегружать:

RSS_ComОбъект = Новый COMОбъект("Msxml2.XMLHTTP");
RSS_ComОбъект.open("GET", "http://lenta.ru/rss", false);
RSS_ComОбъект.send();
XMLDocument_RSS = DOM_НовыйXMLДокумент(); //см. ниже
XMLDocument_RSS.LoadXml(RSS_ComОбъект.responseText); 
XMLDocument_RSS.SetProperty("SelectionLanguage","XPath");
XMLDocument_RSS.setProperty("SelectionNamespaces", 
"xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' xmlns:a='http://www.w3.org/2005/Atom'"
);

Поскольку можно не угадать с версией при формировании Msxml2.DOMDocument.4.0, то вынесено в отдельную функцию:

&НаКлиенте
Функция DOM_НовыйXMLДокумент()
	Попытка
		XML = Новый COMОбъект("Msxml2.DOMDocument.4.0");
	Исключение
		ош = ОписаниеОшибки();
		Попытка
			XML = Новый COMОбъект("Msxml2.DOMDocument.3.0");
		Исключение
			ош2 = ОписаниеОшибки();
			Возврат Неопределено;
		КонецПопытки;
	КонецПопытки;

	Возврат XML;
КонецФункции

Таким образом, на выходе у нас в переменной XMLDocument_RSS содержится XML самого RSS канала. Далее обегаем item-ы:

СписокЭлементов = XMLDocument_RSS.XMLDocument.selectNodes("rss/channel/item");
Для Каждого Элемент ИЗ СписокЭлементов Цикл
	Описание  = Элемент.selectSingleNode("description").text;
	Ссылка    = Элемент.selectSingleNode("link").text;
	Заголовок = Элемент.selectSingleNode("title").text;
	Категория = Элемент.selectSingleNode("category").text;
	Дата      = Элемент.selectSingleNode("pubDate").text;
КонецЦикла;

В обработке на самом деле есть проверки, преобразование формата даты и обработка текста новости. У 3Dnews, например, там много мусора: тэги, коды символов, ссылки на картинки т.д.

Отдельно по поводу картинок - их я не загружаю специально. Причины 2:

1. Вывод новостей идёт в таблицу. Вставка картинок большого размера в ячейку отрабатывает некорректно. Либо картинка маленькая, либо залезает на соседние ячейки. Надеюсь, это глюк платформы и в будущем всё будет нормально.

2. Трафик

Никаких уникальных технологий не применялось, всё сделано именно на уровне "для чайников", из-за этого кому-то код может показаться "не на уровне". Так что пожелания и конструктивная критика - приветствуются. 

Если где-то описал сумбурно и требуется больше пояснений или кода - готов откорректировать.

HTTPСоединение HTTPЗапрос Msxml2.XMLHTTP Msxml2.DOMDocument

См. также

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17847    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25855    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88877    162    216    

318

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16464    42    49    

23

Merlion Commander Версия 1.3.9.2 - июль 2022 г. (Интеграция с 1С: УT, редакция 11.4, 1С:Розница 2.3,1С:ERP Управление предприятием 2, УТ 10.3, редакция веб-сервиса MERLION API 3.0 от 18.08.2021)

Оптовая торговля Розничная торговля WEB-интеграция Платформа 1С v8.3 1С:Управление торговлей 11 Россия Платные (руб)

Расширении конфигурации "Управление торговлей, редакция 11" для работы с веб-сервисом Мерлион с помощью Merlion API. Расширение и набор подключаемых дополнительных обработок позволяет без изменения конфигурации получить возможность работы с API крупнейшего российского дистрибьютора http://merlion.com. Логика работы максимально приближена к работе веб-сервиса b2b. Вы сможете создать и исправить заказ, зарезервировать товар прямо из 1С, посмотреть актуальные остатки и цены, импортировать штрихкода EAN13 товаров, загружать заказ c автоматическим созданием номенклатуры в 1С и корректности создания. Можно выбирать характеристики по товарным группам и загружать товар с выбранными характеристиками, загружать изображения товара. Не требуется установки дополнительного ПО для работы с веб-сервисом. Кроссплатформенное решение для ОС Windows и Linux. Весь код модулей открыт и доступен для просмотра и внесения изменений.

8280 руб.

02.05.2017    40955    43    64    

50
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Aleksey.Bochkov 3661 03.04.15 05:53 Сейчас в теме
1С не возвращает текст новости, а только заголовки (т.е. текст пустой)

У меня все нормально загрузилось через HTTPСоединение.
http://i.imgur.com/nqwp7eG.png
2. Silmariil 157 03.04.15 07:05 Сейчас в теме
(1) Aleksey.Bochkov, имелось ввиду что конкретно сайт 1c.ru не использует текст новости в RSS, а только заголовки. Скорректировал в статье.
3. AganinEvgeniy 2 08.04.15 11:46 Сейчас в теме
У меня немного иначе реализован алгоритм получения курсов валют, так как столкнулся с проблемой безопасности. В смысле настроен иса сервер, который обычные запросы в интернет блокирует, пришлось воспользоваться найденной в своё время процедурой XML запроса (к сожалению за давностью лет уже и не упомню откуда она бралась), немного подкорректированной под свои нужды. Может кому-нибудь и пригодится:
Функция ЗапроситьФайлыССервера(СерверИсточникПараметр, СтрокаПараметраПолученияПараметр, ИмяВходящегоФайлаПараметр, HTTP = Неопределено) Экспорт

СерверИсточник = СерверИсточникПараметр;
СтрокаПараметраПолучения = СтрокаПараметраПолученияПараметр;
ИмяВходящегоФайла = ИмяВходящегоФайлаПараметр;
Попытка
aUrlRequest = "http://" + СерверИсточникПараметр + "/" + СтрокаПараметраПолучения;

oXMLHTTP = Новый COMОбъект("MSXML2.XMLHTTP");
oXMLHTTP.open("GET",aUrlRequest, False );
oXMLHTTP.Send();
FSO = Новый COMОбъект("Scripting.FileSystemObject");
Fso.CreateTextFile(ИмяВходящегоФайла,True);
FileFso =Fso.OpenTextFile(ИмяВходящегоФайла,2,True);
FileFso.writeline(oXMLHTTP.responseText);

Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;


КонецФункции

Процедура ПриОткрытии()
СерверИсточник = "cbrates.rbc.ru";
HTTP = Новый HTTPСоединение(СерверИсточник);
Адрес = "tsv/";
ТМП = Строка(Формат(ТекущаяДата(), "ДФ=/yyyy/MM/dd"));
ВремКаталог = "C:\\Kurses\download\";//Указываем любой каталог, в который будем записывать данные
СоздатьКаталог(ВремКаталог);
УдалитьФайлы(ВремКаталог,"*.*");
СпрВал = Справочники.Валюты.Выбрать();
Пока СпрВал.Следующий() Цикл
Если СпрВал.ПометкаУдаления Тогда
Продолжить;
КонецЕсли;
ИмяВходящегоФайла = ВремКаталог + Прав(СпрВал.Код,3) + ".txt";
СтрокаПараметраПолучения = Адрес + Прав(СпрВал.Код,3) + ТМП + ".tsv";
Если ЗапроситьФайлыССервера(СерверИсточник, СтрокаПараметраПолучения, ИмяВходящегоФайла, HTTP) <> Истина Тогда
Сообщить("Не удалось получить ресурс для валюты " + СокрЛП(СпрВал.Наименование) + " (код " + СпрВал.Код + "). Курс для валюты не загружен.");
Продолжить;
КонецЕсли;
// Далее блок чтения и записи курсов
КонецЦикла;
КонецПроцедуры
4. Yashazz 4722 08.04.15 19:04 Сейчас в теме
Забавно. Такие баянчики до сих пор популярны, хотя это всё считалось давно открытой америкой ещё в 2008-09 гг. Автор, а зачем нужно было юзать Msxml2.DOMDocument?
5. Silmariil 157 08.04.15 19:21 Сейчас в теме
(4) Yashazz, затем что другого способа не нашел. Поделитесь опытом, с радостью перейму опыт.
6. grum01 115 09.04.15 05:13 Сейчас в теме
А я вот так и не смог забрать погоду с gismeteo.
У кого-нибудь получалось? Даже гугля по этому поводу молчит...
7. ZIGRAS 18.01.16 21:20 Сейчас в теме
А дает ли яндекс картинки к погоде?
8. пользователь 12.01.20 16:39
Сообщение было скрыто модератором.
...
9. jan-pechka 408 25.02.22 10:04 Сейчас в теме
Не запускается обработка...выдает ошибку(см.скрин)
Прикрепленные файлы:
Оставьте свое сообщение