Поле html документа 1с не работает javascript

Обновлено: 07.07.2024

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

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

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

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

Ближе к делу!

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Установим атрибут «onclick» и его значение, одной функцией ( ДИВ.setAttribute("onclick", "alert('Координаты');");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вывод.

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

(2) и это в общем логично. Поле HTML и выполнение в нём произвольного js, да ещё с eval, было страшенной дырой в безопасности. Поэтому и возможности поля порезали, и вообще.
Интересный способ, спасибо. Как-нибудь на досуге попробую.

Если статья понравилась не забываем щелкнуть на звездочку Статья так понравилась, особенно эта фраза, что щёлкнул звёздочку даже дважды) (3) Yashazz, Вот всегда так, паришься, а потом все по два раза звездочку жмут ((( (4) а просто не люблю попрошаек. Статья дельная, и я было щёлкнул, а потом дочитал до конца и даже расстроился.

(5) Yashazz,
Я просто на другие статьи посмотрел, дак там даже Яндекс кошель прицеплен. Да, и к тому же, не понятно нормальная статья или нет, звездочку не жмут и Комменты не пишут. Вот и думай стоит писать еще или нет.

Но не в это суть. Статья гуд и отлично )

(9) YPermitin, XMLHttpRequest не понимаю какую цель вы хотите этим достичь. вроде запросы из ПолеHTMLДокумент нормально уходят, проверил в помощью тега "Кнопка".

(2) можно определить функцию в самом документе -- и вызывать её:
<script type="text/javascript">
function exec(script) < eval(script); >
</script>

agent00mouse; maksa2005; sp18s; ice-net; TuneSoft; dutlovva; + 6 – Ответить (7) sikuda, Спасибо за коммент, посмотрел вашу статью.
В ней действительно есть похожие места, но думаю посмотрев структуру возврата события в 1С более удобных мест передачи данных не придумать, поэтому у нас места совпали. И сам подход у меня немного другой.

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

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

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

кто нибудь решал такую проблему?

а что именно там смотреть? я ту обработку и брал за образец Это поправили в 8.3.7 как я знаю. Не понятно почему нельзя обновить, режим совместимости вполне работает. я субподрядчик на большом проекте, от меня это не зависит, увы (16) ut11, Это косяк платформы, методов обхода мне найти не удалось (16) ut11, Добрый день, вам удалось решить проблему на платформе 8.2 ?

Подскажите плиз как сделать

(17) Zixxx, попробуйте поиграть с этим тегом <meta http-equiv="X-UA-Compatible" content="IE=9"/>. сначала откройте свой HTML с эти тегом(1с запустит эмуляцию IE). а потом переходите по ссылке К чему эти извращения? Вопрос из ряда "Знаю JS и лень учить 1С. Как писать в 1С средствами JS?". Вопрос, зачем? (21) alex_ua85, Либо я не очень понятно написал, либо читать вам надо внимательней. Так есть определяется функция в самом документе и вызывается (Это для передачи данных из 1с в док), а ели у вас произошло событие в документе, определен второй вариант с вызовом из документа в 1с через события "ПриНажатии" с передачей строковых данных. (21), использование JS из 1С имеет право на жизнь. Использование уже готовых библиотек, как минимум. Я, например, использовал JS библиотеки для расчета SHA-1 и HMAC-SHA1. Только запускал JS через "MSScriptControl.ScriptControl"
При использовании тега <meta http-equiv="X-UA-Compatible" content="IE=edge"/>, недоступно обращение через функцию eval html документа, как можно обратится к функции html документа с этим тегом? (26) SherifSP, к сожалению работу с edge (это не IE) не тестировал . Добрый день. Подскажите, как обойти проблему Eval() на обычных формах 8.3? Ругается на метод Евал при открытии карты(( (27) Дмитрий_кдс, Статья сверху (Весь текст) посвещен именно этому вопросу А ДобавитьОбработчик совсем никто не юзает, только я? (34) Такой статьи ДобавитьОбработчик + HTML я еще не видел, это ваш шанс заявить о себе. И мне тоже будет интересно. (35) насчет статьи не знаю, в общем, там просто все. Но меня выручило прямо. Вот, для событий onclick и oncontextmenu.

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

Как дальше выполнить этот код, чтобы иметь возможность сохранить файл?

(38)Это делается с помощью GET запроса, в вашем случае объект HTMLДокумент не нужен.

Тут упущен важный момент, на какой версии IE работает данная обработка.

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

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

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

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

но почему то эти события 1С не ловит.


Но он не позволяет вызвать событие onHelp в 1С.
Поэтому приходится вызывать fireEvent, но он работает только в старой версии IE.

При создании объекта "Поле HTML Документа" можно указать версию IE.

Привет, в справочник номенклатура был добавлен редактор HTML для редактирования описания и выгрузки на сайт.
до версии 8.3.14 все прекрасно работало, сейчас после перехода перестало работать, так как в версии 8.3.14 - webkit
html = Элементы.Body.Документ.parentWindow.eval("CKEDITOR.instances.editor1.getData();"); вот этот код выдает ошибку

Подскажите пожалуйста, как перевести на webkit

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

Решение нашёл такое: если нужно выполнить некую функцию на JS, достаточно объявить эту функцию в глобальном контексте:

Глобальный контекст доступен в 1С через свойство window объекта Документ:

Что в IE, что в WebKit, чтобы вызвать функцию js поля HTML из 1С, достаточно в скрипте объявить эту функцию, как переменную документа:
Pavel_Vladivostok; user1391851; Kuzja_R; asg.aleks; user876469; mailrum2004; + 6 – Ответить

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

Коллеги понимаю, что вопрос не туда, но может кто знает как на вебкит (ПолеHTMLДокумента) передать "ЭтаФорма" (контекст формы для вызова экспортных процедур формы 1С из JS)? раньше старый код работал когда мне нужно было вызвать из JS экспортный метод формы в 1С нужно было в js вызвать Form.exportMethod() , то сейчас при передаче в JS Этаформа всегда равен undefined . (8.3.15.1830) (51) Думаю заблокировали разработчики эту возможность. Вообще сейчас из 1С в JS никакие объекты не "лезут". Так что пользуйтесь программно вызываемым событием click.

(52)
Довольно неприятной особенностью обычных форм является вызов платформой обновления всей формы (главным образом ее табличных полей) при наличии непустого обработчика одного из событий

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

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

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

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

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

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

Ближе к делу!

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Установим атрибут «onclick» и его значение, одной функцией ( ДИВ.setAttribute("onclick", "alert('Координаты');");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вывод.

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

На текущий момент штатные средства 1С в управляемых формах не могут в полной мере удовлетворить потребность в богатом и отзывчивом интерфейсе. Ведь, по словам разработчиков платформы, управляемые формы призваны обеспечить быструю и эффективную разработку бизнес-логики приложения, с некоторым ущербом интерфейсу. Для абсолютного большинства ситуаций это верный подход, но есть случаи, когда необходимо и то, и другое.
Решением является использование HTML и JavaScript.

Предлагается решение, которое работает как в тонком, так и в веб-клиенте. Под Windows и Linux.

Примечание: при упоминании работоспособности в тонком клиенте, также подразумевается работоспособность и в толстом клиенте (управляемое приложение).

Взаимодействие кода 1С и JavaScript.

Вызов методов языка JavaScript из кода 1С.

Методы JavaScript могут быть вызваны из 1C так:

Глобальные переменные доступны следующим образом:

Для браузера Internet Explorer окно документа доступно через

Для остальных браузеров через


Подготовка переменных модуля для взаимодействия с JavaScript и вызов функции:

Подробнее остановимся на передаваемых агрументах.

В тонком клиенте под Windows, помимо примитивных типов Строка, Число, Булево. в функцию JavaScript можно передавать и нативные объекты 1С, такие как Структура, Массив, Соответствие, УправляемаяФорма, и др. Затем, в теле javascript функции доступны свойства и методы этих объектов.

Данный метод очень удобен, и он подходит, если хватает возможности работы в тонком клиенте в ОС Windows.

В тонком клиенте под Linux, а также в веб-клиенте метод не работает. При передаче структур, массивов, соответствий в аргумент функции, в её теле эти агрументы равны undefined. Работает передача строк, чисел, булев.

Функции сериализации и десериализации в/из JSON:

Используются механизмы работы с JSON, реализованные в платформе 8.3.6.1977.

Теперь, прежде чем передавать структуру в функцию JavaScript, преобразуем её в строку:

Изменится и код функции Javascript, так как строку нужно преобразовать обратно в объект, пусть и не 1С-овский, но удобный для обработки:

Глобальный объект JSON, используемый для сериализации и парсинга (десериализации) в javascript, доступен начиная с Internet Explorer 8.

HTML документ в тонком клиенте, по умолчанию, даже при наличии установленного IE11, отображается в режиме совместимости с IE5 (Quirks mode), поэтому необходимо его перевести в Standarts mode установной тега <meta http-equiv="X-UA-Compatible" content="IE=EDGE" /> в теле тега head.

Если на компьютере установлен IE7 (когда переход в режим минимум IE8 невозможен), то нужно использовать следующий скрипт: который реализует функционал работы с JSON в IE < 8 (по аналогии с работой с JSON в платформе начиная с версии 8.3.6.1977, и до неё).

В функции javascript можно создавать массивы или объекты javascript, заполнять их, и возвращать в 1C.

Вызов методов 1С из JavaScript

В тонком клиенте под Windows доступен очень удобный метод:

В HTML документе создается глобальная переменная, например externalForm. При загрузке документа, переменной externalForm присваивается ссылка на текущую упрваляемую форму, доступную через ЭтотОбъект или ЭтаФорма.

Затем, в коде JavaScript становятся доступны любые клиентские экспортные методы и переменные модуля данной управляемой формы.

В тонком клиенте на Linux и в веб-клиенте методы и свойства переменной externalForm не доступны в javascript, их значение - undefined, поэтому используется следующая методика:

Объявляем глобальную переменную javascript, в которую будем помещать передаваемое значение.

В документ добавляем невидимую кнопку

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

И обрабатываем событие ПриНажатии у поля HTML документа.

Благодарю за внимание, не претендую на уникальность и надеюсь, что и данная информация будет полезна многим.

Прикреплена демонстрационная обработка.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Еще один интересный приём передачи данных JavaScript -> 1C, работающий только в тонком/толстом клиентах на Windows.

fancy; le0nid; json; WizaXxX; Gilev.Vyacheslav; zergnm; kote; + 7 – Ответить (23) unpete, Хоть и не замечал пропусков, но ваш метод всё же, более надёжен, спасибо. Одно непонятно, как поведет себя одновременный .pop() у этого стека в 1С, и .push() в javascript, при отсутствии mutex'ов. как поведет себя одновременный .pop() у этого стека в 1С, и .push() в javascript Поведёт себя плохо, решение не идеальное, но вероятность проблем ниже. (1)hello is there any english document ? I didnt understand it :) Basicly i need when i click a event in html document i want to start 1c procedure or function how can i do it ?

Прочитал с большим интересом :) В своё время "подружил" HTML-форму c Flash элементом на нём - с передачей данных туда и обратно.. но потом flash умер и всё как то сошло на нет :)
В общем, управляемые формы уже не мучал в этом отношении.

Пишите еще. Интересно, насколько можно улучшить UI у 1С с помощью js - фото и видео бы добавить в следующих статьях.. и посмотреть работу таких фреймворков в окне 1С, как Angular/React/.. и т.п.

Жму руку и буду ждать продолжения..

(2) kote, Постараюсь написать полезный материал.

Исходный код HTML документа можно хранить в макете типа ТекстовыйДокумент. Хотя есть и макет типа Документ HTML, с мгновенным просмотром результата изменений, но хранить код в нем не советую, так как конфигуратор портит код, работающий с новыми версиями браузеров.

Создаете реквизит формы, с типом Строка, переностите его на форму, изменяете тип элемента с Поле ввода на Поле HTML документа. Получаете содержимое макета ТекстовыйДокумент и присваиваете его созданному реквизиту с типом Строка.

(4) vano-ekt, Нужно указывать мета-тег x-ua-compatible для перевода браузера в Standards mode, тогда документ будет отображаться в режиме версии, установленной на компьютере. Тег присутствует в статье. Проблема реальна, когда сборка Windows на компьютере старая, и установлен IE8, или IE7. Поэтому нужно писать разметку HTML таким образом, чтобы обеспечивать совместимость и с этими браузерами.

Для решения которое я разрабатываю, я выбрал минимальный порог - IE8. То есть, если хотите чтобы приложение работало, обновите ваш IE6/7 до IE8, так как для поддержки IE7 нужно слишком много костылей. Такой же порог выбрали и разработчики 1С для веб-клиента.

Надо сделать коллективное обращение в 1С, об отказе использования IE WebContol в толстом/тонком клиентах под Windows, и переход на Webkit, с вшитием его в платформу, то есть чтобы версия Webkit не зависела от того что установлено на компьютере.

Читайте также: