Задача отображения списка адресов на интерактивной карте с произвольными комментариями к каждой точке часто возникает при автоматизации логистики, работы курьеров или торговых представителей. Однако при использовании старых наработок разработчики 1С регулярно сталкиваются с ошибками: карта перестает загружаться, выдает сообщения о недействительном ключе (invalid key) или некорректно обрабатывает геокодирование адресов.
Разберем подробнее причины возникновения этих проблем, рассмотрим рабочий пример скрипта для отображения меток и выясним, как правильно интегрировать карту в элемент Поле HTML документа управляемой формы 1С.
Проанализируем ситуацию, почему решения, созданные несколько лет назад, перестают функционировать при открытии в современных версиях платформы 1С:
Поле HTML документа использует движок Internet Explorer (Trident). По умолчанию он может запускаться в режиме совместимости с IE7/IE8, что приводит к синтаксическим ошибкам при исполнении современного JavaScript.Рассмотрим пример HTML-шаблона, который загружается в поле HTML-документа на форме. В нем задаются функции инициализации карты, добавления точек по координатам и адресам, а также установке текстов в балунах и метках.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Карта заказов</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script src="https://api-maps.yandex.ru/2.1/?apikey=ВАШ_API_КЛЮЧ&lang=ru_RU" type="text/javascript"></script>
<script type="text/javascript">
var map;
var placemark;
window.onload = function () {
map = new YMaps.Map(document.getElementById("YMapsID"));
map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 10);
map.addControl(new YMaps.TypeControl());
map.addControl(new YMaps.ToolBar());
map.addControl(new YMaps.Zoom());
map.addControl(new YMaps.ScaleLine());
map.enableScrollZoom();
}
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;
}
function AddPlacemarkByAddress(Name, Descr, Cont, Address, Params) {
geocoder = new YMaps.Geocoder(Address, {results: 1});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
placemark = new YMaps.Placemark(this.get(0).getGeoPoint(), Params);
placemark.name = Name;
placemark.description = Descr;
if (Cont != "") {
placemark.setIconContent(Cont);
}
map.addOverlay(placemark);
});
}
</script>
</head>
<body>
<div id="YMapsID" style="width:100%;height:100%"></div>
</body>
</html>
Посмотрим на ключевые моменты этого кода:
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> заставляет встроенный браузер 1С использовать самый актуальный режим рендеринга страницы.AddPlacemark принимает имя метки, текстовое описание (комментарий), содержимое и географические координаты, после чего добавляет объект на карту.AddPlacemarkByAddress осуществляет поиск координат через геокодер по передаваемому текстовому адресу прямо в JS-скрипте.Рассмотрим, как правильно связать макет HTML и обработку на платформе 1С:Предприятие 8.3 (Управляемые формы):
Строка (например, ТекстHTML).Поле HTML документа.ПриОткрытии или ПриСозданииНаСервере прочитайте HTML-макет из макета обработки и запишите его в реквизит ТекстHTML.ИсполнитьСкрипт() (или evalAction() для устаревших версий платформы).Пример кода на 1С для вызова функции добавления метки из 1С:
&НаКлиенте
Процедура ДобавитьМеткуНаКарту(Название, Комментарий, Широта, Долгота)
// Формируем вызов JavaScript-функции, определенной в макете
Скрипт = СтрШаблон("AddPlacemark('%1', '%2', '%1', %3, %4, {})",
Название,
Комментарий,
СтрЗаменить(Строка(Широта), ",", "."),
СтрЗаменить(Строка(Долгота), ",", "."));
Элементы.ПолеКарты.ИсполнитьСкрипт(Скрипт);
КонецПроцедуры
Проанализируем практические советы, которые помогут избежать ошибок при активной эксплуатации решения:
Широта и Долгота, сохранять их в базе данных и передавать в карту уже готовые числа.Поле HTML документа.Поле HTML документа переведен на движок Chromium. Это обеспечивает полную совместимость со всеми современными картографическими веб-библиотеками и стандартами HTML5/CSS3.