-- Шаблон создан мастером бланков
-- 10.09.2012 16:48:17
--
БланкСШаблоном "Использование Python через OLE";

var OleClass:S="TBB_Py.Interpreter";
var Py_Ole:AutoObject;
var Installed_:L;
var refcount:I;
--Для проверки
var mod_chk[]:S;
var imp_succ[]:L;
var Упр:I;
var mod_to_check:S;

Proc Exec(S:S);
  Py_Ole.Exec(S);
end;

Func Eval(S:S):S;
  ^AsString(Py_Ole.Eval(S));
end;

Func EvalL(S:S):L;
  ^AsLogical(Py_Ole.Eval(S));
end;

Func EvalS(S:S):S;
  if not AsLogical(Py_Ole.Eval("bool("+S+")")):
     ^"";
   else
    ^AsString(Py_Ole.Eval(S));
  fi;
end;

Func EvalD(S:S):D;
  ^AsDate(Py_Ole.Eval(S));
end;

Func EvalI(S:S):I;
  ^AsInteger(Py_Ole.Eval(S));
end;

Func EvalN(S:S):N;
  ^AsReal(Py_Ole.Eval(S));
end;

Proc AssignS(varname:S; S:S);
-- Присваивает переменной значение строки;
-- Строка присваивается как юникод, допустимы переносы строк
  if Length(S) < 180:
     Exec(varname + "=u'''" + S + "'''");
    else
     Exec("_assig_tmp_ = u'''" + Substr(S, 1, 180) + "'''");
     Exec("_assig_tmp_ = _assig_tmp_  + u'''" + Substr(S, 180, 255) + "'''");
     Exec(varname + " = _assig_tmp_");
  fi;
end;

Func DateCast(tb:D):S;
  ^Format("date(%d,%d,%d)",Year(tb),Mon(tb),Day(tb));
end;

Func Installed(ver:S):L;
var ll:L;
  if Installed_: ^True; fi;
  try
   РАБ.Python.Py_Ole=CreateAutoObject(OleClass);
   ClearVariable(РАБ.Python.Py_Ole); -- освободить объект
   ll=true;
  except
   ll=false;
  end;

  if ll:
     Installed_=True;
     ^True;
   else
     ^False;
  fi;
end;

Func Install(UAC:L):L;
var res:L;
var i:I;
var Bin:S;
  if UAC:
     Message("Требуется установка дополнительного компонента."+chr(13)+
     "Для установки требуются повышеные права."+chr(13)+
     "Подтвердите запрос на выполнение или запустите Турбо Бухгалтер от имени администратора", mtWarning);
  fi;
  Bin=Раб.Бюджет2005.Контроль2слэш(PlanVar("Bin")+"\");
  Bin=Substr(Bin,1,Length(Bin)-1);
  if not ExistsFolder(Bin):
     CreateFolder(Bin);
  fi;
  if UAC:
     -- UAC elevate script
     CopyFile(Раб.Бюджет2005.Std_Rpo_AP+"Bin\elevate.cmd",Bin);
     CopyFile(Раб.Бюджет2005.Std_Rpo_AP+"Bin\elevate.vbs",Bin);
  fi;
  --MSVCR
  CopyFile(Раб.Бюджет2005.Std_Rpo_AP+"Bin\msvcr90.dll",Bin);
  CopyFile(Раб.Бюджет2005.Std_Rpo_AP+"Bin\Microsoft.VC90.CRT.manifest",Bin);
  --Python itself
  CopyFile(Раб.Бюджет2005.Std_Rpo_AP+"Bin\TB69extTBB.exe",Bin);

  if UAC:
     ExecuteProgram(Bin+"\elevate.cmd "+Bin+"\TB69extTBB.exe /register",True);
    else
     ExecuteProgram(Bin+"\TB69extTBB.exe /register",True);
  fi;
  for i=1..100 do
    res=Installed('');
    if res then Break; fi;
  od;
  ^res;
end;

Func Load(force:L):L;
var res:L;
var trymore:L;

  if РАБ.Python.refcount>0:   
     РАБ.Python.refcount=РАБ.Python.refcount+1; 
     ^True; 
  fi;

  try
    РАБ.Python.Py_Ole=CreateAutoObject(OleClass);
    trymore=False;
  except
    if force:
       if Install(False):
          trymore=True;
         else
          --Message("Требуется установка дополнительного компонента."+chr(13)+"В процессе установки возможна выдача запросов UAC", mtWarning);
          if Install(True):
             trymore=True;
            else
             ^false;
          fi;
       fi;
      else
       ^false;
    fi;
  end;

  if trymore:
     try
       РАБ.Python.Py_Ole=CreateAutoObject(OleClass);
     except
       ^false;
     end;
  fi;

  try
    Exec("import sys");
    Exec("from datetime import date");
    Exec("sys.path.append(r'"+Раб.Бюджет2005.Std_Rpo_AP+"Py')") ;
--    Exec("_tbb_modules=[r'"+Раб.Бюджет2005.Std_Rpo_AP+"Py']") ;
--    Exec("import imp");
    РАБ.Python.refcount=РАБ.Python.refcount+1;
    res=True;
  except
    res=False;
    raise;
  end;
  if not res:
    ClearVariable(РАБ.Python.Py_Ole);
  fi;
  return res;
end;

Proc Unload;
  РАБ.Python.refcount=РАБ.Python.refcount-1;
  if РАБ.Python.refcount<=0:
     ClearVariable(РАБ.Python.Py_Ole);
  fi;
end;

Func Import_direct(module:S):L;
  var res:L;
  try
    Exec("import "+module);
    res=True;
  except
    res=False;
  end;
  return res;
end;

Func Import(module:S):L;
  return Import_direct(module);
end;

Func LoadAndImport(module:S;force:L):L;
--var res:L;
if Load(force):
   if Import(module):
      ^True;
     else
      Unload;
      ^False;
   fi;
  else
   ^False;
fi;
end;

Func ИзОбменаS(target_var:S):L;
var tmp:s;
  tmp=Раб.Бюджет2005.tempfile("","dbt");
  if not Import('tb_dbt'): ^False; fi;
  if not WriteVarInDBT(tmp,False,'РАБ.ОБМЕН'): ^False; fi;
  Exec(target_var+"=tb_dbt.read_array(r'"+tmp+"','BUFS1')");
  Exec(target_var+"=tb_dbt.dict_to_list("+target_var+")");
  DeleteFile(tmp);
end;

Func ВОбменS(src_var:S):L;
var tmp:s;
  tmp=Раб.Бюджет2005.tempfile("","dbt");
  if not Import('tb_dbt'): ^False; fi;
  Exec("tb_dbt.write_array(r'"+tmp+"','РАБ.ОБМЕН.BufS1',"+src_var+")");
  if not ReadVarFromDBT(tmp,'РАБ.ОБМЕН'): ^False; fi;
  DeleteFile(tmp);
  ^True;
end;

Func ИзОбменаI(target_var:S):L;
var tmp:s;
  tmp=Раб.Бюджет2005.tempfile("","dbt");
  if not Import('tb_dbt'): ^False; fi;
  if not WriteVarInDBT(tmp,False,'РАБ.ОБМЕН'): ^False; fi;
  Exec(target_var+"=tb_dbt.read_array(r'"+tmp+"','РАБ.ОБМЕН.BufI1',int)");
  Exec(target_var+"=tb_dbt.dict_to_list("+target_var+")");
  DeleteFile(tmp);
end;

Func ВОбменI(src_var:S):L;
var tmp:s;
  tmp=Раб.Бюджет2005.tempfile("","dbt");
  if not Import('tb_dbt'): ^False; fi;
  Exec("tb_dbt.write_array(r'"+tmp+"','РАБ.ОБМЕН.BufI1',"+src_var+")");
  if not ReadVarFromDBT(tmp,'РАБ.ОБМЕН'): ^False; fi;
  DeleteFile(tmp);
  ^True;
end;

Func ИзОбменаN(target_var:S):L;
var tmp:s;
  tmp=Раб.Бюджет2005.tempfile("","dbt");
  if not Import('tb_dbt'): ^False; fi;
  if not WriteVarInDBT(tmp,False,'РАБ.ОБМЕН'): ^False; fi;
  Exec(target_var+"=tb_dbt.read_array(r'"+tmp+"','РАБ.ОБМЕН.BufN1',float)");
  Exec(target_var+"=tb_dbt.dict_to_list("+target_var+")");
  DeleteFile(tmp);
end;

Func ВОбменN(src_var:S):L;
var tmp:s;
  tmp=Раб.Бюджет2005.tempfile("","dbt");
  if not Import('tb_dbt'): ^False; fi;
  Exec("tb_dbt.write_array(r'"+tmp+"','РАБ.ОБМЕН.BufN1',"+src_var+")");
  if not ReadVarFromDBT(tmp,'РАБ.ОБМЕН'): ^False; fi;
  DeleteFile(tmp);
  ^True;
end;

Proc RunCallback(cb:S);
--Функуия прерывается только из Python!
--Действовать аккуратно!
var fname,tmpS:S;
  while True do
    Exec(cb+".exec_me.wait()");
    fname=Eval(cb+".f_name");
    if fname="Break":
      Break;
    |EvalL(cb+".f_func"):
      tmpS=ExecuteFuncS(fname,Eval(cb+".f_args[0]"));
      Exec(cb+".f_res='"+tmpS+"'");
    fi;
    Exec(cb+".executed.set()");
  od;
end;

Proc Пров_Имп(which:S);
   InsertFrame(Упр,Упр+1);
   mod_chk[Упр]=which;
   imp_succ[Упр]=False;
   Load(False);
   try
     imp_succ[Упр]=Import(which);
   finally
     Unload;
   end;
end;

Proc Пров_стандарт;
  if not Installed(''):
     if EnqOkCancel("Интерпретатор Python для ТБ 6.9 не установлен."+chr(13)+"Установить?",mtWarning)=cmOk:
        Install(True);
     fi;
  fi;
  --Это модули стандартной библиотеки. Могут пропасть только из-за оптимизаций при компановке OLE
  --работа с zip-архивами. zlib обеспечивает поддержку ZIP_DEFLATED
  Пров_Имп("zlib");
  Пров_Имп("zipfile");
  --статусы файлов, листинг папок
  Пров_Имп("os");
  Пров_Имп("os.path");
  --работа с реестром
  Пров_Имп("_winreg");
  --многопоточность
  Пров_Имп("thread");
  --Это модули из папки Py в STD_RPO. За ними лучше следить.
  --Импорт может сбоить как из-за ошибки в модулях, так и из-за появившихся/пропущенных зависимостей
  --Запись в Excel
  Пров_Имп("xlwt");
  --Для быстрой передачи массивов через DBT
  Пров_Имп("tb_dbt");
  --Возможность вызова функций ТБ из Python
  Пров_Имп("tb_callback");
  --сервер удаленного вызова процедур
  Пров_Имп("SimpleXMLRPCServer");
end;



Proc AfterOpen(Destroy: Logical);
  ClearVariable(mod_chk);
  ClearVariable(imp_succ);
  ClearVariable(Упр);
  Пров_стандарт;
end;


Proc btnCheckImport_OnClick(Sender: String);
  Пров_Имп(mod_to_check);
end;


Конец
