1С и WebKit. Вариант взаимодействия


В результате перехода на WebKit тип свойства Документ у поля, имеющего вид ПолеHTMLДокумента, изменился с COMОбъект на ВнешнийОбъект. Также изменилась DOM модель документа, доступная через это свойство.

Как уже известно, 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) нужно добавить переменную в скрипт, по значению которой будет выбираться ветка алгоритма.

 

Приложил обработку с примером работы кода с ПолеHTMLДокумента, независимого от типа браузера платформы.

Алгоритм следующий:

передача данных из 1С в браузер 

  • открываем карту OpenStreetMap (используется библиотека Leaflet)
  • указываем адрес
  • выбираем один из вариантов локаций на карте, предложенных геокодером Nominatim
  • передаем координаты локации на карту для отрисовки маркера

передача данных из браузера в 1С

  • перемещаем маркер в любое место на карте
  • передаем координаты новой локации в 1С и отображаем их на форме

 

Скрины экранов конфигураций на разных платформах с этой обработкой:

8.3.13

 

8.3.14

 

Возможно Вам будут интересны эти программы:

Простые маршруты [OSM]. Работа с картой, оптимизация маршрута.

[Простые маршруты] Временные окна. Автоматическое построение оптимизированных маршрутов.

Простые маршруты [LITE]. Получение координаты адреса доставки в 1С. Карты OSM, 2GIS, Yandex, Google

 

