|
JavaScript в поле HTML документа. Прямой вызов функций и с помощью eval | ☑ | ||
---|---|---|---|---|
0
Elizir
03.04.13
✎
09:03
|
Доброго дня. Возникла такая проблема, а точнее вопросы. На форме есть поле HTML документа, в котором присутствуют пара JavaScript функций. Пытаюсь наладить связь между ними и 1С, форум уже прошелестил, осталось следующей непонятное:
1) Вызвать функцию JS можно двумя способами, так: Элементы.ПолеHTMLДокумента.Документ.parentWindow.testJS(); и так: Элементы.ПолеHTMLДокумента.Документ.parentWindow.eval("testJS()"); Вызываемая функция должна возвращать массив, например. Так вот, второй вариант возвращает массив в виде COM-объекта (правда ключи строковые), а первый возвращает просто COM-объект без элементов (есть подозрение, что он ничего не возвращает, а в переменную записывается сама функция). Собственно, отсюда вопрос, где подробней можно узнать о разнице в вызовах? Ведь первый вариант предпочтителен, т.к. позволяет передавать не только строковой параметр в функцию. 2) Из предыдущего вытекает еще любопытство. Обратная ситуация, передаем массив в функцию JS (прямым вызовом, разумеется). Предполагал, что ошибка будет (откуда JS знать тип массива 1С), но нет, передалось, более того, в JS с ним можно работать, используя функции 1С, т.е. Добавить(), Получить() и т.д., не работает только индексация. Как так? 3) И, наконец, самое загадочное - вызов функций 1С из JS. Для обычных форм советовали использовать в JS fireEvent, вызвав им событие, которое может поймать 1С. Но на управляемых формах есть только "ПриИзменении", "ПриНажатии" и "ДокументСформирован". Как тут быть? Не очень надеюсь, но, конечно, хотелось бы узнать литературу, в которой это было хоть как-то затронуто. :) |
|||
1
Asmody
03.04.13
✎
09:29
|
почитать это, пожалуй, только в msdn, про компонент WebBrowser, да и то не всё. Ибо то, как в 1ске внутре реализована работа с ним знают только в 1С,а остальные догадывается. Методом тыка
|
|||
2
vde69
03.04.13
✎
09:31
|
eval - потенциально опасная функция, многими "защитниками" режется
|
|||
3
Elizir
03.04.13
✎
12:01
|
Нда, обидно. Для передачи данных туда-сюда еще глобальные переменные могут сгодиться, но некрасиво... В любом случае, третий вопрос остается открытым, не понимаю, почему из управляемых форм вырезали обработчики событий html?
|
|||
4
sikuda
03.04.13
✎
12:10
|
onclick="testJS()" написать в HTML. Или при загрузке http://sikuda.ru/?p=181
|
|||
5
Elizir
03.04.13
✎
13:53
|
(4) Это привяжет функцию JS к событию JS. А как его в 1С-то поймать на управляемой форме?
|
|||
6
Elizir
04.04.13
✎
07:34
|
Видимо, никак. :) Выход, получается, один. Поскольку управляемая форма может отлавливать нажатие, т.е. onclick, это событие, вызываемое fireEvent'ом - единственная обратная связь от JS к 1С. Остается только узнать, кто, собственно, нажимал, пользователь или JS. Всем спасибо!
|
|||
7
vde69
04.04.13
✎
08:14
|
(6) надо в 1с вызвать ПодключитьОбработчик(обработчикВМодуле1с)
будет работать в толстом клиенте, в веб и тонком - не проверял |
|||
8
orefkov
04.04.13
✎
08:32
|
Скорее всего первый вызов тебе возвращает javascript'овский массив, который Array. И с ним одинэсина (да и не только она) не может работать. Я делал так:
результат = Новый Массив; Элементы.ПолеHTMLДокумента.Документ.parentWindow.testJS(результат); А в самом скрипте: function testJS(res) { res.Add(1) res.Add(2) } |
|||
9
orefkov
04.04.13
✎
08:38
|
(0)
По второму вопросу. Так как с 1Ской можно работать через COM, ее движок умеет при передаче объектов 1С через COM "оборачивать" их в COM-объект. И обратно соответственно. Даже функции такая торчат наружу из core82.dll: valueToVariant и variantToValue. В скриптах к снегопату очень активно используются 1Сные объекты - от ТаблицЗначений до Метаданные. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |