************
*
* Программа..:  Многие
* Имя файла..:  feval.Prg
* Автор......:  А. Титов
* Назначение.:  Работа с fileEval из любого реестра
*
******
// Copyright (c) 1993-2005 "Компания БЭСТ". Все права сохраняются.



#INCLUDE "inkey.ch"
#Include "my.ch"
#Include "my_new.ch"
#Include "s_public.ch"


//Используются в FileEval

REQUEST CWSWAP      //для совместимости
REQUEST SWPRUNCMD  //для совместимости
REQUEST SX_RLOCK //для совместимости
REQUEST SX_UNLOCK //для совместимости
REQUEST SX_PACK //для совместимости

REQUEST DBOPENBASE //для совместимости
REQUEST DBCLOSEBASE //для совместимости

REQUEST CallExcel   //для совместимости

REQUEST WINREPORT //универсальный построитель отчетов

REQUEST BIN2W,BIN2I,BIN2L,I2BIN,L2BIN

REQUEST NewGuid38


Request __hrbGetFu
Request __hrbDoFu
//
// Remote Procedure Call ( Client class )
//
Request TRpcClient

#ifndef __PLATFORM__Linux
//
// ADS DD
//
//Request AdsUseDictionary         // AdsUseDictionary(lUse)
//Request AdsDDCreate              // AdsDDCreate(cDictionaryPath,nEncrypt,cDescription)
//Request AdsDDSetDataBaseProperty // AdsDDSetDataBaseProperty( nProperty, AnyProperty )
//Request AdsDDGetDataBaseProperty // AdsDDGetDataBaseProperty( nProperty )
//Request AdsDDAddTable            // AdsDDAddTable(cAlias,cFileName,cIndexName)
//Request AdsDDCreateUser          // AdsDDCreateUser(cGroupName,cUserName,cPassword,cDescription)
//Request AdsDDAddUserToGroup      // AdsDDAddUserToGroup(cGroupName,cUserName)
//Request AdsDDGetUserProperty     // AdsDDGetUserProperty(cUserName,nPropertyID,cProperty,nPropertyLen)
//
// ADS SQL
//
//Request AdsCreateSQLStatement    // AdsCreateSQLStatement( cAlias )
//Request AdsExecuteSQLDirect      // AdsExecuteSQLDirect( cSql )
//Request AdsPrepareSQL
//Request AdsExecuteSQL
//
// ADS AOF
//
//Request AdsSetAOF
//Request AdsClearAOF
//Request AdsCustomizeAOF
//Request AdsEvalAOF
//Request AdsGetAOFOptLevel
//Request AdsGetAOFnoOpt
//Request AdsIsRecordInAOF
//Request AdsRefreshAOF
//
//Request AdsRegCallBack           // AdsRegCallBack({|nPercent| SQLProgress( nPercent ) })
//Request AdsClrCallBack           // AdsClrCallBack()
//
Request HB_OemToAnsi,HB_AnsiToOem
//
// MySQL
//
//Request TMySQLServer
//Request TMySQLQuery
//Request TMySQLTable
//Request TMySQLRow
#endif

Static cMess := " F9:Печать F10:Сохр."
Static aString

FUNCTION F_Eval(cTReestr,xMetka,lWithSpec,lNoRun,cAltX,lWithSpec2,lAdvDel)  //victor newCTRL_F5 lWithSpec2
   // Выполняет файл-евал для помеченных строк в реестре
   // cTReestr -тип реестра
   // xMetka - массив выделенных строк или алиас файла, содержащего список
   //          выделенных строк
   // lWithSpec - включен режим автоматического вызова FEVAL из записи
   //             и удаления док-та
   //lNoRun - признак,что из этого меню не запускать, можно только добавлять или корректировать функции
   //cAltX - не задействован
   // lWithSpec2 - включен режим автоматического вызова FEVAL из вxода в док-т и его проверки  //victor newCTRL_F5
   // lAdvDel - включен режим расширенного удаления (перед удалением, после удаления)
LOCAL aSetKey:=SaveSetKey()
LOCAL cScreen:=SAVESCREEN()
LOCAL cSel := ALIAS()
LOCAL cHead:=' Специальные функции '
LOCAL cHead1:=''
LOCAL cColHead:=;
'          Наименование                  Файл        '+IF(!EMPTY(lWithSpec),'      Вызов      ','')
LOCAL aBlockCols:= {{{||Left(FEval->Name,30)},1},{{||IF(LEN(ALLTRIM(FEval->NameFile))>20,'...'+RIGHT(ALLTRIM(FEval->NameFile),17),PADR(FEval->NameFile,20))},33}}
LOCAL nTop:=7
LOCAL nBottom:=16
LOCAL cCurProc//:={||CoProc()}
LOCAL aHeads:={;
       {{0,0},'Code'},;
       {{05,40},'Name'},;
       {{06,40},'NameFile'},;
       {{07,40},'Param'};
       }

LOCAL aSortSeek:={;
 {'- наименованиям ','Наименование?:','LEFT(Name,30)',;
 'TRIM(UPPER("'+PADR(cTReestr,20)+'"+aIn[1]))','@K'};
}
LOCAL aGetBlock :={{||''},,,,{|oGet|RotateBlock(oGet,m->aCallVv,'aIn[5]') }}
LOCAL aPict:={,'@KS25','@KS25','@KS25','XXXXXXXXXXXXXXX'}
LOCAL aRef:={,,,,{|oGet|RotateAndReader( oGet, m->aCallVv) }}, cScrM, nZap
LOCAL nLeftBrd:= 6, lDel:=.F., lDelPost:=.F.,lZap:=.F. , lVhod:=.F., lProv:=.F.      //victor newCTRL_F5
LOCAL bPreGet:={|lExit| ;
                        TrapShift(""),;
                        cScrM:= SaveScreen(),;
                      IF(nApp = 2,;
                        (QHelp('...',,1,,'Code',,,,'Code'),;
                        IF(RECLOCK(),(FEval->TReestr := cTReestr,dbUnLock()),NIL),;
                        aIn[2]:=SPACE(LEN(FEval->Name)),;
                        aIn[4]:=SPACE(LEN(FEval->Param)),;
                        aIn[3]:=SPACE(LEN(FEval->NameFile)),;
                        iIF(lWithSpec,aIn[5]:=' ',NIL)),;
                        NIL),;
                      SayFEval(lWithSpec),;
                        nZap:=RECNO(),;
                        dbPush(),;
                        m->aCallVv:={{' ','по требованию  '}},;
                        lZap:=.F.,lDel:=.F.,lDelPost:=.F.,lVhod:=.F.,lProv:=.F.,;
                        dbEVAL({||IF(FEval->Call='1'.AND.(nApp=2.OR.nZap#RECNO() ) ,lZap:=.T.,NIL),;
                                  IF(FEval->Call='3'.AND.(nApp=2.OR.nZap#RECNO() ) ,lVhod:=.T.,NIL),;  //victor newCTRL_F5 2
                                  IF(FEval->Call='4'.AND.(nApp=2.OR.nZap#RECNO() ) ,lProv:=.T.,NIL),;
                                  IF(FEval->Call='2'.AND.(nApp=2.OR.nZap#RECNO() ),lDel:=.T.,NIL),;
                                  IF(FEval->Call='5'.AND.(nApp=2.OR.nZap#RECNO() ),lDelPost:=.T.,NIL)}),;
                        IF (!lVhod .AND. lWithSpec2,AADD(m->aCallVv,{'3','вход в док-т   '}),NIL),;     //victor newCTRL_F5 2
                        IF (!lProv .AND. lWithSpec2,AADD(m->aCallVv,{'4','проверка док-та'}),NIL),;
                        IF (!lZap                  ,AADD(m->aCallVv,{'1','запись док-та  '}),NIL),;
                        IF(!EMPTY(lAdvDel),;
                           (IF (!lDel                  ,AADD(m->aCallVv,{'2','перед удалением'}),NIL),;
                            IF (!lDelPost                  ,AADD(m->aCallVv,{'5','после удаления '}),NIL)),;
                           IF (!lDel                  ,AADD(m->aCallVv,{'2','удаление док-та'}),NIL)),;
                        dbPop()  ;
                         }
LOCAL bPostGet
LOCAL bPost

LOCAL aWhen :={{||.F.},,{||SETKEY(K_F2,{||SelFile()})},,{||LEN(m->aCallVv)>1}}
LOCAL aValid:={,,{||SETKEY(K_F2,NIL),ValidFile(aIn[3])}}
LOCAL nUniMode:=2
LOCAL bDelInit:={||.T.}
LOCAL bDelPost
LOCAL bScrInit:={||2}

LOCAL aPHeads:={cHead,;
{'Наименование','Name',REPLICATE('X',20)},;
{'Файл','NameFile',REPLICATE('X',25)},;
{'Параметры','Param',REPLICATE('X',25)};
}
LOCAL bColor

LOCAL bScrPost
LOCAL cFindMacro:='cFind$UPPER(TRIM(Name))'
LOCAL cHelp_Code:=m->HELP_CODE, nLen
LOCAL aBase := {'FEval'}
LOCAL cColor
LOCAL nArea:=SELECT()
LOCAL cTrap


IF SELECT('CARGO')>0.AND.Cargo->(LASTREC())>=196
   Cargo->(DBGOTO(196))
   IF !Parol(Cargo->Cargo)
      RESTSCREEN(,,,,cScreen)
      RestSetKey(aSetKey)
      RETURN
   ENDIF
ENDIF

cColor:=SETCOLOR(COL_REFER)
cTrap:=TRAPSHIFT("")





IF lNoRun==NIL
   lNoRun:=.F.
ENDIF

IF !EMPTY(lAdvDel)

   PRIVATE aCall:={{' ','по требованию  '},;
                {'3','вход в док-т   '},;      //victor newCTRL_F5 2
                {'4','проверка док-та'},;
                {'1','запись док-та  '},;
                {'2','перед удалением'},;
                {'5','после удаления '};
                }

ELSE

   PRIVATE aCall:={{' ','по требованию  '},;
                {'3','вход в док-т   '},;      //victor newCTRL_F5 2
                {'4','проверка док-та'},;
                {'1','запись док-та  '},;
                {'2','удаление док-та'}    }

ENDIF





PRIVATE aCallVv:={{' ','по требованию  '}}



lWithSpec:=!EMPTY(lWithSpec)
lWithSpec2:=!EMPTY(lWithSpec2)   //victor newCTRL_F5
BEGIN SEQUENCE
dbOpenBases(aBase)
SELECT FEval
SetScope( 'UPPER(TReestr)',UPPER(PADR(cTReestr,20)) )
GO TOP

    m->HELP_CODE:='16.1'
    ScrTitul(1,cHead)
    ScrTitul(24,"F11:Среда программрования")
    SETCOLOR(COL_REFER)
    IF lNoRun
       SETKEY(K_RETURN,{||SayError(;
       {"При операциях экспорта-импорта",;
       "запуск пользовательских функций",;
       "будет произведен автоматически!";
       })})
       ScrTitul(23,CHR(17)+"Ctrl-"+CHR(17)+"┘:Правка F4:Ввод Alt-F6:Фильтр F7,Alt-F7:Поиск F8:Удал F9:Печать")
    ELSE
       SETKEY(K_RETURN,{||IF(FEval->Call=' ',(cSel)->(FunEval(FEval->NameFile,xMetka,FEval->Param)),SayError('Разрешено выполнять только функции "по требованию"')),0})
       ScrTitul(23,CHR(17)+"┘:Выбор Ctrl-"+CHR(17)+"┘:Правка F4:Ввод Alt-F6:Фильтр F7,Alt-F7:Поиск F8:Удал F9:Печать")
    ENDIF

    SETKEY(K_CTRL_RET,{||IF(!EOF(),QInput(nTop,6,nBottom,56,aHeads,1,aRef,aPict,aWhen,aValid,,bScrInit,bPost,,,aGetBlock,bScrPost,,bPreGet,bPostGet,,,,,,,);
                         ,NIL),2})
    SETKEY(K_F11,{||xDebug()})

    ShadowBox( ' Специальные функции ',nTop-1,nLeftBrd-1,nBottom+1,61+IF(lWithSpec,16,0),COL_REFER)
    IF lWithSpec
       AADD(aHeads,{{08,40},'CALL'})
       AADD(aPHeads,{'Вызов','StrS(Call,aCall)','XXXXXXXXXXXXXXX'})
       AADD(aBlockCols,{{||StrS(FEval->Call,aCall)},54})
    ENDIF

    InitList(nTop,nBottom,cColHead,aBlockCols,cCurProc,aHeads,aRef,;
     aPict,aWhen,aValid,nUniMode,bDelInit,bScrInit,aSortSeek,aPHeads,;
     bPost,bDelPost,aGetBlock,bColor,,nLeftBrd,bScrPost,cFindMacro,COL_REFER,,bPreGet,bPostGet)


END SEQUENCE
m->HELP_CODE:=cHelp_Code
dbCloseBases(aBase)
SELECT(nArea)
RESTSCREEN(,,,,cScreen)
RestSetKey(aSetKey)
SETCOLOR(cColor)
TRAPSHIFT(cTrap)
RETURN (NIL)

******************
FUNCTION SayFEval(lWithSpec)
******************
ShadowBox( "Параметры спец.функции",3,10,9,69,COL_INPUT)
@ 5,12 SAY 'Наименование' COLOR COL_INPUT
@ 6,12 SAY 'Имя файла с программой' COLOR COL_INPUT
@ 7,12 SAY 'Список параметров'  COLOR COL_INPUT
IF lWithSpec
   @ 8,12 SAY 'Вызов'  COLOR COL_INPUT
ENDIF
RETURN .T.


******************
FUNCTION FunEval(cNameFile,xMetka,cParam,lNoSoob,lRun)

LOCAL nKey:=LASTKEY()
LOCAL aSet := SaveSet(), aSetKeys := SaveSetKey()
LOCAL i, nRec := RECNO(), cPar, nRecM, nKolZap:=0, lRes, cOrd, nOldRec
LOCAL cTrap:=TRAPSHIFT("")

PRIVATE lFromMaker:=.T.

IF !EMPTY(cNameFile)


   PRIVATE nNumber:=0, nKolStrok
   IF EMPTY(cParam)
      cPar := NIL
//   ELSEIF "U"$TYPE('{'+cParam+'}')
//      SayError("Ошибка в задании параметров!")
//      BREAK
   ELSE
      TRY
         cPar := &('{'+cParam+'}')
      CATCH
         SayError("Ошибка в задании параметров!")
         cPar:=NIL
      END
   ENDIF
   lNoSoob:=!EMPTY(lNoSoob)
   IF VALTYPE(xMetka) = 'A'
      nKolStrok := LEN(xMetka)
      IF !EMPTY(xMetka)
         FOR i:=1 TO LEN(xMetka)
            
            if ValType(xMetka[i]) == 'A'
               dbGOTO(xMetka[i,1])
             else
               dbGOTO(xMetka[i])
            end
            nNumber++
            lRes:=HFileEval(cNameFile,cPar,,lRun)
            nKolZap++
         NEXT
      ELSE
         nKolStrok := 1
         nNumber++
         lRes:=HFileEval(cNameFile,cPar,,lRun)
         nKolZap++
      ENDIF
   ELSEIF VALTYPE(xMetka) = 'C'
      (xMetka)->(cOrd:=ORDSETFOCUS(0))
      (xMetka)->(dbGOTOP())
      nKolStrok := 0
      (xMetka)->(dbEVAL({||nKolStrok++}))
      (xMetka)->(dbGOTOP())
      IF !(xMetka)->(EOF())
         DO WHILE  !(xMetka)->(EOF())
            (xMetka)->(dbSKIP())
            nRecM := (xMetka)->(RECNO())
            (xMetka)->(dbSKIP(-1))
            nOldRec:=(xMetka)->(RECNO())
            altd()
            IF (xMetka)->(FIELDNUM("cRec")) > 0 
               dbGOTO(VAL((xMetka)->cRec))
            ELSE
               dbGOTO((xMetka)->(RecNo()))
            ENDIF
            nNumber++
            lRes:=HFileEval(cNameFile,cPar,,lRun)
            nKolZap++
            (xMetka)->(dbGOTO(nOldRec))
            IF (xMetka)->(RECLock())
               (xMetka)->(dbDELETE())
               (xMetka)->(dbUnLock())
            ENDIF
            (xMetka)->(dbGOTO(nRecM))
         ENDDO
      ELSE
         nKolStrok := 1
         nNumber++
   #ifndef __HARBOUR__
         lRes:=FileEval(cNameFile,cPar)
   #else
         lRes:=HFileEval(cNameFile,cPar,,lRun)
   #endif
         nKolZap++
      ENDIF
      (xMetka)->(ORDSETFOCUS(cOrd))
   ELSE
      nKolStrok := 1
      nNumber++
   #ifndef __HARBOUR__
      lRes:=FileEval(cNameFile,cPar)
   #else
      lRes:=HFileEval(cNameFile,cPar,,lRun)
   #endif
      nKolZap++
   ENDIF
   dbGOTO(nRec)

   /*************
   IF !lNoSoob
      SayAndWait({"Обработка данных завершена!","Обработано "+AllTrim(Str(nKolZap))+" записей."},8)
   ENDIF
   **************/
ENDIF
RestSet(aSet)
RestSetKey(aSetKeys)
SetLastKey(nKey)
TRAPSHIFT(cTrap)
RETURN lRes

******************
FUNCTION F_EvalZap(cTReestr,nAdd)
******************
LOCAL cSel:=ALIAS()
Local nWin
nWin := WSELECT()
WSELECT(0)

cTReestr:=PADR(cTReestr,20)
dbPush()
If SELECT('FEval')=0
  dbOpenBases({'FEval'})
EndIf
FEval->(dbPush(,,,{'UPPER(TReestr+Call)',UPPER(cTReestr+'1')}))
PRIVATE nVidWork_:=nAdd
If !FEval->(EOF())
  (cSel)->(FunEval(FEval->NameFile,{},FEval->Param,.T.))
ENDIF
FEval->(dbPop())
dbPop()
WSELECT(nWin)
RETURN .T.

******************
FUNCTION F_EvalDel(cTReestr)
******************
LOCAL cSel:=ALIAS(), lRes:=.T.
cTReestr:=PADR(cTReestr,20)

dbPush()
IF SELECT('FEval')=0
   dbOpenBases({'FEval'})
ENDIF
FEval->(dbPush(,,,{'UPPER(TReestr+Call)',UPPER(cTReestr+'2')}))
IF !FEval->(EOF())
   lRes:=(cSel)->(FunEval(FEval->NameFile,{},FEval->Param,.T.))
   IF VALTYPE(lRes) = 'C' .AND. lRes ==''
   ELSEIF VALTYPE(lRes) # 'L'
      lRes := .T.
   ENDIF
ENDIF
FEval->(dbPop())
dbPop()

RETURN lRes



******************
FUNCTION F_EvalDelPost(cTReestr)
******************
LOCAL cSel:=ALIAS(), lRes:=.T.
cTReestr:=PADR(cTReestr,20)

dbPush()
IF SELECT('FEval')=0
   dbOpenBases({'FEval'})
ENDIF
FEval->(dbPush(,,,{'UPPER(TReestr+Call)',UPPER(cTReestr+'5')}))
IF !FEval->(EOF())
   lRes:=(cSel)->(FunEval(FEval->NameFile,{},FEval->Param,.T.))
   IF VALTYPE(lRes) = 'C' .AND. lRes ==''
   ELSEIF VALTYPE(lRes) # 'L'
      lRes := .T.
   ENDIF
ENDIF
FEval->(dbPop())
dbPop()
RETURN lRes





******************
FUNCTION F_EvalVhod(cTReestr,nAdd)       //victor newCTRL_F5 2func
******************
LOCAL cSel:=ALIAS(), lRes:=.T., nDisp:=DISPCOUNT(),i

cTReestr:=PADR(cTReestr,20)
dbPush()
If SELECT('FEval')=0
  dbOpenBases({'FEval'})
EndIf
FEval->(dbPush(,,,{'UPPER(TReestr+Call)',UPPER(cTReestr+'3')}))
PRIVATE nVidWork_:=nAdd
If !FEval->(EOF())
   FOR i:=1 TO nDisp
      DISPEND()
   NEXT
  lRes:=(cSel)->(FunEval(FEval->NameFile,{},FEval->Param,.T.,.T.)) //без выгрузки!!!
//    lRes:=(cSel)->(FunEval(FEval->NameFile,{},FEval->Param,.T.)) 
   FOR i:=1 TO nDisp
      DISPBEGIN()
   NEXT
   IF VALTYPE(lRes) # 'L'
      lRes := .T.
   ENDIF
ENDIF
FEval->(dbPop())
dbPop()
RETURN lRes
******************
FUNCTION F_EvalProv(cTReestr,nAdd)
******************
LOCAL cSel:=ALIAS(), lRes:=.T., nDisp:=DISPCOUNT(),i

cTReestr:=PADR(cTReestr,20)
dbPush()
If SELECT('FEval')=0
  dbOpenBases({'FEval'})
EndIf
FEval->(dbPush(,,,{'UPPER(TReestr+Call)',UPPER(cTReestr+'4')}))
PRIVATE nVidWork_:=nAdd
If !FEval->(EOF())
   FOR i:=1 TO nDisp
      DISPEND()
   NEXT
  lRes:=(cSel)->(FunEval(FEval->NameFile,{},FEval->Param,.T.))
   FOR i:=1 TO nDisp
      DISPBEGIN()
   NEXT
   IF VALTYPE(lRes) # 'L'
      lRes := .T.
   ENDIF
ENDIF
FEval->(dbPop())
dbPop()
RETURN lRes


//
#ifdef __HARBOUR__

Function HFileEval(cFile,aX,lNoEval,lRun)
//Если lRun - то не выгружаем, так как могут быть фильтры - при выгрузке по Alt-X
Local uResult,hHandle,oError
Local i,n
Local lExist := .f.
#ifndef __PLATFORM__Linux
Local uPath,uName,uExt,uRun
#endif
Local aPath := {;
                _PRO_PATH+'PLUGINS\EXTENSNS\'+cFile,;
                _PRO_PATH+'PLUGINS\PRINT\'+cFile,;
                _PRO_PATH+'PLUGINS\EXTENSNS\'+GetAllArm(NIL,EXENAME())[6]+cFile,;
                _PRO_PATH+'PLUGINS\PRINT\'+GetAllArm(NIL,EXENAME())[6]+cFile,;
                UPPER(IF(TYPE("PATH_DBS") = "C",MemVar->PATH_DBS,LoadPath()+"INI\")) + cFile}

STATIC aRun:={}
IF lRun==NIL
   lRun:=.F. 
ENDIF

                For i := 1 To Len(aPath)
                    if File(AllTrim(aPath[i]))
                       lExist := .t.
                       Exit
                    endif
                Next
                if lExist
                   if IsHRBCode(AllTrim(aPath[i]))
                      Private xRet := 0, aPars
                      PRIVATE _User_Code:= IF(EMPTY(Global_Set[2]),SUBSTR(IDENT_USER,COUNTLEFT(IDENT_USER,"0")+1),Global_Set[2])
                      if TYPE('aGlobVars') = 'U'
                         PUBLIC aGlobVars
                         m-> aGlobVars := ARRAY(100)
                      endif
                      MemVar->aPars := aX

                      IF (n:=ASCAN(aRun,{|x|UPPER(x[1])==UPPER(AllTrim(aPath[i]))}))>0
                         hHandle:=aRun[n,2]
                         lRun:=.T.
                      ELSEIF lRun
                         AADD(aRun,{AllTrim(aPath[i]),(hHandle:=__hrbLoad(AllTrim(aPath[i])))})
                      ELSE
                         hHandle:=__hrbLoad(AllTrim(aPath[i]))
                      ENDIF
                     if !Empty( hHandle ) // pointer
                      TRY
                        uResult := __hrbDo(hHandle,aX)
                       CATCH oError
                        SayError({"Ошибка выполнения "+cFile,;
                                   oError:Description})
                      END
                      IF !lRun
                         __hrbUnload(hHandle)
                      ENDIF
                     endif
                    else
#ifndef __PLATFORM__Linux
                      hb_FNameSplit( aPath[i], @uPath, @uName, @uExt )
                      uPath := DiskName()+':'+DirName()+'\'+uPath
                      uExt := Lower(AllTrim(uExt))
                      if uExt == '.js'.or.uExt == '.vbs'
                         uRun := uPath+uName+uExt
                         RunShell(uRun)
                        else
                         uResult := FileEval(cFile,aX,lNoEval)
                      endif
#else
                         uResult := FileEval(cFile,aX,lNoEval)
#endif

                   endif
                  else
                    uResult := FileEval(cFile,aX,lNoEval)
                endif
Return uResult
//
Function IsHRBCode(cFile)
Local lSucces := .f.
Local cBuffer := Space(4)
Local nHandle
      if (nHandle := fOpen(cFile)) != -1
         if fRead( nHandle, @cBuffer, 4 ) == 4
            lSucces := Right(cBuffer,3) == 'HRB'
         endif
         fClose(nHandle)
      endif
Return lSucces
#endif



STATIC FUNCTION SelFile()
LOCAL cPath:=_PRO_PATH+'PLUGINS\EXTENSNS\'+GetAllArm(NIL,EXENAME())[6]
LOCAL aFile := Select_Files( 3, 2, cPath,{},.T.,.T.)
LOCAL cFile
IF VALTYPE(aFile)="A".AND.!EMPTY(aFile)
    cFile:=ALLTRIM(aFile[1])
ENDIF

cFile:=PADR(cFile,60)
aIn[3]:=cFile
RETURN .T.


STATIC FUNCTION ValidFile(cFile)
IF LASTKEY()!=K_ESC.AND.UPPER(cFile[1])!="U"
   SayAndWait("Для обеспечения последующего переноса в новые версии,"+CHR(13)+CHR(10)+;
    'рекомендуется имя файла начинать с латинской буквы "u"!')
ENDIF
RETURN .T.








