Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Передача параметров в VBScript (число прочтений - 30682 )
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Передача параметров в VBScript
19. Марта 2008 :: 12:44
Печать  
Наверно для кого-то не станет открытием (для меня стало), что интерпретатор VBScript работает быстрее интерпретатора 1С 7.7. Например, простейшая операция A=(2+5)/10 прокрученная в цикле 1000000 раз, выполняется в 1С в 4.5 раза дольше. Соответственно возникает мысль определенные участки кода писать на VBScript, а не на 1С. Как я это делаю сейчас:

Код
Выбрать все
	ТекстСкрипта="
	|Sub Main
	|I=0
	|Do
	|   A=(2+5)/10
	|   I=I+1
	|Loop While I<1000001
	|End Sub
	|";
	VBS=СоздатьОбъект("MSScriptControl.ScriptControl");
	VBS.Language="vbscript";
	VBS.AddCode(ТекстСкрипта);
	VBS.Run("Main");
 



Но у меня возник вопрос: как (не извращаясь со встраиванием строковых значений в модуль скрипта) передать в скрипт несколько параметров из 1С и вернуть из скрипта несколько результатов. Можно конечно через файл, но это уже явный изврат. И кроме того вопрос: если можно передать в скрипт значения, то только простых типов (дата, число, строка) или все-таки можно передавать сложные (типа массивов) и агрегатные типы?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #1 - 19. Марта 2008 :: 12:51
Печать  
Надеюсь, что ты направляешь свои усилия по оптимизации именно в те участки кода, где подобная работа даст максимальную отдачу.
Надеюсь, что для тебя не будет открытием тот факт, что самыми продолжительными операциями в 1С являются операции с данными.
  
Наверх
www  
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #2 - 19. Марта 2008 :: 13:06
Печать  
Конечно, именно в те участки. Улыбка
Играюсь с библиотекой GfFlAx, оказывается с ее помощью можно такие обалденные графики строить прямо на форме! Вот только методов для рисования в этой библиотечке маловато - круг, прямоугольник, точка, линия... Но имея даже только метод вывода точки, можно делать красивые графики, например рэйтрэйсингом. Улыбка А уж всякие там градиенты и т.п. делаются на раз. Начал вспоминать что такое синусы с косинусами и операции над матрицами (для создания 3D-графиков с произвольной конструкцией, положением и освещением). Вот только объем подобных вычислений уж очень большой, и разница VBScript с 1С может достигать двух порядков. Но красиво блин...
Ну так подскажет кто-нибудь как параметры в скрипт загонять/получать?
  

screen_003.jpg ( 34 KB | Загрузки )
screen_003.jpg
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #3 - 19. Марта 2008 :: 13:26
Печать  
Ну есть метод AddObject(Name, Object, [AddMembers]), для ActiveX объектов работает, дла простых переменных не пробовал
  
Наверх
ICQ  
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Передача параметров в VBScript
Ответ #4 - 19. Марта 2008 :: 13:38
Печать  
Цитата:
Ну так подскажет кто-нибудь как параметры в скрипт загонять/получать?

Загонять как обычно.
МойСкрипт.vbs -Первый -Второй

Внутри
If WScript.Arguments(1) и т.д.
  
Наверх
ICQ  
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #5 - 19. Марта 2008 :: 13:44
Печать  
Ну если вы заметили, я не загоняю скрипт в файл. Кроме того в командной строке не очень-то уж много и передашь. Как например массив передать 1000х1000?
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Передача параметров в VBScript
Ответ #6 - 19. Марта 2008 :: 13:53
Печать  
maljaev писал(а) 19. Марта 2008 :: 13:44:
Ну если вы заметили, я не загоняю скрипт в файл. Кроме того в командной строке не очень-то уж много и передашь. Как например массив передать 1000х1000?

А... Не дочитал.
Тогда вообще непонятно. Ну формируй текст скрипта средствами 1С. Надеюсь, не самые большие потери при этом будут.
  
Наверх
ICQ  
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #7 - 19. Марта 2008 :: 13:58
Печать  
Ну хорошо, пусть формировать текст скрипта. Но ведь загнать массив 1000х1000 в текст скрипта тоже не шибко быстро будет, кроме того какого же размера будет скрипт? При его выполнении WSH тормозить не будет?
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Передача параметров в VBScript
Ответ #8 - 19. Марта 2008 :: 14:08
Печать  
maljaev писал(а) 19. Марта 2008 :: 13:58:
Ну хорошо, пусть формировать текст скрипта. Но ведь загнать массив 1000х1000 в текст скрипта тоже не шибко быстро будет, кроме того какого же размера будет скрипт? При его выполнении WSH тормозить не будет?

ХЗ. А что, в WSH есть специальные методы для обработки именно массивов?
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #9 - 19. Марта 2008 :: 14:09
Печать  
maljaev писал(а) 19. Марта 2008 :: 13:58:
Ну хорошо, пусть формировать текст скрипта. Но ведь загнать массив 1000х1000 в текст скрипта тоже не шибко быстро будет, кроме того какого же размера будет скрипт? При его выполнении WSH тормозить не будет?

Создай какойнить ActiveX контейнер. Заполни его через 1с а потом добавь этот объект в скрипт
  
Наверх
ICQ  
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #10 - 19. Марта 2008 :: 14:14
Печать  
Nick писал(а) 19. Марта 2008 :: 14:09:
maljaev писал(а) 19. Марта 2008 :: 13:58:
Ну хорошо, пусть формировать текст скрипта. Но ведь загнать массив 1000х1000 в текст скрипта тоже не шибко быстро будет, кроме того какого же размера будет скрипт? При его выполнении WSH тормозить не будет?

Создай какойнить ActiveX контейнер. Заполни его через 1с а потом добавь этот объект в скрипт

Будь добр, поподробнее на этот счет. Можно в виде участка кода (ну с десяток значений загнать).
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Передача параметров в VBScript
Ответ #11 - 19. Марта 2008 :: 14:20
Печать  
Сомневаюсь, что будет быстрее сформировать массив средствами 1С, а потом его перебирать For each.
Лучше уж формировать текст скрипта.
Хотя, имхо.
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #12 - 21. Марта 2008 :: 07:47
Печать  
При попытке засунуть в скрипт встроенный в 1С объект (типа ТЗ, СЗ и др.) через AddObject получишь ошибку "плохой тип переменной".
Обходится с помощью ObjRef-сериализации.
пример кода:
Код
Выбрать все
	e=СоздатьОбъект("Addin.EventProxy");
	Scr=СоздатьОбъект("MSScriptControl.ScriptControl");
	scr.Language="vbscript";
	т=СоздатьОбъект("ТаблицаЗначений");
	Т.НоваяКолонка("t1");
	Т.НоваяСтрока();
	Т.t1 = 111;
	Scr.AddCode("
	|Function TestVT
	|Set v=GetObject("""+e.Сериализовать(т)+""")
	|v.SelectLines()
	|v.GetLine()
	|TestVT=v.t1
	|End Function");
	Сообщить(Scr.Eval("TestVT()"));
 


в строке сообщений выводится "111", как и ожидаемо Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #13 - 21. Марта 2008 :: 07:58
Печать  
steban писал(а) 21. Марта 2008 :: 07:47:
При попытке засунуть в скрипт встроенный в 1С объект (типа ТЗ, СЗ и др.) через AddObject получишь ошибку "плохой тип переменной".
Обходится с помощью ObjRef-сериализации.

Это куда-нибудь в ФАК нужно занести, ведь Степан не всегда под рукой Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #14 - 21. Марта 2008 :: 08:16
Печать  
artbear писал(а) 21. Марта 2008 :: 07:58:
steban писал(а) 21. Марта 2008 :: 07:47:
При попытке засунуть в скрипт встроенный в 1С объект (типа ТЗ, СЗ и др.) через AddObject получишь ошибку "плохой тип переменной".
Обходится с помощью ObjRef-сериализации.

Это куда-нибудь в ФАК нужно занести, ведь Степан не всегда под рукой Улыбка


А в 1с++ этот функционал перенести нельзя?
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #15 - 21. Марта 2008 :: 08:40
Печать  
Nick писал(а) 21. Марта 2008 :: 08:16:
А в 1с++ этот функционал перенести нельзя?

Код метода "Сериализовать" примитивен:
Код
Выбрать все
HRESULT CEventProxy::methSerialize(VARIANT* pRetVal, SAFEARRAY **pParams)
{
	CComVariant param=GetNParam(*pParams,0);
	VariantInit(pRetVal);
	pRetVal->vt=VT_BSTR;
	if(param.vt==VT_DISPATCH)
	{
		IMoniker* moniker;
		CreateObjrefMoniker(param.pdispVal,&moniker);
		moniker->GetDisplayName(NULL, NULL, &pRetVal->bstrVal);
		moniker->Release();
	}
	return S_OK;
}
 


в какой класс предлагаешь засунуть?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #16 - 21. Марта 2008 :: 08:52
Печать  
Цитата:
в какой класс предлагаешь засунуть?


Что то кроме класса "Система " ничего подходящего не наблюдается
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #17 - 21. Марта 2008 :: 09:04
Печать  
Да, можно в класс Система закинуть.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #18 - 21. Марта 2008 :: 09:05
Печать  
Nick писал(а) 21. Марта 2008 :: 08:16:
А в 1с++ этот функционал перенести нельзя?

Создай соответствующий баг в багзилле. Тогда можно будет сделать, думаю, что возражать особо никто не будет Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #19 - 21. Марта 2008 :: 09:13
Печать  
artbear писал(а) 21. Марта 2008 :: 09:05:
Nick писал(а) 21. Марта 2008 :: 08:16:
А в 1с++ этот функционал перенести нельзя?

Создай соответствующий баг в багзилле. Тогда можно будет сделать, думаю, что возражать особо никто не будет Улыбка


Артур, может я ещё твои планы по развитию заносить в багзиллу буду? Автор этой ветки не я. Мне этот метод сейчас не нужен и будет ли когда - нибудь нужен неизвестно. Я просто внёс предложение.
Или твоё пожелание автору ветки?
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #20 - 21. Марта 2008 :: 09:17
Печать  
Nick писал(а) 21. Марта 2008 :: 09:13:
Я просто внёс предложение.
Или твоё пожелание автору ветки?

"Я только разместил объяву" чтоли? Улыбка
Мое предложение для тебя, но в принципе, если не тебе, а кому-то нужно, пишите в багзиллу, разберемся Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #21 - 21. Марта 2008 :: 09:20
Печать  
Цитата:
"Я только разместил объяву" чтоли?


Точно Улыбка
  
Наверх
ICQ  
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #22 - 25. Марта 2008 :: 14:23
Печать  
Написал ряд процедур и функций (1С+VBScript) для расширения функционала GflAx. Неделю писал с утра до вечера, давно так мозги не напрягал. Теперь играючи можно делать например такие вещи. Выложить исходники?
  

screen.png ( 119 KB | Загрузки )
screen.png
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #23 - 25. Марта 2008 :: 14:32
Печать  
maljaev писал(а) 25. Марта 2008 :: 14:23:
Выложить исходники?

Выкладывай, почему нет?
Только закилнь в "репо" со ссылкой на эту тему..
  
Наверх
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #24 - 25. Марта 2008 :: 14:37
Печать  
Выкладываю ту обработку которая этот график выводит. Там же все процедуры и функции для формирования ПОДОБНЫХ графиков (полигональные, круговые и 3D функции я пока не создавал) с описанием назначения и параметров.
  

Graphics.ert ( 51 KB | Загрузки )
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #25 - 25. Марта 2008 :: 14:38
Печать  
А как у GflAx обстоят дела с печатью этой красоты на бумаге?

понял.
у тебя на форме обычная 1с-вская картинка, которая считывается из файла, сформированного при помощи GflAx.Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #26 - 25. Марта 2008 :: 14:46
Печать  
Правильно!  Улыбка
Дальнейшее обсуждение конкретно этой обработки можно продолжить здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1206456271
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #27 - 25. Апреля 2008 :: 09:24
Печать  
steban писал(а) 21. Марта 2008 :: 08:40:
Nick писал(а) 21. Марта 2008 :: 08:16:
А в 1с++ этот функционал перенести нельзя?

Код метода "Сериализовать" примитивен:
Код
Выбрать все
HRESULT CEventProxy::methSerialize(VARIANT* pRetVal, SAFEARRAY **pParams)
{
	CComVariant param=GetNParam(*pParams,0);
	VariantInit(pRetVal);
	pRetVal->vt=VT_BSTR;
	if(param.vt==VT_DISPATCH)
	{
		IMoniker* moniker;
		CreateObjrefMoniker(param.pdispVal,&moniker);
		moniker->GetDisplayName(NULL, NULL, &pRetVal->bstrVal);
		moniker->Release();
	}
	return S_OK;
}
 


в какой класс предлагаешь засунуть?

Видимо, я еще более примитивен Улыбка
Т.к. я не в теме практически, напиши код в терминах 1С для CValue
Тогда я без проблем смогу вставить его в 1С++ 2.5 и 3.0
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #28 - 28. Апреля 2008 :: 10:29
Печать  
Nick писал(а) 21. Марта 2008 :: 08:16:
artbear писал(а) 21. Марта 2008 :: 07:58:
steban писал(а) 21. Марта 2008 :: 07:47:
При попытке засунуть в скрипт встроенный в 1С объект (типа ТЗ, СЗ и др.) через AddObject получишь ошибку "плохой тип переменной".
Обходится с помощью ObjRef-сериализации.

Это куда-нибудь в ФАК нужно занести, ведь Степан не всегда под рукой Улыбка


А в 1с++ этот функционал перенести нельзя?

Зарегистрировал баг
http://www.1cpp.ru/bugs/show_bug.cgi?id=3783
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #29 - 28. Апреля 2008 :: 11:04
Печать  
berezdetsky писал(а) 26. Апреля 2008 :: 09:16:
Код
Выбрать все
WINOLEAPI CreateObjrefMoniker(
    LPUNKNOWN pUnk,    //Pointer to the object
    LPMONIKER *ppMk    //Address of pointer to OBJREF moniker
); 


Код
Выбрать все
		CComVariant param;
		((CBLMyEx*)NULL)->ValueToVariantEx(ppValue[0][0],&param);
		if(param.vt==VT_DISPATCH)
		{
			IMoniker* moniker;
			CreateObjrefMoniker(param.pdispVal,&moniker);
			LPOLESTR pszDisplayName = NULL;
			moniker->GetDisplayName(NULL, NULL, &pszDisplayName);
			rValue = CString(pszDisplayName);
			moniker->Release();
		} else {
			rValue = "";
		}
 


На тестовом коде
Код
Выбрать все
Процедура Тест_ПередачаВСкриптСПомощьюСериализовать() Экспорт
	Сам = Сам();

	Система = СоздатьОбъект("Система");

	Scr=СоздатьОбъект("MSScriptControl.ScriptControl");
	scr.Language="vbscript";

	Т = СоздатьОбъект("ТаблицаЗначений");
	Т.НоваяКолонка("t1");
	Т.НоваяСтрока();
	лНужноеЗначение = 111;
	Т.t1 = лНужноеЗначение;

	Scr.AddCode("
	        |Function TestVT
	        |Set v=GetObject("""+Система.Сериализовать(Т)+""")
	        |	v.SelectLines()
	        |	v.GetLine()
	        |	TestVT=v.t1
	        |End Function");

	Сам.ПроверитьРавенство(Scr.Eval("TestVT()"), лНужноеЗначение);

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


Что-то у меня после такого кода при завершении работы 1С начал зависать процесс 1cv7.exe Печаль
Я так понимаю, где-то ссылка повисла Печаль
Чего делать?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #30 - 28. Апреля 2008 :: 12:25
Печать  
artbear писал(а) 28. Апреля 2008 :: 11:04:
Что-то у меня после такого кода при завершении работы 1С начал зависать процесс 1cv7.exe Печаль
Я так понимаю, где-то ссылка повисла Печаль
Чего делать?

А, ну да.. Всё время забываю тестировать без vkloader.  Печаль Надо подумать..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #31 - 28. Апреля 2008 :: 12:30
Печать  
Ссылка зависает из-за
Код
Выбрать все
		LPOLESTR pszDisplayName = NULL;
		moniker->GetDisplayName(NULL, NULL, &pszDisplayName);
 


Но добавочный код, который уничтожает выделенную строку, также не помогает Печаль
Код
Выбрать все
	LPOLESTR pszDisplayName = NULL;
moniker->GetDisplayName(NULL, NULL, &pszDisplayName);

CString temp(pszDisplayName);

CComPtr<IMalloc> spMalloc;
if(FAILED(CoGetMalloc(MEMCTX_TASK, &spMalloc)))
	return FALSE;

spMalloc->Free(pszDisplayName);
 

  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #32 - 28. Апреля 2008 :: 16:27
Печать  
artbear писал(а) 28. Апреля 2008 :: 12:30:
Ссылка зависает из-за

IMHO, из-за счётчика ссылок на param.pdispVal, а не из-за этого лика. Но как-то странно - при многократном последовательном вызове не после каждого (???) вызова его нужно освобождать. Чего-то у меня с головой, наверное.. Ужас Или что-то где-то не инициализировано.. Нерешительный
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #33 - 29. Апреля 2008 :: 05:49
Печать  
berezdetsky писал(а) 28. Апреля 2008 :: 16:27:
artbear писал(а) 28. Апреля 2008 :: 12:30:
Ссылка зависает из-за

IMHO, из-за счётчика ссылок на param.pdispVal, а не из-за этого лика. Но как-то странно - при многократном последовательном вызове не после каждого (???) вызова его нужно освобождать. Чего-то у меня с головой, наверное.. Ужас Или что-то где-то не инициализировано.. Нерешительный

Да, ты прав, именно из-за param.pdispVal
Но после ручного освобождения
param.pdispVal->Release();
все стало нормально, процесс больше не зависает и все нормально отрабатывает.

В итоге код стал такой:
Код
Выбрать все
BOOL CSystem::funcSerialize(CValue& RetVal, CValue **ppValue)
{
	CComVariant param;
	static_cast<CBLMyEx*>(NULL)->ValueToVariantEx(ppValue[0][0],&param);
	if(param.vt != VT_DISPATCH)
		RetVal = "";
	else
	{
		IDispatchPtr dispatch(param.pdispVal);
		param.pdispVal->Release();

		IMonikerPtr moniker;
		if FAILED(CreateObjrefMoniker(dispatch,&moniker))
			RuntimeError("Система::Сериализовать - неудача");

		LPOLESTR pszDisplayName = NULL;
		if FAILED(moniker->GetDisplayName(NULL, NULL, &pszDisplayName))
			RuntimeError("Система::Сериализовать - неудача");

		RetVal = CString(pszDisplayName);

		CoTaskMemFree(pszDisplayName);
	}

	return TRUE;
}
 


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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #34 - 29. Апреля 2008 :: 06:56
Печать  
artbear писал(а) 29. Апреля 2008 :: 05:49:
berezdetsky писал(а) 28. Апреля 2008 :: 16:27:
artbear писал(а) 28. Апреля 2008 :: 12:30:
Ссылка зависает из-за

IMHO, из-за счётчика ссылок на param.pdispVal, а не из-за этого лика. Но как-то странно - при многократном последовательном вызове не после каждого (???) вызова его нужно освобождать. Чего-то у меня с головой, наверное.. Ужас Или что-то где-то не инициализировано.. Нерешительный

Да, ты прав, именно из-за param.pdispVal
Но после ручного освобождения
param.pdispVal->Release();
все стало нормально, процесс больше не зависает и все нормально отрабатывает.

Да, все-таки баг есть, тестировал немножко неверный код, так освобождать нельзя, GetObject в скрипте перестает работать.
Нужно еще разбираться Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #35 - 29. Апреля 2008 :: 08:14
Печать  
В общем, вывод такой - объект, который сериализуем, а точнее, IDispatch для него должен существовать на момент использования его сериализованного представления.
Удалять этот объект нужно уже после использования его сериализованного представления

Поэтому придется пойти другим путем - я добавил в 1С++ спец.класс "Сериализация" с единственным методом "Сериализовать", в деструкторе этого класса и будет удаляться существующий  IDispatch Улыбка
И клиентский код выглядит очень просто, без всяких доп. фишек Улыбка

Например, приведенный выше пример от Степана будет выглядеть так:
Код
Выбрать все
Процедура Тест_ПередачаВСкриптСПомощьюСериализовать() Экспорт

	//Система = СоздатьОбъект("Система");
//Т = СоздатьОбъект("ТаблицаЗначений");
//лТекст = Система.Сериализовать(Т);
//Сообщить("<"+лТекст+">");

Scr=СоздатьОбъект("MSScriptControl.ScriptControl");
scr.Language="vbscript";

Т = СоздатьОбъект("ТаблицаЗначений");
Т.НоваяКолонка("t1");
Т.НоваяСтрока();
лНужноеЗначение = 111;
Т.t1 = лНужноеЗначение;

Сериализация = СоздатьОбъект("Сериализация");

Scr.AddCode("
        |Function TestVT
        |	Set v=GetObject("""+Сериализация.Сериализовать(Т)+""")
        |	v.SelectLines()
        |	v.GetLine()
        |	TestVT=v.t1
        |End Function");

Если Scr.Eval("TestVT()") <> лНужноеЗначение Тогда
	Предупреждение("Неуспех");
Иначе
	Предупреждение("Успех");
КонецЕсли;

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


Что и требовалось Улыбка

PS повторный вызов Сериализовать() удалит предыщий IDispatch, т.е. лика также не будет.

Нормальное решение, что скажете?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #36 - 29. Апреля 2008 :: 08:15
Печать  
Блин, только что дошло, что тоже самое можно и для Системы оставить Улыбка
Что скажете?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #37 - 29. Апреля 2008 :: 11:49
Печать  
artbear писал(а) 29. Апреля 2008 :: 08:14:
В общем, вывод такой - объект, который сериализуем, а точнее, IDispatch для него должен существовать на момент использования его сериализованного представления.
Удалять этот объект нужно уже после использования его сериализованного представления

Не понятно, как тогда это работает у steban? Ну и ладно..

artbear писал(а) 29. Апреля 2008 :: 08:14:
Нормальное решение, что скажете?

Улыбка

Только это маршаллинг, а не сериализация, как я понимаю.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #38 - 30. Апреля 2008 :: 18:57
Печать  
artbear писал(а) 29. Апреля 2008 :: 08:15:
Блин, только что дошло, что тоже самое можно и для Системы оставить Улыбка
Что скажете?

Потестил сегодняшний ночник - нескладное что-то получилось. Печаль
В архиве два тестовых глобальных модуля.
  • Делаем с первым пустую конфигурацию, заходим, выходим - 1С зависает. Если переменную ст очистить явно - зависания нет.
  • Со вторым интереснее. Делаем с ним пустую конфигурацию, заходим - под вистой 1С молча падает, под ХР не падает (с тем кодом метода, с которого всё началось, под вистой не падает).
  • Дальше. Делаем пустую конфигурацию, второй глобальный модуль загружаем директивой ЗагрузитьИзФайла, запускаем под ХР - иногда работает, иногда выскакивает исключение "Ошибка выполнения Microsoft VBScript: Недопустимый вызов или аргумент процедуры: 'GetObject'". Впрочем, возможно, дело не в ЗагрузитьИзФайла, а в том, что иногда оно под ХР всё-таки работает.  Нерешительный
  

GMs.zip ( 1 KB | Загрузки )

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #39 - 04. Мая 2008 :: 06:04
Печать  
berezdetsky писал(а) 30. Апреля 2008 :: 18:57:
artbear писал(а) 29. Апреля 2008 :: 08:15:
Блин, только что дошло, что тоже самое можно и для Системы оставить Улыбка
Что скажете?

Потестил сегодняшний ночник - нескладное что-то получилось. Печаль
В архиве два тестовых глобальных модуля.
  • Делаем с первым пустую конфигурацию, заходим, выходим - 1С зависает. Если переменную ст очистить явно - зависания нет.
  • Со вторым интереснее. Делаем с ним пустую конфигурацию, заходим - под вистой 1С молча падает, под ХР не падает (с тем кодом метода, с которого всё началось, под вистой не падает).
  • Дальше. Делаем пустую конфигурацию, второй глобальный модуль загружаем директивой ЗагрузитьИзФайла, запускаем под ХР - иногда работает, иногда выскакивает исключение "Ошибка выполнения Microsoft VBScript: Недопустимый вызов или аргумент процедуры: 'GetObject'". Впрочем, возможно, дело не в ЗагрузитьИзФайла, а в том, что иногда оно под ХР всё-таки работает.  Нерешительный

Подтверждаю по обоим пунктам.
п.2. - Висты нет, но на Вин2003 Сп1 с простым глобальником (без ЗагрузитьИзФайла) падает на разных конструкциях Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #40 - 04. Мая 2008 :: 06:13
Печать  
По п.1 - если явно обнулить глобальный объект Система (ст), например, в ПриЗавершенииРаботыСистемы, все будет нормально.
Видимо, дело в том, что у 1С дело просто не доходит до деструктора ст Печаль, т.е. 1С зависает раньше Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #41 - 04. Мая 2008 :: 06:18
Печать  
По п.2 - в режиме отладки 1С++ в Студии все проходит на ура на Вин2003, без отладочного режима 1С дает ошибку на GetObject Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #42 - 06. Мая 2008 :: 12:34
Печать  
Похоже, что придется временно убрать данный метод из 1С++ версии 2.5 до выпуска релиза.
В 3.0 можно временно, для тестирования и доработки оставить.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #43 - 07. Мая 2008 :: 07:07
Печать  
artbear писал(а) 06. Мая 2008 :: 12:34:
Похоже, что придется временно убрать данный метод из 1С++ версии 2.5 до выпуска релиза.

Значит, ещё один релиз пройдёт мимо. Печаль А жаль - мне уже начало нравиться писать что-то вроде
Код
Выбрать все
тбл.СоздатьЭУ("OWC11.Spreadsheet");
conn = CreateObject("ADODB.Connection");
conn.Open("Provider=OLEDB1C");
тбл.Объект.DataSource = conn.Execute(ст.Сериализовать(тз));
тбл.Объект.DataMember = ""; 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #44 - 07. Мая 2008 :: 10:43
Печать  
Возможно, нужно просто явно указать в доке, что после вызова Сериализовать нужно обязательно уничтожить объект Система.
Или явный метод УничтожитьОбъектСериализации
Довольно коряво, но будет работать Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача параметров в VBScript
Ответ #45 - 07. Мая 2008 :: 12:06
Печать  
artbear писал(а) 07. Мая 2008 :: 10:43:
Довольно коряво, но будет работать Улыбка

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

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
7330
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 21. Августа 2017
Re: Передача параметров в VBScript
Ответ #46 - 05. Сентября 2017 :: 20:28
Печать  
artbear писал(а) 07. Мая 2008 :: 10:43:
Довольно коряво, но будет работать Улыбка
Ещё как будет.. Особенность метода Сериализовать понял и осилил, но не сразу.. разобрался; до Контекст формы уже добрался..

Как бы ещё теперь до ExecuteBatch добраться?

Метод ExecuteBatch выполняет последовательность операторов, записанную в параметре <СтрокаОператоров> на встроенном языке 1С:Предприятие.
ExecuteBatch(<СтрокаОператоров>)
Возвращаемое значение:
Значение логического типа: TRUE, если последовательность операторов выполнены успешно, или FALSE, если нет.
Замечание:
В OLE Automation TRUE и FALSE имеют соответственно значения: -1 (минус единица) и 0.
Пример:
Код
Выбрать все
Sub Command1_Click ()
   Dim v7 As Object
   Dim Price As Object
   Set v7 = CreateObject("V77.Application")
   result = v7.Initialize(v7.RMTrade, "/DC:\V7\DB /M", "")
   Set Price = v7.EvalExpr("ОтдатьСправочникТоваров()")
   Price.New
   Price.Code = "112233"
   Price.Description = "Test string"
   Price.Write;
   BoolResult = v7.ExecuteBatch("ПроцедураРегл1(); ПроцедураРегл2();")
End Sub
 

* здесь пример приводится на языке MS Visual Basic

Чтобы для базовых команд платформы не делать в модулях форм подкладок, вроде этой:

Код
Выбрать все
Функция Mess(ТекстСообщения,МаркерСообщения=0)
	Если МаркерСообщения=0 Тогда
		МаркерСообщения=".";
	КонецЕсли;
	Сообщить(ТекстСообщения,МаркерСообщения);
КонецФункции
 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать