Как уже известно, 1С, начиная с версии платформы 8.3.14.1565, перевела работу с HTML в 1С:Предприятии с Internet Explorer на WebKit. Поэтому, если в коде использовалась объектная модель IE, например для разбора событий html-страницы, то при переходе на новую версию платформы, такой код придется перевести на модель WebKit. В этой статье предлагаю один из вариантов такой доработки.
Сразу скажу, что вариант работы через попытку вызывать пользовательское DOM-событие через функцию document.dispatchEvent (аналогично document.fireEvent в IE) не удался.
event = document.createEvent("Event");
event.initEvent('click', true, true);
event.eventName = 'click';
event.propertyName = name;
event.data = data;
event.cancelBubble = true;
event.returnValue = false;
externalForm.dispatchEvent(event);
После вызова этого события, в 1С получаем ВнешнийОбъект в который возможно содержит переданные данные, но найти их не удалось. Возможно в будущем, уважаемый sikuda (или кто-то другой) найдет способ и поделится с нами).
В итоге, передача данных в 1С будет обычным способом, через div элемент.
например, так создаем:
<div id='message_name' style='display: none'></div>
<div id='message_data' style='display: none'></div>
и так передаем данные в 1С:
document.getElementById('message_name').innerHTML = name;
document.getElementById('message_data').innerHTML = data;
Для реализации кода, независимого от версии платформы (IE или WebKit) нужно добавить переменную в скрипт, по значению которой будет выбираться ветка алгоритма.
&НаКлиенте
Процедура БраузерДокументСформирован(Элемент)
Если НЕ БраузерЗагружен Тогда
БраузерЗагружен = Истина;
ДокументБраузера = Элемент.Документ;
ОкноБраузера = ДокументБраузера.parentWindow;
Если ОкноБраузера = Неопределено Тогда
ОкноБраузера = ДокументБраузера.defaultView;
КонецЕсли;
ОкноБраузера.externalForm = ЭтаФорма;
СисИнфо = Новый СистемнаяИнформация;
ВерсияПлатформы = Число(РазложитьСтрокуВМассивПодстрок(СисИнфо.ВерсияПриложения, ".")[2]);
ОкноБраузера.setProperty("webkit", ?(ВерсияПлатформы>13,"up","down"));
КонецЕсли;
КонецПроцедуры
обработка события на стороне 1С
&НаКлиенте
Процедура БраузерПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Данные = ОбработатьДанные(ДанныеСобытия);
Если Данные.Количество() Тогда
ЗаполнитьЗначенияСвойств(ЭтотОбъект, Данные);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ОбработатьДанные(ДанныеСобытия) Экспорт
Ответ = Новый Структура;
Если ВерсияПлатформы > 13 Тогда
ИмяОперации = ДанныеСобытия.Document.documentElement.childNodes[2].childNodes[5].innerHTML;
ДанныеСобытия.Document.documentElement.childNodes[2].childNodes[5].innerHTML = "";
Иначе
ИмяОперации = ДанныеСобытия.Event.propertyName;
КонецЕсли;
Если ИмяОперации = "" Тогда
Возврат Ответ;
КонецЕсли;
Если ВерсияПлатформы > 13 Тогда
ДанныеОперации = ДанныеСобытия.Document.documentElement.childNodes[2].childNodes[7].innerHTML;
ДанныеСобытия.Document.documentElement.childNodes[2].childNodes[7].innerHTML = "";
Иначе
ДанныеОперации = ДанныеСобытия.Event.data;
КонецЕсли;
Если ИмяОперации = "dragend" Тогда
Координаты = РазложитьСтрокуВМассивПодстрок(ДанныеОперации, ",");
Ответ.Вставить("ПунктЗагрузки_Широта" , Число(Координаты[0]));
Ответ.Вставить("ПунктЗагрузки_Долгота" , Число(Координаты[1]));
КонецЕсли;
Возврат Ответ;
КонецФункции
код скрипта, использующий информацию о версии платформы:
var this_webkit = false;
..
function setProperty(name,action) {
switch (name) {
case 'webkit': this_webkit = action=='up' ? true : false; break;
default : break;
}
}
function addMarkerDraggable(buttonsData){
ClearMarkers();
if(this_webkit) markersData = JSON.parse(buttonsData);
else markersData = buttonsData;
marker = L.marker([markersData.Широта, markersData.Долгота], {icon:defaultIcon,draggable:true}).bindPopup(markersData.ПредставлениеАдреса);
marker.on('dragend', function(event){
var location = event.target.getLatLng();
send_to_1C('dragend', [location.lat, location.lng])
});
marker.addTo(map);
map.setView(new L.LatLng(markersData.Широта,markersData.Долгота), markersData.МасштабКарты);
}
function send_to_1C(name,data){
if(this_webkit){
document.getElementById('message_name').innerHTML = name;
document.getElementById('message_data').innerHTML = data;
} else {
var evt = document.createEventObject();
evt.propertyName = name;
evt.data = data;
evt.cancelBubble = true;
evt.returnValue = false;
document.fireEvent('onclick',evt);
};
};
Приложил обработку с примером работы кода с ПолеHTMLДокумента, независимого от типа браузера платформы.
Алгоритм следующий:
передача данных из 1С в браузер
- открываем карту OpenStreetMap (используется библиотека Leaflet)
- указываем адрес
- выбираем один из вариантов локаций на карте, предложенных геокодером Nominatim
- передаем координаты локации на карту для отрисовки маркера
передача данных из браузера в 1С
- перемещаем маркер в любое место на карте
- передаем координаты новой локации в 1С и отображаем их на форме
Скрины экранов конфигураций на разных платформах с этой обработкой:
8.3.13
8.3.14
Возможно Вам будут интересны эти программы:
Простые маршруты [OSM]. Работа с картой, оптимизация маршрута.
[Простые маршруты] Временные окна. Автоматическое построение оптимизированных маршрутов.
Простые маршруты [LITE]. Получение координаты адреса доставки в 1С. Карты OSM, 2GIS, Yandex, Google