42 Comments

  1. xxxAndricxxx

    Спасибо) с появлением Web kit появились новые идеи, но много нового) добавлю вашу инфу в копилку знаний)

    Reply
  2. folo

    А почему точки на разных берегах у одного и того же адреса в разных платформах?

    Reply
  3. DitriX

    Это все фигня — самое главное, что теперь 1с может открыть в 1с 🙂

    Reply
  4. mi1man

    (2) маркер был сдвинут на новое место .. поэтому различны координаты в таблице и текущие (реквизиты Широта, Долгота) .. в этом и заключается суть примера — получить в 1С координаты при сдвиге маркера на карте

    Reply
  5. Поручик

    интересно. жаль, что нет ничего, куда бы приспособить

    Reply
  6. Fox-trot

    судя по примерам кода — мало куда приспособишь

    Reply
  7. mi1man

    (6) странно чем пример не угодил) .. вот например нужно получить координаты какой-нибудь стройки, базы или другого места за городом ( 25-й километр сразу за поворотом) .. как раз этот функционал и будет полезен, т.к координаты можно будет получить просто сдвинув маркер на карте в нужное место

    Reply
  8. mi1man

    (3) можете раскрыть мысль Вашей фразы ?

    Reply
  9. DitriX

    (8) а что тут раскрывать — делаете поле html и в нем открываете опубликованую базу через веб

    Reply
  10. mi1man

    (9) это я понял) .. почему это так важно ? Вы пишите что «..это самое главное»

    Reply
  11. TODD22

    (10)

    это я понял) .. почему это так важно ? Вы пишите что «..это самое главное»

    Плохо у вас видимо с чувством юмора.

    Можно даже рекурсию сделать…

    Reply
  12. DitriX

    (10) потому что это новый горизонт для всяких связок и сверок с базами 1с.

    Ну и это просто прикольно 🙂

    Есть еще куча других вещей, но они уже более специфические, и долго объяснять суть проблемы, чтобы понять почему это важно.

    Reply
  13. xpehep

    подскажите почему может не выводиться хтмл в элементе ПолеHTMLДокумента

    раньше в обработке приоткрытии вызывался такой код

    Документ = Элементы.ПолеБраузера.Document;

    Документ.designMode = «On»;

    Документ.write(ТекстМакета);

    Документ.designMode = «Off»;

    Reply
  14. mi1man

    очень мало информации .. какой функционал описан в ТекстМакета ?

    Reply
  15. user1174057

    Подскажите, как можно обработать правый клик на Webkit?

    Reply
  16. mi1man

    (15)

    правый клик на Webkit

    посмотрите тут

    Reply
  17. Udod141516

    был рад типа переходу на встроенный движок webkit, но радость быстро стухла, когда свежая встройка tinymce которая до этого работала отлично свалилась в никуда — не работает и просто зависает мертво окно 1с

    причина в том, что встроенный webkit видимо сильно дополнен перехватываемыми вызовами от разработчиков 1С

    для примера посмотрите типовой полеHTMLдокумента — оно дополняется как минимум методами добавления полос прокрутки в стиле 1С, это уже костыль который вносит конкретный глюк, причем везде (даже во всплывающее окно внутри html документа изнутри поля, хотя там свои есть, типа за двоения получается в конкретном примере)

    окромя этого еще что то перехватывают, и так криво, я понимаю, новое, но блин почему так топорно то!?

    короче tinymce как ни перебирал все параметры вешает 1с, вставка не работает (таблицы вставляются текстом, хотя во всех браузерах как минимум с разметкой таблицы), фокус при вставке не важно чего теряет, может вставится например в текстовое поле формы, а не в элемент хтмл, контекстное меню конфликтует, идет переполнение стека как я чую, раз на полеHTMLдокумента валится все…

    другие редакторы — тоже самое, нет нормального копипаста из-за перехвата, конфликт контекстного, заморозка окна 1с

    в общем — спасибо огромное!!! так даже я не смогу заказчику представить нечто совсем «новое» — мня просто снесут и оправдаться нечем.

    Reply
  18. Udod141516

    прочитал статьи о муках выбора движка спецами 1С, поначалу проникся «мукам» выбора, но потом пришло понимание — в итоге выбрали то, что уже привычно им, чтобы не менять уже сложившееся, зачем типа? допилим как хотим, пойдет.

    статистика применения webkit в топе браузеров (кому не лень, за пару минут узнает что webkit на текущий момент в деле у браузеров внизу топов скорей вообщен вне топов — как экстро) — не, не показатель, мы же для себя, для любимых пользователей 1С) нам привычно, кроссово типа, ну увидели что полосы прокрутки не те — давай допилим под свои, еще что то увидели — еще допилим … допилили в общем)

    не понимайте что я обижен типа что tinymce не работает, я просто увидел как «дополняется» webkit спецами 1С, что то что работало при IE (от винды) с ограниченными его, не работает, и то, что в ближайшее время ничего не поменяется ввиду выбранной «модели», по сути тупика…

    Reply
  19. SergiosMailz

    (17)

    На обычных формах тоже заметили, что полеHTMLдокумента вешает 1С (либо передает фокус управления вникуда, т.е. становится не доступны пункты меню, хотя на форме, где размещено полеHTMLдокумента все кликабельно).

    Reply
  20. Kruzya

    Не пробовал пока новую версию платформы (сидим на 8.3.13 пока), но предполагаю, что из программного кода должен быть доступ к data- полям. Свойство dataset у элемента документа.

    Попробовать положить данные в data- элементы заранее перед нажатием (при формировании страницы, например, если она относительно статична), и ловить уже нативно.

    Reply
  21. deminded

    (19)

    На обычных формах тоже заметили, что полеHTMLдокумента вешает 1С (либо передает фокус управления вникуда, т.е. становится не доступны пункты меню, хотя на форме, где размещено полеHTMLдокумента все кликабельно).

    А не нашли, в какой момент и как это исправить? Или надо переезжать везде на управляемые (что к сожалению не везде возможно 🙁 )?

    Reply
  22. SergiosMailz

    (21)

    Способа исправления/обхода данного поведения пока не нашли.

    Reply
  23. Diversus

    (0) А вы не знаете каким образом получить позицию скрола в поле HTML документа в новом WebKit 8.3.14?

    Не сталкивались?

    Reply
  24. Kruzya

    (23) пробовали получить позицию скролла через window.pageYOffset? В 1С, кажется, ЭлементHTMLДокумента.defaultView.pageYOffset.

    Reply
  25. Diversus

    (24)

    ЭлементHTMLДокумента.defaultView.pageYOffset

    См. скриншоты. pageYOffset = 0

    Раньше в 8.3.10 я делал так:

    1. Завел в HTML-документе в тексте скрытый DIV в котором хранил текущее положение скрола:

    <div class=’scrollvalue’ id=’scrollpos’>1000</div>

    Далее в body было событие onscroll, которое меняло текст этото тега:

    <body style=’background-color:#FAFAFA;’ on scroll=’fonscroll()’ on load=’scrollBottom(«…»)>

    Ну и сама fonscroll и scrollBottom:

    function scrollBottom(value){
    document.body.scrollTop = value;
    document.getElementById(‘scrollpos’).value = value;
    }
    
    function fonscroll(value){
    var scrollpos = Math.max( $(«html»).scrollTop(), $(«body»).scrollTop() );
    var elem = document.getElementById(«scrollpos»);
    if (elem != null){
    elem.innerHTML = scrollpos;
    }
    }

    Показать

    Далее в 1С я просто смотрел в текст перед перерисовкой, находил scrollpos и запоминал

    Перерисовывал и там где «…» я передавал значение которое я запомнил по старому scrollpos.

    Поэтому визуально при изменении страницы скролл в HTML документе перемещался всегда в то месте где был в последний момент перед перерисовкой.

    Сейчас хочу добиться того же эффекта, но почему-то не срабатывает событие onscroll.

    Reply
  26. SergiosMailz

    (21)

    По данной ошибке на портале «Публикация ошибок->Каталог ошибок->Технологическая платформа» заведено обращение 20173064

    Описание
    Reply
  27. mi1man

    (23) такой функционал не нужен был, но попробовал и вроде работает (прицепил картинку результата и обработку)

    использовал такой макет:

    <!DO CTYPE html>
    <ht ml>
    <head>
    <st yle>
    #myDIV {
    height: 250px;
    width: 250px;
    overflow: auto;
    }
    
    #content {
    height: 800px;
    width: 2000px;
    background-color: coral;
    }
    </style>
    </head>
    <body>
    
    <div id=»myDIV» on scroll=»myFunction()»>
    <div id=»content»>Scroll inside me!</div>
    </div>
    
    <p id=»demo»></p>
    
    <sc ript>
    function myFunction() {
    var elmnt = document.getElementById(«myDIV»);
    var x = elmnt.scrollLeft;
    var y = elmnt.scrollTop;
    document.getElementById («demo»).innerHTML = «Horizontally: » + x + «pxVertically: » + y + «px»;
    }
    </sc ript>
    
    </body>
    </html>

    Показать

    Reply
  28. Diversus

    (28) Да, событие onscroll у DIV есть, а вот если его же повесить на body, то оно не срабатывает…

    Reply
  29. mi1man

    (29) В документе есть свойство scrollingElement , которое WebKit поддерживает

    https://developer.mozilla.org/en/docs/Web/API/document/scrollingElement

    попробуйте через него достать .. что то типа такого

    var scrollingElement = document.scrollingElement || document.documentElement;

    scrollingElement.scrollTop = 100;

    Reply
  30. sleemp

    Добрый день!

    Случайно не в курсе, как указать прокси, чтобы на 8.3.14 и выше корректно работала ваша обработка? Системные настройки не помогают.

    Reply
  31. mi1man

    не понял сути вопроса .. код обработки открыт .. добавьте там вызов своего прокси .. есть много примеров как это сделать

    Reply
  32. sleemp

    (32) Я имел в виду, что ранее, когда 1С использовали движок IE, прокси можно было настроить в системных настройках Internet Explorer. В случае с webkit — настройки Internet Explorer никак не влияют на прокси в ПолеHTMLДокумента 1С.

    Собственно уже нашел решение в виде inetcfg.xml https://forum.infostart.ru/forum9/topic35121/

    Но интересно было бы ознакомиться с примерами, что вы имели в виду. Не поделитесь ссылкой?

    Reply
  33. mi1man

    что то типа такого ..

    пример
    Reply
  34. sleemp

    (34) Понял. Но это не поможет с подгрузкой js с внешних ресурсов и с подгрузкой тайлов карты.

    Reply
  35. mi1man

    как вариант тут еще посмотри .. Илья Низамов очень подробно описал

    Reply
  36. IfYouWant_YouCan

    (27) Может как то удалось победить проблему с черным квадратом и зависанием платформы?

    Reply
  37. Мехди

    Доброго дня, Дмитрий!

    Я скачал Вашу обработку. Скажите, пожалуйста, как можно установить название в метке на карте?

    Reply
  38. mi1man

    Привет. Уточни что нужно:

    — при клике на маркер должен появиться балун (всплывающее окно) с текстом ?

    — рядом с маркером должен постоянно отображаться некоторый текст ?

    Reply
  39. Мехди

    Доброго дня, Дмитрий!

    Прошу прощения что сразу не ответил.

    Мне необходимо чтобы маркер сразу отображался уже с информацией.

    У нас есть порядковый номер заказа, и этот номер должен быть виден сразу на карте в этом маркере.

    Reply
  40. mi1man

    посмотри тут .. там есть демо-страница

    Reply
  41. dimauspeh

    (37)Тоже столкнулся с этой проблемой и не знаю как ее решить. Нужно авторизацию делать на нескольких сайтах чтобы парсить данные — а оно зависает и то грузит страницу то недогружает какое то количество скриптов

    Reply
  42. GSA3D

    (35) Чтобы подгружать скрипты, расположенные локально, нужно прокси прописать? Что там написать нужно не понял? В ие все медленно, но работало, в webkit вообще не работают внешние скрипты.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *