Имя: Пароль:
1C
1С v8
Вызов методов языка JavaScript из кода 1С.
,
0 Alexxxxxx
 
15.12.17
13:31
Доброго времени суток!

Платформа 8.3.10.2561
IE11
Есть внешняя обработка. На форме обработки "Поле HTML документа".
В процедуре "ПриСозданииНаСервере" вставляется код HTML.
Коде HTML есть функция и кнопка. Как вызвать функцию JavaScript из кода 1С. Eval не работает.

Спасибо.
1 Alexxxxxx
 
15.12.17
13:33
P.S. Кнопка в данном случае не привязана к функции, она просто создаётся и всё.
2 VS-1976
 
15.12.17
13:39
(0) 1С использует урезанный функционал ослика. Грузи по com самого ослика и там вызывай что нужно.
3 Alexxxxxx
 
15.12.17
13:41
(2)Что Вы подразумеваете под "ослик"?)
4 catena
 
15.12.17
13:42
(3)ie-ie-ie
5 Asmody
 
15.12.17
13:50
(0) как функция объявлена?
6 Alexxxxxx
 
15.12.17
13:51
(5)
Функция ПолучитьТекстHTML()

    Текст = "
    |<html>
    |<head>
    |<title>Мой заголовок</title>
    |<meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />
    |</head>
    |<body>
    |<script type=""text/javascript"">
    |
    |// Для вызова из 1С
    |function zako()
    |{
    |    return alert( 'привет, мир!' );
    |};
    |
    |</script>
    |
    |<!-- А это вызов функции 1С из скрипта /> -->
    |<input type = ""button"" onclick = ""Message1C('пока, мир!')"" value = ""1С"" />
    |
    |</body>
    |</html>
    |";    
    
    Возврат Текст;

КонецФункции
7 Asmody
 
15.12.17
13:55
js-функцию Надо объявить как свойство какой-то глобальной js-переменной. тогда ее можно будет вызвать из 1С через object.
В обратную сторону надо в js кидать события документа, которые ловить в обработчике ПоляHTMLДокумента
8 Asmody
 
15.12.17
13:56
(2) по отношению к ie11 и 8.3 это не верно
9 Адинэснег
 
15.12.17
13:56
(3) как тебя угораздило то в js
10 Alexxxxxx
 
15.12.17
14:04
(9)как то так занесла нелёгкая.)
11 sitex
 
naïve
15.12.17
14:04
(0) А Какая задача то стоит и того? УФ?
12 Alexxxxxx
 
15.12.17
14:04
(7) на почту, что в профиле, я Вам написал.
13 Alexxxxxx
 
15.12.17
14:06
Задача следующая - есть некоторая программа которая пишет в тхт данные. Забрать эти данные и вывести в "Поле HTML документа".
14 Сергиус
 
15.12.17
14:07
(0)Закидываешь в переменную, которая связана с полем HTML на форме текст функции, к примеру:
15 Alexxxxxx
 
15.12.17
14:08
Cредствами js, потому что там есть sleep.
16 dinn
 
15.12.17
14:08
Буквально вчера готовил пример. см СоздатьКнопки()

Процедура ПриОткрытии()
    
    Текст = "
    |<HTML>
    |<BODY style='background-color:#FCFAEB' scroll = 'no'>
    |
    |<div id='container'></div>
    //|<button id='interactionButton' style='display: none'>Кнопка взаимодействия</button>
    |
    |<script type=""text/javascript"">
    |function createButtons(buttonsArray)
    |{
    |var buttonsCount = buttonsArray.Количество(); // Доступны методы и свойства массива 1С
    |for(var i = 0; i < buttonsCount; i++)
    |    {
    |    var ПараметрыКнопки = buttonsArray.Получить(i);
    |
    |    var btn = document.createElement('div');
    |    btn.id             = ПараметрыКнопки.ИмяКоманды;
    |    btn.innerText         = ПараметрыКнопки.Заголовок;    
    |    btn.style.fontSize     = ПараметрыКнопки.РазмерТекста;            
    |    btn.style.color     = ПараметрыКнопки.ЦветТекста;  
    |    btn.style.background = '#eee';
    |    btn.style.color = '#088';
    |    btn.style.textDecoration  = 'none';
      |    btn.style.display = 'block';
      |    btn.style.width = '90px';
    //  |    btn.style.text-align = 'center';
      |    btn.style.margin = '20px auto';
      |    btn.style.padding = '10px 10px';
      |    btn.style.transition = 'all 0.3s';
    |                    
    |    container.appendChild(btn);                        
    |    }  
    |};
    |</script>
    |</BODY>
    |</HTML>
    |";
        
    ЭтаФорма.ЭлементыФормы.ДокументHTML.УстановитьТекст(Текст);
    
    
КонецПроцедуры


Процедура СоздатьКнопки()
    
    МассивКнопок = Новый Массив;    
    Для Сч = 1 По 2 Цикл
        СтруктураКнопки = Новый Структура;
        СтруктураКнопки.Вставить("Заголовок",        "Кнопка " + Сч);
        СтруктураКнопки.Вставить("ИмяКоманды",       "Кнопка" + Сч);
        СтруктураКнопки.Вставить("РазмерТекста",     15);
        СтруктураКнопки.Вставить("ЦветТекста",       "");
                
        МассивКнопок.Добавить(СтруктураКнопки);
    КонецЦикла;        
    
    // ЭлементыФормы.ПолеHTMLДокумента1.Документ.parentWindow.createButtons(МассивКнопок);
    
    Документ = ЭтаФорма.ЭлементыФормы.ДокументHTML.Документ;
    //Документ.parentWindow.zako(ЭтаФорма);
    Документ.parentWindow.createButtons(МассивКнопок);
    
КонецПроцедуры

Процедура ВызватьСкрипт(Команда)
    
    Документ = ЭтаФорма.ЭлементыФормы.ДокументHTML.Документ;
    Документ.parentWindow.zako(ЭтаФорма);
    
КонецПроцедуры

Процедура ДокументHTMLДокументСформирован(Элемент)
    
    Если Не КнопкиСозданы Тогда
        // ВызватьСкрипт(Неопределено);
        КнопкиСозданы = Истина;
        СоздатьКнопки();
    КонецЕсли;
    
КонецПроцедуры

Процедура ДокументHTMLonclick(Элемент, pEvtObj)
    
     Сообщить(pEvtObj.srcElement.id);
    
КонецПроцедуры
17 sitex
 
naïve
15.12.17
14:11
(13) Ну собрать данные можно и просто в макете и вывести их потом в поле HTML. Скинул бы пример но почты у вас нет в профиле.
18 Alexxxxxx
 
15.12.17
14:13
текст = "
    |          <!DO C TYPE HTML>
    |<html>
    |<head>
    |    <script type=""text/javascript"">
    |    window.onload = function () {
    |
    |      var dps = [{x: 1, y: 10}, {x: 2, y: 13}, {x: 3, y: 18}, {x: 4, y: 20}, {x: 5, y: 17},{x: 6, y: 10}, {x: 7, y: 13}, {x: 8, y: 18}, {x: 9, y: 20}, {x: 10, y: 17}];   //dataPoints.
    |
    |      var chart = new CanvasJS.Chart(""chartContainer"",{
    |          title :{
    |              text: ""Live Data""
    |          },
    |          axisX: {                        
    |              title: ""Axis X Title""
    |          },
    |          axisY: {                        
    |              title: ""Units""
    |          },
    |          data: [{
    |              type: ""line"",
    |              dataPoints : dps
    |          }]
    |     });
    |
    |      chart.render();
    |      var xVal = dps.length + 1;
    |      var yVal = 15;    
    |      var updateInterval = 1;
    |
    |      var updateChart = function () {
    |          
    |          
    |          yVal = yVal +  Math.round(5 + Math.random() *(-5-5));
    |          dps.push({x: xVal,y: yVal});
    |          
    |          xVal++;
    |          //if (dps.length >  10 )
    |          //{
    |       //    dps.shift();                
    |          //}
    |
    |          chart.render();        
    |
    |    // update chart after specified time.
    |
    |};
    |
    |setInterval(function(){updateChart()}, updateInterval);
    |}
    |</script>
    |<script type=""text/javascript"" src=""canvasjs.min.js""></script>
    |</head>
    |<body>
    |     <div id=""chartContainer"" style=""height: 300px; width: 100%;""></div>
    |</body>
    |</html>";
19 Alexxxxxx
 
15.12.17
14:16
(17)Открыл видимость почты.
Выше макет рабочего кода построения движущегося графика при помощи canvasjs.
20 Сергиус
 
15.12.17
14:20
+(14)

JSCode = |function SetForm1c(Form1c)
     |{
     |  xForm1C = Form1c;
     |}";

Создаешь на форме 1с кнопку, и в ее коде делаешь вызов по типу:

Элементы.ПолеHTML.Документ.parentWindow.SetForm1c(ЭтаФорма);
21 sitex
 
naïve
15.12.17
14:30
(19) После 1000 в графике IE умирает на УФ. (по крайне мере у меня )
22 Alexxxxxx
 
15.12.17
14:32
(21)да, поэтому я от этого отказался.
23 sitex
 
naïve
15.12.17
14:34
(22) Отправил.
24 Alexxxxxx
 
15.12.17
14:35
(16) Документ.parentWindow.zako(ЭтаФорма) выдаёт ошибку, что метод zako не обнаружен.
25 Alexxxxxx
 
15.12.17
14:36
(23)Спасибо. Сейчас гляну.
26 Alexxxxxx
 
15.12.17
14:39
(23) у меня ничего не происходит при открытии.
27 sitex
 
naïve
15.12.17
14:41
(26) Должен быть доступ в Инет для canvasjs.min.js
28 dinn
 
15.12.17
14:45
(24) а она вам не нужна, см. Документ.parentWindow.createButtons(МассивКнопок);
29 Alexxxxxx
 
15.12.17
14:45
Погуглив два дня, есть информация что до IE9 методы вызова eval или Элементы.ДокументHTML.Документ.МояФункция() работали. Выше IE9 вызов функций, как я понимаю, происходит через создание невидимых кнопок на HTML.
30 Alexxxxxx
 
15.12.17
15:14
(28) {ВнешняяОбработка.ТестХТМЛ.Форма.Форма.Форма(67)}: Метод объекта не обнаружен (createButtons)
    Документ.parentWindow.createButtons(МассивКнопок);
31 Alexxxxxx
 
15.12.17
15:20
Источник по (29) _http://catalog.mista.ru/public/347442/
32 Alexxxxxx
 
15.12.17
15:38
Всё оказалось очень банально просто и всё заработало!
В IE(он же ослик, он же ie-ie-ie) нужно было настроить параметры безопасности. Спасибо всем. За наводку отдельное спасибо sitex.
33 trdm
 
15.12.17
16:07
Есть софт, который отрисовывает графики в картинку, нарисовал-забрал.
34 trdm
 
15.12.17
16:10