Имя: Пароль:
1C
1С v8
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Сные объекты - от ТаблицЗначений до Метаданные.