Есть три варианта решения данной проблемы.
1) Написать библиотеку для вызова произвольного интерфейса RunAnyView.Для этого нужны vih файлы из M_SCRIPT и M_MNPLAN.
вот она рабочая
Runanyview.vip
Код: Выделить всё
#define ComponentVersion
#component "m_scripts"
#include oiJSWork.vih
#include Steck.vin
#Component "M_MNPLAN"
#include InsTblPl.vin
#component "m_scripts"
// имя разрабатываемого интерфейса JS_Atl_Unisoft
VipInterface JS_Atl_Unisoft implements oGalScriptStdF #Licensed_Free;
Interface JS_Atl_Unisoft '' (,hcNoContext,) EscClose, Cyan;
var JavaScript : oiJSWork;
var fBody: oSteckCommonString;
var fEventList: oSteckCommonString;
function SFInitInter (wflag: word; var pt :TRecAcc): Boolean;
{
SFInitInter := true;
}
// наименование пользовательской библиотеки
function SFGetFuncName: String;
{
SFGetFuncName := 'Пользовательские функции ООО Юнисофт';
}
// описываем тело реализуемой функции Center()
function SFGetBody: oSteckCommonString;
{
if NOT (NullVipRef(fBody)) then
{
fBody.Init;
fBody.push('function RunAnyView(Line,Stat)');
fBody.push('{');
fBody.push('VIP.CallMethod("JS_ATL_Unisoft", "RunAnyView", Line,Stat,"")');
fBody.push('return VIP.ArgValue(4)');
fBody.push('}');
fBody.push('');
}
SFGetBody:= fBody;
}
// в списке событий указываем функцию Center
function SFGetEventList: oSteckCommonString;
{
if NOT (NullVipRef(fEventList)) then
{
fEventList.Init;
fEventList.push('RunAnyView');
}
SFGetEventList:= fEventList;
}
function SFEvent(aEName: String): Boolean;
{
var bResult : boolean;
SFEvent := true
case aEName of
'RunAnyView' : {
JavaScript.SetVIPArg(4,string(Runanyview(string(JavaScript.GetVIPArg(2, False)),boolean(JavaScript.GetVIPArg(3, False)))),false);
}
end;
}
// возвращает описание функции пользовательской библиотеки для вывода в memo-поле
function SFGetMemo ( st:oSteckCommonString ) : Boolean;
{
if NOT (NullVipRef(st)) then
{
st.push('');
st.push('В данной библиотеке реализован вызов функции Атлантиса.');
st.push('');
st.push('Функция для вызова произвольного интерфейса или диалога:');
st.push('function RunAnyView(Line,Stat) : boolean');
st.push(' Line : string - Строка запуска интерфейса - к примеру Interface C_Partner::_PrintEtiketka(0,0)');
st.push(' Stat : boolean - признак модальности интерфейса.');
st.push('Возвращает результат выполнения интерфейса');
st.push('');
st.push('');
SFGetMemo := True;
}
}
// идентификатор интерфейса совпадает с его наименованием
function SFGetName: String;
{
SFGetName := 'JS_ATL_Unisoft';
}
function SFGetPrior: word;
{
SFGetPrior := word(0);
}
procedure SFDoneInter;
{
}
#JSWorkLink(JavaScript)
HandleEvent // interface
cmOnVipLoad:
{
LoadVipRef(fBody, #AddComp(MNPComp) 'SteckString');
LoadVipRef(fEventList, #AddComp(MNPComp) 'SteckString');
if NOT(NullVipRef(fBody)) then fBody.Init;
if NOT(NullVipRef(fEventList)) then fEventList.Init;
}
cmOnVipUnload:
{
if NOT(NullVipRef(fBody)) then FreeVipInterFace(fBody);
if NOT(NullVipRef(fEventList)) then FreeVipInterFace(fEventList);
}
end; //HandleEven
End. //'interface
//----------------------------------------------------------------------
2) Написать алгоритм для вызова RunAnyView.Плюсы - универсальность, Минус невозможно возвратить параметры
alg 5905.vip
Код: Выделить всё
#Component "M_MnPlan"
CONST
#include galnet.csc // константы статус-строк Галактики
#include fldcolor.inc // цвета в Галактике
#include GLOCONST.INC
#include KauConst.inc
#include mnplan.inc
end;
#include galnet.ccm end; // константы пользовательских команд
#include uAlgor.vih
#include oAlgSetup.vih
VipInterface Algoritm_5905 Implements oAlgoritm_Sys licensed (FREE);
Interface Algoritm_5905 '' (,hcNoContext,) EscClose, Cyan;
//Function GetSysGraf : Comp; Forward;
Create View
Var
cWorkFormPl, cWorkMnPlan
: Comp;
//
//: Date;
fPreTuneOk,
fVis
: Boolean;
wEvnCode
: Word;
//
//: LongInt;
sEvnLine
: String;
//
//: Double;
//'------------------------------------------------'объекты
iSetup : oAlgoritmSetup;
//-------------------------------------------------'структуры
//
As Select
FormPl.*,
MnPlan.*
From
FormPl (ReadOnly),
MnPlan (ReadOnly)
Where ((
//'настройка алгоритма
cWorkFormPl == FormPl.NRec and
//'документ-источник
cWorkMnPlan == MnPlan.NRec
))
//Order WP_ByNumber By WP.Number
;
create view nakl from katsopr;
create view sop from soprhoz;
Exception ExUser1, ExUser2, ExUser3, ExUser4, ExUser5;
//============================================================================
Window wnTuneGeneral 'Основные параметры настройки' (,, sci1Esc) EscClose;
//============================================================================
// Show at (,,45,7);
Embedded scTuneGeneral Interface iSetup;
End;
End; //'window
//=======================================================================
Procedure OnCloseParentWindow( wFlag:Word );
//-----------------------------------------------------------------------
{
fPreTuneOk := True;
CloseWindow(wnTuneGeneral);
}
//=======================================================================
Function GetNum : word;
//-----------------------------------------------------------------------
{
GetNum := 5905;
}
//=======================================================================
function GetName : string;
//-----------------------------------------------------------------------
{
GetName := 'RunAnyView';
}
//=======================================================================
Function GetMemo ( st:oSteckCommonString ) : Boolean;
//-----------------------------------------------------------------------
{
GetMemo := True;
st.push(string(' runanyview '));
st.push(string(' строка параметров из DSK: '));
st.push(string(' STROKA_RUN,REJIM_MODAL '));
}
//=======================================================================
Function GetNameInter : String;
//-----------------------------------------------------------------------
{
GetNameInter := 'Algoritm_5905' ;
}
//=======================================================================
Function GetNameInterPr : String;
//-----------------------------------------------------------------------
{
GetNameInterPr := 'AlgoritmSetup_5905' ;
}
//=======================================================================
// 'ИНИЦИАЛИЗАЦИЯ АЛГОРИТМА'
//-----------------------------------------------------------------------
//'коды ситуаций - до 49 включительно
Function InitInter( Var pt:TRecAcc ) : Boolean;
{
_try
{
InitInter := False;
pt.Visua := Word(0);
pt.MessEnd := Word(0);
if ((pt.FlagRun and 16) > 0)
{
FormPl.Buffer := Type$FormPl(pt.stFormPl);
cWorkFormPl := Comp(0);
}
else
{
cWorkFormPl := pt.cFormPl;
if (GetFirst FormPl <> tsOk)
{
wEvnCode := 1;
sEvnLine := 'Пользовательский алгоритм не найден (скорее всего, он был удален)';
_raise ExUser2;
}
}
if ((FormPl.ResWord[3] and 1) > 0)
{
//---------------------------------'Подтверждение параметров'
if (Not LoadVipRef (iSetup, 'AlgoritmSetup_5905'))
{
wEvnCode := 5;
sEvnLine := 'Системная ошибка !!!'#13' '+
'Не загружен интерфейс <' + 'AlgoritmSetup_53' + '>';
_raise ExUser2;
}
if (Not iSetup.asInitInter(cWorkFormPl))
Exit;
BindEvent(OnCloseParentWindow, iSetup.asCloseParentWindow);
fPreTuneOk := False;
RunWindowModal(wnTuneGeneral);
if (Not fPreTuneOk)
Exit;
ReReadRecord(#FormPl);
//-----------------------------------------------------------
}
InitInter := True;
} //'_try
_except
on ExUser1:
pt.Error := 1;
on ExUser2:
{
Message(''#3 + String(wEvnCode) + ' ' + sEvnLine, Error);
}
_finally
{
//'
}
}
//=======================================================================
// 'ЗАВЕРШЕНИЕ РАБОТЫ С ИНТЕРФЕЙСОМ'
//-----------------------------------------------------------------------
Function DoneInter( Var pt:TRecAcc ) : Boolean;
{
DoneInter := True;
if (Not NullVipRef(iSetup))
{
iSetup.asDoneInter();
FreeVipInterface(iSetup);
}
}
//=======================================================================
Function RunInter( wflag:Word; Var pt:TRecAcc ) : Boolean;
//-----------------------------------------------------------------------
//'коды ситуаций - от 50 до 99 включительно
{
var st:string;
var m,res:boolean;
_try
{
RunInter := False;
fVis := (pt.Visua = Word(0));
res:=ReadMyDsk(st,'STROKA_RUN',false);
if res=true
{
res:=ReadMyDsk(m,'REJIM_MODAL',false);
runanyview(st,m);
res:=SaveMyDsk('','STROKA_RUN');
res:=SaveMyDsk(false,'REJIM_MODAL');
}
RunInter := True;
} //'_try
_except
on ExUser1:
pt.Error := 1;
on ExUser2:
{
Message(''#3 + String(wEvnCode) + ' ' + sEvnLine, Error);
}
_finally
{
DoneInter(pt);
}
}
End. //'interface
setup_5905.vip
Код: Выделить всё
#Component "M_MnPlan"
CONST
#include galnet.csc // константы статус-строк Галактики
#include fldcolor.inc // цвета в Галактике
#include GLOCONST.INC
#include KauConst.inc
#include mnplan.inc
end;
#include galnet.ccm end; // константы пользовательских команд
#include oAlgSetup.vih
VipInterface AlgoritmSetup_5905 Implements oAlgoritmSetup licensed (FREE);
Interface AlgoritmSetup_5905 '' (,hcNoContext,) EscClose;
Show at (,,,50);
#include constpl.vpp
Procedure FieldAccess; Forward;
Procedure MySetTitle; Forward;
Procedure SetTunes; Forward;
//Var
//'------------------------------------------------'объекты
//comAlg : oCommonFunAlg;
Create View
Var
cFormPl : Comp;
//
//: Word;
//
//: String;
fSimplyTune
: Boolean;
As Select
if (FormPl.ResWord[1] = toZClient, Indent.NoInd, MnPlan.Name)
(FieldName = fDocName),
FormPl.*,
MnPlan.*,
Indent.*,
WayAccou.*
From
FormPl,
MnPlan (ReadOnly),
Indent (ReadOnly),
WayAccou (ReadOnly)
Where ((
cFormPl == FormPl.NRec and
FormPl.ResComp[1] == WayAccou.NRec and
FormPl.ResComp[2] == MnPlan.NRec and
FormPl.ResComp[2] == Indent.NRec
))
;
//'Last .ResWord = 3
Parameters
cFormPl
TabbedSheet bottom tsTunning;
Show At (,,,44);
Screen ScrFormPl_Source 'Документ' (,,sci1Esc);
Table FormPl;
Fields
FormPl.ResWord[1] ('Тип документа',,sci13Esc) :
[List
toPlan 'Производственный план',
toNeedMt 'Потребность в материалах',
toNeedTr 'Потребность в трудовых ресурсах',
toNeedEq 'Потребность в оборудовании',
toPlanSb 'План сбыта',
toPlanSnab 'План снабжения',
toMnfZakaz 'Производственный заказ',
#ifdef PlanOper
toPlanOper 'Пооперационный план',
#end
toCorpoNeed 'Корпоративная потребность',
toCorpoDelivery 'Корпоративный план поставок',
toCorpoManuf 'Корпоративный план производства',
toCorpoBalance 'Баланс движения продукции',
toZClient 'Заявка'
], Protect;
WayAccou.Name ('Наименование шаблона',,sci13Esc) : Protect, PickButton;
FormPl.ResWord[2] ('Документ',,) : NoProtect;
fDocName ('Наименование документа',,sci13Esc) : Protect, PickButton,
{Font = {BackColor = if( (FormPl.ResWord[2] = 1) and ((Not IsValid(tnMnPlan)) and (Not IsValid(tnIndent))), ColorNeed, 0)}};
<<
`Тип документа`.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
`Шаблон` .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
`Документ:`
(.) Текущий на момент запуска алгоритма`
(.) Другой` .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>>
End; //'screen
Screen ScrFormPl_Calc 'Расчет' (,,sci1Esc);
Table FormPl;
Fields
FormPl.ResWord[3] ('Разные параметры',,) : NoProtect;
<<
[.] Подтвердить настройку перед запуском алгоритма`
>>
End; //'screen
End; //'ts
Screen ScrForButtons;
Show At (,45,,);
Buttons
cmOk, Default,, 'Сохранить настройки и закрыть окно',,;
cmCancel,,, 'Закрыть окно',,;
<<
<. Сохранить .> <. Отменить .>
>>
End; //'screen
Screen ScrForButtons_;
Show At (,45,,);
Buttons
cmOk, Default,, 'Сохранить настройки и запустить алгоритм',,;
cmCancel,,, 'Закрыть окно',,;
<<
<. Расчет .> <. Отменить .>
>>
End; //'screen
//=======================================================================
Procedure FieldAccess;
//-----------------------------------------------------------------------
{
//'Документ
if (FormPl.ResWord[1] = toZClient)
ClearFieldOption(#WayAccou.Name, ofSelectable);
else
SetFieldOption(#WayAccou.Name, ofSelectable);
//'Документ
if (FormPl.ResWord[2] = 1)
SetFieldOption(#fDocName, ofSelectable);
else
ClearFieldOption(#fDocName, ofSelectable);
}
//=======================================================================
// 'ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ ПРИ УСТАНОВКЕ ШАБЛОНА'
//-----------------------------------------------------------------------
Procedure OnInsertWayAccou( p_cWayAccou:Comp; p_fInside:Boolean );
{
Var cFormPlDef : Comp;
Set FormPl.ResComp[1] := p_cWayAccou;
if (GetFirst WayAccou <> tsOk)
Exit;
Set FormPl.ResWord[1] := WayAccou.TypeObj;
if (p_fInside)
{
//'
}
else
{
Update Current FormPl;
}
}
//=======================================================================
// 'ПРОВЕРКА КОРРЕКТНОСТИ НАСТРОЙКИ'
//-----------------------------------------------------------------------
Function CheckTune : Boolean;
{
CheckTune := False;
if ( (FormPl.ResWord[2] = 1) and ((Not IsValid(tnMnPlan)) and (Not IsValid(tnIndent))))
{
if ( Message(''#3'Без указания документа алгоритм работать не будет,'#13#3+
'закрыть окно настройки ?', YesNo) = cmNo )
{
SetFormat(ScrFormPl_Source);
SelectFormat(ScrFormPl_Source);
SelectField(#fDocName);
Exit;
}
}
CheckTune := True;
}
//=======================================================================
Function InitInter( p_cFormPl:Comp; p_fSimplyTune:Boolean ) : Boolean;
//-----------------------------------------------------------------------
{
InitInter := False;
fSimplyTune := p_fSimplyTune;
if (Not fSimplyTune)
cFormPl := p_cFormPl;
if (GetFirst FormPl <> tsOk)
{
Message(''#3'Ошибка поиска в таблице FormPl:'#13#3+
'Записи FormPl.NRec = ' + Trim(String(cFormPl)) + ' не существует'
,Error+CancelButton);
Exit;
}
//==========================='загружаем интерфейсы'=====================
//if (Not LoadVipRef (comAlg, 'CommonFunAlg'))
//{
// Message('Системная ошибка !!!'+
// 'Не загружен интерфейс <' + 'CommonFunAlg' + '>', Error+CancelButton);
// Exit;
//}
//======================================================================
SetTunes;
FieldAccess;
MySetTitle;
InitInter := True;
}
//=======================================================================
Function DoneInter : Boolean;
//-----------------------------------------------------------------------
{
DoneInter := True;
//if (Not NullVipRef(comAlg))
//FreeVipInterface(comAlg);
}
//=======================================================================
// 'ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ ПРИ СОЗДАНИИ НОВОЙ ЗАПИСИ'
//-----------------------------------------------------------------------
Procedure OnSetDefault;
{
Set FormPl.ResWord[1] := toPlan;
Update Current FormPl;
}
//=======================================================================
//'ИНИЦИАЛИЗАЦИЯ ИНТЕРФЕЙСА
//-----------------------------------------------------------------------
Function asInitInter( p_cFormPl:Comp ) : Boolean;
{
asInitInter := InitInter(p_cFormPl, False);
}
//=======================================================================
//'ЗАВЕРШЕНИЕ РАБОТЫ С ИНТЕРФЕЙСОМ
//-----------------------------------------------------------------------
Function asDoneInter : Boolean;
{
asDoneInter := DoneInter();
}
//=======================================================================
//'ПО КОМАНДЕ CMSETDEFAULT
//-----------------------------------------------------------------------
Procedure asOnCmSetDefault;
{
OnSetDefault;
}
//=======================================================================
//'ПРИ ВСТАВКЕ НАСТРОЙКИ В ШАБЛОН
//-----------------------------------------------------------------------
Procedure asOnSetWayAccou( p_cWayAccou:Comp );
{
OnInsertWayAccou(p_cWayAccou, False);
}
//=======================================================================
// 'ЗАГОЛОВОК ОКНА'
//-----------------------------------------------------------------------
Procedure MySetTitle;
{
Var sTuneName : String;
sTuneName := 'Настройка алгоритма "' + FormPl.Name + '"';
if (FormPl.ResWord[40] > 0)
sTuneName := sTuneName + '. Включена отладочная информация';
SetWindowTitle(wnMainWindow, sTuneName);
}
//=======================================================================
Procedure SetTunes;
//-----------------------------------------------------------------------
{
if (fSimplyTune)
{
SetFormat(ScrForButtons);
}
else
{
//'закрываемые элементы для подтверждения настройки
//SetFormatEnabled(ScrFormPl_Calc, False);
//ClearFieldOption(#FormPl.ResWord[2], ofSelectable);
//ClearFieldOption(#FormPl.ResWord[8], ofSelectable);
//ClearFieldOption(#FormPl.ResWord[9], ofSelectable);
SetFormat(ScrForButtons_);
}
}
Panel pnFormPl;
Table FormPl;
//=======================================================================
HandleEvent //'panel
//-----------------------------------------------------------------------
cmCheckField:
{
Case CurField of
#FormPl.ResWord[2], //'переключатель документа
#FormPl.ResWord[1] //'тип документа
:
{
if (CurField = #FormPl.ResWord[1])
if (Word(OldFieldValue) <> FormPl.ResWord[1])
{
Set FormPl.ResComp[1] := Comp(0);
Set FormPl.ResComp[2] := Comp(0);
}
FieldAccess;
}
End; //'case
}
End; //'he panel
End; //'panel
//=======================================================================
HandleEvent //'he interface
//-----------------------------------------------------------------------
cmInit:
{
if (Not InitInter(cFormPl, True))
{
Abort;
Exit;
}
}
cmOk:
{
Update Current FormPl;
if (CheckTune())
{
if (fSimplyTune)
CloseInterface(cmOk);
else
asCloseParentWindow(Word(0));
}
}
cmPick:
{
Case CurField of
#fDocName: //'документ-предложение
{
if (FormPl.ResWord[1] = toZClient)
{
if ( RunInterface('Bookings', 1, FormPl.ResComp[2], -1) = cmOk ) {};
}
else
if (RunInterface('GetMnPlan', Word(1), FormPl.ResWord[1], FormPl.ResComp[2], FormPl.ResComp[1]) != cmCancel) {};
}
#WayAccou.Name:
{
Var cWay : Comp;
cWay := FormPl.ResComp[1]
if (RunInterface('NastrPl', FormPl.ResWord[1], cWay, Word(1)) != cmCancel)
{
OnInsertWayAccou(cWay, True);
}
}
End; //'case
}
cmDelOnProtect:
{
Case CurField of
#WayAccou.Name:
{
if (FormPl.ResComp[1] != Comp(0))
Set FormPl.ResComp[1] := Comp(0);
Stop;
}
#fDocName:
{
if (FormPl.ResComp[2] != Comp(0))
Set FormPl.ResComp[2] := Comp(0);
Stop;
}
End; //'case
}
cmDone:
{
DoneInter();
}
cmNal:
{
if (FormPl.ResWord[40] = 0)
Set FormPl.ResWord[40] := 1;
else
Set FormPl.ResWord[40] := 0;
MySetTitle;
}
End; //'he interface
End. //'interface
3) Написать алгоритм для вызова конкретного интерфейса. Плюсы возможно возвратить параметры, Минус - Каждый интерфейс придется писать в отдельном алгоритме.
тут уже сами разберетесь