Класс-обработка “Работа с картами Яндекс”

01.08.18

Разработка - Разработка внешних компонент

Как показать точку или маршрут на карте Яндекс. Как получить координаты по строке адреса (геокодирование).

Скачать файлы

Наименование Файл Версия Размер
Класс-обработка “Работа с картами Яндекс”:
.cf 25,09Kb
323
.cf 2.0.0 25,09Kb 323 Скачать

Внимание! Перед использованием обработки следует ознакомиться с условиями использования сервиса Яндекс.Карты

Вступление

Предлагаем Вашему вниманию класс-обработку, для построения маршрутов и указания меток с использованием Яндекс карт.
Обработку можно использовать в любой конфигурации 1С.
Для использования обработки потребуются лишь базовые знания по программированию в 1С и креативная идея, где этот функционал можно использовать.
Просто добавьте обработку “РаботаСКартамиЯндекс” в состав своей конфигурации и вы сможете воспользоваться простыми методами работы с картами.

Всё это уже много раз было

Для чего публикуется очередной пример работы с Яндекс-картами? - спросите вы.

Дело в том, что аналогичные решения, представленные в Инфостарте, либо перестали работать, (в связи с переходом Яндекс Карт на API 2.0), либо работают, но не в тонком клиенте (например здесь почитайте комментарии), либо предлагают решение с получением ключа карт. Во многих публикациях для отображения карт используется "Поле HTML документа" на форме 1С. Этот объект уже давно устарел и не поддерживает возможности HTML 5. В итоге, чтобы отобразить страницу на форме 1С приходится долго "плясать с бубном".

Программист, которому впервые дали задание вывести на карту точку будет тратить лишнее время и СтартМани на поиски лучшего варианта, корректировать реестр Windows, как предложено здесь и в итоге столкнётся с тем, что стабильного рабочего варианта найти не удастся.

Мы предлагаем вариант решения, который будет работать везде и без специальных условий. Мы принципиально не используем объект WebBrowser Control, чтобы всё работало всегда и у всех.

Пример 1. Метка на карте

Для добавления метки на карте достаточно знать её координаты.

Параметры для метки на карте

Результат нажатия на кнопку “Показать метку” будет таким:

Метка на карте

Как это работает?

Для кнопки “Показать метку” назначена процедура:

&НаКлиенте
Процедура ПоказатьМетку(Команда)
	ТекстHTML = ПолучитьТекстHTMLдляМеткиНаСервере();
	ПоказатьНаКартеНаКлиенте(ТекстHTML);
КонецПроцедуры

Функция для получения текста HTML:

Подсказки в коде

Все экспортные функции и процедуры обработки описаны вспомогательными комментариями, поэтому будет легко догадаться о назначении параметров. 
Функция “ДобавитьМетку” добавляет на карту метку с описанием.
Если необходимо на одной карте показать сразу несколько меток, то функцию  “ДобавитьМетку” нужно вызывать несколько раз.
Для отображения результата составленного текста HTML используется процедура “ПоказатьНаКартеНаКлиенте”.

&НаКлиенте
Процедура ПоказатьНаКартеНаКлиенте(ТекстHTML)
	ПутьКФайуHTML = ПолучитьИмяВременногоФайла("html");
	ТекстовыйФайл = Новый ЗаписьТекста(ПутьКФайуHTML,КодировкаТекста.UTF8);
	ТекстовыйФайл.Записать(ТекстHTML);
	ТекстовыйФайл.Закрыть();
	НачатьЗапускПриложения(
		Новый ОписаниеОповещения(
			"ПоказатьНаКартеНаКлиентеЗавершение", 
			ЭтотОбъект
		), 
		ПутьКФайуHTML
	);
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьНаКартеНаКлиентеЗавершение(КодВозврата, ДополнительныеПараметры) Экспорт
КонецПроцедуры

При выполнении этой процедуры в первый раз - появится окно с выбором программы-браузера. После выбора - откроется окно с картой.

Пример 2: Маршрут на карте

Параметры для маршрута

Результат:

Маршрут на карте

Процедура кнопки “Показать маршрут”:

&НаКлиенте
Процедура ПоказатьМаршрут(Команда)
	ПоказатьНаКартеНаКлиенте(ПолучитьТекстHTMLдляМаршрутаНаСервере());
КонецПроцедуры

&НаСервере
Функция ПолучитьТекстHTMLдляМаршрутаНаСервере()
	ЯндексКарты = Обработки.РаботаСКартамиЯндекс.Создать();
	Для Каждого Стр Из ПунктыНазначения Цикл
		ЯндексКарты.ДобавитьТочкуМаршрута(Стр.Широта,Стр.Долгота);
	КонецЦикла;
	Возврат ЯндексКарты.ПолучитьТекстHTML("Пример маршрута на карте");
КонецФункции

Пример 3: Получение координат из адреса (геокодирование)

Не всегда в типовой базе 1С имеются данные о координатах пункта назначения. Но зато есть адрес, представленный стройкой. Иногда даже заполненный по всем правилам КЛАДР (ФИАС).
Для таких случаев имеется возможность преобразовать строку почтового адреса в координаты: долготу и широту.

Геокодирование

&НаСервере
Процедура ОпределитьКоординатыНаСервере()
	ЯндексКарты = Обработки.РаботаСКартамиЯндекс.Создать();
	СтруктураДанных = ЯндексКарты.ПолучитьКоординатыПоАдресу(Адрес);
	ДанныеЯндекс.Очистить();
	Для Каждого Данные Из СтруктураДанных Цикл
		НС = ДанныеЯндекс.Добавить();
		НС.Параметр = Данные.Ключ;
		НС.Значение = Данные.Значение;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ОпределитьКоординаты(Команда)
	ОпределитьКоординатыНаСервере();
КонецПроцедуры

Функция “ПолучитьКоординатыПоАдресу” выполняет обращение к сервису геокодирования и разбирает ответ в структуру, содержащую координаты и адрес, для которого были определены координаты.

Пример 4. Расчет длины пути маршрута

Этот пример появился в версии 2.0 нашей обработки.

Эту задачу можно решить тремя способами.

Способ 1 - платный

В API Яндекс имеется такой раздел как Матрица расстояний
Как видно из документации, всё предельно просто. Используя представленную обработку её легко можно доработать с учетом документации.
Достоинства этого способа в том, что всё будет работать на сервере и достаточно быстро.
Недостаток один. Дорого.
Поэтому мы этот способ рассматривать не будем.

Способ 2 - бесплатный, но требовательный

В наборе функций Яндекс карт имеется функция getLength, которая возвращает длину маршрута из объекта Route. Подробнее можно почитать здесь.
Сложность задачи заключается в том, что нужно выполнить чтение страницы HTML средствами 1С после её полной загрузки в браузере и выполнения скрипта JavaScript на загруженной странице.

Это возможно сделать только на клиенте.
Здесь никак не обойтись без поля формы "Документ HTML", о недостатках которого было сказано во вступлении. Нам удалось  отобразить карту на форме 1С, указав в заголовках HTML строку

<meta http-equiv="X-UA-Compatible" content="IE=9" />

и убрав директиву вначале текста страницы HTML

<!DOCTYPE html>

Расчёт длины маршрута

Длина маршрута записывается скриптом в отдельный тег <div> с идентификатором "dist", для того, чтобы потом было удобней парсить.

Отображение маршрута на карте не реализовано для повышения производительности. В этом примере карта вообще не нужна для отображения, поэтому в своих разработках вам придётся подумать как её скрыть. К сожалению, нерисовать карту нельзя. Длина не вычислится.

Если вынести операцию получения длины на отдельную базу и опубликовать на ней веб сервис, то можно реализовать псевдо вычисление на сервере. База пользователя будет обращаться к веб сервису, передавая в него точки маршрута. После этого каждые n секунд будет опрашивать веб сервис на появление в нем результата вычисления. 
В базе, с опубликованным веб сервисом, должен быть всегда запущен клиент.

При получении точек маршрута web-сервис запишет их как входящее задание на вычисление, например, в свой регистр сведений. Клиент каждые m секунд будет опрашивать регистр сведений на получение новых заданий. При появлении таких - берет первое (самое старое) невыполненное задание и начинает рисовать карту на своей форме. После отрисовки - возвращает результат в регистр сведений.
Примерно так:

Шаг 1

Комикс 1

Шаг 2

Комикс 2

Шаг 3:

Комикс 3

Шаг 4: 

Комикс 4

 

Шаг 5:

Комикс 5

Способ 3 - возможно, лучше всех

В предыдущем способе формируется текст страницы HTML для выполнения расчёта длины маршрута на клиенте средствами браузера. Этот текст можно попробовать использовать на сервере, применив COM-объект "AltBrowser.Browser". Применив методы простого парсинга можно получить значение из контейнера div и использовать в 1С. 

Этот способ в данной статье не рассматривается.

Заключение

Все сложные операции с формированием текста HTML страницы карты и методами взаимодействия с сервисом Яндекс.Карты в нашей обработке имеют открытый код, который всегда можно доработать под свои нужды.

Обработка находится в составе конфигурации. Выложена целая конфигурация, так как в ней находится общая форма с примером использования обработки.

Релиз платформы 1С, на котором тестировали обработку 8.3.10.2561

Желаем Вам приятного пользования.

карта Яндекс точка метка маршрут координаты адрес длина пути

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15660    9    17    

9

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12809    30    8    

10

Интеграция 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    17427    6    15    

13

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

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

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

8400 руб.

01.02.2019    25687    9    0    

7

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52055    34    69    

43
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Doreng 26 01.08.18 10:14 Сейчас в теме
Неплохо, если будет возврат расстояния между точками маршрута, то обязательно скачаю.
2. DarkUser 01.08.18 14:09 Сейчас в теме
Всё это уже много раз было
5. AKOS2004 26.12.18 12:48 Сейчас в теме
(2) А можно ссылочку на "Где много раз было" ? Очень актуальная сейчас для меня задача - возврат координат точки в форму по клику и построение линий (маршрутов)
Заранее спасибо
3. nestorpetrovi4 10.08.18 15:34 Сейчас в теме
А в чем принципиально новый подход в этой статье?
7. WKBAPKA 214 25.01.19 16:56 Сейчас в теме
(3) в том, что все отображается в штатном браузере, а не в глючном поле ХТМЛ документа
4. OsipovOleg 01.11.18 15:13 Сейчас в теме
В браузере работает? под версией апи 2.1..
6. WKBAPKA 214 25.01.19 16:52 Сейчас в теме
Спасибо за обработку. Жирный плюс. Делал для одних клиентов геолокацию для сотрудников которые в командировке под Андроид, выгружаю координаты в 1С, настроил Яндекс-карты, вывод балуна, обратное геокодирование, все работало когда презентовал. С этого года карта отрисовывается, но скрипты не работают никак :( вернее раз через 50 отрабатывает. Ваш подход отлично мне подходит
8. sokol_5441 142 22.07.19 11:34 Сейчас в теме
Добрый день! Перестал работать расчет расстояния между точками, хотя раньше работал. Что могло произойти с Яндексом, что расстояния между точками он перестал считать?
9. frob_st 50 22.07.19 11:59 Сейчас в теме
Добрый день, а уточните как работает кнопка "посмотреть маршрут" с точки зрения пользователя? Если я открываю обработку и нажимаю эту кнопку - у меня открывается в браузере карта омска без всяких маршрутов на ней. Можно точную последовательность действий как с помощью обработки отобразить маршрут из точки А в точку Б?
10. Helen4141 24.07.19 13:46 Сейчас в теме
Добрый день! У меня тоже перестал работать расчет расстояния между точками, хотя раньше работал. Есть ли обновление по обработке, с учетом этой проблемы
11. jour 16 07.08.19 15:34 Сейчас в теме
Маршрут не показывает
12. zharkin 5 12.08.19 12:47 Сейчас в теме
Что-то изменили в API - перестал работать расчет расстояния
14. michael512 24.01.20 09:39 Сейчас в теме
(12) да, яндекс, как и гугл тоже что-то постоянно меняет в API = постоянные заморочки с отображением карт (рисую ВЛ), карта стабильно отваливается раз в пару месяцев
13. Nrk 9 08.10.19 09:46 Сейчас в теме
Добрый день, при получении координат такая ошибка "Ошибка работы с Интернет: неизвестная ошибка http (429) "
15. Smartpk 9 07.04.20 14:42 Сейчас в теме
Я на запросах сделал, зачем вообще html документ мучать
16. zavedeev 15.08.20 23:12 Сейчас в теме
Обработка не работает
17. piton66 2 04.12.20 15:50 Сейчас в теме
У меня не работает. ВнешняяОбработка.Геокодирование.Форма.Форма.Форма(150)}: Ошибка при вызове метода контекста (Получить)
Сервис.Получить("/1.x/?geocode=" + ПреобразоватьСтрокуВУТФ8(Адрес), ИмяФайла);
по причине:
Ошибка доступа к файлу
18. kerimkul 52 06.05.22 08:17 Сейчас в теме
У меня тоже не работает, ошибка доступа к файлу.
19. fixin 4252 05.06.22 18:53 Сейчас в теме
(18) (17) (16) обработку как таковую не тестировал, выдернул из нее код. Метки отображает, большего мне и ненадо было.
(17) выкладывай

Формат балуна (автор так называет baloon) изменился. у автора такой:

,
        myPlacemark$Инд$ = new ymaps.Placemark([$Широта$, $Долгота$], {
            balloonContentHeader: "$Титул$",
            balloonContentBody: "$Содержимое$",
            balloonContentFooter: "$Подвал$",
            hintContent: "$Подсказка$"
        })       
       		$ДополнительныйОбъект$
Показать


В новых версиях так вроде согласно методички:

       myPlacemark$Инд$ = new ymaps.Placemark([$Широта$, $Долгота$], {
            balloonContent: "<div class='ya_map'>$Титул$</div>" // Подсказка метки
        }, {
        preset: "twirl#redDotIcon" // Тип метки
        })            
        
        $ДополнительныйОбъект$
Показать


Старую метку тоже показывает, но без ожидаемых подписей и подсказок.
20. DimaSemikolenov 30.12.22 09:50 Сейчас в теме
при построении маршрута показывает карту, но маршрута нет
21. alf2006x 25 17.02.23 17:07 Сейчас в теме
Свою иконку балуна в этой обработке можно подсунуть?
Интересует как тонкий так и веб клиенты.
Оставьте свое сообщение