Имя: Пароль:
1C
1С v8
JS в 1С
0 golem14
 
25.07.18
08:13
Платформа 8.3.13.1198.

Объект.HTML = "
|<!DOCTYPE HTML>
|<html>
|
|<head>
|  <!-- Тег meta для указания кодировки -->
|  <meta charset=""utf-8"">
|</head>
|
|<body>
|
|  <p>Начало документа...</p>
|  <script>
|   document.write('qwerty');
|  </script>
|
|  <p>...Конец документа</p>
|
|</body>
|
|</html>";


javascript срабатывает два раза, т.е. в поле появляется qwerty qwerty.
Почему и что с этим делать?
1 Ненавижу 1С
 
гуру
25.07.18
08:15
фиг знает как ты это запуускаешь
2 golem14
 
25.07.18
08:16
(1) в Поле HTML документа
3 Малыш Джон
 
25.07.18
08:28
(2) тебе мягко намекают, что самого скрипта недостаточно, чтобы понять где ошибка.

ты на какое-то действие выполнение скрипта вешаешь?
4 golem14
 
25.07.18
08:31
(3) я пробовал ПриСозданииНаСервере, ПриОткрытии, просто на кнопку повесить. Во всех случаях javascript срабатывает два раза.
уже обсуждалось v8: v8: javascript в поле html-документа срабатывает 2 раза
но решения там нет
5 sitex
 
naïve
25.07.18
08:32
(0) не совсем понял зачем скрипт в тело сувать?
6 golem14
 
25.07.18
08:37
(5) А куда? оно так работает. вот простой пример HelloWorld
<!DOCTYPE HTML>
<html>

<head>
  <!-- Тег meta для указания кодировки -->
  <meta charset="utf-8">
</head>

<body>

  <p>Начало документа...</p>
  <script>
    alert( 'Привет, Мир!' );
  </script>

  <p>...Конец документа</p>

</body>

</html>
7 sitex
 
naïve
25.07.18
08:38
(0) блок <head> </head> , и от туда вызывай
8 golem14
 
25.07.18
08:39
этот пример тоже выводит "Привет, Мир!" два раза (в 1С).
9 sitex
 
naïve
25.07.18
08:41
(8) Итого что опиши подробной что ты хочешь сделать.
10 sitex
 
naïve
25.07.18
08:45
(8) <body> добавляй свои кнопки и что угодно < /body>
, в <script> создавай функции и вешай их свои кнопки , клики мыши и т.д.  </script> все просто.
11 novichok79
 
25.07.18
08:46
а может функцию сделать в JS и просто вызывать ее насильно...
что-то типа parentWindow.eval("HelloWorldYopta()");
12 golem14
 
25.07.18
08:50
(7) &НаКлиенте
Процедура Команда1(Команда)
     Объект.HTML = "
|<html>
|<head>
|  <script>
|   document.write('qwerty');
|  </script>
|</head>
|<body>
|
|</body>
|</html>";
КонецПроцедуры



выводит - qwerty qwerty

Объясню подробней: в пустой конфигурации создал документ, ему реквизит HTML (тип строка с неограниченной длиной). Вывел реквизит на форму, установил вид "Поле HTML документа".
Добавил вышеприведенную команду.

должно выводить - qwerty
а выводит - qwerty qwerty , т.е. скрипт выполняется дважды.
13 golem14
 
25.07.18
08:52
(11) Хотелось бы чтобы оно просто работало, но видимо так и нужно делать как вы советуете. Есть готовый простой пример?
14 sitex
 
naïve
25.07.18
08:53
(12) &НаСервере формируй свой текст html и Процедуре ПриСозданииНаСервере присваивай своему реквизиту-  этого достаточно.
15 golem14
 
25.07.18
08:54
(10) в теории все просто и красиво, на практике вот оно вот так вот и работает.
16 golem14
 
25.07.18
08:54
(14) так и делаю, выводит два раза
17 Малыш Джон
 
25.07.18
08:55
(11) начиная с какой-то версии порезали eval()
18 novichok79
 
25.07.18
08:56
(17) ну тогда печалько...
19 novichok79
 
25.07.18
09:00
вот недавно как раз баловался...

<!DOCTYPE html>
<html>
<head>
    <title>Font Size Definition</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=9" />
    <script>
    function GetFontSize1C(TextParam, FontDefinition)
    {
        var myCanvas = document.getElementById("myCanvas");
        var myCanvas2D = myCanvas.getContext("2d");
        myCanvas2D.font = FontDefinition;
        return myCanvas2D.measureText(TextParam).width;
    }

    function ExecCommand()
    {
        code = document.getElementById("ExtCommand").innerHTML;
        res = "" + eval(code);
        document.getElementById("BufferData").innerHTML = res;
    }
    </script>
</head>
<body>
    <canvas id="myCanvas" width="320" height="120" style="border:2px solid #d3d3d3;">Ваш браузер не поддерживает тэг HTML5 canvas.</canvas>
    <input type=button style="display:none" id="SendEvent" onclick = "ExecCommand()" />
    <div id="ExtCommand" style="display:none">extcommand</div>
    <div id="EventName" style="display:none">js_event</div>
    <div id="BufferData" style="display:none">js_result</div>
</body>
</html>
20 golem14
 
25.07.18
09:01
здесь dt выгрузка моего простого примера https://yadi.sk/d/Cc9U85Ok3ZYQkG
21 novichok79
 
25.07.18
09:02
&НаКлиенте
Процедура ОпределитьШиринуНадписи(Команда)
    
    Объект.ШиринаТекста = ОпределитьШиринуНадписиНаКлиенте();

КонецПроцедуры

&НаКлиенте
Функция ОпределитьШиринуНадписиНаКлиенте()

    ТипЧисло100 = Новый ОписаниеТипов("Число",
    Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Любой));
    
    Элементы.ПолеHTMLДокумента.Документ.getElementById("ExtCommand").innerHTML =
    ПодставитьПараметрыВСтроку("GetFontSize1C(""%1"", ""%2"")",
    Объект.ТекстНадписи, Объект.ОпределениеШрифта);

    КнопкаSendEvent = Элементы.ПолеHTMLДокумента.Документ.getElementById("SendEvent");
    РезультатВыполненияКоманды = КнопкаSendEvent.fireEvent("onclick");
    
    Если РезультатВыполненияКоманды Тогда

        РезультатФункции =
        ТипЧисло100.ПривестиЗначение(
        Элементы.ПолеHTMLДокумента.Документ.getElementById("BufferData").innerHTML);
        
    Иначе РезультатФункции = 0;
    КонецЕсли;
    
    Если ТипЗнч(РезультатФункции) <> Тип("Число") Тогда РезультатФункции = 0;
    КонецЕсли;

    Возврат РезультатФункции;
    
КонецФункции
22 novichok79
 
25.07.18
09:03
первое - это текст документа, второе - код обработки в 1С.
23 sitex
 
naïve
25.07.18
09:10
(16) ну напиши так в теле <body onload=""document.write('qwerty')"" > выведет один раз
24 sitex
 
naïve
25.07.18
09:15
либо в добавь <script>  window.onload = function () {
        document.write('qwerty');  

тоже должно вывести один раз
25 golem14
 
25.07.18
09:19
(24) так работает да. эх костыли.
26 sitex
 
naïve
25.07.18
09:21
(24) Этот вариант предпочтительней использовать. так ты хоть будешь контролировать что у тебя выводиться.
Ошибка? Это не ошибка, это системная функция.