Имя: Пароль:
1C
 
1C 7.7 + jscript как получить результат?
0 MaxPiter
 
12.01.11
12:06
Добрый день.
Подскажите как получить результат выполнения скрипта в 1С?
Это пример:

Процедура Сформировать()
   scriptCtrl =  СоздатьОбъект("MSScriptControl.ScriptControl");
   WScript = СоздатьОбъект("WScript.Shell");
   scriptCtrl.Language="jscript";
   scriptCtrl.AddObject("WScript",WScript);
   Попытка
   scriptCtrl.AddCode("
   |function Start()
   |{
   |    var Outobj=WScript.Exec(""cscript D:\\test.js 8"");
   |    StrOut= Outobj.Stdout.ReadAll();
   |}
   |");
   
   Исключение
       Сообщить("Текст ошибки: "+scriptCtrl.Error.Text);
       Сообщить("Строка ошибки: "+scriptCtrl.Error.Line);
   КонецПопытки;
   
   Сообщить(scriptCtrl.run("Start"));

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

и сам скрипт: d:\test.js

var ms='0';
var oArg=WScript.Arguments;
if (WScript.Arguments.Count()>0) ms=oArg(0);
switch (ms)
{
case '0' : mes='січень'; break;
case '1' : mes='лютий'; break;
case '2' : mes='березень'; break;
case '3' : mes='квітень'; break;
case '4' : mes='травень'; break;
case '5' : mes='червень'; break;
case '6' : mes='липень'; break;
case '7' : mes='серпень'; break;
case '8' : mes='вересень'; break;
case '9' : mes='жовтень'; break;
case '10' : mes='листопад'; break;
case '11' : mes='грудень'; break;
}
WScript.StdOut.Write(mes);
1 MaxPiter
 
12.01.11
12:06
При выполнении выводит пусто.
2 medved_kot
 
12.01.11
13:27
oArg(0) - это разве не строка - D:\\test.js

Если первый аргумент, то можно попробовать удалить пробелы
3 ДенисЧ
 
12.01.11
13:28
А сам скрипт-то значение возвращает? Нэ выжу.
4 dk
 
12.01.11
13:32
засунь текст скрипта в функцию и верни ее значение
5 dk
 
12.01.11
13:37
через eval
6 dk
 
12.01.11
13:47
раз никого нету
-----

Процедура Сформировать()
   scriptCtrl =  СоздатьОбъект("MSScriptControl.ScriptControl");
   WScript = СоздатьОбъект("WScript.Shell");
   scriptCtrl.Language="jscript";
   scriptCtrl.AddObject("WScript",WScript);
   Попытка
   scriptCtrl.AddCode("
   |function my()
   |{
   |var ms='0';
   |var oArg=WScript.Arguments;
   |if (WScript.Arguments.Count()>0) ms=oArg(0);
   |switch (ms)
   |{
   | case '0' : mes='січень'; break;
   | case '1' : mes='лютий'; break;
   | case '2' : mes='березень'; break;
   | case '3' : mes='квітень'; break;
   | case '4' : mes='травень'; break;
   | case '5' : mes='червень'; break;
   | case '6' : mes='липень'; break;
   | case '7' : mes='серпень'; break;
   | case '8' : mes='вересень'; break;
   | case '9' : mes='жовтень'; break;
   | case '10' : mes='листопад'; break;
   | case '11' : mes='грудень'; break;
   |}
   | my = mes;
   |end function  
   |}
   |");
   
   Исключение
       Сообщить("Текст ошибки: "+scriptCtrl.Error.Text);
       Сообщить("Строка ошибки: "+scriptCtrl.Error.Line);
   КонецПопытки;
   
   Сообщить(scriptCtrl.eval("Start"));

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

как-то так
7 Лефмихалыч
 
12.01.11
13:53
Результат = scriptCtrl.CodeObject.Start();
8 medved_kot
 
12.01.11
14:07
Почему в коде (0) обрабатывается ошибка записи кода явы, а не его исполнения.
9 MaxPiter
 
12.01.11
14:21
Спасибо за ответы, сейчас буду пробовать.
10 MaxPiter
 
12.01.11
14:25
(6) Возвращает OLE.JScriptTypeInfo

Как бы все таки результат :)
11 MaxPiter
 
12.01.11
14:26
(6) и |end function лишнее
12 DrZombi
 
гуру
12.01.11
14:29
(11)Человек, в (6) тебе дали подсказку, что бы ты не извращался и не вызывал скрипт из файла. А просто написал сам скрипт и выполнил :)
13 MaxPiter
 
12.01.11
14:36
(12) я как бы использовал код в 6 но возвращается не значение а OLE.JScriptTypeInfo
Видимо его надо перед выводом как-то преобразовать в значения для 1С.

И то что тут код - это простейший пример, чтобы понять как вообще с этим хозяйством работать из 1С
14 Лефмихалыч
 
12.01.11
14:38
решение в (7) без всяких йевалов
15 MaxPiter
 
12.01.11
14:45
(14) все равно возвращает OLE.JScriptTypeInfo
16 Лефмихалыч
 
12.01.11
14:47
(15) пеляет!.. это потму, что ты неправильно этим всем пользуешься.
Показывай свой скрипт, покажу, как надо
17 Лефмихалыч
 
12.01.11
14:53

   scriptCtrl =  СоздатьОбъект("MSScriptControl.ScriptControl");
   scriptCtrl.Language="jscript";
   scriptCtrl.AddCode("
   |function xoxloMonth(monthNumber)
   |{
   |    var mes='';
   |    switch (monthNumber)
   |    {
   |     case '0' : mes='січень'; break;
   |     case '1' : mes='лютий'; break;
   |     case '2' : mes='березень'; break;
   |     case '3' : mes='квітень'; break;
   |     case '4' : mes='травень'; break;
   |     case '5' : mes='червень'; break;
   |     case '6' : mes='липень'; break;
   |     case '7' : mes='серпень'; break;
   |     case '8' : mes='вересень'; break;
   |     case '9' : mes='жовтень'; break;
   |     case '10' : mes='листопад'; break;
   |     case '11' : mes='грудень'; break;
   |     default: mes='номер месяца не корректный';
   |    }
   |
   |    return mes;
   |}");
    Сообщить(scriptCtrl.CodeObject.xoxloMonth(11));
18 DrZombi
 
гуру
12.01.11
14:56
+(0)для справки почитай: http://www.script-coding.com/
19 MaxPiter
 
12.01.11
15:08
(17) спасибо - этот код работает
p.s.
только Сообщить(scriptCtrl.CodeObject.xoxloMonth(11));
заменить на Сообщить(scriptCtrl.CodeObject.xoxloMonth("11"));
20 Лефмихалыч
 
12.01.11
15:08
(19) ага, а еще в конце не забыть scriptCtrl = Неопределено;
а то горя хапнешь при повторных запусках
21 dk
 
12.01.11
15:09
(19) потому что case у тебя строки сравнивает
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший