Выполнение JavaScript кода из 1С в объекте Поле HTML Документа (HTML 5) и вызов события в 1С ПриНажатии

06.12.16

Разработка - Работа с интерфейсом

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ПРИМЕР РАБОТЫ С JS
.epf 6,83Kb
201
201 Скачать (1 SM) Купить за 1 850 руб.

Предыстория

Во время реализации одного проекта, возникла необходимость выполнять javascript(далее JS) код под управление объекта ПолеHTMLДокумента, с получением результат в 1С.  Приведённые примеры, в найденных статьях, показались не очень удобными в использовании (сугубо личное мнение). Было принято решение попробовать найти другое, более простое, решение, на поиски отводилось не более 1 дня.

Меня заинтересовала статья на хабре в которой говорилось, что из HTML документа можно программно вызвать события (используется для вызова метода ПриНажатии из объекта ПолеHTMLДокумента). А на этом сайте управление атрибутами (использую для выполнения JS из 1С) .

Это и стало отправной точкой в разработке метода взаимодействия 1С и объекта ПолеHTMLДокумента.

Для эксперимента будем использовать простую HTML страницу.

<HTML>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
</HEAD>
<body>
<div id="TEST" />
</body>
</html>

Ближе к делу!

Пример описанных методов вы можете посмотреть в прилагаемой обработке. 

  1. Запуск скрипта
  2. Получения ответа скрипта
  3. Запуск с возвратом результата скрипта в 1с


После тестирования статья дополнилась вторым подходом, он получился более простым и понятным, советую пробовать методы описанные в дополнениях.

Выполнение JS из 1С

    Для выполнения JS кода в объекте  ПолеHTMLДокумента мы можем использовать стандартные события тегов. Такие как щелчок, двойной щелчок....  Для примера я буду использовать событие «OnClick»,  список тегов поддерживающих это событие можно посмотреть тут, выберем самый простой тег div.

Получим элемент по ИД из объекта DOM построеным Полем HTML Документа.

ДИВ = Элементы.Док.Документ.getElementById("TEST");

Попробуем найти атрибут "onclick", связанный с событием щелчок мыши, у элемента.

НашлиАтрибут = ДИВ.getAttributeNode("onclick");

Удалим атрибут если такой имеется

Если НашлиАтрибут <> null Тогда
    ДИВ.removeAttribute("onclick");
КонецЕсли;

Создадим атрибут и установим необходимое нам действие

Атрибут  = Элементы.Катра.Документ.createAttribute("onclick"); //создаем атрибут
Атрибут.value = "alert('сообщение от 1c');"; // прописываем скрипт который будем выполнять
ДИВ.attributes.setNamedItem(Атрибут); // привязываем атрибут

Вызовем действие щелчок мыши.

ДИВ.click();

   Таким образом мы можем выполнять любые скрипты, и привязывать/подменять действия у элементов объекта ПолеHTMLДокумента, тем самым обеспечивая необходимое нам поведение. Например к ссылке/кнопке, отображаемой на открытом сайте, мы можем присоединть свое действие или поменять стандарное на свое. (Наверное так и работают вломщики )

В результате получим функцию выполнения скрипта

&НаКлиенте
Процедура ВыполнитьСкрипт(Команда)
	
	ДИВ = Элементы.док.Документ.getElementById("TEST");
	
	НашлиАтрибут = ДИВ.getAttributeNode("onclick");
	Если НашлиАтрибут <> null Тогда
		ДИВ.removeAttribute("onclick");
	КонецЕсли; 
	
	Атрибут  = Элементы.док.Документ.createAttribute("onclick");
	Атрибут.value = "alert('Сообщение  от 1с');";
	ДИВ.attributes.setNamedItem(Атрибут); // привязываем атрибут
	
	ДИВ.click();
		
КонецПроцедуры

Эту процедуру использую вместо старого метода ПолеHTMLДокумента.Документ.parentWindow.eval
который теперь(при использовании IE8 и выше) выдает ошибку ( Метод объекта не обнаружен (eval) )

Дополнение от 25.03.2016

    Попытка выполнить данную конструкцию на платформе 8.3.5.1570 и ниже в толстом клиенте, под управляемой формой, не увенчалась успехом. Но был найден еще один способ выполнить данную операцию. Возможно даже более простой и удобный.

Получим наш Элемент по ИД

ДИВ = Элементы.Катра.Документ.getElementById("TEST");

Установим атрибут «onclick» и его значение, одной функцией (Подсмотрел ТУТ)

ДИВ.setAttribute("onclick", "alert('Координаты');");

Выполним скрипт

ДИВ.click();

ТАДА. все работает 

Процедура ВыполнитьСкрипт(ТекстСкрипт) 

   ДИВ = Элементы.док.Документ.getElementById("TEST");
   ДИВ.setAttribute("onclick", ТекстСкрипт);
   ДИВ.click();

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

Дополнение от 02.08.2016

В комметариях был предложен еще один способ вызова JS (спасибо Rie), если у вас есть возможность менять код HTML документа, то можно прописать функцию в нем и затем ее вызывать.  передавая в нее код на JS.
<script type="text/javascript"> function exec(script) { eval(script); } </script>

и затем в 1С: 

Элементы.ПолеHTMLДокумента1.Документ.parentWindow.exec("alert('OK')");

Возврат результата JS в 1С

      Для передачи результата скрипта в 1С из объекта ПолеHTMLДокумента будем использовать событие. Привяжем к  ПолеHTMLДокумента событие ПриНажатии которое получает на вход 3 параметра:

  1. Элемент у которого произошло событие(само ПолеHTMLДокумента )
  2. Объект событие
  3. Признак выполнения стандартного поведения

Чтобы вызвать событие при нажатии понадобиться выполнить следующий js код

var evt = document.createEventObject(); // создадим пустой объект событие
evt.propertyName = 'функц1'; // в реквизит propertyName предлагаю помещать название результата ( что-то вроде типа, или название функции от которой получили данные )
evt.data = '156'; //в реквизит data будем передавать данные результата
document.body.fireEvent('onclick', evt); // выполним событие при нажатии  ПолеHTMLДокумента

    Выполнив данный js код в процедуру при нажатии вторым параметром придет созданный нами объект событие. Который довольно удобно обрабатывать. 

Пример разбора ответа.

&НаКлиенте
// получаем имя и результат события
Процедура ДокПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)  
               
      ИмяОперации = ДанныеСобытия.Event.propertyName;
      ДанныеОперации = ДанныеСобытия.Event.data;
      Если ИмяОперации = "" Тогда //не наше событие
          Возврат;                       
      КонецЕсли;
              
      Если ИмяОперации = "Функц1" Тогда
         // обработка результат
      ИначеЕсли ИмяОперации = "функц2" Тогда
          // обработка результат
          //......  
      КонецЕсли;
                 
КонецПроцедуры

     Этот метод избавляет от использования обработчиков ожидания, и предоставляет удобный идентификатор события. По идентификатору мы точно знаем какие данные нам пришли, и как их разобрать.

Дополнения от 26.03.2016

   И в этом месте тоже произошли непонятки (ошитбка восптроизводится только на плаформе 8.3.5.1570, но дабы предупредить эти ситуации в далнейшем, приведу решение) Сама причина - при повторном запуске формы с Поле HTML документа в момент вызова процедуры при нажатии по полю HTML платформенный вызов залипал и валил весь COM объект ( Произошла исключительная ситуация (htmlfile): Неопределенная ошибка ). Решением стало отключение стндарного выполнения события click, и отключение режима всплывания события. Как же это сделать смотрим ниже.

// отключим всплывание события подробнее тут

evt.cancelBubble = true;

// отключим стандартное поведение подробнее тут

evt.returnValue = false;

В результате для передачи данных в 1с из JS мы получим функцию.

function return1c(name,data){        

        var evt = document.createEventObject();
	evt.propertyName = name;
	evt.data = data;
	evt.cancelBubble = true;
	evt.returnValue = false;
        document.fireEvent('onclick',evt);
}; 

Вывод.

     Комбинируя эти методы, вы сможете довольно легко запускать необходимый вам js код, и получать данные в 1С, для дальнейшей обработки.

Пример реализации в публикации тут

javascript js ПолеHTMLДокумента

См. также

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    62984    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    18851    26    6    

41

Работа с интерфейсом Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

1500 руб.

06.10.2020    10223    7    7    

10

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    16781    mrXoxot    43    

121

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    7340    smielka    37    

100

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    14783    913    elcoan    47    

117

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    11909    162    acces969    31    

124
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DrAku1a 1745 24.03.16 03:39 Сейчас в теме
По выполнению JS из 1С - вроде было что-то попроще, вроде eval или EvalExpr. По поводу возврата результата - думаю, будет полезно!
2. igo1 270 24.03.16 11:55 Сейчас в теме
(1) DrAku1a, Да, раньше выполнять скрипты можно было с помощью конструкции ПолеHTMLДокумента.Документ.parentWindow.eval("Скрипт"); , но с переходом на IE8 и выше такой возможности больше нет. Да и статья показывает не только, что можно вызвать JS код, но и изменить поведение HTML документа, загруженного в ПолеHTMLДокумент.
3. Yashazz 4790 24.03.16 13:01 Сейчас в теме
(2) и это в общем логично. Поле HTML и выполнение в нём произвольного js, да ещё с eval, было страшенной дырой в безопасности. Поэтому и возможности поля порезали, и вообще.
Интересный способ, спасибо. Как-нибудь на досуге попробую.

Если статья понравилась не забываем щелкнуть на звездочку
Статья так понравилась, особенно эта фраза, что щёлкнул звёздочку даже дважды)
v.l.; amon_ra; +2 Ответить
4. igo1 270 24.03.16 13:21 Сейчас в теме
(3) Yashazz, Вот всегда так, паришься, а потом все по два раза звездочку жмут (((
nekit_rdx; adhocprog; +2 Ответить
5. Yashazz 4790 24.03.16 16:57 Сейчас в теме
(4) а просто не люблю попрошаек. Статья дельная, и я было щёлкнул, а потом дочитал до конца и даже расстроился.
6. igo1 270 24.03.16 19:03 Сейчас в теме
(5) Yashazz,
Я просто на другие статьи посмотрел, дак там даже Яндекс кошель прицеплен. Да, и к тому же, не понятно нормальная статья или нет, звездочку не жмут и Комменты не пишут. Вот и думай стоит писать еще или нет.

Но не в это суть. Статья гуд и отлично )
9. пользователь 28.03.16 15:05
(2) скажите, а не пытались ли вы использовать объект XMLHttpRequest для отправки запрос из поля HTML-документа?
Вроде как функция эта заблочена, но вдруг есть обходной путь)
10. igo1 270 13.05.16 14:42 Сейчас в теме
(9) YPermitin, XMLHttpRequest не понимаю какую цель вы хотите этим достичь. вроде запросы из ПолеHTMLДокумент нормально уходят, проверил в помощью тега "Кнопка".
20. Rie 29.07.16 00:05 Сейчас в теме
(2) можно определить функцию в самом документе -- и вызывать её:
<script type="text/javascript">
function exec(script) { eval(script); }
</script>

и затем в 1С:

Элементы.ПолеHTMLДокумента1.Документ.parentWindow.exec("alert('OK')");
agent00mouse; maksa2005; sp18s; ice-net; TuneSoft; dutlovva; +6 Ответить
23. igo1 270 29.07.16 13:36 Сейчас в теме
7. sikuda 677 25.03.16 09:50 Сейчас в теме
8. igo1 270 25.03.16 11:45 Сейчас в теме
(7) sikuda, Спасибо за коммент, посмотрел вашу статью.
В ней действительно есть похожие места, но думаю посмотрев структуру возврата события в 1С более удобных мест передачи данных не придумать, поэтому у нас места совпали. И сам подход у меня немного другой.
11. ut11 2 27.07.16 19:09 Сейчас в теме
Опробовал методику, столкнулся с тем, что при повторных вызовах обработки происходит ошибка:

"Ошибка при вызове метода контекста (setAttribute)
ДИВ.setAttribute("onclick", ТекстСкрипт);
по причине:
Произошла исключительная ситуация: Не поддерживается"

либо "Произошла исключительная ситуация (0x800a01b6)"

кто нибудь решал такую проблему?
12. igo1 270 27.07.16 19:25 Сейчас в теме
Да такая проблема была на платформе 8.3.5 обновите и все ОК, или посмотрите эту публикацию http://infostart.ru/public/506854/ (11) ut11,
13. ut11 2 27.07.16 19:44 Сейчас в теме
у клиента 8.2.19 и обновить нет возможности :(
14. ut11 2 27.07.16 19:46 Сейчас в теме
а что именно там смотреть? я ту обработку и брал за образец
15. igo1 270 27.07.16 19:47 Сейчас в теме
Это поправили в 8.3.7 как я знаю. Не понятно почему нельзя обновить, режим совместимости вполне работает.
16. ut11 2 27.07.16 19:53 Сейчас в теме
я субподрядчик на большом проекте, от меня это не зависит, увы
18. igo1 270 28.07.16 11:50 Сейчас в теме
(16) ut11, Это косяк платформы, методов обхода мне найти не удалось
24. Al-77 74 02.08.16 16:23 Сейчас в теме
(16) ut11, Добрый день, вам удалось решить проблему на платформе 8.2 ?
25. igo1 270 02.08.16 18:15 Сейчас в теме
(24) Al-77, Ее не решить на 8.2, там COM объект после вызова события разваливается. только 8.3.7 и выше. под 8.2 должен работать старый метод eval просто поставьте <meta http-equiv="X-UA-Compatible" content="IE=9"/> в место IE=9 -> IE=7. должно заработать. Пример такой работы в моей старой обработке http://infostart.ru/public/238697/
17. Zixxx 28.07.16 06:17 Сейчас в теме
Ни как не получается в Поле HTML Документа отобразить следующую страницу
http://wsde.ru/timeline/index.html
Постоянно валится с ошибками, описанный здесь пример тоже пробовал использовать, но может не так чего сделал.

Подскажите плиз как сделать
19. igo1 270 28.07.16 12:53 Сейчас в теме
(17) Zixxx, попробуйте поиграть с этим тегом <meta http-equiv="X-UA-Compatible" content="IE=9"/>. сначала откройте свой HTML с эти тегом(1с запустит эмуляцию IE). а потом переходите по ссылке
21. alex_ua85 29.07.16 01:23 Сейчас в теме
К чему эти извращения? Вопрос из ряда "Знаю JS и лень учить 1С. Как писать в 1С средствами JS?". Вопрос, зачем?
22. igo1 270 29.07.16 12:57 Сейчас в теме
(21) alex_ua85, Либо я не очень понятно написал, либо читать вам надо внимательней. Так есть определяется функция в самом документе и вызывается (Это для передачи данных из 1с в док), а ели у вас произошло событие в документе, определен второй вариант с вызовом из документа в 1с через события "ПриНажатии" с передачей строковых данных.
31. zan_od 55 13.12.16 22:05 Сейчас в теме
(21), использование JS из 1С имеет право на жизнь. Использование уже готовых библиотек, как минимум. Я, например, использовал JS библиотеки для расчета SHA-1 и HMAC-SHA1. Только запускал JS через "MSScriptControl.ScriptControl"
VKislitsin; +1 Ответить
26. SherifSP 21.09.16 13:00 Сейчас в теме
При использовании тега <meta http-equiv="X-UA-Compatible" content="IE=edge"/>, недоступно обращение через функцию eval html документа, как можно обратится к функции html документа с этим тегом?
29. igo1 270 26.09.16 13:23 Сейчас в теме
(26) SherifSP, к сожалению работу с edge (это не IE) не тестировал .....
27. Дмитрий_кдс 22.09.16 11:06 Сейчас в теме
Добрый день. Подскажите, как обойти проблему Eval() на обычных формах 8.3? Ругается на метод Евал при открытии карты((
28. igo1 270 26.09.16 13:22 Сейчас в теме
(27) Дмитрий_кдс, Статья сверху (Весь текст) посвещен именно этому вопросу
30. vaxhab 16 06.12.16 22:31 Сейчас в теме
32. dablack 29.08.17 23:15 Сейчас в теме
Игорь, спасибо! очень кстати нашел вашу статью.
33. igo1 270 01.09.17 12:28 Сейчас в теме
34. antz 01.09.17 13:01 Сейчас в теме
А ДобавитьОбработчик совсем никто не юзает, только я?
35. igo1 270 01.09.17 13:09 Сейчас в теме
(34) Такой статьи ДобавитьОбработчик + HTML я еще не видел, это ваш шанс заявить о себе. И мне тоже будет интересно.
36. antz 01.09.17 13:29 Сейчас в теме
(35) насчет статьи не знаю, в общем, там просто все. Но меня выручило прямо. Вот, для событий onclick и oncontextmenu.
Прикрепленные файлы:
Обработчик.epf
Aligator69; Valador; svilsa; tormozit; Степной; N1LL; CnupT; +7 Ответить
63. Valador 30.01.22 19:10 Сейчас в теме
(36)
Ой спасибо за этот простой, тихо и скромно написанный код, впервые мной увиденный в применении к внешнему объекту поля HTML!
И все назначенные события отрабатывают на "ура". Работают события и нажатия кнопки мыши, и отпускания, и движения мыши. И вот до этого момента я не знал, как "поймать" эти события мыши в поле HTML. Именно то, что я искал.

Событие "onclick" как я понимаю тоже самое что и "ПриНажатии" или есть разница?

Кстати, события можно "вешать" прямо на теги с определенным классом, главное не перепутать, какое свойство проверять (ДанныеСобытия.target, ДанныеСобытия.toElement или ДанныеСобытия.currentTarget)

Спасибо!
37. igo1 270 05.09.17 13:09 Сейчас в теме
Посмотрел обработчик, хороший пример. можно и так.
38. Mzybo 09.10.17 10:13 Сейчас в теме
У меня есть практический вопрос. Как получить файл Excel с сайта?
http://grls.rosminzdrav.ru/GRLS.aspx (в правом верхнем углу)

Сейчас я получаю данные элемента через функцию
а = Элементы.Реквизит1.Документ.getElementById("ctl00_plate_tdzip");

Как дальше выполнить этот код, чтобы иметь возможность сохранить файл?
39. igo1 270 09.10.17 12:19 Сейчас в теме
(38)Это делается с помощью GET запроса, в вашем случае объект HTMLДокумент не нужен.
40. ZhokhovM 755 18.10.17 12:29 Сейчас в теме
41. v.l. 435 11.01.18 13:51 Сейчас в теме
(40) Не стесняйся, не держи в себе! Пиши здесь.
42. Green2 29 24.09.18 14:59 Сейчас в теме
Тут упущен важный момент, на какой версии IE работает данная обработка.

Потому что в режиме IE 11 функции

var evt = document.createEventObject();
document.fireEvent('onclick',evt)

Не работают.

По стандарту надо писать

var event = document.createEvent("Event");
event.initEvent("hello", true, true);

elem.dispatchEvent(event) ;

но почему то эти события 1С не ловит...
43. igo1 270 25.09.18 15:48 Сейчас в теме
44. Green2 29 25.09.18 16:03 Сейчас в теме
(43) Я попробовал этот код
// Create the event.
var event = document.createEvent('Event');

// Create a click event that bubbles up and
// cannot be canceled 
event.initEvent('help', true, false);

// Listen for the event.
elem.addEventListener('click', function (e) {
  // e.target matches elem
}, false);

elem.dispatchEvent(event);
Показать

Но он не позволяет вызвать событие onHelp в 1С.
Поэтому приходится вызывать fireEvent, но он работает только в старой версии IE.
45. igo1 270 26.09.18 16:18 Сейчас в теме
(44)

При создании объекта "Поле HTML Документа" можно указать версию IE.
53. skaoxy 18 07.08.20 10:19 Сейчас в теме
(45)
Поле HTML Документа
Как?
46. rassigor 03.05.19 01:57 Сейчас в теме
Привет, в справочник номенклатура был добавлен редактор HTML для редактирования описания и выгрузки на сайт.
до версии 8.3.14 все прекрасно работало, сейчас после перехода перестало работать, так как в версии 8.3.14 - webkit
html = Элементы.Body.Документ.parentWindow.eval("CKEDITOR.instances.editor1.getData();"); вот этот код выдает ошибку

Подскажите пожалуйста, как перевести на webkit
47. user1275865 04.09.19 19:38 Сейчас в теме
Всё вышеперечисленное перепробовал, но тщетно: fireEvent не работает, CustomEvent, у которого можно задать detail - тоже не взлетел (detail всё время равно 1)...

Решение нашёл такое: если нужно выполнить некую функцию на JS, достаточно объявить эту функцию в глобальном контексте:
<script type="text/javascript">
function myCustomFunction() {
   return "My valuable JS data";
}
</script>


Глобальный контекст доступен в 1С через свойство window объекта Документ:
Данные = ЭлементыФормы.ПолеHTMLДокумента.Документ.window.myCustomFunction();
48. igo1 270 04.09.19 19:48 Сейчас в теме
На какой платформе пробовали?
49. Konstatine 8 07.10.19 14:51 Сейчас в теме
Скажите, почему не работает на 8.2?
50. SlavaKron 22.10.19 15:03 Сейчас в теме
Что в IE, что в WebKit, чтобы вызвать функцию js поля HTML из 1С, достаточно в скрипте объявить эту функцию, как переменную документа:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Реквизит1 =
	"<html>
	|	<head>
	|		<script language='JavaScript' type='text/javascript'>
	|			
	|			document.helloWorld = function() {helloWorld()};
	|		 
	|		 	function helloWorld() {
	|				document.getElementById('text').innerHTML = 'Hello World!'
	|			}
	|			
	|		</script> 
	|	</head>		
	|			
	|	<body>
	|		<h1 id='text'> </h1>
	|	</body>
	|	
	|</html>";

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

&НаКлиенте
Процедура Команда1(Команда)
	Элементы.Реквизит1.Документ.helloWorld();
КонецПроцедуры
Показать
Прикрепленные файлы:
ВнешняяОбработка1.epf
zinzillya; Irwin; Pavel_Vladivostok; user1391851; Kuzja_R; asg.aleks; tyazhovkin; mailrum2004; +8 Ответить
55. Pavel_Vladivostok 58 21.05.21 15:20 Сейчас в теме
(50)
document.helloWorld = function() {helloWorld()};


К сожалению не работает данный способ в 8.3.18.1208, пытаюсь запустить в поле HTML документа, диаграмму HighCharts, не выполняются JS скрипты чтобы я не делал.
Может есть какой-то другой способ?
Например этот код сохраненный в файле выполняется, при подстановке в текст HTML документа, выполняется только html.
<html>
<body>

<script src="https://code.highcharts.com/stock/highstock.js"></script>
<script src="https://code.highcharts.com/stock/modules/data.js"></script>
<script src="https://code.highcharts.com/stock/modules/exporting.js"></script>
<div id="container" style="height: 100%; min-width: 310px; relational">  </div>
<script type="text/javascript">


Highcharts.getJSON('https://demo-live-data.highcharts.com/aapl-ohlc.json', function (data) {

    // create the chart
    Highcharts.stockChart('container', {


        rangeSelector: {
            selected: 1
        },

        title: {
            text: 'AAPL Stock Price'
        },

        series: [{
            type: 'candlestick',
            name: 'AAPL Stock Price',
            data: data,
            dataGrouping: {
                units: [
                    [
                        'week', // unit name
                        [1] // allowed multiples
                    ], [
                        'month',
                        [1, 2, 3, 4, 6]
                    ]
                ]
            }
        }]
    });
}); 

</script>

</body></html>
Показать
66. zinzillya 19.11.22 18:51 Сейчас в теме
(601)
(50)
Удивительное дело. Ваша обработка работает, Аналогичный код - нет.
Метод объекта не обнаружен (СalculateDistance)

1С:Предприятие 8.3 (8.3.20.1674)

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    HTMLДокумент = 
    "<ht ml>
    |    <head>
    |        <sc ript language='JavaScript' type='text/javascript'>
    |            
    |            document.СalculateDistance = function() {СalculateDistance()};
    |         
    |             function СalculateDistance() {
    |				document.getElementById('text').innerHTML = 'Hello World!'
    |				}
    |
    |            
    |        </sc ript> 
    |    </head>        
    |            
    |    <body>
    |        <h1 id='text'> </h1>
    |    </body>
    |    
    |</html>";
КонецПроцедуры

&НаКлиенте
Процедура Расстояние(Команда) 
	
	Элементы.HTMLДокумент.Документ.СalculateDistance();
	
КонецПроцедуры
Показать
51. eugeniezheludkov 45 04.05.20 17:08 Сейчас в теме
Коллеги понимаю, что вопрос не туда, но может кто знает как на вебкит (ПолеHTMLДокумента) передать "ЭтаФорма" (контекст формы для вызова экспортных процедур формы 1С из JS)? раньше старый код работал когда мне нужно было вызвать из JS экспортный метод формы в 1С нужно было в js вызвать Form.exportMethod() , то сейчас при передаче в JS Этаформа всегда равен undefined . (8.3.15.1830)
52. wenzor 39 25.06.20 14:29 Сейчас в теме
(51) Думаю заблокировали разработчики эту возможность. Вообще сейчас из 1С в JS никакие объекты не "лезут". Так что пользуйтесь программно вызываемым событием click.
agent00mouse; +1 Ответить
56. tormozit 7229 09.06.21 00:01 Сейчас в теме
(52)
Довольно неприятной особенностью обычных форм является вызов платформой обновления всей формы (главным образом ее табличных полей) при наличии непустого обработчика одного из событий

ВнешнееСобытие
ОбработкаОповещенния
ПолеHTMLДокумента.Событие

Соответственно на тяжелых формах каждый вызов события onclick вызывает асинхронное (как одноразовый обработчик ожидания) выполнение большого количества ненужного кода. А у меня это событие для поля HTML зовется очень часто. Таким образом если на форме отображается табличное поле с большим количеством ячеек и обработчиков ПриВыводеСтроки, то возникают ощутимые задержки при частых вызовах onclick.

Нужен именно вызов экспортного метода. Может есть какой то грязный хак?
57. tormozit 7229 09.06.21 00:47 Сейчас в теме
58. agent00mouse 256 16.06.21 14:04 Сейчас в теме
(52)
Я Это решил так:
	мКодJS	= Новый Массив();
	мКодJS.Добавить("var DocsArr = [");
	Для Каждого ЭМ Из МДокументов Цикл
		мКодJS.Добавить("'"+ЭМ+"',");
	КонецЦикла;
	мКодJS.Добавить("];");
	мКодJS.Добавить(Символы.ВК);
	мКодJS.Добавить("ContentUpdate ( DocsArr );");
	КодJS=СтрСоединить(мКодJS,"");
	
	ОкноБраузера.ExcecMyCodeFunc( КодJS );
Показать

Но это дикий костыль!
54. AnotherSide 21.08.20 17:05 Сейчас в теме
Коллеги, возникла следующая проблема: по описанной выше методике пытаемся реализовать запись звука из формы с HTML-документом на веб-клиенте (2 кнопки- Начать запись и Закончить запись). Скачан и доработан готовый скрипт на JS зашитый в поле HTML. При попытке начать запись выдается Dom Exception, судя по консоли JS в момент попытки чтения звуковых устройств, т.е. по ощущениям не хватает прав, хотя все права для самого сайта даны на уровне браузера. Может кто знает, есть ли какие-то ограничения для веб-клиента на этот счет, ведь локально на странице все прекрасно отрабатывает. Кусок скрипта ниже:

function startRecord() {
		
	navigator.mediaDevices.getUserMedia({
            audio: true
        }).then(function(stream) {
            gumStream = stream;
            recorder = new MediaRecorder(stream);
            recorder.ondataavailable = function(e) {
				recordingBlob = e.data;
            };
            recorder.start();
Показать
59. Oleeeg 22.09.21 11:45 Сейчас в теме
Может кто сталкивался
Стоит задача сохранить карту, построенную в поле HTML в jpeg, с последующим сохранением этой картинки как присоединенного файла
Собственно, как можно поле хтмл сохранить в картинку?
60. igo1 270 05.10.21 14:39 Сейчас в теме
(59) вроде метод есть в АПИ яндекса.
61. Oleeeg 05.10.21 17:44 Сейчас в теме
(60)
АПИ яндекса.

А подробней можно?))
62. serverstar 69 29.11.21 15:16 Сейчас в теме
Итак, снова я в этой ветке.

Все это конечно хорошо, и производить обмен JS и 1С через событие ПриНажатии() удобно.
Вот только засада. На android-эмуляторе событие ПриНажатии() срабатывает ТОЛЬКО если есть тег "http:// и ОБЯЗАТЕЛЬНО
href="" заполнено ссылкой. НЕ пустой ссылкой типа href=""#"" или href=""##"" или href=""!#"" или href=""javascript:void(0)""

Поэтому вопрос к знатокам. как уже в Android-эмуляторе заставить работать ПриНАжатии у тега <a></a>???
64. vasiliy_09_05 6 25.03.22 14:54 Сейчас в теме
Доброго времени суток Дамы и Господа.
Требуется Ваша помощь :(
Есть сайт, на котором я работаю через элемент ПолеHTMLДокумента.
Мне необходимо программно нажать на кнопку.
Сайт:
СтраницаСайта
Мне необходимо нажать на кнопку "В корзину"
Сам код html этой кнопки такой:


То есть у объекта нет никаких обработчиков Click и так далее, и вообще класс объекта - fake-submit :)
В общем уже какой день мучаюсь, никак программно не могу добавить товар :(
Судя по коду используется ajax скрипты, но вызвать их так же не могу, как и вызвать #add2basket
То есть у меня обратная ситуация - мне не нужно менять скрипт, мне нужно его запустить :(

Если кто подскажет, куда копать, был бы очень благодарен!!!
65. vasiliy_09_05 6 25.03.22 14:55 Сейчас в теме
Оставьте свое сообщение