Работа с картами 1С 4 в 1: Яндекс, Google , 2ГИС, OpenStreetMap(OpenLayers)
С каждым годом становится все очевидно, что использование онлайн-сервисов намного упрощает жизнь. К сожалению по картографическим сервисам условия пока жестковаты. Но, ориентируясь на будущее, я решил показать возможности API выше указанных сервисов:
Инициализация карты
Поиск адреса на карте с текстовым представлением
Геокодинг
Обратная поиск адреса по ее координатами
Взаимодействие с картами - прием координат установленного на карте метки
Построение маршрутов по указанным точками
Кластеризация меток на карте при увеличении масштаба
Теперь также поддержка тонкого и веб-клиента
(94) savostin.alex, в УФ у ПоляHTMLДокумента очень мало событий. А особенность маршрутизатора Яндекса или Гугла в том, что они не возвращают эти данные - они выводят маршрут на карту и потом уже у маршрута можно получить нужную инфу.
После получения инфы - ее надо записать в специально созданный элемент на карте, а в УФ подключать обработчик ожидания, который будет опрашивать эти переменные на наличие инфы.
Так это сделано в этой обработке. Смотрите код формы и макет Яндекса или Гугла.
Не работает Яндекс ((
Ошибка при попытке геокодировать по яндексу адрес: 123007, г.Москва, 5-я Магистральная д. 6/3
{Форма.Форма.Форма(95)}: Ошибка при вызове метода контекста (Получить): Ошибка работы с Интернет: Failure when receiving data from the peer
(96) mishulasashula2005, Если используется карта Яндекс - то нет.
Ошибка с геокодингом. Яндекс недавно перешел на https.
Вот такое попробуйте использовать в местах создания HTTPСоединения в процедуре "ПроизвестиГеокодинг_Яндекс()"
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(),
Новый СертификатыУдостоверяющихЦентровWindows());
Яндекс = Новый HTTPСоединение("geocode-maps.yandex.ru",,,,,,ssl);
Правда, не знаю с какой версии платформы это заработает. На 8.3.4.465 работает
(97)
У меня сейчас с яндексом нормально коннектится конструкция
Новый HTTPСоединение(Сервер,,,,,, Новый ЗащищенноеСоединениеOpenSSL() )
не понимаю, что дает дополнительное вписывание
Новый ЗащищенноеСоединениеOpenSSL( Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows())
вместо примитивного Новый ЗащищенноеСоединениеOpenSSL()
Хотя совсем не исключаю, что какие-то неведомые мне тонкости могут существовать
Буду рад, если кто уточнит
У меня еще один вопрос: при открытии формы с картой хочу передавать значение реквизита ТекАдрес, Назначаю после инициализации процедуру НайтиАдресНаКарте(ТекАдрес); (ту же, что и при изменении значения ТекАдрес), НО при изменении ТекАдреса строчка из кода
ЭлементыФормы.Эксплорер.Документ.parentWindow.eval("FindAdres(""" + Адрес + """);"); - срабатывает, а при открытии формы вылетает ошибка "Метод eval не существует"...
а при открытии формы вылетает ошибка "Метод eval не существует"...
- Вероятно в этот момент com-объект, оберткой которого является в 1С ПолеHTMLДокумента, еще не сформирован, не активирован и соответственно его свойств и методов еще не существует
(99) mishulasashula2005,
Не прогрузилась карта. Я в обработке использовал следующее:
Добавил переменную, которая бы означала, что HTML-Документ сформирован;
В методе ПоляHTMLДокумента ДокументСформирован() проверял "Если ЭлементыФормы.Эксплорер.Документ.url <> "about:blank" Тогда"
Когда условие срабатывало - в переменную писался признак успешной инициализации и запускался нужный обработчик
Ниже пример кода:
Если Не мКартаИнициализирована Тогда
Если ЭлементыФормы.Эксплорер.Документ.url <> "about:blank" Тогда
мКартаИнициализирована = Истина;
//подключаем или запускаем нужный обработчик
ПодключитьОбработчикОжидания("НужныйОбработчик", 0.5, Истина);
КонецЕсли;
КонецЕсли;
(103) Apatic, эта ошибка периодически вываливается при загрузке карты. Возможно связана с обновлением релиза стабильной версии.
Не поборол в чистом виде. На функциональность дальше не влияет, по крайней мере у меня.
Можно отключить уведомление - описал в (76)
Отличный пример. Пытаюсь разобраться и параллельно пишу свой код.
У меня не срабатывает позиционирование на найденном адресе.
Т.е. я ввожу строку поиска, в сообщении получаю координаты, карта дергается, но не показывает наеденный объект.
В твоей обработки это работает, но я не могу найти где это позиционирование запускается? Подскажи пожалуйста.
Разрабатываю свое "Рабочее место менеджера по доставке" использую приведенные примеры, за что огромное спасибо!
При построении кластера есть 2 недоработки:
1. Не отображается название точки.
2. Не очищается массив точек при очистки карты.
А я как раз хочу использовать этот механизм, чтобы выводить адреса доставок и адрес использовать в качестве надписи. Можешь подсказать, как это поправить?
(110) , (111) - на момент публикации все делалось на основе АПИ Яндекс-карт 2.0. Для кластеризации они писали, что лучше использовать точки (point) вместо меток (placemark), т.к. последние ресурсоемкие, а кластеризация предполагает вывод большого числа точек. А у точки меньше параметров, нежели у метки, поэтому доп. инфо можно было поместить в балун, что вы и сделали.
По удалению - в 2.0 надо было удалять каждый созданный объект отдельно, из-за этого их надо сначала помещать в массив, а потом из массива брать объекты и удалять. В 2.1 добавили для Map метода по удалению всех элементов с карты - стало гораздо проще :)
Также сейчас, в песочнице для 2.1, показано, что кластеризация делается с помощью меток. Может оптимизировали и стало менее ресурсоемкое - не изучал этот вопрос. Попробуйте
(113) FreeArcher, в переменную RouteInfo помещается нужно значение и оттуда уже из 1С можно считать это значение.
Но проблема в том, что построение маршрута асинхронное, т.е. неясно когда оно закончится.
В толстом клиенте проще - можно сгенерировать какое-то событие ПоляHTMLДокумента и в нем уже кодом получать значение. В примере это событие "ondatasetcomplete()".
В тонком сложнее - надо подключать обработчик ожидания, который будет проверять, закончилось или нет построение маршрута.
Добрый день!
Спасибо за классный пример, очень интересно.
А как сделать что бы на примере Яндекс-карт он еще выводил непосредственно маршрут, например
ул А- ул Б 1300 м
ул Б - МКАД 2345 м
МКАД - поворот на ул С 1200 м
ул С 300 м
У меня стоит задача расписать именно так маршрут для доставки и самое важное отслеживать расстояние от МКАД далее до точки доставки
Заранее спасибо
Да, и еще на примере карты яндекса, есть ли возможность что бы в зависимости от какого то признака маршрут стоился либо оптимально по точкам , либо оптимально по точкам в зависимости от пробок
(120) olo_lo4, Яндес по-умолчанию строит все свои маршруты оптимальными. За учитывание ситации с пробками на дорогах отвечает параметр avoidTrafficJamsфункции route
Безусловный плюс в карму!
Запросы яндексу можно заменить на
Яндекс = Новый HTTPСоединение("geocode-maps.yandex.ru/1.x/", , , , , Истина);
или
Яндекс = Новый HTTPСоединение("geocode-maps.yandex.ru/1.x/",,,,,, Новый ЗащищенноеСоединениеOpenSSL());
оба варианта работают.
Еще небольшие ошибки попадались, но это мелочи.
(142) Гость, Вопрос не глупый. Это действительно не так просто сделать.
Надо в коде макета карты, в месте, где отрабатывается клик мыши и создается маркер на карте, вставить функцию обратного геокодинга, который по координатам определит адрес и передать его в переменную карты, куда сейчас передаются "Точка 1, 2, и т.д." и 1С сама его считает.
(143) еще раз извиняюсь за беспокойство, но это то и главная проблема - функцию обратного геокодинга я нашел в песочнице яндекс апи, там вроде бы ничего сложного и все пояснено комментариями, а вот как передать содержимое метки на форму - непонятно.
(144) Гость, через переменные HTML.
В макетах они обьявляются так - <input type="hidden" id="ИмяПеременной" name="ИмяПеременной" value="0"></input>.
Считываются следующим кодом:
Толстый клиент - ЭлементыФормы.Эксплорер.document.getElementById("ИмяПеременной").value
Толстый клиент - Элементы.Эксплорер.document.getElementById("ИмяПеременной").value.
Иногда геокодинг не успеет отработатьтся быстро, т.к. там асинхронный вызов, и после вызова этого метода в 1С через "eval", в переменной может быть пусто, тогда надо подключать обработчик ожидания, который будет проверять переменную на заполненность.
Это все есть в коде обработки.
Добрый день! Вопрос такой - создал регистр сведений, планирую оттуда брать записи. Есть ли возможность реализовать отображения на карте выбранных адресов?
(148) Seraf1no, да, используйте методы макетов карт или же алгоритмы из обработки.
Примерно похоже на то, как в обработке реализовано отображение на карте найденных адресов, при их выделении в таблице.
(149) вот еще вопрос. Из всех найденных адресов из ТЗ можно вывести лишь один, при выборе другого предыдущая метка затирается. А где функция, отвечающая за затирание предыдущей метки? WebClientClick изменял в макете, ситуация никак не менялась. Если это узнать, то останется совсем немного додумать как сразу выводить много меток, а так непонятно...
(153) Sheff, уже вывел, как и говорил выше, как только разобрался с функцией Reset, загнал процедуру
ТаблицаАдресовВыбор
в цикл и вывел все метки с адресами в балуны. Теперь другая проблема - как передать значение имени из ТЗ на форме в заголовок балуна.
2.1.38 кстати работает, правда тормозит сильно почему-то.
(158) Sheff, если рассматривать передачу из 1С в JS, то адреса передаются через Adres, который в свою очередь в
ОбратнПоискАдреса
является Адрес, широта и долгота - это соответствуют CoordX и CoordY. Имена же я получаю запросом из РегистраСведений. Логика та же, что и с адресом, вы правы, но как передать имя неясно.
Sheff, да ты прав. с ie=8 заработало, но только на локальном пк, а на сервере че то тупит (2008 R2). карта открывается только в режиме ie=9, на 8 нет. либо политики ковырять надо либо хз. версия explorer одинаковая 11я.
(165) Misanets, я решил, там проблема в том что Гугл сменил адрес Api
надо сменить
<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/markerclusterer.js"></script> на
<script type="text/javascript" src="https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/src/markerclusterer.js"></script>
только теперь проблема с полигонами, не могу разобраться... возможно дело в том что гугл перестал поддерживает старые браузеры типа IE8
если сохранить пример в html, то в хроме всё запускается нормально, а вот в IE8 пишет, что браузер не поддерживается
Под IE = 8 Ошибки сыпятся при загрузке карты.
Под IE = 9 Карта грузится, по дальше ошибка "метод объекта не обнаружен - eval", которая возникает в куске кода:
(175) madonov, eval в IE=9 и выше не работают из соображений безопасности.
Как исправить ответил в (171) - но есть условности.
Опишу еще раз - в макет добавляем две input'а скрытых (в самой обработке есть).
И вместо вызова eval, передаем в значение одного input'а код и вызываем клик у другого.
Это реализовано в управляемых формах обработки
(176) Большое спасибо за наводку. Карта снова работает.
Но есть баг - работает она только до переоткрытия.
То есть, если закрыть обработку, а потом снова запустить, то при работе возникает ошибка
{Обработка.РаботаСКартами.Форма.Форма.Форма(608)}: Ошибка при вызове метода контекста (click)
ЭлементыФормы.Эксплорер.document.getElementById("WebClient").click();
по причине:
Произошла исключительная ситуация (htmlfile): Не удалось завершить действие. Ошибка 8070000b.
Перезапускаешь программу целиком - снова всё работает.
Переоткрываешь обработку - ошибка.
Поглядел процедуры "При закрытии" обычной и управляемой формы - разницы не увидел. Временные файлы при закрытии подчищаются.
(177) madonov, подскажу.
Это все баг платформы.
Тестировал на 8.3.4 и 8.3.7 - такая же ошибка.
Только на последней версии 8.3.8 все заработало без ошибок.
(178) сегодня часик поковырялся
Временные файлы 1С складывает в \AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\ , однако их чистка не помогает.
Проблема где-то на уровне взаимодействия платформы и mshtml.dll. При повторном запуске в COM-объект передается какой-то бред.
Придется убрать у формы обработки кнопку закрытия =)).
Обновлена обработка:
[*] Отказ от использования метода eval() в обычных формах
[*] Перевод работы макетов в режим совместимости IE=9 и больше - открываются больше возможностей карт и меньше ошибок.
[*] Перевод 2GIS на API 2.0
[-] 2GIS - в версии 2.0 отсутствует встроенный js-геокодер
[*] Google-map - исправлена проблема с кластеризатором
[-] На версиях 1С ниже 8.3.7 при повторном открытии возможно отключение функционала HTML-документа. Скорее всего это внутрення ошибка платформы, которые исправлена в более поздних версиях.
(180) Странно, у меня не работает, но и ошибок не выдает. просто полез в отладчик даже ни
ЭлементыФормы.Эксплорер.document.getElementById("WebClientOperation").value = "Reset()";
ни
ВыполнитьСкрипт("Reset()");
ни
ЭлементыФормы.Эксплорер.document.getElementById("Reset()"); не работают. вч чем может быть проблема?
(187) a3a, если не работает именно эта обработка, которая обновлена, то единственное, что приход на ум - это связано с IE. Либо его настройки, либо его обновить надо.
ЭлементыФормы.Эксплорер.document.getElementById("WebClientOperation").value = "Reset()"; работать не будет, т.к. нужно еще сэмулировать нажатие на элемент "WebClient"
ЭлементыФормы.Эксплорер.document.getElementById("Reset()"); - это вообще непонятная конструкция.
(188) да, в этой обработке.
а ЭлементыФормы.Эксплорер.document.getElementById("Reset()");
имелось ввиду через Eval()
или ЭлементыФормы.Эксплорер.document.Reset(); раньше в IE = 8 работали.
(191) a3a, карты яндекса в новой версии обработки переведены на поддержку IE=9. Там eval() недоступно в целях безопасности.
Как я и писал ранее - скорее всего проблема кроется в браузере.
В макете Яндекса пропишите alert'ы, чтобы узнать - заходит вызывается метод или нет.
Может, я чего не понял, но на гугле синим по белому написано: "Для всех приложений Google Maps Geocoding API требуется аутентификация с помощью ключа API.", а автор утверждает, что ключ не нужен. Итак?
(183), да, вы не поняли.
Я не утверждал, что не нужен ключ для гугл-карт. В статье написано, что не нужен ключ для этой обработки.
Т.е. она без него нормально пока отображает карту. Ну а в руководстве написано что он нужен.
Так что со временем, я думаю, отключат возможность пользоваться без ключа.
В терминальном режиме не прорисовывает карту. Точки, подписи показывает, а самой карты нет. Это настройки IE или на сервере какой-то доступ не предоставлен к сайту яндекса? Доступ открывали к https://api-maps.yandex.ru/2.1/?lang=ru_RU и https://geocode-maps.yandex.ru. Может еще куда-то надо?
Подскажите как можно отключить тулбар на яндекс картах в 1С (строка поиска, переключатель типа карт и т.д.)?
В документации нашел вот это https://tech.yandex.ru/maps/doc/jsapi/1.x/dg/tasks/how-to-add-map-controls-docpage/ Но попытка вставить код в процедуру инициализации карты init() (там где доступен объект map) приводит к ошибкам