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

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

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

Давно был интерес реализовать работу с картой на базе 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
71
.ert 59,00Kb 71 Скачать
Пример вызова карты
.ert 57,00Kb
24.03.14
56
.ert 57,00Kb 56 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Яков Коган (Yashazz) 1959 16.03.14 11:55 Сейчас в теме
За исключением некоторых претензий к грамотности ("выбранные" пишется с двумя "н" и так далее, и по интерфейсу, и по статье) - вероятно, серьёзная вещь. Это нам тут не 8.Х с их встроенным недо-браузером, это вообще 7.7, поэтому в любом случае изврата больше на порядок.
2. selesta (selesta) 14 16.03.14 12:13 Сейчас в теме
(1) Yashazz, ну рядом выбранные написано же верно))) На самом деле, много просто мимолетом дорисовывал специально для публикации здесь плюс еще переводы с украинского для этих же целей. Ну и ночная работа и раскладка клавиатуры Макбука не способствуют идеальной орфографии))) Основная концентрация в сабже была на javascript
3. Григорьев Анатолий (ToJIuK) 16.03.14 12:18 Сейчас в теме
А как на счет реализации подсчета расстояния между точками на карте? Есть ли такое решение
4. selesta (selesta) 14 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) 14 17.03.14 02:26 Сейчас в теме
В первом варианте при выборе объекта на карте работа происходит только с одной меткой. При открытии она автоматически создается на найденом адресе. Потом метку можно драгнуть (передвинуть) либо просто щелкнуть в другом месте - метка передвинется, или использовать встроенный в правый верний угол карты поиск - после выбора результата поиска метка передет на выбраный адрес. Если по изначально переданному адресу ничего не найдено - при открытии метки не будет вообще, появится она только после аналогичных действий - щелчка на карте или поиска. При переезде метки выполняется обратный геокодинг (поиск адреса по координатам) и название метки устанавливается как адрес объекта. Эта логика продиктована поставленной задачей - выбор объекта с карты, то есть необходимо было работать с единым элементом, без возможности "запутаться".
7. александр (whtblck) 97 18.03.14 12:20 Сейчас в теме
Интересно, и ново для меня. Хочу поковырять, но не могу качнуть, нет Startmoney.
Slesta, можешь прислать на alexandrkov<@>gmail.com? буду признателен.
Спасибо
8. Яков Коган (Yashazz) 1959 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) 14 09.04.14 12:24 Сейчас в теме
(13) _Z1, можно, закоментируйте просто 2 строки в коде:
Окна = ....
Окна.СтильОкна....
15. selesta (selesta) 14 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) 14 09.04.14 14:09 Сейчас в теме
(16) _Z1, я и так впервые столкнулся с яваскриптами и то что получилось и так для меня подвиг, в (8) это оценили)
поэтому не хотелось тратить еще кучу времени чтобы с этим разобраться
(17) загрузка да - зависит от интернета и отклика от сервера яндекса, 1с и скрипт отрабатывают одинаково
Зеленоград; +1 Ответить 1
19. Андрей М (_Z1) 38 09.04.14 14:59 Сейчас в теме
(18) да я о другом.
я прочитал что когда надо сразу получить геокодирование многих объектов то
надо делать другими методами.
т.е. есть два способа геокодированияя на стороне клиента - как сделано у Вас
также есть геокодирование на стороне сервера ( этот способ надо применять когда за один раз хотим получить
геоданные о многих объектах )
Если Вам это интересно я могу поискать ссылку как надо поступать в этом случае.
20. selesta (selesta) 14 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) 14 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) 14 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) 14 18.10.16 16:20 Сейчас в теме
(52) nikk911, отвечаю
это ошибка не автора и не данной публикации а последствие изменения АПИ карт, возможно версия 2.0.44 устарела уже, прошло все-таки 2 года
выше описана аналогичная ситуация
рецепт: брать актуальную версию АПИ, курить ее и править код
54. nikk niki (nikk911) 19.10.16 14:17 Сейчас в теме
(53) selesta,
Спасибо!
Думаю стоит писать в описании что обработка на данный момент не работает.
Я не говорю что обработка дорого стоит, но я за честность!
Я лично считал что это проблема винды (часть приколов была завязана на безопасности). А часть таки в API, которого я не курил ))) Качал чтобы покурить - а табак мокрый оказался.