Страница 1 из 1

Запуск VIP-интерфейса из js

Добавлено: 17 июл 2012, 12:29
savov
Всем доброго времени суток.
В связи с тем, что из под js прямым скулем не удалось сделать insert и update, подскажите, если у кого что было подобное, нельзя ли из js запустить VIP-интерфейс собственного производства?

Re: Запуск VIP-интерфейса из js

Добавлено: 17 июл 2012, 15:15
Dmitry_Sol
Есть три варианта решения данной проблемы.
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) Написать алгоритм для вызова конкретного интерфейса. Плюсы возможно возвратить параметры, Минус - Каждый интерфейс придется писать в отдельном алгоритме.
тут уже сами разберетесь