К сожалению, прошлая публикация была потёрта в результате какой то ошибке на сервере базы данных, поэтому приходится создавать новую, улучшенную версию. В этой публикации я постараюсь рассмотреть способ взаимодействия с картами не как со статичным объектом, когда предварительно формируется текст html страницы, который показывается пользователю, а как с объектом, обладающим "рычагами" для управления.
В тестовом примере показаны: рисование полигонов в статике из данных БД, рисование маркеров в статике, создание маркеров интерактивно без перерисовки карты, перемещение маркеров.
Массив статических элементов передается при формировании страницы, как xml блок, ввиду чего, к сожалению, страница некорректно работает в firefox. Проблема легко лечится вынесением массива из html блока и формированием объектов динамически.
Для динамических изменений веб страницы необходимо вызывать её скриптовые функции. В 1С это выглядит довольно "неудобно":
Функция Скрипт(Элемент,Код)
Результат = Элемент.Документ.parentWindow.Eval(Код);
Возврат Результат;
КонецФункции
Для собственного удобства я обернул вызов javascript кода в функцию. Здесь "Элемент" - поле HTML текста, а "Код" - код на языке javascript. Для вызова доступны глобальные переменные блока и функции оттуда же. Поэтому, для создания маркера мы создаем функцию в макете html страницы, которая по списку параметров создает маркер:
function placemarker(iconId,lat,lng,title,GUID){ var pos = new google.maps.LatLng(parseFloat(lat), parseFloat(lng)); var marker = new google.maps.Marker({ position: pos, map: map, title: title, icon: icons[iconId] }); }
В функцию передаются текстовые значения координат, названия точки и иконки (если она есть)
Кроме того, что маркер размещается на поле HTML документа, необходимо отразить его создание в базе данных. Для этого создаются подписки на события нажатия на карту.
google.maps.event.addListener(map, 'click', mapClick); function mapClick(event) { sender = "map"; eventname = "click"; latlng = event.latLng; }
Обработчик устанавливает значения глобальных переменных, к сожалению более красивого способа я пока не нашёл. Эти глобальные переменные доступны в обработчике нажатия на поле HTML документа в 1С. С помощью переменной sender определяется объект, с которым произошло событие, с помощью eventname - само событие, а в переменной latlng находятся координаты, если они применимы.
В обработке нажатия на поле HTML текста осуществляется обработка всех подобных событий.
&НаКлиенте
Процедура ПолеHTMLТекстаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
ИсточникСобытия = Скрипт(Элемент,"sender");
Событие = Скрипт(Элемент,"eventname");
Если ИсточникСобытия = "map" И Событие = "dragend" Тогда
Возврат;
КонецЕсли;
Широта = Скрипт(Элемент,"latlng.lat()");
Долгота = Скрипт(Элемент,"latlng.lng()");
Если ИсточникСобытия = "marker" Тогда
GUID = Скрипт(Элемент,"myGUID");
ТК = ПолеHTMLТекстаПриНажатииНаСервере(GUID);
Если Событие = "click" Тогда
Если НЕ ТК = Неопределено ИЛИ ВводНовыхОбъектов Тогда
ПараметрыФормы = Новый Структура("Ключ",ТК);
Форма = ПолучитьФорму("Справочник.ОбъектыРазвития.ФормаОбъекта",ПараметрыФормы);
ДанныеФормы = Форма.Объект;
ЗаполнитьНаСервере(ДанныеФормы,Широта,Долгота);
КопироватьДанныеФормы(ДанныеФормы,Форма.Объект);
Форма.ОткрытьМодально();
КонецЕсли;
ИначеЕсли Событие = "dragend" Тогда
ПараметрыОбновления = Новый Структура("Широта,Долгота,GUID",Широта,Долгота,GUID);
Структура = Новый ФиксированнаяСтруктура(ПараметрыОбновления);
ОбновитьКоординатыТК(Структура);
КонецЕсли;
ИначеЕсли ИсточникСобытия = "map" И Событие = "click" И ВводНовыхОбъектов Тогда
ВводНовогоТК = Истина;
ПараметрыФормы = Новый Структура("Ключ",ТК);
Форма = ПолучитьФорму("Справочник.ОбъектыРазвития.ФормаОбъекта",ПараметрыФормы);
ДанныеФормы = Форма.Объект;
ЗаполнитьНаСервере(ДанныеФормы,Широта,Долгота);
КопироватьДанныеФормы(ДанныеФормы,Форма.Объект);
Форма.ОткрытьМодально();
КонецЕсли;
КонецПроцедуры
Следующим образом получаются значения глобальных переменных, играющих роль параметров события. Дальнейшая обработка тривиальна, рассматривать её не будем.
ИсточникСобытия = Скрипт(Элемент,"sender");
Широта = Скрипт(Элемент,"latlng.lat()");
Долгота = Скрипт(Элемент,"latlng.lng()");
Аналогичным образом осуществляется и перемещение маркеров. Только вместо события карты вызывается событие маркера, которое привязывается к нему при создании.