Работа с картами 1С 4 в 1: Яндекс, Google , 2ГИС, OpenStreetMap(OpenLayers)





С каждым годом становится все очевидно, что использование онлайн-сервисов намного упрощает жизнь. К сожалению по картографическим сервисам условия пока жестковаты. Но, ориентируясь на будущее, я решил показать возможности API выше указанных сервисов:
Инициализация карты
Поиск адреса на карте с текстовым представлением
Геокодинг
Обратная поиск адреса по ее координатами
Взаимодействие с картами — прием координат установленного на карте метки
Построение маршрутов по указанным точками
Кластеризация меток на карте при увеличении масштаба
Теперь также поддержка тонкого и веб-клиента

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

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

 

Обновление 29.07.2024.

[*] В связи со скорым отказом Яндекса от использования анонимных вызовов API-JS и геокодирования доработана инициализация карты с использованием API-ключа(неправильно передавался параметр).
[*] Доработан геокодер яндекса — если указан API-ключ, то геокодирует с ним.
[*] Для геокодера Яндекса добавлен формат JSON.
[*] Исправлена проблема с переинициализацией карт в управляемых формах в тонком клиенте.

Обновление 13.02.2024.

[+] Добавлена возможность работы с OpenStreetMap через api OpenLayers v5. Геокдирование реализовано через сервис Nominatim. Маршрутизация реализована через сервис OSRM.
[+] Реализован алгоритм поиска и построения выпуклого многоугольника среди массива точек.
[*] Яндекс и Google требуют для корректной работы использование api-ключа. Обработка позволяет работать с этими сервисами как с ключем, так и без (но будет ограниченный функционал).
[*] Переделана обработка — теперь для каждого сервиса сделана отдельная форма для обычных и управляемых форм.
[*] Перевод работы макетов в режим совестимости IE=10.
[*] На текущий момент проверена работа всех представленных сервисов во всех режимах 1С — Толстый клиент, Тонкий клиент, Веб-клиент. Тестировалось на версии 1С 8.2.12.
[*] Работу http-геокодерования переведено на json-формат (кроме Яндекса). Оптимизирован сам процесс геокодирования — ответ читается сразу, а не сохраняется во временный. На старых версиях платформы может выдавать ошибку.

Обновление 29.07.2024.

[*] Отказ от использования метода eval() в обычных формах
[*] Перевод работы макетов в режим совестимости IE=9 и больше — открываются больше возможностей карт и меньше ошибок.
[*] Перевод 2GIS на API 2.0
[-] 2GIS — в версии 2.0 отсутствует встроенный js-геокодер
[*] Google-map — исправлена проблема с кластеризатором
[-] На версиях 1С ниже 8.3.7 при повторном открытии возможно отключене функционала HTML-документа. Скорее всего это внутрення ошибка платфрмы, которые исправлена в более поздних версиях.

Обновление 23.02.2024.

[*] Исправление ошибок в картах Яндекса и Гугл.

Обновление 10.01.2013. 

Поддержка работы обработки в тонком и веб-клиенте. Но там поддерживается работа только трех поставщиков услуг — Яндекс, Google. Рамблер. 2ГИС выбыл из гонки, потому, что клик на элементе формы в 1С срабатывает раньше клика в JS, поэтому координаты метки не считываются. А событий в HTML-поля в управляемых формах очень мало — двойного клика нет. Также добавлена возможность построить полигон по выбранным точкам. В тонком клиенте работа HTML-поля бывает некорректна — это уже особенности платформы.

Вот список возможностей сервисов, которые я пытался интегрировать с 1С:

  • Инициализация карты
  • Поиск адреса на карте с текстовым представлением
  • Геокодинг
  • Обратная поиск адреса по ее координатами
  • Взаимодействие с картами — прием координат установленного на карте метки
  • Построение маршрутов по указанным точками
  • Кластеризация меток на карте при увеличении масштаба
  • Построение полигона по всем меткам на карте
  • Построение выпуклого полигона по крайним меткам

Ну а теперь подробно по каждому сервиса


Яндекс-карты

Web-версия.
API Яндекс-карт.
На текущий момент используется версия API 2.0.
Возможности обработки при работе с Яндекс-картами:

  • Инициализация карты — ДА;
  • Отсутствие API-ключа — ДА;
  • Поиск адреса на карте с текстовым представлением — ДА;
  • Геокодирование — ДА;
  • Обратный поиск адреса по его координатами — ДА;
  • Взаимодействие с картами — прием координат от установленной на карте метки — ДА (клик на карте);
  • Построение маршрутов по указанным точками — ДА;
  • Кластеризация меток на карте при увеличении масштаба — ДА;


Google-карты
Web-версия.
API Google- карт.
На текущий момент используется версия API v3.
Возможности обработки при работе с Google-картами:

  • Инициализация карты — ДА;
  • Отсутствие API-ключа — ДА;
  • Поиск адреса на карте с текстовым представлением — ДА;
  • Геокодирование — ДА;
  • Обратный поиск адреса по его координатами — ДА;
  • Взаимодействие с картами — прием координат от установленной на карте метки — ДА (клик на карте);
  • Построение маршрутов по указанным точками — ДА (до 10 точек, включена оптимизация промежуточных точек);
  • Кластеризация меток на карте при увеличении масштаба — ДА;


2ГИС-карты
Web-версия.
API 2ГИС- карт.
На текущий момент используется версия API 1.0.
Возможности обработки при работе с 2ГИС-картами:

  • Инициализация карты — ДА;
  • Отсутствие API-ключа — НЕТ;
  • Поиск адреса на карте с текстовым представлением — ДА;
  • Геокодирование — ДА (но нужен API-ключ);
  • Обратный поиск адреса по его координатами — ДА;
  • Взаимодействие с картами — прием координат от установленной на карте метки — ДА (клик на карте);
  • Построение маршрутов по указанным точками — НЕТ;
  • Кластеризация меток на карте при увеличении масштаба — НЕТ;

2ГИС - поиск адреса


Рамблер-карты (проект умер, оставляю в статье для памяти)
Web-версия.
API Рамблер- карт.
На текущий момент используется версия API 1.x.
Возможности обработки при работе с Рамблер-картами:

  • Инициализация карты — ДА;
  • Отсутствие API-ключа — ДА;
  • Поиск адреса на карте с текстовым представлением — ДА;
  • Геокодирование — ДА;
  • Обратный поиск адреса по его координатами — ДА;
  • Взаимодействие с картами — прием координат от установленной на карте метки — ДА (одинарный клик на карте);
  • Построение маршрутов по указанным точками — ДА;
  • Кластеризация меток на карте при увеличении масштаба — ДА (но в обработку не добавлял, не понравилось);

Обработка реализована для 1С 8.2 (толстый клиент).

smaylukk.com.ua

99 Comments

  1. Yashazz

    Что касается Яндекс-карт, то концептуально всё ровно так же, как в моей недавней http://infostart.ru/public/164621/ Хотя слишком увлекаться возможностями eval всё ж нехорошо. 🙂

    Reply
  2. Smaylukk

    (1), спасибо за отзыв. API ведь одно — концепции тоже особо отличаться не будут :). Тем более в 1С, которая изначально предназначена для решения других задач.

    А про eval можете ссылочку бросить или написать, что с ее использованием не так?

    Потому что я в web-программировании новичок.

    Reply
  3. dimon555

    Спасибо большое за хороший пример.Делал нечто подобное, только дедовским способом.Теперь окончательно разберусь.

    Reply
  4. Smaylukk

    (3), всегда пожалуйста 🙂

    Reply
  5. dyak84

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

    Reply
  6. Lukich66

    Впервые посмотрел. Яндекс.

    1.Ввел тупо=Город(ххх), улица(хххх),№дома- ищет город(ок),ищет нас.пункт с именем улицы(?),№ дома(???) В карточной метке- красиво

    2.Создал точку (Точка 1), создал точку(Точка 2)

    3. Удалил в ТЧ-«точки» точку (Точка1)- не обновляется отображение карты, т.е. метки Т1,Т2 на карте остались, нажимать кнопку «обновления» карты- это для продвинутых.

    4.Ввел в ТЧ точку «вася» с координатами хх,уу- на карте тихо? т.е. точка не появилась- координаты рядом c точкой «город»- как бы должны отобразиться.

    5.Как это можно приспособить для работы с GPS-системой «Навигатор»,чтобы сразу в 1с-БП получать маршрут движения автомобиля, точки его жизнедеятельности(остановка,заправка,слив бензина и т.п.)?

    Reply
  7. Smaylukk

    (6), спасибо за отзыв. Отвечаю:

    1. Посмотрите информацию про геокодирование на странице описания API(есть в публикации).

    2, 3. Таблица «точки» нужна для построение маршрута. Карта очищается при построении маршрута или очистке — кнопка рядом с маршрутом с крестиком — очищает и таблицу и карту.

    4. Опять же повторюсь — таблица «точки» нужна для построения маршрута, для отображения на карте меток с адресом нужно использовать верхнюю таблицу «Адреса». Но и там после добавления ничего не появится — нужен двойной клик.

    5. Напомню, что это не подпадает под лицензию использования. Ну а относительно задачи — надо искать механизмы импорта из системы «Навигатор» точек маршрута — XML, COM, OLE — ну а дальше уже дело техники. С этой системой не работал, по-этому больше не подскажу.

    Reply
  8. Lukich66

    (7) и Вам спасибо. Посмотрел код и практически все стало понятно- первые впечатления- их и изложил.

    посмотрел и (1)http://infostart.ru/profile/48297/ и т.б. уже там об этом же. А про «Навигатор»-оч.похоже отображение на карте движений а/м объектов(точки_х)+ регистрация событий,но это уже с ними.

    Reply
  9. Yashazz

    (2) eval нехороша тем, что снижает понимабельность, особенно становятся непрозрачны области действия тех или иных переменных, поэтому тогда уж или лучше сразу указывать их как глобальные (window), или минимально использовать eval, а по максимуму — конкретные функции. Стоит на месячишко отвлечься — и код, изобилующий eval, будет трудненько понять.

    Кстати, я-то думал, ты сделал настоящее геокодирование… А это всего лишь показ на карте. Геокодирование интересно тогда, когда ты передаёшь, например, строковые адреса, а получаешь таблицу координат X,Y.

    (6) Советую посмотреть и мою разработку. Там несколько простых примеров, с которых можно начинать, авось пригодится.

    Reply
  10. Smaylukk

    (9), а то думал, что что-то серьезное. Eval я использую для запуска операций (маршрутизация, отображение на карте маркера с координатами, поиск адреса по строке). С получением координат установленного маркера на карте я перемудрил, признаю. Можно и через значение GetElemenetByID() получить.

    Про геокодирование— не знаю, что это означает для вас, но в моей разработке на карте отображается первый найденный (и наиболее точный) адрес через геокодирование внутреннее, а в таблицу , которая слева верхняя, попадают адреса, найденные через HTTP-геокодер.

    Reply
  11. Lukich66

    (9) Yashazz,добрый день. а я и посмотрел(только внешне,об этом и писал), но когда увидел «боян» кнопок( добавить метку ,удалить метку и т.д.)желания посмотреть «внутренности» не возникло. Года 4-5 назад сделал робкую попытку окунуться в мир html- получил такое разочарование от «убогости» доступных ресурсов( типа на бейсике-89г написать бухгалтерию предприятия),но с.б. появилась быстро прогрессирующая 8-ка на ней и «женился».

    Reply
  12. mzelensky

    + !

    Reply
  13. Yashazz

    (10) Дык в том и фишка, что найденные только отображаются на карте. А через http — это уже давнишний боян. Я к тому, чтоб именно средствами API получать прогеокодированную инфу обратно в 1С. Я это сделал как раз с помощью eval и весьма извратно (там переход от асинхрона к синхронности 1С), хотел глянуть, может, есть другие идеи для группового геокодирования. Сразу предупрежу — скрипт, предлагаемый разработчиками Яндекса или его вызов как библиотеки не прокатывают, т.к. в 1С сейчас MSIE 7, а там фишки, поддерживаемые в java в следующих версиях (например ForEach).

    (11) На API 2.0 это не баян. Делали на старой 1.Х, но не на новой. Конечно, разница невелика, но как демо-пример я нарочно их сделал.

    Reply
  14. Rokov

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

    Reply
  15. Smaylukk

    (14), так ведь у вас есть еще Google и Рамблер маршрутизация 🙂

    Reply
  16. Danil.Potapov

    скачал версию от 10.01.13 (упр формы)

    есть баг.

    Сценарий:

    1. выбрать яндекс

    2. набрать в поиске «Москва».

    3. Изменить размер элемента управления поле html (изменить размер формы, подвинуть вертикальный разделитель, ctrl+shift+z и тд)

    вываливается окно IE с ошибкой исполнения сценария.

    Reply
  17. Danil.Potapov

    дополнение про версию на упр формах.

    процедуры

    ПроизвестиГеокодинг_Яндекс

    ПроизвестиГеокодинг_Гугл

    ПроизвестиГеокодинг_Рамблер

    и функцию

    Получить16Цвет

    переведи на клиент

    так как хранение временных файлов на сервере 1с как-то не айс, да и причин уходить на сторону сервера нету.

    Reply
  18. Danil.Potapov

    после (17) исчезает баг описанный в (16)

    Reply
  19. Smaylukk

    (17), ПроизвестиГеокодинг можно и перевести, но ПолучитьЦвет не выйдет — ГенераторСлучайныхЧисел не работает в ВебКлиенте.

    Reply
  20. Smaylukk

    (18), спасибо за наблюдение, обязательно гляну.

    Там еще и с Рамблером проблема в Тонком клиенте — карта в поле HTML появляется внизу, сверху пустая область.

    Но прикол в том, что для толстого, тонкого и веб-клиента я использую 1 текст HTML. Везде отрабатывало норм, а в тонком начало сбоить.

    Reply
  21. Danil.Potapov

    (19) тогда насерверебезконтекста

    Reply
  22. Danil.Potapov

    (21) какой релиз 1с?

    Reply
  23. Danil.Potapov

    (21) в 8.2.17.143 все ок. скинь скрин с проблемой.

    Reply
  24. Smaylukk

    (18), у меня не исчез баг. Если открыть форму с картой Яндекса, закрыть и повторно открыть — баг остается.

    Но перевод функций геокодинга на клиент уместен.

    Такое наблюдал, когда в толстом клиенте или в 8.1 передавал текст HTML-полю, в котором подгружались файлы скриптов или стиля, через метод УстановитьТекст(). Поэтому приходится изворачиваться — сохранять в файл и метод Перейти()

    Reply
  25. Smaylukk

    (23), тоже 8.2.17.143

    Reply
  26. Smaylukk

    (23), но несмотря на ошибку функционал карты остается полным.

    Reply
  27. Danil.Potapov

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

    Reply
  28. Danil.Potapov

    (26) когда перевел на клиент, то для ПроизвестиГеокодинг_Рамблер пришлось доработать, так как там есть вызовы сервера (методы из ОбработкиОбъект).

    Reply
  29. Danil.Potapov

    (21) в первый раз когда открыл рамблер, то все работает отлично, потом переоткрывал, перестало работать как надо.

    Reply
  30. Danil.Potapov

    в основной упр форме в заголовке написано «Работа с каратми 1С: 4 в 1», но у тебя в упр формах только три сервиса.

    Reply
  31. Smaylukk

    (30), остаточное явление, извини. Дорабатывался функционал на управляемых формах, так что про заголовок и не подумал. Я изначально планировал 4 сервиса перетянуть, но 2ГИС отказался это делать.

    Reply
  32. Danil.Potapov

    (21) продолжение про глюк с рамблером.

    Как сделать, чтобы не глючил (работает только при первом открытии обработки).

    1. очистить всю историю в IE.

    2. перевести работу IE WebBrowser в режим отличный от версии 7.

    http://blogs.msdn.com/b/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx

    http://partners.v8.1c.ru/forum/thread.jsp?id=876295

    — на компьютере штатным образом можно установить только одну версию IE.

    — при установке IE регистрируется в системе как ActiveX «Microsoft Web Browser». Реализация находится в ieframe.dll, которая располагается в системном каталоге ОС

    — поле HTML документа для работы использует этот ActiveX, создавая его штатным образом.

    Т.о. нам не понятно как можно добиться описанного Вами поведения.

    Мы можем только посоветовать Вам убедиться в том, что IE был установлен правильно. Например, не используются утилиты, которые пытаются предоставить возможность параллельного использования IE разных версий.

    PS у себя сделал 1cv8.exe 1f40 и 1cv8c.exe 1f40 в HKCU и тупо перезапустил приложения.

    Reply
  33. Danil.Potapov

    (32) проверить, что все заработало

    http://rghost.ru/42879791

    Reply
  34. Danil.Potapov

    (25) фиксил чисткой кэша на стороне клиента 1с.

    Reply
  35. Gmix

    Скачал пробую добавить несколько точек — не получается.

    Как вообще это проверить все?

    Reply
  36. Smaylukk

    (35), открываете стартовое окно

    выбраете поставщка услуг (клик по логотипу)

    появляется карта — вот по ней либо клик, либо двойной клик.

    Reply
  37. Gmix

    (36) На скринах в ТЧ адреса видно несколько адресов.

    Как это сделать? посмотрел код. При вводе адреса в верхнее поле ТЧ Адреса очищается.

    Не понятно зачем она тогда.

    Я так понимал я ввожу несколько адресов и обработка геокодирует адрес и добавляет его в ТЧ.

    Посмотрев код понял что ожидал другое поведение от этой обработки.

    За обработку Спасибо.

    Reply
  38. Smaylukk

    (37), «несколько адресов в ТЧ адерсов» — это следствия геокодинга, который запускается при изменении адреса. Перед этим нужно очистить результат предыдущего геокодинга.

    Reply
  39. ReLock

    А у меня почему-то вообще открывается не ФормаОсновная, а ФормаОсновнаяУпр, т.к. на форме нет 2GIS. И не важно, в каком режиме я запускаю программу (толстый, тонкий). Пробовал поменять формы местами — 0. Почему так?

    Reply
  40. Smaylukk

    (39), возможно вы запускаете 1С в режиме «Толстый клиент управляемое приложение»?

    Во всяком случае, у меня такой проблемы не было.

    Если не получится — напишите номер версии 1С и конфигурацию, в которой запускаете (если не самописная).

    Reply
  41. ReLock

    Спасибо! Запустил в толстом клиенте (обычное приложение)! 2GIS появился!

    Reply
  42. ReLock

    (40) А почему 2GIS работает только в этом режиме (ТК ОП)?

    Reply
  43. Smaylukk

    (42), я описал в обновлении к публикации. 1С быстрее отрабатывает клик по карте, чем прикрепленное событие в JS. Проще говоря — нельзя корректно считать координаты метки для 2ГИС. Остается только поиск адреса. Остальной функционал тоже отсутствует. Поэтому решил с ним в тонком клиенте не заморачиваться.

    Reply
  44. kanalya

    А как снова отобразить точки на карте после очистки карты?

    Reply
  45. Smaylukk

    (44), просто точки уже не отобразить — можно вывести кластера, построить маршрут или полигон.

    Но вы можете и сами программно (если умеете) доделать — по аналогии с верхней таблицей Адресов. Там при выборе адреса — выводится точка, только с предварительной очисткой карты.

    Reply
  46. kanalya

    (45)Спасибо. Попробую.

    Reply
  47. mikukrnet

    А почему такие точки в яндексе странные? Вот эта запатентованная (by Apple) скругленная рамочка — это точка )

    Reply
  48. Smaylukk

    (47), это по всей видимости зависит от Internet Explorer, который у вас стоит. И такое возникает в тонком клиенте.

    В макете, в секции HEAD есть строка

    <meta http-equiv=»X-UA-Compatible» content=»IE=7″/>

    .

    Вот при установке

    content=»IE=9″

    у меня появлялась такая точка :).

    Поиграйтесь с мета тегом «X-UA-Compatible», на который завязывается HTML в тонком клиенте.

    P.S. Если его убрать, макет напрочь отказывался работать.

    Reply
  49. Bukaska

    Хорошая статья! Как раз нужный мне материал, но есть вопросы.

    1. Карты — это типа показухи, предназначено для демонстрации готовой конфигурации?

    2. Какие карты лучше подойдут для обозначения транзитных складов, а так же показать линии маршрута?

    3. Кроме обработки, как ещё можно «внедрить» карты в конфигурацию? Или оно не внедряется внутрь, а чисто внешним файлом или внешним отчетом для демонстрации возможностей?

    Reply
  50. Smaylukk

    (49), в обработке я захотел собрать воедино работу с несколькими картографическими сервисами, у которых есть более-менее приемлемые карты стран СНГ. На сайте есть похожие обработки, но они заточены чисто под один сервис. Ну и наконец делалось это чисто для прокачки опыта.

    По-этому это просто обработка — демонстрация возможностей работы из 1С с подобного рода сервисами. Конфигурации нет.

    Мне из представленных 4 больше всего понравился Яндекс — хорошая детализация, русский/украинский язык, большая территория.

    Напомню, что из перечисленных карт в 1С можно встроить только Гугл, при условии, что у вас есть бизнес-аккаунт.

    Ну а внедрение:

    • Берете понравившийся макет.
    • Добавляете его в общие макеты или в нужный объект.
    • Настраиваете формы, по аналогии с формой обработки.
    • Программно привязываете к нужным справочникам/документам, для поиска адресов, координат, составления маршрутов.
    Reply
  51. Bukaska

    (50) А Как добавить карту в нужный объект? Об этом где-нить написано?

    Reply
  52. karakozov

    Видел уже несколько примеров взаимодействия с АПИ поставщиков карт, очень интересная концепция, но более интересно реально прикладное внедрение, которое не просто умерло по средствам пользователей, а функционирует и используется (не в транспортных компаниях например). Можно предположить что в логистике это очень полезно.Но есть ли иные реализации задач по средствам карт API.

    Reply
  53. Smaylukk

    (52), отвязать карты от транспорта очень сложно. Но к примеру владельцы торговых или некоммерческих точек, которые разбросаны по городу или стране могут с помощью карт обозначит их для более удобного поиска.

    Reply
  54. Zhilyakovdr

    Ни кто не задавался целью написать решение задачи коммивояжера с использованием данных карт? Это могло бы очень упростить работу логиста…

    Reply
  55. Aleks1973

    (54) В Москве такого решения — для произвольного маршрута — не существует. Тема была ещё на 77

    Reply
  56. Zhilyakovdr

    (55) В смысле не существует? На сколько я знаю у тех же яндекс карт есть прокладка маршрута от точки А к точке Б, разве нельзя получить матрицу расстояний между всеми точками потом просчитать задачу коммивояжера по этой матрице и с помощью апи нарисовать маршрут? Я реализовывал похожую задачу, но без расчета оптимального пути((( Если у кого то есть функция решения задачи коммивояжера, то можем попробовать написать такую обработку.

    Reply
  57. pridecom

    Спасибо за обработку.

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

    Например, нужно отображение адреса клиента, на карточке которого в УТ 11 планируем добавить кнопку с отображением карты (Яндекс).

    В коде данный параметр отсутствует, да и его организация не совсем понятна…

    Reply
  58. Smaylukk

    (57) ,Спасибо за отзыв.

    В макете Яндекса есть две процедуры:

    • 1 FindAdres(Adres) — ищет адрес по текстовому представлению с помощью геокодера Яндекса и отображает первый найденный.
    • 2 ReverseSearchAdres(CoordX, CoordY, Adres) — устанавливает маркер на карте по переданным координатам.

    Вызов этих процедур осуществляется с помощью метода — ЭлементыФормы.Эксплорер.Документ.parentWindow.eval(«FindAdres(«»» + ВашАдрес + «»»);»);

    или

    ЭлементыФормы.Эксплорер.Документ.parentWindow.eval(«ReverseSearchAdres(» + Широта + «,» + Долгота + «, «»» + ВашАдрес + «»»);»);

    Reply
  59. Ed111111

    Обязательно скачаю. Это самое лучшее, что я мог себе представить. Если мне разрешат этой обработкой пользоваться на работе — мне вообще ничего почти не надо будет делать почти. Работы станет процентов на 70 меньше)))

    Reply
  60. pridecom

    Еще один вопросик

    На скриншоте Яндекс.Карт отражено несколько адресов сразу на карте

    В самой обработке непонятно, каким образом отображать сразу несколько адресов.

    Строка поиска только для заполнения одного адреса или нет?

    Reply
  61. Smaylukk

    (60), после заполнения строки поиска запускается механизм геокодинга Яндекса (в данном случае) и в таблицу адресов заполняется все найденные адреса, а на карту выводится по координатам первый адрес, с предварительной очисткой карты. Т.е. всегда один адрес отобразится в данном случае.

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

    А теперь ответ на вопрос:

    1. Методы отображения адреса на карте всегда покажут один маркер, поскольку там встроен метод очистки.

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

    Reply
  62. Поручик

    Проект «Рамблер-Карты» закрыт

    Reply
  63. @lex

    Хорошие примеры 🙂 Еще бы сохранение маршрута в нужном масштабе сделать…

    Reply
  64. Foma4382

    Хороший примерчик. Спасибо!

    Reply
  65. gosizo

    Яндекс карта. допустим я поставил несколько меток, можно ли как-то смасштабировать карту (не руками, а программно), что бы масштаб был максимально увеличен и в тоже время все метки были видны (в границах карты)?

    Reply
  66. Smaylukk

    (65), установка масштаба карты программно — Метод карты;

    Навесить правильный масштаб при наполнении карты — сложновато. Т.е. тут надо высчитывать наибольшее расстояние между точками и для него подбирать оптимальный масштаб. Автомасштаб есть при построении маршрута.

    Reply
  67. gosizo

    (66) в моем случае не вычерчивается маршрут а только выводятся метки на карту последовательно передавая параметры в функцию

     function AddPlacemark(Name, Descr, Cont, Att, Latt, Params) {
    
    // Создает метку в центре Москвы
    placemark = new YMaps.Placemark(new YMaps.GeoPoint(Latt, Att), Params);
    
    // Устанавливает содержимое балуна
    placemark.name = Name;
    placemark.description = Descr;
    
    if (Cont != «») {
    placemark.setIconContent(Cont);
    }
    
    // Добавляет метку на карту
    map.addOverlay(placemark);
    
    return placemark;
    }
    

    Показать

    в этом случае возможно применить автомасштаб ?

    Reply
  68. Smaylukk

    (67), эта функция делает только то, что добавляет метки на карту. Маршрутом и не пахнет.

    Вот моя функция, которая выводит маршрут на карту:

    function calcRoute(options){
    ymaps.route(options, {
    // Опции маршрутизатора
    mapStateAutoApply: true, // автоматически позиционировать карту
    avoidTrafficJams: true   // Учитывать пробки
    }).then(
    function (router) {
    route = router;
    myMap.geoObjects.add(route);
    
    //следующее можно пропустить, т.к. приводится лишь в контексте обработки
    //заполняем и сохраняем инфо про маршрут
    document.getElementById(‘RouteInfo’).value = «Длина маршрута — » + route.getHumanLength() + «. Время — » + route.getHumanJamsTime();
    
    //генерация события для перехвата в 1С
    var evt = document.createEventObject();
    document.body.fireEvent(‘ondatasetcomplete’, evt);
    },
    function (error) {
    alert(«Возникла ошибка: » + error.message);
    });
    }
    

    Показать

    А в параметр options нужно передать массив точек в виде

    [[ШиротаТочки1, ДолготаТочки1],[ШиротаТочки2, ДолготаТочки2],…[ШиротаТочкиn, ДолготаТочкиn]]

    Но это все есть в обработке.

    Reply
  69. Algiz

    Изучаю вашу обработку. При переносе ее на документ вываливается ошибка

    Значение не является значением объектного типа (value)

    Элементы.Эксплорер.document.getElementById(«WebClientOperation»).value = «Reset()»;

    Куда копать, что смотреть?

    Reply
  70. Smaylukk

    (69) , судя по ошибке — у вас управляемые формы и что-то не то, с HTML — не все прогрузилось. Но информации маловато.

    1. Внешняя обработка нормально под тонким клиентом запускается и работает?

    2. Какую карту используете?

    3. На какой операции возникает проблема?

    Reply
  71. Algiz

    (70) 1с 8.3

    Карта используется яндекса, перенесен функционал по работе с яндексом в свой модуль. Макет добавлен в общий. При построении маршрута вываливается эта ошибка 🙁

    Если отключить «ОчисткаКарты()» то вываливается на этой строке

    Элементы.Эксплорер.document.getElementById(«WebClientOperation»).value = «calcRoute(» + ПараметрыМаршрута + «)»;

    с такой же ошибкой. Получается ему почему-то не нравится «(value)»

    Reply
  72. iov

    г. Санкт-Петербург, ул. Большая Морская, 23/12 на карте точка верно стоит — в таблице 2 строки

    Большая Морская улица, 23, Санкт-Петербург, Россия, 190000

    Большая Морская улица, 12, Санкт-Петербург, Россия, 190000

    Reply
  73. Smaylukk

    (72) , Проверил :

    Яндекс — показывает один результат геокодинга, т.е. все ОК.

    Гугл — показывает две строки. Скорее всего он не обновил у себя данные по этому адресу.

    Алгоритм геокодирования — отправляет строку адреса, получает массив результатов, выводит первую точку (т.к. она самая подходящая) и подписывает ее строкой поиска.

    Reply
  74. Smaylukk

    Заметил, что при открытии Яндекс-карт выскакивает ошибка:



    Эта ошибка связана с версией 2.0.35.

    Поэтому, чтобы ее исправить надо в макете обработки «МакетЯндекс» изменить скрипт подключения карты с

    <script src=»http://api-maps.yandex.ru/2.0-stable/?load=package.full&lang=ru-RU»  type=»text/javascript»></script>

    на

    <script src=»http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU»  type=»text/javascript»></script>
    Reply
  75. Smaylukk

    (74) , Все же поспешил. Желательно оставить подключение к стабильной версии API, а чтобы запретить всплывающее окно с ошибкой — просто подключить следующий скрипт:

    <script type=»text/javascript»> window.onerror = function(){ return true; };</script>
    Reply
  76. Stas-ch

    190068, Санкт-Петербург г, Лермонтовский пр-кт, дом № 30

    По этому адресу выдает ошибку. Адрес взят из адресного классификатора.

    Ошибка при попытке геокодировать по яндексу адрес: 190068, Санкт-Петербург г, Лермонтовский пр-кт, дом № 30

    {Форма.ФормаУпр.Форма(123)}: Ошибка при вызове метода контекста (Получить): Ошибка работы с Интернет: Couldn’t connect to server

    Однако на карте все нормально отображается.

    1С 8.2.19.83.

    С интернетом вроде все нормально. (правда на работе пробовал — может тут безопасники что заблокировали….)

    Reply
  77. Stas-ch

    И еще вопрос — Перенес карту на отдельную страницу. т.е. карта не видна сразу, а ее можно глянуть, типа при необходимости. Набираю адрес, нажимаю найти и получаю сообщение:

    {Форма.ФормаУпр.Форма(109)}: Значение не является значением объектного типа (value)

    Элементы.Эксплорер.document.getElementById(«WebClientOperation»).value = «FindAdres(«»» + Адрес + «»»);»;

    Можно это как-то побороть?

    Или карта обязательно должна отображаться для работы с ней?

    Reply
  78. Smaylukk

    (77), это ошибка с геокодингом. Он осуществляется по адресу «geocode-maps.yandex.ru».

    Надо проверить, доступ по этому адресу. Также возможне временный сбой у Яндекса.

    Но тем не менее, геокодинг сейчас работает.

    Reply
  79. Smaylukk

    (78), эта ошибка из-за того, что не загрузился HTML. А он к сожалению загружается, когда поле HTML документа видно на форме.

    Reply
  80. Stas-ch

    (79)

    Да, действительно, адрес был заблокирован нашими доблестными сисадминами.

    Reply
  81. Stas-ch

    Кстати по двойному клику по адресу в верхней таблице Данные, получаем ошибку:

    {Форма.ФормаУпр.Форма(273)}: Индекс находится за границами массива

    Если ЗначениеЗаполнено(ТаблицаАдресов[ВыбраннаяСтрока].Широта) И ЗначениеЗаполнено(ТаблицаАдресов[ВыбраннаяСтрока].Долгота) Тогда

    При этом параметр ВыбраннаяСтрока = 6 (а всего два адреса).

    Reply
  82. Smaylukk

    (82), мало информации.

    Какой адрес искали?

    Какая карта?

    Reply
  83. Stas-ch

    карта Яндекс.

    Для примера сейчас ввел в поиск Туристская. Вывелось несколько результатов поиска. стал кликать по разным строкам — на карте отображается найденная точка. Ввел в поиск Садовая. При клике на последней записи появляется такое же сообщение.

    т.е. похоже при вводе второго адреса может появляться такая ошибка.

    Reply
  84. Stas-ch
    Reply
  85. Stas-ch

    (85) Stas-ch,

    Проблема частично решилась. вдруг у кого будет такое же — надо в скрипте первой строкой прописать:

    <!DO CTYPE html>

    Но появилась другая проблема — при выводе карты она выводится по высоте в одну строку.



    Если вместо

    <div id=»map» st yle=»width:100%;height:100%»></div>

    прописать

    <div id=»map» st yle=»width:800px;height:400px»></div>

    То карта отрисовывается в указанном размере, но это не совсем интересно,т.к. не заполняет все пространство или наоборот вылезает за рамки.

    Reply
  86. Smaylukk

    (85)(86), Нужно смотреть на эту строку

    <meta http-equiv=»X-UA-Compatible» content=»IE=EmulateIE7″ >

    ,

    в частности на этот параметр

    content=»IE=EmulateIE7″ >

    .

    У меня к примеру стоит IE=7

    Reply
  87. Smaylukk

    (84), непонятное поведение платформы. Индексы строк не обнуляются пр очистки коллекции. В ближайшем будущем переделаю на ТекущиеДанные.

    Reply
  88. platonov.e

    Ребят, а вот в обычных формах расчитывается длина маршрута, а в управляемых нет. Может кто то сделал расчет длины маршрута или знает как его сделать?)

    Reply
  89. Smaylukk

    (89), расчет длины маршрута в толстом клиенте реализован с помощью событий ПоляHTMLДокумента. Сам метод построения маршрута у Яндекса или Гугла асинхронный — т.е. после вызова метода работа скрипта идет дальше, но после выполнения метода можно вызвать другой скрипт, который и генерирует событие у ПоляHTMLДокумента.

    В тонком клиенте только 1 событие у ПоляHTMLДокумента — значит этот метод не сработает.

    На одном из проектов подсчет маршрута сделал следующим образом — после построения маршрута в специальные inputы помещается информация о времени и длине маршрута. После этого в управляемой форме подключается обработчик ожидания, который постоянно считывает эти inputы на наличие значения. Если считало — выводит информацию на форму, а эти inputы очищает.

    Reply
  90. andrey-st

    (90)

    «На одном из проектов подсчет маршрута сделал следующим образом — после построения маршрута в специальные inputы помещается информация о времени и длине маршрута. После этого в управляемой форме подключается обработчик ожидания, который постоянно считывает эти inputы на наличие значения. Если считало — выводит информацию на форму, а эти inputы очищает.» А это можно где-нибудь посмотреть детальнее.

    Reply
  91. set5553

    Как побороть в Гугл карте построение маршрутов до 10 точек?

    Reply
  92. Smaylukk

    (92) set5553, да никак не побороть — это ограничение АПИ. Смотреть тут — https://developers.google.com/maps/documentation/javascript/directions#Waypoints.

    Если купить Гугл карты для бизнеса — там будет 25 точек.

    Reply
  93. savostin.alex

    А как в УФ получить расстояние по рассчитанному маршруту?

    Reply
  94. madonov

    Если

    content=»IE=8″

    заменить на

    content=»IE=9″, то ошибка при инициализации карты пропадает, но возникают проблемы при работе.

    Например, если нажать кнопку «обновить» —

    {Форма.Форма.Форма(80)}: Метод объекта не обнаружен (eval)

    ЭлементыФормы.Эксплорер.Документ.parentWindow.eval(«FindAdres(«»» + Адрес + «»»);»);

    Адрес апи пробовал менять на 2.1.35 — не помогает.

    Обсуждение на яндексе

    ВРЕМЕННОЕ РЕШЕНИЕ — пишите 2.1.34 при подключении
    Reply
  95. Sheff

    (133) madonov,

    ВРЕМЕННОЕ РЕШЕНИЕ — пишите 2.1.34 при подключении

    Спасибо добрый человек. Потратил час разбираясь, если бы не ваш совет — неизвестно сколько бы ещё времени ушло!

    Reply
  96. alex15650

    (76) а в каком месте нужно вставить этот код?

    Reply
  97. Smaylukk

    (170) alex15650, к сожалению тот скрирт уже не работает.

    Я решил это переводом совместимости IE в «IE=9». Но тогда слетает метод eval ().

    Так что дополнительно надо переписать весь код взаимодействия с яндекс-картами.

    За основу взял способ, который использовал в управляемой форме этой обработки — передача кода в один ,лемент управления и принудительный клик по втором.

    Но на ИС есть и лрурие срособы.

    Reply
  98. alex15650

    (171) а можно поподробнее о реализации? ))

    Reply
  99. Smaylukk

    (172) alex15650, откройте управляемую форму этой обработки и посмотрите, как там устроен обмен с HTML-документом

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *