Как уже известно, 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
Спасибо) с появлением Web kit появились новые идеи, но много нового) добавлю вашу инфу в копилку знаний)
А почему точки на разных берегах у одного и того же адреса в разных платформах?
Это все фигня — самое главное, что теперь 1с может открыть в 1с 🙂
(2) маркер был сдвинут на новое место .. поэтому различны координаты в таблице и текущие (реквизиты Широта, Долгота) .. в этом и заключается суть примера — получить в 1С координаты при сдвиге маркера на карте
интересно. жаль, что нет ничего, куда бы приспособить
судя по примерам кода — мало куда приспособишь
(6) странно чем пример не угодил) .. вот например нужно получить координаты какой-нибудь стройки, базы или другого места за городом ( 25-й километр сразу за поворотом) .. как раз этот функционал и будет полезен, т.к координаты можно будет получить просто сдвинув маркер на карте в нужное место
(3) можете раскрыть мысль Вашей фразы ?
(8) а что тут раскрывать — делаете поле html и в нем открываете опубликованую базу через веб
(9) это я понял) .. почему это так важно ? Вы пишите что «..это самое главное»
(10)
Плохо у вас видимо с чувством юмора.
Можно даже рекурсию сделать…
(10) потому что это новый горизонт для всяких связок и сверок с базами 1с.
Ну и это просто прикольно 🙂
Есть еще куча других вещей, но они уже более специфические, и долго объяснять суть проблемы, чтобы понять почему это важно.
подскажите почему может не выводиться хтмл в элементе ПолеHTMLДокумента
раньше в обработке приоткрытии вызывался такой код
Документ = Элементы.ПолеБраузера.Document;
Документ.designMode = «On»;
Документ.write(ТекстМакета);
Документ.designMode = «Off»;
очень мало информации .. какой функционал описан в ТекстМакета ?
Подскажите, как можно обработать правый клик на Webkit?
(15)
посмотритетут
был рад типа переходу на встроенный движок webkit, но радость быстро стухла, когда свежая встройка tinymce которая до этого работала отлично свалилась в никуда — не работает и просто зависает мертво окно 1с
причина в том, что встроенный webkit видимо сильно дополнен перехватываемыми вызовами от разработчиков 1С
для примера посмотрите типовой полеHTMLдокумента — оно дополняется как минимум методами добавления полос прокрутки в стиле 1С, это уже костыль который вносит конкретный глюк, причем везде (даже во всплывающее окно внутри html документа изнутри поля, хотя там свои есть, типа за двоения получается в конкретном примере)
окромя этого еще что то перехватывают, и так криво, я понимаю, новое, но блин почему так топорно то!?
короче tinymce как ни перебирал все параметры вешает 1с, вставка не работает (таблицы вставляются текстом, хотя во всех браузерах как минимум с разметкой таблицы), фокус при вставке не важно чего теряет, может вставится например в текстовое поле формы, а не в элемент хтмл, контекстное меню конфликтует, идет переполнение стека как я чую, раз на полеHTMLдокумента валится все…
другие редакторы — тоже самое, нет нормального копипаста из-за перехвата, конфликт контекстного, заморозка окна 1с
в общем — спасибо огромное!!! так даже я не смогу заказчику представить нечто совсем «новое» — мня просто снесут и оправдаться нечем.
прочитал статьи о муках выбора движка спецами 1С, поначалу проникся «мукам» выбора, но потом пришло понимание — в итоге выбрали то, что уже привычно им, чтобы не менять уже сложившееся, зачем типа? допилим как хотим, пойдет.
статистика применения webkit в топе браузеров (кому не лень, за пару минут узнает что webkit на текущий момент в деле у браузеров внизу топов скорей вообщен вне топов — как экстро) — не, не показатель, мы же для себя, для любимых пользователей 1С) нам привычно, кроссово типа, ну увидели что полосы прокрутки не те — давай допилим под свои, еще что то увидели — еще допилим … допилили в общем)
не понимайте что я обижен типа что tinymce не работает, я просто увидел как «дополняется» webkit спецами 1С, что то что работало при IE (от винды) с ограниченными его, не работает, и то, что в ближайшее время ничего не поменяется ввиду выбранной «модели», по сути тупика…
(17)
На обычных формах тоже заметили, что полеHTMLдокумента вешает 1С (либо передает фокус управления вникуда, т.е. становится не доступны пункты меню, хотя на форме, где размещено полеHTMLдокумента все кликабельно).
Не пробовал пока новую версию платформы (сидим на 8.3.13 пока), но предполагаю, что из программного кода должен быть доступ к data- полям. Свойство dataset у элемента документа.
Попробовать положить данные в data- элементы заранее перед нажатием (при формировании страницы, например, если она относительно статична), и ловить уже нативно.
(19)
А не нашли, в какой момент и как это исправить? Или надо переезжать везде на управляемые (что к сожалению не везде возможно 🙁 )?
(21)
Способа исправления/обхода данного поведения пока не нашли.
(0) А вы не знаете каким образом получить позицию скрола в поле HTML документа в новом WebKit 8.3.14?
Не сталкивались?
(23) пробовали получить позицию скролла через window.pageYOffset? В 1С, кажется, ЭлементHTMLДокумента.defaultView.pageYOffset.
(24)
См. скриншоты. pageYOffset = 0
Раньше в 8.3.10 я делал так:
1. Завел в HTML-документе в тексте скрытый DIV в котором хранил текущее положение скрола:
Далее в body было событие onscroll, которое меняло текст этото тега:
Ну и сама fonscroll и scrollBottom:
Показать
Далее в 1С я просто смотрел в текст перед перерисовкой, находил scrollpos и запоминал
Перерисовывал и там где «…» я передавал значение которое я запомнил по старому scrollpos.
Поэтому визуально при изменении страницы скролл в HTML документе перемещался всегда в то месте где был в последний момент перед перерисовкой.
Сейчас хочу добиться того же эффекта, но почему-то не срабатывает событие onscroll.
(21)
20173064
По данной ошибке на портале «Публикация ошибок->Каталог ошибок->Технологическая платформа» заведено обращение
(23) такой функционал не нужен был, но попробовал и вроде работает (прицепил картинку результата и обработку)
использовал такой макет:
Показать
(28) Да, событие onscroll у DIV есть, а вот если его же повесить на body, то оно не срабатывает…
(29) В документе есть свойство scrollingElement , которое WebKit поддерживает
попробуйте через него достать .. что то типа такого
var scrollingElement = document.scrollingElement || document.documentElement;
scrollingElement.scrollTop = 100;
Добрый день!
Случайно не в курсе, как указать прокси, чтобы на 8.3.14 и выше корректно работала ваша обработка? Системные настройки не помогают.
не понял сути вопроса .. код обработки открыт .. добавьте там вызов своего прокси .. есть много примеров как это сделать
(32) Я имел в виду, что ранее, когда 1С использовали движок IE, прокси можно было настроить в системных настройках Internet Explorer. В случае с webkit — настройки Internet Explorer никак не влияют на прокси в ПолеHTMLДокумента 1С.
https://forum.infostart.ru/forum9/topic35121/
Собственно уже нашел решение в виде inetcfg.xml
Но интересно было бы ознакомиться с примерами, что вы имели в виду. Не поделитесь ссылкой?
что то типа такого ..
Показать
(34) Понял. Но это не поможет с подгрузкой js с внешних ресурсов и с подгрузкой тайлов карты.
как варианттут еще посмотри .. Илья Низамов очень подробно описал
(27) Может как то удалось победить проблему с черным квадратом и зависанием платформы?
Доброго дня, Дмитрий!
Я скачал Вашу обработку. Скажите, пожалуйста, как можно установить название в метке на карте?
Привет. Уточни что нужно:
— при клике на маркер должен появиться балун (всплывающее окно) с текстом ?
— рядом с маркером должен постоянно отображаться некоторый текст ?
Доброго дня, Дмитрий!
Прошу прощения что сразу не ответил.
Мне необходимо чтобы маркер сразу отображался уже с информацией.
У нас есть порядковый номер заказа, и этот номер должен быть виден сразу на карте в этом маркере.
посмотритут .. там есть демо-страница
(37)Тоже столкнулся с этой проблемой и не знаю как ее решить. Нужно авторизацию делать на нескольких сайтах чтобы парсить данные — а оно зависает и то грузит страницу то недогружает какое то количество скриптов
(35) Чтобы подгружать скрипты, расположенные локально, нужно прокси прописать? Что там написать нужно не понял? В ие все медленно, но работало, в webkit вообще не работают внешние скрипты.