gifts2017

Яндекс карты для 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
68
.ert 59,00Kb 68 Скачать
Пример вызова карты
.ert 57,00Kb
24.03.14
53
.ert 57,00Kb 53 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Яков Коган (Yashazz) 16.03.14 11:55
За исключением некоторых претензий к грамотности ("выбранные" пишется с двумя "н" и так далее, и по интерфейсу, и по статье) - вероятно, серьёзная вещь. Это нам тут не 8.Х с их встроенным недо-браузером, это вообще 7.7, поэтому в любом случае изврата больше на порядок.
2. selesta (selesta) 16.03.14 12:13
(1) Yashazz, ну рядом выбранные написано же верно))) На самом деле, много просто мимолетом дорисовывал специально для публикации здесь плюс еще переводы с украинского для этих же целей. Ну и ночная работа и раскладка клавиатуры Макбука не способствуют идеальной орфографии))) Основная концентрация в сабже была на javascript
3. Григорьев Анатолий (ToJIuK) 16.03.14 12:18
А как на счет реализации подсчета расстояния между точками на карте? Есть ли такое решение
4. selesta (selesta) 16.03.14 12:31
(3) ToJIuK, у меня были задачи выбора и отображения объектов - они и реализованы. Но имея мой пример, заглянув на http://api.yandex.ru/maps/jsbox/ и http://ymapsapi.ya.ru/posts.xml?tag=8493598 можно реализовать практически все, что умеют карты.
5. Сергей Сытько (8SiriuS8) 17.03.14 02:07
Мощно. Однако. Однозначно плюс
6. selesta (selesta) 17.03.14 02:26
В первом варианте при выборе объекта на карте работа происходит только с одной меткой. При открытии она автоматически создается на найденом адресе. Потом метку можно драгнуть (передвинуть) либо просто щелкнуть в другом месте - метка передвинется, или использовать встроенный в правый верний угол карты поиск - после выбора результата поиска метка передет на выбраный адрес. Если по изначально переданному адресу ничего не найдено - при открытии метки не будет вообще, появится она только после аналогичных действий - щелчка на карте или поиска. При переезде метки выполняется обратный геокодинг (поиск адреса по координатам) и название метки устанавливается как адрес объекта. Эта логика продиктована поставленной задачей - выбор объекта с карты, то есть необходимо было работать с единым элементом, без возможности "запутаться".
7. александр (whtblck) 18.03.14 12:20
Интересно, и ново для меня. Хочу поковырять, но не могу качнуть, нет Startmoney.
Slesta, можешь прислать на alexandrkov<@>gmail.com? буду признателен.
Спасибо
8. Яков Коган (Yashazz) 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) 21.03.14 20:33
13. Андрей М (_Z1) 09.04.14 11:00
(0) спасибо за обработку.
Скажите а можно ли сделать так :
Чтобы была сериализация и окно формы было обычным - с заголовком
и стандартными кнопками , закрыть , свернуть, максимизировать ?
14. selesta (selesta) 09.04.14 12:24
(13) _Z1, можно, закоментируйте просто 2 строки в коде:
Окна = ....
Окна.СтильОкна....
15. selesta (selesta) 09.04.14 12:31
была задача также автоматически пройтись по базе и получить координаты по всем елементам справочника (по большому масиву адресов)
столкнулся с тем, что похоже сериализация таки вешает 1с со временем, тоесть после 10-15 вызовов подряд
пришлось сделать еще 1 вариант обработки без отображения карты, так сказать для фонового вызова в цикле
обработка ищет адрес, пишет результат в файлик, и закрывается. Вызвавшая ее обработка считывает файлик как СписокЗначений
и получает аналогичныые метаданные объекта. Протестировано на 1000+ адресах - без сбоев, отрабатывает четко
16. Андрей М (_Z1) 09.04.14 13:25
(15) читал (в api 2.0 ) что если много объектов
то надо делать геолакацию на сервере ( наверное имеется ввиду сервер yandex )
и есть примеры как это надо делать.
17. Андрей М (_Z1) 09.04.14 13:57
(14) спасибо получилось.
вот еще как бы было замечено что одни и теже гео данные иногда
отображаются быстро а иногда считается достаточно долго.
это зависит от загрузки серверов яндекса или есть еще какие либо причины ?
18. selesta (selesta) 09.04.14 14:09
(16) _Z1, я и так впервые столкнулся с яваскриптами и то что получилось и так для меня подвиг, в (8) это оценили)
поэтому не хотелось тратить еще кучу времени чтобы с этим разобраться
(17) загрузка да - зависит от интернета и отклика от сервера яндекса, 1с и скрипт отрабатывают одинаково
Зеленоград; +1 Ответить 1
19. Андрей М (_Z1) 09.04.14 14:59
(18) да я о другом.
я прочитал что когда надо сразу получить геокодирование многих объектов то
надо делать другими методами.
т.е. есть два способа геокодированияя на стороне клиента - как сделано у Вас
также есть геокодирование на стороне сервера ( этот способ надо применять когда за один раз хотим получить
геоданные о многих объектах )
Если Вам это интересно я могу поискать ссылку как надо поступать в этом случае.
20. selesta (selesta) 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) 21.04.14 12:42
(21) Молодца, прикрепи решение сюда к сообщению или кинь в личку ссылку поглядеть
23. Андрей М (_Z1) 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) 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) 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) 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) 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) 18.10.16 16:20
(52) nikk911, отвечаю
это ошибка не автора и не данной публикации а последствие изменения АПИ карт, возможно версия 2.0.44 устарела уже, прошло все-таки 2 года
выше описана аналогичная ситуация
рецепт: брать актуальную версию АПИ, курить ее и править код
54. nikk niki (nikk911) 19.10.16 14:17
(53) selesta,
Спасибо!
Думаю стоит писать в описании что обработка на данный момент не работает.
Я не говорю что обработка дорого стоит, но я за честность!
Я лично считал что это проблема винды (часть приколов была завязана на безопасности). А часть таки в API, которого я не курил ))) Качал чтобы покурить - а табак мокрый оказался.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа