Особенности работы с картами Google через WebKit на платформе 16

Публикация № 1273033

Разработка - Системная интеграция - Интеграция с WEB

WebKit google карты

При переходе на 16 платформу появилась проблема с google картами. Перестали работать вызовы функций JS Поля HTML документа и Callback вызовы в контекст формы из java script Поля HTML документа.

 Проблема вызова JS функций из модуля формы была решена следующим образом:

Функция DOMWindow(Элемент)
    
    Document = Элемент.Документ;
    Если Document.parentWindow = Неопределено Тогда
        Возврат Document.defaultView;
    Иначе
        Возврат Document.parentWindow;
    КонецЕсли; 
    
КонецФункции

Вызов функции определения адреса стал выглядеть вот так

DOMWindow(Элементы.Карта).GeocodeByAddress(Объект.Адрес);

 В JS была следующая функция:

function GeocodeByAddress(address) {
    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            for (var i in results) {
                 Form1C.UpdateGeoCode(results[i].geometry.location.lat(), results[i].geometry.location.lng());  
            }
        }
    });
}

Функция GeocodeByAddress отрабатывает асинхронно и по мере выполнения вызывает процедуру UpdateGeoCode формы

В Форме следующая Процедура:

Процедура UpdateGeoCode(Lat, Lng)
    //Что то сделать с координатами    
КонецПроцедуры

И вот здесь я столкнулся с проблемой вызова Процедуры формы. Из за того что Поле HTML документа больше не OLE объект, форму никак не передать в контекст JS. (Можно передать простые типы)

Из- за отсутствия решения пришлось применять кривоватый метод:
Записывать результаты  GeocodeByAddress во внутренние тэги поля HTML документа и опрашивать их с помощью ПодключитьОбработчикОжидания

Вот так стала выглядеть GeocodeByAddress

function GeocodeByAddress(address) {
    document.getElementById('satus_location').innerHTML = "IN PROGRESS";
    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            for (var i in results) {
                document.getElementById('CenterLat').innerHTML = results[i].geometry.location.lat();
                document.getElementById('CenterLng').innerHTML = results[i].geometry.location.lng();
            }

            document.getElementById('satus_location').innerHTML = "READY";
        } else {
            document.getElementById('satus_location').innerHTML = "ERROR";
        }
    });
}

Все изложенное присутствует в обработке, реализованной на управляемой форме. Конфигурация базы не имеет значения,  версия платформы 8.3. Был бы рад за советы по реализации Callback функций. Нигде не смог найти.

Для полноценной работы обработки требуется API ключ google, без него работает только установка маркера по координатам и координаты по маркеру. Ключ необходимо ввести в поле API Key (если ключ неверный то карта перестает функционировать совсем). Для получения координат по адресу необходимо набрать произвольный адрес и нажать кнопку Установить метку по адреу. Для установки метки по координатам указать вручную координаты и нажать кнопку Установить конпку по координатам

Обработка выполняет следующие действия с картой:

  1. Определение координат и установка маркера по адресу. 
  2. Установка маркера по координатам
  3. Получение координат по двойному щелчку мыши на карте

Протестировано на платформах 8.3.12.1529, 8.3.16.1502

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

Наименование Файл Версия Размер
Особенности работы с картами Google через WebKit на платформе 16:

.epf 10,45Kb
1
.epf 10,45Kb 1 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. t278 37 04.08.20 02:26 Сейчас в теме
у меня с Яндекс картами, после второго или последующего массового вывода меток зависает 1С.
Возможно ваше описание поможет найти решение, но пока нет времени.
Оставьте свое сообщение