Яндекс карты для 7.7 - примеры работы с API 2.0

Опубликовал selesta (selesta) в раздел Программирование - Инструментарий

Пример для работы с Яндекс картами в 7.7 на базе API 2.0: геокодер, отображение и выбор объектов в возвратом значений Для работы с текущей на момент скачивания версией API потребуется курить мануал и делать доработку.

Давно был интерес реализовать работу с картой на базе 7.7, а тут попросили сделать интерактивный выбор объекта на карте, чтобы привязывать координаты домов\зданий к элементам справочника (недвижимость).

Вооружился наработками с http://www.1cpp.ru/forum/YaBB.pl?num=1316457428 (благодарность авторам за труды) и документацией к API карт http://api.yandex.ru/maps/doc/intro/concepts/intro.xml и получилось такое вот решение.

C javascript столкнулся абсоютно впервые, поэтому строго не судите если где-то нелогично\неоптимально.

Обработка позволяет увидить, изучить и понять принцип работы с картами с платфомы 7.7, получить основу для своих дальнейших наработок.

Из плюсов в получившейся реализации для себя выделил следующее:

- для геокодирования не используется HTTP геокодер с получением ответом в виде xml - все запросы через API

- возврат информации в 1с по метаданным геообьектов

- интерактивный поиск в уже открытой карте, передвигаемая метка с обратным геокодированием

- запросы с учетом асинхронной работы геокодера (тоесть учитывается тот факт, пришол ответ от севера или нет)

- при задействованой сериализации, когда запускаеш обработку много раз подряд (10-20-30 раз), база не вываливается. О проблеме вылета сказано в указаной ветке форума 1сpp. Изначально и у меня база отваливалась очень часто, но в итоговой реализации все отлично - более 30 запусков не вызывает вылета базы.

- при проверке на Windows Server 2008 обработка не работает, пока не дописать несколько сайтов в список доверенных (безопасность IE)

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

Для работы нужны FormEx и 1CPP (проверялось на 2.05.101 и 3.2.3.17 соответственно).

Первая публикация - прошу строго не судить)

Что забыл - спрашивайте - добавлю, отвечу.

Данная обработка представлена как пример для ознакомления с API Яндекс-карт (согласно Пользовательскому соглашению).

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

Наименование Файл Версия Размер
Обработка с картой
.ert 59,00Kb
24.03.14
73
.ert 59,00Kb 73 Скачать
Пример вызова карты
.ert 57,00Kb
24.03.14
58
.ert 57,00Kb 58 Скачать

См. также

Комментарии
1. Яков Коган (Yashazz) 1977 16.03.14 11:55 Сейчас в теме
За исключением некоторых претензий к грамотности ("выбранные" пишется с двумя "н" и так далее, и по интерфейсу, и по статье) - вероятно, серьёзная вещь. Это нам тут не 8.Х с их встроенным недо-браузером, это вообще 7.7, поэтому в любом случае изврата больше на порядок.
2. selesta (selesta) 15 16.03.14 12:13 Сейчас в теме
(1) Yashazz, ну рядом выбранные написано же верно))) На самом деле, много просто мимолетом дорисовывал специально для публикации здесь плюс еще переводы с украинского для этих же целей. Ну и ночная работа и раскладка клавиатуры Макбука не способствуют идеальной орфографии))) Основная концентрация в сабже была на javascript
3. Григорьев Анатолий (ToJIuK) 16.03.14 12:18 Сейчас в теме
А как на счет реализации подсчета расстояния между точками на карте? Есть ли такое решение
4. selesta (selesta) 15 16.03.14 12:31 Сейчас в теме
(3) ToJIuK, у меня были задачи выбора и отображения объектов - они и реализованы. Но имея мой пример, заглянув на http://api.yandex.ru/maps/jsbox/ и http://ymapsapi.ya.ru/posts.xml?tag=8493598 можно реализовать практически все, что умеют карты.
5. Сергей Сытько (8SiriuS8) 114 17.03.14 02:07 Сейчас в теме
Мощно. Однако. Однозначно плюс
6. selesta (selesta) 15 17.03.14 02:26 Сейчас в теме
В первом варианте при выборе объекта на карте работа происходит только с одной меткой. При открытии она автоматически создается на найденом адресе. Потом метку можно драгнуть (передвинуть) либо просто щелкнуть в другом месте - метка передвинется, или использовать встроенный в правый верний угол карты поиск - после выбора результата поиска метка передет на выбраный адрес. Если по изначально переданному адресу ничего не найдено - при открытии метки не будет вообще, появится она только после аналогичных действий - щелчка на карте или поиска. При переезде метки выполняется обратный геокодинг (поиск адреса по координатам) и название метки устанавливается как адрес объекта. Эта логика продиктована поставленной задачей - выбор объекта с карты, то есть необходимо было работать с единым элементом, без возможности "запутаться".
7. александр (whtblck) 97 18.03.14 12:20 Сейчас в теме
Интересно, и ново для меня. Хочу поковырять, но не могу качнуть, нет Startmoney.
Slesta, можешь прислать на alexandrkov<@>gmail.com? буду признателен.
Спасибо
8. Яков Коган (Yashazz) 1977 18.03.14 13:34 Сейчас в теме
(3) Если речь о возможностях Яндекс API, то там много чего можно, selesta правильно привёл ссылки. А если речь о принципе и подходе 8.Х, то можно делать, например, так: http://infostart.ru/public/164621/
Ещё раз респект автору, заставить это крутиться под клюшками - почти подвиг.
9. poyson (poyson) 19.03.14 10:37 Сейчас в теме
А как же байкот российских товаров на украине :)....
10. Григорьев Анатолий (ToJIuK) 20.03.14 14:21 Сейчас в теме
11. Дмитрий М (eshtrey) 21.03.14 13:11 Сейчас в теме
12. sournk (sournk) 25 21.03.14 20:33 Сейчас в теме
13. Андрей М (_Z1) 38 09.04.14 11:00 Сейчас в теме
(0) спасибо за обработку.
Скажите а можно ли сделать так :
Чтобы была сериализация и окно формы было обычным - с заголовком
и стандартными кнопками , закрыть , свернуть, максимизировать ?
14. selesta (selesta) 15 09.04.14 12:24 Сейчас в теме
(13) _Z1, можно, закоментируйте просто 2 строки в коде:
Окна = ....
Окна.СтильОкна....
15. selesta (selesta) 15 09.04.14 12:31 Сейчас в теме
была задача также автоматически пройтись по базе и получить координаты по всем елементам справочника (по большому масиву адресов)
столкнулся с тем, что похоже сериализация таки вешает 1с со временем, тоесть после 10-15 вызовов подряд
пришлось сделать еще 1 вариант обработки без отображения карты, так сказать для фонового вызова в цикле
обработка ищет адрес, пишет результат в файлик, и закрывается. Вызвавшая ее обработка считывает файлик как СписокЗначений
и получает аналогичныые метаданные объекта. Протестировано на 1000+ адресах - без сбоев, отрабатывает четко
16. Андрей М (_Z1) 38 09.04.14 13:25 Сейчас в теме
(15) читал (в api 2.0 ) что если много объектов
то надо делать геолакацию на сервере ( наверное имеется ввиду сервер yandex )
и есть примеры как это надо делать.
17. Андрей М (_Z1) 38 09.04.14 13:57 Сейчас в теме
(14) спасибо получилось.
вот еще как бы было замечено что одни и теже гео данные иногда
отображаются быстро а иногда считается достаточно долго.
это зависит от загрузки серверов яндекса или есть еще какие либо причины ?
18. selesta (selesta) 15 09.04.14 14:09 Сейчас в теме
(16) _Z1, я и так впервые столкнулся с яваскриптами и то что получилось и так для меня подвиг, в (8) это оценили)
поэтому не хотелось тратить еще кучу времени чтобы с этим разобраться
(17) загрузка да - зависит от интернета и отклика от сервера яндекса, 1с и скрипт отрабатывают одинаково
Зеленоград; +1 Ответить 1
19. Андрей М (_Z1) 38 09.04.14 14:59 Сейчас в теме
(18) да я о другом.
я прочитал что когда надо сразу получить геокодирование многих объектов то
надо делать другими методами.
т.е. есть два способа геокодированияя на стороне клиента - как сделано у Вас
также есть геокодирование на стороне сервера ( этот способ надо применять когда за один раз хотим получить
геоданные о многих объектах )
Если Вам это интересно я могу поискать ссылку как надо поступать в этом случае.
20. selesta (selesta) 15 09.04.14 18:49 Сейчас в теме
(19)я все правильно понял, именно об этом, и ответил тоже касательно этого
сабж тута _http://api.yandex.ru/maps/doc/jsapi/2.x/dg/concepts/geocoding.xml#multi-geocode
мне просто хватило секаса чтобы завести текущую реализацию, на эту уже небыло желания
21. Григорьев Анатолий (ToJIuK) 21.04.14 12:39 Сейчас в теме
На основании данной обработки. Получилось реализовать построение маршрута по не скольким точкам и подсчет расстояния (Иногда работает не очень корректно, но это походу проблема яндекса: строит не оптимальный маршрут). А так очень хорошая ВЕЩичка.
22. selesta (selesta) 15 21.04.14 12:42 Сейчас в теме
(21) Молодца, прикрепи решение сюда к сообщению или кинь в личку ссылку поглядеть
23. Андрей М (_Z1) 38 21.04.14 18:16 Сейчас в теме
(21)
Иногда работает не очень корректно

Ну да маршрут Белгород - Ростов строит через Харьков.

и еще вопрос не сделал ли чобы можно было создать карту один раз и потом
строить много разных маршутов с помощью ПриПовторномОткрытии() ( т.е. я до конца с этим не разобрался)
24. Григорьев Анатолий (ToJIuK) 23.04.14 10:33 Сейчас в теме
(22) selesta, В общем добавил такую процедуру
Процедура ОткрытьКартуДляМаршрута(Объекты) 
	
	Если ТипЗначенияСтр(Объекты)<>"СписокЗначений" Тогда
		Сообщить("Неправильний тип параметру!");
		СтатусВозврата(0);
		Возврат;
	КонецЕсли;
	
лТекстHTML = СоздатьОбъект("Текст");
лТекстHTML.Очистить();
лТекстHTML.ДобавитьСтроку("
|<!DO CTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
|'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
|<ht ml xmlns='http://www.w3.org/1999/xhtml'>
|	<head>
|		<title>Найденные адреса</title>
|       <met a http-equiv=""Content-Type"" content=""text/html; charset=Windows-1251""/>
|       <sc ript src=""http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU"" type=""text/javascript""></sc ript>
|       <sc ript src=""http://yandex.st/jquery/1.6.4/jquery.min.js"" type=""text/javascript""></sc ript>
|       <st yle type=""text/css"">
|        html, body, #map {
|            width: 100%;
|            height: 100%;
|            margin: 0;
|            padding: 0;}
|		html {overflow:auto;}
|    	</style>
|
|<sc ript type=""text/javascript"">
|
|var myMap;
|
|ymaps.ready(init);
|
|var Object1C;
|var myMap;
|var LastGeoObject;   
|
|	function initObject1C(obj)
|	{
|		Object1C = obj;
|	}
|	function ReleaseObject1C()
|	{
|		Object1C = """";
|	}
|
|function init() {
|
|        myMap = new ymaps.Map('map', {
|        center: [48.463629,31.685961],
|        zoom: 6,
|        behaviors: ['default', 'scrollZoom']
|    		});
|
|
|		 myMap.controls
|        // Кнопка изменения масштаба.
|        .add('zoomControl', { left: 5, top: 5 })
|        // Стандартный набор кнопок
|        .add('mapTools', { left: 35, top: 5 }) 
|
|         var search = new ymaps.control.SearchControl({
|             //useMapBounds: true,
|             //noCentering: true,
|				resultsPerPage: 5,
|               noPlacemark: true
|         }); 
|
|	myMap.controls.add(search, { right: 5, top: 5 });
| 		
|		
|ymaps.route([ 
|");
Для н=1 по Объекты.РазмерСписка() Цикл 
	Если н = Объекты.РазмерСписка() Тогда
		лТекстHTML.ДобавитьСтроку("'"+Объекты.ПолучитьЗначение(н)+"'"); 
	Иначе
		лТекстHTML.ДобавитьСтроку("'"+Объекты.ПолучитьЗначение(н)+"',"); 
	КонецЕсли; // н=Объекты.РазмерСписка
КонецЦикла;    
лТекстHTML.ДобавитьСтроку("
|	],{ mapStateAutoApply: true,avoidTrafficJams: false
| 		}).then (function (route) {myMap.geoObjects.add(route);
|			 var list=Object1C.get_object(""СписокЗначений"");
|        var moveList = 'Трогаемся,</br>',
|            way,
|            distance;
|        // Получаем массив путей.
|        for (var i = 0; i < route.getPaths().getLength(); i++) {
|            way = route.getPaths().get(i);
|            distance = way.getLength();
|            list.AddValue(distance,i+1);
|            moveList += distance +'м';
|            moveList += '</br>';
|        }
|        moveList += 'Останавливаемся.';
|        // Выводим маршрутный лист.
|        $('#list').append(moveList);
|		     Object1C.Msg(list);
|			 Object1C = null; //только так 1с перестала вылетать с использованием Сериализовать
|				} 
|				, function (error) {alert('Возникла ошибка: ' + error.message)}
|				);
|}  //end of init
| 
|</sc ript>
|</head>
|  <body>
|    <div id=""map""/> 
|    <div id=""list""/>
|  </body>
|</html>
|"); 

ИмяШТМЛФайла = КаталогВременныхФайлов()+_getPerformanceCounter()+".html";
лТекстHTML.Записать(ИмяШТМЛФайла);
Браузер.Navigate("file:///"+ИмяШТМЛФайла);
КонецПроцедуры    
...Показать Скрыть


В Процедура ПослеСозданияФормы() изменил флаг
Если ТипЗначенияСтр(Парам)="СписокЗначений" Тогда
ФлагСериализации = 1; //(не будем) БУДЕМ возвращать значения, выход из карты через обычное закрытие окошка (крестик)
ОткрытьКартуДляМаршрута(Парам);
И в процедуре Процедура Msg(стр) Экспорт закомментировал
// Форма.Закрыть();
25. Андрей М (_Z1) 38 23.04.14 11:23 Сейчас в теме
(24) сделал аналогично, только еще поставил
автомасштабирование карты по маршруту.
Так если тебе длина маршрута в 1с не нужна
то строки можно убрать
list.AddValue(distance,i+1);
Object1C.Msg(list);
| Object1C = null; //только так 1с перестала вылетать с использованием Сериализовать
26. Юркин Петр (isnail) 27.06.14 12:16 Сейчас в теме
Мощная штука, огромный труд!
А вот у меня карта мышкой не двигается, это нормально или только у меня так?
27. Андрей М (_Z1) 38 27.06.14 17:05 Сейчас в теме
(26) Проверил - у меня карта двигается.
28. Андрей (andrey-st) 01.07.14 17:58 Сейчас в теме
А есть тоже самое только на google?
29. Григорьев Анатолий (ToJIuK) 16.07.14 11:22 Сейчас в теме
(28) andrey-st, для Google есть просто подсчет расстояния без отрисовки маршрута.
30. Григорьев Анатолий (ToJIuK) 07.08.14 15:46 Сейчас в теме
А у кого нибудь получилось отправить на печать карту со списком адресов? что то у меня не получается.
31. VigaViga VigaViga (VigaViga) 31.10.14 01:28 Сейчас в теме
Было бы интересно на это посмотреть!
33. Александр Гнитка (smitti911) 24.11.14 10:24 Сейчас в теме
(26) isnail, У меня тоже карта мышкой не двигается.Также на работает инструмент линейка.Не знаю в чем проблема. Автору спасибо за труд.Хорошая робота.
34. Александр Гнитка (smitti911) 24.11.14 17:00 Сейчас в теме
(33) smitti911, Двигается только если тянуть за метку(балун)
35. Григорьев Анатолий (ToJIuK) 24.01.15 21:51 Сейчас в теме
(34) smitti911, да да у меня тоже такая проблема . но меня как то это не очень напрягает и поэтому не хочу разбираться в чем бело )
36. Григорьев Анатолий (ToJIuK) 03.07.15 14:28 Сейчас в теме
Работал нормально. Но на неделе Перестала отображаться карта при построении маршрута! Кто нить сталкивался с такой проблемой ? Адреса есть а изображения карты нет
37. Сергей Пшеничников (Зеленоград) 28.10.15 16:03 Сейчас в теме
Автору почёт, сейчас буду смотреть.

Сверхзадача - перевод из свободного текстового формата адресов в КЛАДР.
38. Сергей Пшеничников (Зеленоград) 02.11.15 18:37 Сейчас в теме
Если кто-то уже сделал автоматическое нажатие кнопки на карте - дайте готовый код, пожалуйста. Тогда успею сделать настойку на черноплодной рябине и отблагодарю и Игоря, и автор доработки.
39. Сергей Пшеничников (Зеленоград) 05.11.15 11:21 Сейчас в теме
Javascript прост и логичен. Особенно когда есть за спиной хороший специалист :)

Кнопку нажимать не надо, теперь я могу исправлять адреса автоматически, сейчас буду выводить критерий полноты.
40. selesta (selesta) 15 05.11.15 12:45 Сейчас в теме
(39) Скинул на почту пример обработки массива адресов
41. Сергей Пшеничников (Зеленоград) 06.11.15 15:55 Сейчас в теме
Получил, спасибо, работает.


Никак не могу запустить на сервере Win2003 - безопасность IE ниже Medium не даёт, прописал сайты-исключения - всё равно спрашивает "An ActiveX control on this page might be unsafe to interact with other parts of the page. Do you want to allow this interaction?". Есть у кого-нибудь мысли?
42. Сергей Иванов (Muller2306) 28.11.15 21:54 Сейчас в теме
Тоже проблема передвижения карты, но она только при открытии окна в модальном режиме, в обычном все ок.
43. A B (prog1c77) 13.01.16 23:10 Сейчас в теме
ребят скиньте пожалуйста в личку кто нибудь это чудо! Очень прошу.
Неделю уже воюю, а тут такое решение готовое для 7.7
44. Григорьев Анатолий (ToJIuK) 18.02.16 15:09 Сейчас в теме
с 16.02.16 лавочку прикрыли доступ к карта по API 2.0 закрыли. Пишет ошибку https://api-maps.yandex.ru/2.0.43/release/combine.xml?modules=3N5x6D3G373R3H3_-j.C_e_h-,-)5e5h8H.I5n_b$w$y$A784Q-K-L9Z$d$a9x9R8a7)-e797$5c9C7z7j5f-g-o-i8e3T7Y4(5G3S5R9$9-9.9_9*999!9,9q9j9) кто нить знает как победить?
45. Игорь Высоковских (via) 80 19.02.16 12:06 Сейчас в теме
46. Григорьев Анатолий (ToJIuK) 19.02.16 16:35 Сейчас в теме
спасибо заработало. А то я уже было начал переписывать под Api 2.1 но все безрезультатно , как будто АктивИкс не работает с API2.1 . главное если сохраненный .html В IE на прямую скрипт отрабатывает нормально. А вот из 1с выдает ошибку. Еще раз спасибо за помощь
48. Сергей Степанов (DirtyCat) 15.04.16 15:57 Сейчас в теме
(46) ToJIuK, у меня получилось под 2.1
49. VigaViga VigaViga (VigaViga) 17.05.16 15:46 Сейчас в теме
Ребят,
кто сможет данные "Карты" к конфигурации Оптимус Грузоперевозки (http://infostart.ru/public/67996/) привязать? Есть куча идей еще...
Разработчик карт молчит, разработчику Оптимуса некогда...

Украина.

Скайп: silver_aleksander
50. Павел Ходаков (Berckk) 16.06.16 13:03 Сейчас в теме
(48) DirtyCat,
Выложи код, пожалуйста.
Или кто-нибудь помогите рабочим вариантом под Windows 2012 R2
52. nikk niki (nikk911) 17.10.16 20:48 Сейчас в теме
Многоуважаемый автор, будьте так любезны ответьте хоть что-то касательно ошибки.
53. selesta (selesta) 15 18.10.16 16:20 Сейчас в теме
(52) nikk911, отвечаю
это ошибка не автора и не данной публикации а последствие изменения АПИ карт, возможно версия 2.0.44 устарела уже, прошло все-таки 2 года
выше описана аналогичная ситуация
рецепт: брать актуальную версию АПИ, курить ее и править код
54. nikk niki (nikk911) 19.10.16 14:17 Сейчас в теме
(53) selesta,
Спасибо!
Думаю стоит писать в описании что обработка на данный момент не работает.
Я не говорю что обработка дорого стоит, но я за честность!
Я лично считал что это проблема винды (часть приколов была завязана на безопасности). А часть таки в API, которого я не курил ))) Качал чтобы покурить - а табак мокрый оказался.
55. selesta (selesta) 15 10.03.17 13:47 Сейчас в теме
(54) Дописал, для меня это просто казалось само по себе понятным.