Имя: Пароль:
1C
1С v8
WebKit - Вызов функций 1С из ПоляHTML через JS. WebKit (8.3.15)
, ,
0 Jimmo910
 
19.09.19
16:48
Подскажите, может кто уже реализовывал на новой платформе.

Есть произвольная HTML страничка, содержащия какие-нибудь кнопки или ссылки. Нужно что бы по этим кнопкам/ссылкам вызывались функции 1С написанные в то й же форме где и размещено HTML Поле.



&НаКлиенте
Процедура КомандаВыполнить(Отказ)
    ЭтаФорма.Элементы.Поле1.Документ.SetForm1C (ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Функция СобытиеНТМЛ (Параметр1) Экспорт
    Сообщить (Параметр1);
КонецФункции

&НаКлиенте
Процедура КомандаОтобразить(Команда)
    Элементы.Поле1.Документ.body.outerHTML = "<html>
    |<head>
    |<script>
    | var xPram1C;
    |function SetForm1C (Pram1C)
    |{
    |  xPram1C = Pram1C;
    |}
    |
    |function Call1C (param1)
    |{
    |   xPram1C.СобытиеНТМЛ (""12"");
    |}
    |
    |</script>
    |</head>
    |
    |<body>Тест вызова функции 1С из JS</br /><br />
    |<input id='param1' type='text' value='Параметр1' /><br />
    |<input type='button' onclick='Call1C(param1.value)' value='Вызов функции в 1С' />
    |
    |</body>
    |</html>";
КонецПроцедуры
1 Лефмихалыч
 
19.09.19
17:17
(0) без вариантов
2 pyha
 
19.09.19
17:44
Зачем через js это делать? у поля html документа есть событие при нажатии, там в параметре передается имя элемента на котором произошло нажатие, там можно и нужный 1с код написать
3 sikuda
 
20.09.19
15:27
(2) Да ДанныеСобытия.Element
4 Jimmo910
 
14.10.19
16:17
Нет. Передается "Поле1" - А так как это целая HTML страница на которой может быть 100500 кнопок нужно именно по нажатию на кнопку html вызвать и передать функцию 1С.

Вот конкретно: html страница с картой Ундекса по карте щелкают и нужно получить координаты щелчка... На самой карте координаты отобразил, а нужно передать их на сторону 1С.

ЭлементыФормы.HTMLКарта.УстановитьТекст("<!DOCTYPE html>
                               |<html xmlns=""http://www.w3.org/1999/xhtml"">;
                               |<head>
                               |    <title>Быстрый старт. Размещение интерактивной карты на странице</title>
                               |    <meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />
                               |    <script src=""https://api-maps.yandex.ru/2.1/?apikey=b74a09e3-3187-4bc7-ac3b-339ad9ef9f9f&lang=ru_RU""; type=""text/javascript"">
                               |    </script>
                               |    <script type=""text/javascript"">
                               |        ymaps.ready(init);
                               |        var myMap;
                               |        function init(){
                               |            myMap = new ymaps.Map(""map"", {
                               |                center: [55.76, 37.64],
                               |                zoom: 7
                               |            });
                               |            myMap.geoObjects.add(new ymaps.Placemark([55.790139, 37.814052], {
                                   |                     balloonContent: '',
                                |                        iconCaption: ''
                                |                    }, {
                                |                        preset: 'islands#blueCircleDotIconWithCaption',
                                |                        iconCaptionMaxWidth: '50'
                                |                }));
                               |            myMap.container.enterFullscreen();
                               |            myMap.events.add('click', function (e) {
                                |                if (!myMap.balloon.isOpen()) {
                                |                    var coords = e.get('coords');
                                |                    myMap.balloon.open(coords, {
                                |                        contentHeader:'',
                                |                        contentBody:'<p>Координаты щелчка: ' + [
                                |                        coords[0].toPrecision(14),
                                |                        coords[1].toPrecision(14)
                                |                        ].join(', ') + '</p>',
                                |                        contentFooter:'<sup>Щелкните еще раз</sup>'
                                |                    });
                                |                }
                                |                else {
                                |                    myMap.balloon.close();
                                |                }
                                |            });
                                
                               |        }
                               |    </script>
                               |</head>
                               |
                               |<body>
                               |    <div id=""map"" style=""width: 700px; height: 580px""></div>
                               |</body>
                               |
                               |</html>");
5 novichok79
 
14.10.19
16:24
я делал связь с лифлетом на 1С 8.3.15
там надо не Call1C, а класть в div'ы значения в JSON например и потом забирать их из 1С по клику.
6 Jimmo910
 
14.10.19
16:34
(5) А можно хоть малюсенький примерчик, плиз. =)
7 Garykom
 
гуру
14.10.19
16:38
(4) В 1С у ЭлементыФормы.HTMLКарта есть обработчик клика, там можно вызвать функцию JS которая вернет координаты.
8 Jimmo910
 
14.10.19
16:53
(7) Можно. Согласен =) А вот как? =)))))
9 novichok79
 
14.10.19
17:13
(6) HTML


<!DOCTYPE html>
<html>
    <head>
        <META content=text/html;charset=utf-8 http-equiv=content-type></META>
        <meta http-equiv="X-UA-Compatible" content="IE=9" />
                
        <link rel='stylesheet' href='https://unpkg.com/[email protected]/dist/leaflet.css'/>;
        <script src="https://unpkg.com/[email protected]/dist/leaflet.js"; integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og==" crossorigin=""></script>
        
        <style>
            body {
                padding: 0;
                margin: 0;
            }
            html, body, #map {
                height: 100%;
                width: 100%;
            }
        </style>
                            
    </head>
<body>

<div id='map'></div>
<script type='text/javascript'>
    
    var externalForm = null;
    var this_webkit = false;
    var defaultIcon = L.icon({iconUrl:"data:image/PNG;base64,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", iconSize:[25, 41]});
    var markerStorage = [];
    
    var    osmLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{maxZoom:18,});
    var map = L.map('map').setView([56.850035, 35.897074], 12);
    
    map.addLayer(osmLayer);
    
    var featureGroup = L.featureGroup().addTo(map);
    
    map.on('click', function(event) {
        var location = event.latlng;
        sendTo1C('map.onclick', JSON.stringify(location));
    });
    
    function setMapScale(mapScale) {
        map.setView(map.getCenter(), mapScale);
    }
    
    function getMapCenter() {
        return JSON.stringify(map.getCenter());
    }
    
    function sendTo1C(name, data) {
        if (this_webkit) {
            document.getElementById('message_key').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);
        };
    };

    function ClearMarkers() {
        if (markerStorage != null) {
            markerStorage.forEach(
            function(markerData, i, markerStorage) {
            if (markerData != null) {
                map.removeLayer(markerData.marker);
                markerData.marker = null;
            };
            });
            markerStorage = [];
        }
    }
        
    function addMarkerDraggable(markersData) {
        ClearMarkers();
        markersData = JSON.parse(markersData);
        var markersCount = markersData.length;
        for (var i = 0; i < markersCount; i++) {
            incomingData = markersData[i];
            marker = L.marker([incomingData.Широта, incomingData.Долгота], {icon:defaultIcon, draggable:true}).bindPopup(incomingData.ПредставлениеАдреса);
            marker.on('click', function(event) {
                        var markerIndex = markerStorage.map(function(object)
                                                            {
                                                            return object.marker;
                                                            }).indexOf(event.target);
                                                            
                        if (markerIndex != -1) {
                            sendTo1C('marker.onclick', JSON.stringify(markerStorage[markerIndex].id));
                            }
                      });
            marker.addTo(map);
            markerStorage.push({marker:marker, id:incomingData.Ссылка});
        };
        if (markersCount > 0) {
        map.setView(new L.LatLng(incomingData.Широта, incomingData.Долгота), incomingData.МасштабКарты);
        }
    }
    
    function setProperty(name, action) {
        switch (name) {
            case 'webkit': this_webkit = action=='up' ? true : false; break;
            default: break;
        }
    }
    
</script>

    <div id='message_key' style='display: none'></div>
    <div id='message_data' style='display: none'></div>
    
</body>
</html>
10 novichok79
 
14.10.19
17:16
&НаКлиенте
Перем ОкноБраузера

&НаКлиенте
Процедура БраузерДокументСформирован(Элемент)
    
    Если Не КартаЗагружена Тогда
        
        КартаЗагружена = Истина;
        
        ДокументБраузера = Элемент.Документ;
        ОкноКарты = ДокументБраузера.parentWindow;
        
        Если ОкноКарты = Неопределено Тогда ОкноКарты = ДокументБраузера.defaultView;    
        КонецЕсли;
        
        ОкноКарты.externalForm = ЭтаФорма;
        ОкноКарты.setProperty("webkit", ?(ВерсияПлатформы > 13, "up", "down"));
        
        Значение = ОкноКарты.getMapCenter();
        Геопозиция = ДесериализоватьJSON(Значение);
        
        Если ТипЗнч(Геопозиция) = Тип("Структура") Тогда
            
            Если Геопозиция.Свойство("lat") Тогда ТекущаяШирота = Геопозиция.lat;
            КонецЕсли;
            
            Если Геопозиция.Свойство("lng") Тогда ТекущаяДолгота = Геопозиция.lng;
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура БраузерПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Если КартаЗагружена Тогда
        
        Если ВерсияПлатформы > 13 Тогда
            
            Ключ = ОкноКарты.Document.getElementById("message_key").innerHTML;
            Значение = ОкноКарты.Document.getElementById("message_data").innerHTML;
            
ОкноКарты.Document.getElementById("message_key").innerHTML = "";
ОкноКарты.Document.getElementById("message_data").innerHTML = "";

        Иначе
            
            Ключ = ДанныеСобытия.Event.propertyName;
            Значение = ДанныеСобытия.Event.data;
        
        КонецЕсли;

        Если Не ПустаяСтрока(Значение) Тогда
            
            Значение1С = ДесериализоватьJSON(Значение);
            
            Если Ключ = "marker.onclick"
                И ТипЗнч(Значение1С) = Тип("Строка")
                И СтрНачинаетсяС(Значение1С, "e1cib/data/") Тогда

                ПерейтиПоНавигационнойСсылке(Значение1С);
                
            ИначеЕсли Ключ = "map.onclick"
                И ТипЗнч(Значение1С) = Тип("Структура") Тогда
                
                Если Значение1С.Свойство("lat") Тогда ТекущаяШирота = Значение1С.lat;
                КонецЕсли;
                
                Если Значение1С.Свойство("lng") Тогда ТекущаяДолгота = Значение1С.lng;
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЕсли;
        
    Иначе ПоказатьОповещениеПользователя("Внимание", , "Карта не загружена", , СтатусОповещенияПользователя.Важное);
    КонецЕсли;
    
КонецПроцедуры
11 novichok79
 
14.10.19
17:16
как-то так
12 Jimmo910
 
22.10.19
12:27
Спасибо. разобрался