Особенности работы с картами Google через WebKit на платформе 16
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Проблема вызова 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 (если ключ неверный то карта перестает функционировать совсем). Для получения координат по адресу необходимо набрать произвольный адрес и нажать кнопку
Установить метку по адреу. Для установки метки по координатам указать вручную координаты и нажать кнопку
Установить конпку по координатам
Обработка выполняет следующие действия с картой:
- Определение координат и установка маркера по адресу.
- Установка маркера по координатам
- Получение координат по двойному щелчку мыши на карте
Протестировано на платформах 8.3.12.1529, 8.3.16.1502
Вступайте в нашу телеграмм-группу Инфостарт