Погодка это расширение конфигурации Бухгалтерия предприятия 3.0, которое показывает прогноз погоды по данным с сайта yandex.ru
Вот так просто и замечательно:
Для тех, кто торопится. Как установить и настроить:
- Заполните фактический адрес организации используя загруженный в базу КЛАДР
- Установите расширение. Инструкция по установке расширений конфигураций разработана уважаемым mrXoxot и я с удовольствием её рекомендую
- На начальной странице в поле "Организация" установите вашу организацию
- Теперь ненастье не застанет вас врасплох
Для тех, кто не торопится. Что там внутри:
Как устроена погода Yandex
Если точнее, то как виджеты погоды получают данные прогноза? Для виджетов Яндекс предоставляет два ресурса и один справочник. Справочник городов и их идентификаторов находится по адресу https://pogoda.yandex.ru/static/cities.xml В справочнике множество стран и много городов, вплоть до районных центров. Яндекс предоставляет погоду только тех населённых пунктов, которые есть в справочнике. По городу из XML необходимо получить ID города из аргумента "id"
Имея ID города получаем прогноз погоды с ресурса http://export.yandex.ru/weather-ng/forecasts/34560.xml, где 34560.xml это документ с прогнозом погоды для города с ID=34560 (Волгоград).
И последнее, Яндекс предоставляет ресурс с картинками погоды http://img.yandex.net/i/wiz%1.png, где %1 код картинки который находится в документе прогноза в теге <image>. Например http://img.yandex.net/i/wizn7.png
Получение ID города
XML с идентификаторами городов разбирается последовательным чтением XML. Процесс чтения оптимизирован. Сперва читаю атрибут name тега <country> и если страна "не наша", то пропускаю все дочерние узлы. Таким образом, пока страна не соответствует целевой, города не читаются.
Погодка определяет город по организации, которая указана на начальной странице:
Если поле "Организация" не заполнено, то информер не отображается. Страну и город расширение получает из фактического адреса организации. Для получения города из адреса используется метод БСП:
сГородОрганизации = УправлениеКонтактнойИнформацией.ГородАдресаКонтактнойИнформации(сАдресОрганизацииXML);
Особенность этого метода в форме подачи аргумента. Адрес на входе метода должен быть в виде XML документа. Адрес в виде строки преобразует в "Адрес XML" метод КонтактнаяИнформацияXMLПоПредставлению(), однако для работы этого метода требуется загруженный в базу справочник КЛАДР. Аналогичная ситуация и со страной.
Если удалось получить страну и город из адреса организации, то дальше получаем с Яндекса справочник городов и по стране и городу находим ID города.
Попытка экономить трафик
При смене организации на начальной странице запускается процедура получения ID города. В случае успешного получения ID города расширение записывает его в дополнительные сведения справочника "Организации". Это сделано для того, чтобы не гонять зря трафик и процессор. В дальнейшем, если значение дополнительного сведения заполнено, то ID города не получается из Интернета а берётся из дополнительного сведения.
Дополнительное сведение ИДГородаДляИнформераПогоды в план видов характеристик расширение добавляет программно.
Лайфхак. Если фактический адрес организации находится в населённом пункте для которого Яндекс не получает погоду, поставьте в дополнительное свойство ИДГородаДляИнформераПогоды ID ближайшего города для которого есть прогноз погоды. Погодка будет показывать прогноз для указанного вами города.
XML с прогнозом погоды в xdtoДокумент
При разработке расширения была поставлена задача работать с прогнозом погоды как с документом. Цель такого решения чисто образовательная. XDTO поддался не с первого раза.
Попытка загружать XML документ в XDTO без схемы XML показала свою не дееспособность. Основные претензии:
- с типами всё плохо а точнее в XDTO документе все данные это текст;
- работа со значениями узлов через последовательность объекта (документация с its.1c.ru) - то ещё удовольствие
Встала задача получить XSD схему прогноза погоды Яндекс. Поиск в Интернете готовой схемы не дал. Народ чаще всего этот XML разбирает вручную.
Было решено построить схему XSD по документу XML с прогнозом погоды. Перепробовано множество способов и инструментов по преобразованию XML2XSD и в конце концов остановился на Free XML to XSD generator Вот некоторые детали, с которыми пришлось столкнуться при получении схемы XML:
- Нет бесплатных инструментов для ручного построения схемы. Есть платные монстры Liquid XML Studio
- XSD схемы могут быть разных дизайнов. Самые популярные: Венецианские жалюзи (Venetian Blind Design), Матрёшка (Russian Doll Design), Колбасные дольки (Salami Slice Design) Для построения xdtoДокумента с помощью фабрики XDTO подходит только схема с дизайном Венецианские жалюзи (возможно я ошибаюсь, но сделать XDTO документ по XML схеме с другим дизайном мне не удалось)
- После получения XSD с помощью того или иного инструмента, в схеме возможны огрехи в простых типах. Так например, если в исходном XML файле значение температуры было 2 градуса, то тип данного узла может быть определён как xs:unsignetByte, хотя, конечно же нужен тип xs:byte
- XML файл с которого генерируется схема может быть неполон. Работа с такой схемой чревата проблемой валидации конкретного XML при построении xdtoДокумента. Наглядный пример: прогноз погоды для Хабаровска не проходил валидацию при построении xdtoДокумента. Оказалось, что для Хабаровска в прогнозе дополнительно подаётся температура воды в Тихом океане water_temperature (Возможно, что-то ещё не учтено. Пишите в комментариях города для которых Погодка валится с ошибкой)
- Для некоторых элементов схемы, которые находятся внутри последовательности xs:sequence, приходится ставить параметр minOccurs="0", который разрешает быть этому элементу необязательным. Как в примере с температурой воды.
- Если XSD файл загрузить в объект конфигурации XDTOПакет то становится удобно выполнять разные тонкие настройки
- В расширениях нет (пока, но обещали исправить) возможности загружать XSD файл в XDTO пакет, поэтому в Погодке схема XML хранится в коде программы
Схему прогноза погоды Яндекс в виде XSD файла я приложу для бесплатного скачивания.
Что отображается на информере:
Если расширению данные о погоде получить не удалось, то вместо информера отображается чистая строка. Если данные получены успешно то в информер выводится следующая информация:
- В заголовке информера, после слов "Погода сегодня", отображается время составления прогноза метеорологической службой. Путь к данным в xdtoДокументе: xdtoДокумент.fact.observation_time Кстати, погода в течении суток обновляется не равномерно. Ночью метеорологическая служба похоже спит.
- Картинка погоды на сегодня и завтра. Картинка при каждом обновлении прогноза загружается с сайта img.yandex.net В расширении конфигурации картинки не хранятся. Путь к данным картинки на сегодня в xdtoДокументе: xdtoДокумент.fact.image.__content, на завтра: xdtoДокумент.day[1].day_part[4].image.__content
- Значение температуры в градусах цельсия на сегодня и завтра. Путь к данным картинки на сегодня в xdtoДокументе: xdtoДокумент.fact.temperature.__content, на завтра: xdtoДокумент.day[1].day_part[4].temperature_data.avg.__content
- Цветная подложка под температурой, которая контекстно меняет цвет. Чем теплее на улице тем оранжевее и на оборот, чем холоднее тем фиолетевее. Путь к данным цвета подложки на сегодня в xdtoДокументе: xdtoДокумент.fact.temperature.color, на завтра: xdtoДокумент.day[1].day_part[4].temperature_data.avg.bgcolor
Интерфейсные мучения
Изначально информацию о погоде планировалось выводить на экран используя объект ФорматированнаяСтрока. Это классный объект, который позволяет манипулировать штифтами, цветами, картинками, ссылками и в общем случае делать чудеса оформления. В ходе экспериментов обнаружил ограничение этого объекта, которое свело на нет все достоинства. ФорматированнаяСтрока в качестве картинок может использовать только картинки с видом ИзБиблиотеки, т.е. загруженные в конфигурацию. Погодка же картинки погоды берёт с Яндекса при каждом обновлении прогноза.
В результате информация выводится в поля, во много полей, поэтому информер визуально выглядит таким "рыхлым". Но я предпочитаю говорить, что это дизайн с большим количеством "воздуха".
Настройки информера
Пока у Погодки простые настройки. В процедуре УстановитьПараметрыИнформера() расширения находятся все необходимые опции.
Процедура УстановитьПараметрыИнформера()
// МОЖНО ИЗМЕНЯТЬ
ИС_Погода_ПериодПроверкиПогодыСек = 3600;
бОшибкуВЖурналРегистрации = Истина;
// ИЗМЕНЯТЬ НЕ РЕКОМЕНДУЕТСЯ
URL_export_yandex = "http://export.yandex.ru/weather-ng/forecasts/%1.xml";
URL_pogoda_yandex = "https://pogoda.yandex.ru/static/cities.xml";
URL_img_yandex = "http://img.yandex.net/i/wiz%1.png";
СоединениеHTTP_export_yandex = ПолучитьСоединениеHTTP(URL_export_yandex);
СоединениеHTTP_pogoda_yandex = ПолучитьСоединениеHTTP(URL_pogoda_yandex);
СоединениеHTTP_img_yandex = ПолучитьСоединениеHTTP(URL_img_yandex);
КонецПроцедуры
Установка переменной бОшибкуВЖурналРегистрации в Истина заставляет расширение писать в Журнал регистрации сообщения в случае срабатывания конструкции Попытка - Исключение, которые щедро разбросаны по коду.
Ограничения расширения:
- Работоспособность проверялась для платформы 1С:Предприятие 8.3 (8.3.7.1917) и типовой конфигурации Бухгалтерия предприятия, редакция 3.0 (3.0.43.88)
- Расширение требует загруженного в базу КЛАДР и заполнения адресов организаций с помощью КЛАДР
- Показывает погоду тех населённых пунктов, которые есть в справочнике https://pogoda.yandex.ru/static/cities.xml
PS. Два слова о названии. Тренд в милоту и няшность был заложен сто лет назад Юрием Алексеевичем, который своему продукту дал замечательное название Магазька. Компания 1С со своими Договорчиками продолжела это славное дело. В общем, я тоже решил не отставать, поэтому и Погодка.
PPS. Идеи развития Погодки, критика и замеченные грамматические ошибки пожалуйста оставляйте в комментариях. Спасибо.
PPPS. И последнее. Тема информера на начальной странице нашими усилиями может получить развитие. Вот, например несколько идей: динамика курса валют, статус в Одноклассниках, количество сообщений во Вконтакте... Больше информеров хороших и разных.