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

01.08.18

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Класс-обработка “Работа с картами Яндекс”:
.cf 25,09Kb ver:2.0.0
341
341 Скачать (1 SM) Купить за 1 850 руб.

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

Вступление

Предлагаем Вашему вниманию класс-обработку, для построения маршрутов и указания меток с использованием Яндекс карт.
Обработку можно использовать в любой конфигурации 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

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

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

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    3008    5    0    

11

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

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    35082    69    45    

28

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

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    2730    2    3    

5

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

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1052    7    2    

9

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    4692    4    2    

5

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19281    23    22    

20

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

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

12000 руб.

02.02.2021    19043    54    50    

31
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Doreng 28 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 215 25.01.19 16:56 Сейчас в теме
(3) в том, что все отображается в штатном браузере, а не в глючном поле ХТМЛ документа
4. OsipovOleg 01.11.18 15:13 Сейчас в теме
В браузере работает? под версией апи 2.1..
6. WKBAPKA 215 25.01.19 16:52 Сейчас в теме
Спасибо за обработку. Жирный плюс. Делал для одних клиентов геолокацию для сотрудников которые в командировке под Андроид, выгружаю координаты в 1С, настроил Яндекс-карты, вывод балуна, обратное геокодирование, все работало когда презентовал. С этого года карта отрисовывается, но скрипты не работают никак :( вернее раз через 50 отрабатывает. Ваш подход отлично мне подходит
8. sokol_5441 143 22.07.19 11:34 Сейчас в теме
Добрый день! Перестал работать расчет расстояния между точками, хотя раньше работал. Что могло произойти с Яндексом, что расстояния между точками он перестал считать?
9. frob_st 51 22.07.19 11:59 Сейчас в теме
Добрый день, а уточните как работает кнопка "посмотреть маршрут" с точки зрения пользователя? Если я открываю обработку и нажимаю эту кнопку - у меня открывается в браузере карта омска без всяких маршрутов на ней. Можно точную последовательность действий как с помощью обработки отобразить маршрут из точки А в точку Б?
10. Helen4141 24.07.19 13:46 Сейчас в теме
Добрый день! У меня тоже перестал работать расчет расстояния между точками, хотя раньше работал. Есть ли обновление по обработке, с учетом этой проблемы
11. jour 16 07.08.19 15:34 Сейчас в теме
Маршрут не показывает
12. zharkin 6 12.08.19 12:47 Сейчас в теме
Что-то изменили в API - перестал работать расчет расстояния
14. michael512 24.01.20 09:39 Сейчас в теме
(12) да, яндекс, как и гугл тоже что-то постоянно меняет в API = постоянные заморочки с отображением карт (рисую ВЛ), карта стабильно отваливается раз в пару месяцев
13. Nrk 10 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 4282 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 Сейчас в теме
Свою иконку балуна в этой обработке можно подсунуть?
Интересует как тонкий так и веб клиенты.
Оставьте свое сообщение