QInput

#IFNDEF PPARAMETERS

 FUNCTION QInput(;
   nTop,nLeft,nBottom,nRight,aHeads,;
   nAppp,aRef,aPict,aWhen,aValid,nUnique,bScrInit,bPost,cFltr0,lSpec,;
   aGetBlock,bScrPost,cScope,bPreGet,bPostGet,nTag,lNoAppend,lNoRestScreen,;
   lGetBlock,cMessSave,bRestSave,bPostRead,lSubIndex,bSayHead,bKeyHead;
   )
#ELSE

 FUNCTION QInput
   PARAMETERS;
        nTop,nLeft,nBottom,nRight,aHeads,;
        nAppp,aRef,aPict,aWhen,aValid,nUnique,bScrInit,bPost,cFltr0,lSpec,;
        aGetBlock,bScrPost,cScope,bPreGet,bPostGet,nTag,lNoAppend,lNoRestScreen,;
        lGetBlock,cMessSave,bRestSave,bPostRead,lSubIndex,bSayHead,bKeyHead
 #ENDIF
 //lSpec должен присутствовать при входе не через InitList()
 //lSpec='REFER'-вход из Refer:цвет,нет цикла,нет поддержки скроллинга,специфические When,Valid
 //lSpec='RESTOFF'-вход из ProBase:все как в штатном режиме,но без восст.овласти
 //Если Eval(bScrInit)->0,то редактирования не происходит вообще
 //  lNoAppend - .T., то довавление записи при любом nApp не происходит
 //             предпологается, что довавление и откат производится
 //             в bPreGet и bPostGet
 //             также происходит сохранение полей даже если не было коррекции
 //  lGetBlock - .T. в фильтре на поле интервал aGetBlock вешается
 //             на два oGet и ему передается значение,oGet и nPoz ({|x,oGet,nPoz| })
 //             где nPoz 1-ый или 2-ой эл-т интервала
 /// lNoRestScren - .T., то восстановление пред. состояния экрана
 //                 в любом случае не происходит, предполагается
 //                 что восстановление либо не требуется, либо
 //                 выполняется в bPostDisp или bScrPost
 //  cMessSave - запрос о записи документа
 //  lSubIndex - .T. построение субиндекса при установке фильтра
 //               иначе ручного индекса
 PLOCAL currFilter:=DBFILTER()
 PLOCAL lFound:=.F.,aScope:=GETSCOPE()
 PLOCAL lMore := .T.,lBlock,cStri,lYes:=.T.
 PLOCAL _cLastColor:=SETCOLOR()
 PLOCAL _cColor:=IF(lSpec!=NIL .AND. lSpec=="REFER" ,COL_REF1,COL_INPUT)
 PLOCAL nFi,nCo,lUpDated
 PLOCAL sRest:=BRSAVESCREEN(IF(nAppp = -1,0,24),0,24,MAXCOL())
 PLOCAL aPos:={},xIndexKey
 PLOCAL nOrd
 PLOCAL cIndexKey
 PLOCAL NRECNO:=RECNO(),lEof:=.F.
 PLOCAL nRow0:=ROW()
 PLOCAL nScroll:=IF(lSpec==NIL .OR. lSpec=='RESTOFF',nTop-1,NIL)
 PLOCAL lRefer:=IF(lSpec!=NIL .AND. lSpec=="REFER" ,.T.,.F.)
 PLOCAL aBlockKey,x,cLastCol, sRet, lReadExit, nLastKey
 PLOCAL sRestii:=sResti ,nScrInit:=1
 PLOCAL sRestS, lSaveFlagArray := .F., lSkipApp := .F., xExit
 PLOCAL nWi:=WSELECT(),cAli,nWin1
 PLOCAL nArea:=ASCAN(sPre,{|x|x[1]==SELECT()}), lExit
 PLOCAL cTempIndex:=IF(EMPTY(nArea),NIL,sPre[nArea,2]), _nMore
 PLOCAL nBakRec, xRest23, nPozGet, nPoz
 PLOCAL aSave
 PLOCAL lbSayHead:= VALTYPE(bSayHead)=="B".AND.VALTYPE(bKeyHead)=="B" //New
 PLOCAL __bStPrint
 PRIVATE V_LSPEC := lSpec // Это для того, чтобы в складе когда делается рефер на MLABEL я видел,
 //что картинка для QInput должна быть черного цвета. Этот параметр здесь нигде вольше не используется
 // но удалять его не нужно.
 PRIVATE lNoInt:=.F. // - это для импорта строк в инитлист. Эта переменная определена всегда.
 IF TYPE("lNoInteractiv")$"L"
   IF VALTYPE(lNoInteractiv)=="L"
     lNoInt := lNoInteractiv
   ENDIF
 ENDIF
 IF (aHeads==NIL) //М.в. бызов из S_Refer c пустым aHeads
   RETURN (1)
 ENDIF
 IF (EOF().OR.BOF().OR.LASTREC()=0)
   IF (nAppp<2)
     RETURN (1)
   ELSE
     lEof:=.T.
   ENDIF
 ENDIF
 aBlockKey:=SaveKey()
 IF( VALTYPE( bPreGet  ) <> 'B', bPreGet := {||NIL}, )
   IF( VALTYPE( bPostGet ) <> 'B', bPostGet:= {||NIL}, )
     IF( VALTYPE( lNoAppend ) <> 'L', lNoAppend := .F., )
       IF( VALTYPE( lGetBlock ) <> 'L', lGetBlock := .F., )
         IF( VALTYPE( lNoRestScreen ) <> 'L', lNoRestScreen := .F., )
           IF( VALTYPE( bPostRead ) == 'B',, bPostRead := {|| .T. } )
             PRIVATE aIn := ARRAY(LEN(aHeads)),GETLIST:={}
             PRIVATE aLastIn:=ARRAY(LEN(aHeads)),nApp:=nAppp
             IF nApp = 0
               PRIVATE aFilIn
               MEMVAR->aFilIn := ARRAY(LEN(aHeads))
             ENDIF
             IF (VALTYPE(aHeads[1,1])=='A' )
               nTopi:=0;nLefti:=0;nBottomi:=MAXROW()-3;nRighti:=MAXCOL()
               sResti:= BRSAVESCREEN(nTopi,0,nBottomi+1,MAXCOL(),sResti)
             ENDIF
             xRest23 := IF(nApp = 0,BRSAVESCREEN(23,0,23,MAXCOL()),NIL)
             IF nApp=-1
               nApp:=0
             ENDIF
             IF (bScrInit!=NIL) //Индивидуальная картинка
               nScrInit:=EVAL(bScrInit,nAppp)
               nScrInit:=IF(lbSayHead.AND.(VALTYPE(nScrInit)=="N".AND.nScrInit#0),2,nScrInit)
               IF nScrInit=NIL.OR.VALTYPE(nScrInit)!='N'
                 IF (VALTYPE(aHeads[1,1])=='A' )
                   nScrInit:=3
                 ELSE
                   nScrInit:=1
                 ENDIF
               ELSEIF VALTYPE(nScrInit)='N'
                 IF nScrInit=0
                   SETCOLOR(_cLastColor)
                   RestKey(aBlockKey)
                   RETURN (1)
                 ELSEIF nScrInit==2.AND.VALTYPE(aHeads[1,1])=='A'
                   nScroll := qScroll()[3] // ИЗВЛЕЧЕМ ИЗ QBROWSE
                 ENDIF
               ENDIF
             ENDIF
             nApp:=nAppp
             // Выход по K_F10
             IF(EMPTY(SETKEY(K_F10)),SETKEY(K_F10,{|oGet| oGet := GETACTIVE(),;
                IF(VALTYPE(oGet) = "O" .AND. oGet:hasFocus,;
                (IF(oGet:changed .AND. (VALTYPE(oGet:NAME) != "A" .OR. LEN(oGet:NAME) < 5 .OR. IF(VALTYPE(aIn[oGet:NAME[3]])=="A",&(oGet:NAME[1]),aIn[oGet:NAME[3]]) != oGet:NAME[5]),oGet:ASSIGN(),NIL), IF(!(VALTYPE(oGet:PostBlock)=="B".AND.!EVAL(oGet:PostBlock)), ReadKill(.T.), NIL)),NIL) }),NIL)
               IF (nApp > 0 .AND.VALTYPE(aHeads[1,1])!='A'.AND.;
                  nRow0 >= nTop .AND. nRow0<=nBottom).AND.nScrInit<3
                 Qini(nScroll,2)
               ENDIF
               // Сброс фильтра или сортировки
               IF nApp = 2
                 MyCloseFilter()
               ENDIF
               cIndexKey:=ORDKEY()
               IF (VALTYPE(aHeads[1,1])!='A' .AND. (nScrInit=1.OR.nScrInit=4))
                 IF (lSpec==NIL)
                   IF !lNoRestScreen
                     BRRESTSCREEN(sResti)
                   ENDIF
                 ELSE
                   nTopi:=nTop;nLefti:=nLeft;nBottomi:=nBottom;nRighti:=nRight
                   sResti:= BRSAVESCREEN(nTopi,0,nBottomi+1,MAXCOL(),sResti)
                   IF (lSpec=='RESTOFF')
                     SETCOLOR(COL_BROWSE)
                     @ nTopi,1 CLEAR TO nBottomi+1,MAXCOL()-1
                     SETCOLOR(COL_INPUT)
                   ENDIF
                 ENDIF
                 DO CASE
                 CASE nApp==-1
                   cStri:=' Расчет сумм '
                 CASE nApp==0
                   cStri:=' Условие фильтра '
                 CASE nApp==1
                   cStri:=' Корректировка '
                 CASE nApp==2
                   cStri:=' Новая запись '
                 ENDCASE
                 IF !lNoInt
                   SHADOWBOX(cStri,nTop,nLeft,nBottom,nRight,_cColor)
                 ENDIF
               ENDIF
               nOrd:=ORDNUMBER()
               //SETCOLOR(_cColor)
               nCo:=nTop
               IF (VALTYPE(aHeads[1,1])=='A')
                 AEVAL(aHeads,{|x|AADD(aPos,{x[1][1],x[1][2]})})
               ELSE
                 SETCOLOR(_cColor)
                 nCo++
                 IF !lNoInt  // Есть интерактив!
                   AEVAL(aHeads,;
                         {|x,Y|;
                         DEVPOS(nCo,nLeft+2),;
                         ;//z0ne
                         Y:=IF(VALTYPE(x[1])=="B",EVAL(x[1]),x[1]) ,;
                         IIF(LEN(x) >= 8 .AND. x[8]!=NIL.AND.x[8]==0,,DEVOUT(Y)),;
                         AADD(aPos,{nCo,nLeft+LEN(Y)+2}),;
                         nCo += IF(LEN(x) < 8 .OR. x[8] = NIL,1,x[8]);
                         })
                 ELSE // Нет интерактива! для импорта
                   AEVAL(aHeads,;
                         {|x,Y|;
                         y:=IF(VALTYPE(x[1])=="B",EVAL(x[1]),x[1]) ,;
                         AADD(aPos,{nCo,nLeft+LEN(Y)+2}),;
                         nCo += IF(LEN(x) < 8 .OR. x[8] = NIL,1,x[8]);
                         })
                 ENDIF // !lNoInt
                 SETCOLOR(_cLastColor)
               ENDIF
               aNameArray := {}
               IF (nApp==2)
                 AEVAL(aIn,{|x,nCo|aIn[nCo]:= IIF(lNoInt,RetValue_ForImport(nCo),RetValue(aHeads[nCo,2]))})
               ENDIF
               WHILE lMore
                 IF lNoInt
                   lMore := .F.
                 ENDIF
                 IF (nApp<2)
                   aNameArray := {}
                   nCo:=0
                   AEVAL(aIn,{|x,nCo|aIn[nCo]:= IIF(lNoInt,RetValue_ForImport(nCo),RetValue(aHeads[nCo,2]))})
                 ENDIF
                 IF (nApp<=0)
                   FOR nCo:=1 TO LEN(aIn)
                     IF !EMPTY(aHeads[nCo,2])
                       nFi:=FiNum(aHeads[nCo,2])
                       cAli:=FiAlias(aHeads[nCo,2])
                       IF (cAli)->(TYPE(aHeads[nCo,2]))=='N' .AND. IF(VALTYPE(aRef) = "A" .AND. LEN(aRef) >= nCo,EMPTY(aRef[nCo]),.T.)
                         x:=VAL(STR(0,(cAli)->(FIELDSIZE(nFi)),(cAli)->(FIELDDECI(nFi))))
                         IF nApp==0
                           aIn[nCo]:=aLastIn[nCo]:={x,x}
                         ELSE
                           aIn[nCo]:=aLastIn[nCo]:=x
                         ENDIF
                       ELSEIF (cAli)->(FIELDTYPE(nFi))=='C'
                         aIn[nCo]:=SPACE(MAX(IF(LEN(aPict)>=nCo.AND.VALTYPE(aPict[nCo])='C',;
                                         IF(LEFT(aPict[nCo],1)='@'.AND.AT(' ',aPict[nCo])#0,;
                                         LEN(SUBSTR(aPict[nCo],AT(' ',aPict[nCo])+1)),;
                                         LEN(aPict[nCo])),;
                                         0),;
                                         (cAli)->(FIELDSIZE(nFi))))
                       ELSEIF (cAli)->(TYPE(aHeads[nCo,2]))=='D'
                         x:=CTOD('  /  /  ')
                         IF nApp==0
                           aIn[nCo]:=aLastIn[nCo]:={x,x}
                         ENDIF
                       ELSEIF (cAli)->(FIELDTYPE(nFi))=='L'
                         aLastIn[nCo]:=aIn[nCo]
                         aIn[nCo]:=' ' //Подставка для фильтра
                       ELSE
                         aIn[nCo]:=aLastIn[nCo]:=BLANK(aIn[nCo],.T.)
                       ENDIF
                     ENDIF
                   NEXT
                 ENDIF
                 IF (LEN(cIndexKey) > 0)
                   xIndexKey:=&(cIndexKey)
                 ENDIF
                 NRECNO:=RECNO()
                 lWasApp:=.F. //Признак довавления записи с увеличенным номером (QHelp())
                 IF (nApp==0)
                   SCRTITUL(24,'Пустое поле:безразличный фактор <+>:Поле не пусто <->:Поле пусто')
                   SETKEY(K_CTRL_F6,{||KEYB(K_CTRL_W)})
                 ENDIF
                 cLastCol := SETCOLOR(IF(lSpec!=NIL.AND.lSpec=="REFER",COL_REF1,COL_GET))
                 lUpDated:=.F.
                 lReadExit:=READEXIT(.F.)
                 sRet:=SETKEY(K_RETURN,NIL)
                 IF EMPTY(GETLIST)
                   MyInputFrame(aPos,aRef,aGetBlock,aPict,aWhen,aValid,aHeads,lSpec,bPreGet,lGetBlock,bRestSave,@aSave)
                 ENDIF
                 lExit := .F.
                 IF nApp >= 0
                   EVAL(bPreGet,@lExit,aHeads,@lFound)
                   IF nApp>0
                     aLastIn := ACLONE(aIn)
                   ENDIF
                   lFound :=.F.
                 ENDIF
                 RunPlugIns("ДОКУМЕНТ","ВХОД",nApp,@lExit)
                 IF VALTYPE(lExit) = "L" .AND. lExit
                   EXIT
                 ENDIF
                 IF IsRunPlugIns("ДОКУМЕНТ","ПЕЧАТЬ")
                   __bStPrint := SETKEY(K_F9,{|| RunPlugIns("ДОКУМЕНТ","ПЕЧАТЬ",__bStPrint) })
                 ENDIF
                 //altD()
                 DO WHILE .T.
                   IF nApp >= 0
                     lDisplay := .T.
                     IF EMPTY(aSave[7])
                       // Начальная инициализация
                       AEVAL(GETLIST, {|oGet| IF(VALTYPE(oGet:NAME) = "A",oGet:NAME[5] := IF(oGet:NAME[4] = 0,aIn[oGet:NAME[3]],aIn[oGet:NAME[3],oGet:NAME[4]]),NIL) })
                       IF !lNoInt // для импорта! 18 января 2005 Вася
                         AEVAL(GETLIST, {|oGet| oGet:DISPLAY() })
                       ENDIF //!lNoInt
                       lDisplay := .F.
                     ENDIF
                     nPozGet := aSave[8]
                     aSave[8] := aSave[7] := NIL
                     IF nPozGet != NIL
                       nPoz := nPozGet-1
                       IF ASCAN(GETLIST,{|oGet| nPoz++,(oGet:preBlock=NIL.OR. EVAL(oGet:preBlock, @oGet)).AND.(nPozGet := nPoz,.T.) },nPozGet) = 0
                         nPoz := 0
                         IF ASCAN(GETLIST,{|oGet| nPoz++,oGet := GETLIST[nPozGet-nPoz+1],EVAL(oGet:preBlock, @oGet).AND.(nPozGet := nPozGet-nPoz+1,.T.) },1,nPozGet) = 0
                           nPozGet := NIL
                         ENDIF
                       ENDIF
                     ENDIF
                     IF lNoInt // для импорта!
                       EmulateRead(GETLIST,aRef)
                     ELSE
                       SETCURSOR(1); READMODAL(GETLIST,nPozGet) ;   SETCURSOR(0)
                     ENDIF
                     IF !EMPTY(aSave[7])
                       LOOP
                     ENDIF
                     IF (nApp>0)
                       lUpDated := IIF(lNoInt,.T.,GetUpdateIn(aIn,aLastIn) ) //и это тоже для импорта
                     ENDIF
                   ENDIF
                   //altD()
                   nLastKey := LASTKEY()
                   IF lUpDated .AND. nLastKey = K_ESC .AND.;
                      (lNoInt.OR.(!lNoInt.AND.;
                      IF(cMessSave = NIL,YESORNO({" Сохранить изменения? " },.T.,,,14,,COL_REFER),YESORNO(cMessSave,.T.,' Да ',' Нет ',10)) ))
                     SETLASTKEY(K_F10)
                   ELSE
                     SETLASTKEY(nLastKey)
                   ENDIF
                   // Выпустим, только при выполнение
                   IF EVAL( bPostRead, lUpDated, LASTKEY())
                     EXIT
                   ELSE // Если это не выполнено
                     IF lNoInt // и нет интерактива (то есть когда есть импорт)
                       // то надо какой-то след оставить что, дескать, все приехали!
                       SAYERROR("Ошибка при вводе данных!")
                       EXIT
                     ENDIF
                   ENDIF
                   IF IsRunPlugIns("ДОКУМЕНТ","ВЫХОД_ПЕРЕД_СОХРАНЕНИЕМ") .AND. RunPlugIns("ДОКУМЕНТ","ВЫХОД_ПЕРЕД_СОХРАНЕНИЕМ",nApp,lUpDated,LASTKEY())
                     EXIT
                   ELSE // Если это не выполнено
                     IF lNoInt // и нет интерактива (то есть когда есть импорт)
                       // то надо какой-то след оставить что, дескать, все приехали!
                       SAYERROR("Ошибка при вводе данных! (plugins)")
                       EXIT
                     ENDIF
                   ENDIF
                 ENDDO
                 SETKEY(K_RETURN,sRet)
                 SETCOLOR(cLastCol)
                 READEXIT(lReadExit)
                 statCod:=.T.
                 lSaveFlagArray := .F.
                 IF (LASTKEY()==K_ESC .OR. nApp<=0)
                   SETKEY(K_ESC,NIL)
                   lMore := .F.
                   IF (lWasApp)
                     xDELETE();lWasApp:=.F.;GO NRECNO
                   ENDIF
                   IF nApp==-1
                     sRestS := BRSAVESCREEN()
                     SCRTITUL(24,'Esc:Прервать' )
                     nWin1:=NOORYES( {'','Суммирование [ ]',''},,,10,35,COL_REFER )
                     lYes := INDIK_NEW(13,53)
                     nCo:=x:=0
                     GO NRECNO
                     GO TOP
                     AEVAL(aHeads,{|Y| ASIZE(Y,MAX(LEN(Y),3)),IF(VALTYPE(Y[3]) != "B",Y[3] := &("{||"+Y[2]+"}"),NIL) })
                     WHILE !EOF()
                       x++;nCo++
                       IF nCo=10.AND.(nCo:=0)=0
                         INDIK_UPDATE(lYes)
                       ENDIF
                       AEVAL(aHeads,{|Y,j| aIn[j] += EVAL(Y[3]) })
                       IF INKEY()=K_ESC
                         EXIT
                       ENDIF
                       SKIP
                     ENDDO
                     GO NRECNO
                     INDIK_END(lYes)
                     BrRestScreeen(sRestS)
                     IF LASTKEY()!=K_ESC
                       FOR nCo:=1 TO LEN(aIn)
                         @ aPos[nCo,1],aPos[nCo,2] SAY aIn[nCo] PICTURE SummaPic(3,19) COLOR COL_HEADR
                       NEXT
                       SCRTITUL(24,'Итого записей : '+;
                                ALLTRIM(STR(x))+'. Для продолжения нажмите любую клавишу...')
                       INKEY(0)
                     ENDIF
                     SETLASTKEY(K_ESC)
                     WSELECT(nWin1)
                     WCLOSE()
                     WSELECT(nWi)
                   ENDIF
                   EVAL(bPostGet,lSaveFlagArray,lUpDated)   // Пеpедает влоку кода флаг выполнения bPost и флаг изменения
                   LOOP
                 ELSEIF (nApp==2 .OR. (nApp==1 .AND. lUpDated))
                   IF (nUnique != NIL .AND. nUnique > 0)
                     SET FILTER TO
                     SETSCOPE()
                     ORDSETFOCUS(TOP_TAG(nTag))
                     nBakRec:=RECNO()
                     lFound:=DBSEEK(&(FiIn(INDEXKEY(),aHeads)))
                     SETSCOPE(aScope)
                     IF !EMPTY(currFilter)
                       DBSETFILTER(&("{||"+currFilter+"}"),currFilter)
                     ENDIF
                     ORDSETFOCUS(nOrd)
                     IF ((nApp==2.AND.lFound.AND.!(RECNO()=nBakRec.AND.lWasApp)) .OR.;
                        (lFound .AND. nApp==1 .AND. RECNO()!=nBakRec))
                       GO nBakRec
                       IF (lWasApp)
                         xDELETE();lWasApp:=.F.;GO NRECNO
                       ENDIF
                       IF (nUnique == 1 .AND. !YESORNO(' Запись с таким ключом уже введена ',.F.,' Ввод ',' Отмена ',10) )
                       ELSE
                         SAYERROR(' Запись с таким ключом уже введена ')
                       ENDIF
                       // Изменение 3.120
                       EVAL(bPostGet,lSaveFlagArray,lUpDated)   // Пеpедает влоку кода флаг выполнения bPost и флаг изменения
                       lFound := .T.
                       LOOP
                     ELSE
                       GO nBakRec
                       lFound := .F.
                     ENDIF
                   ENDIF
                   IF (!lRefer .AND.nApp==2 .AND. !( LASTKEY() = K_F10 .OR. IIF(lNoInt, EMPTY(__HiddenError) ,YESORNO(' Ввести новую '+;
                      'запись? ',.T.,' Ввод ',' Отмена ',10))))
                     statCod:=NIL
                     IF (lWasApp)
                       xDELETE();lWasApp:=.F.;GO NRECNO
                     ENDIF
                     EVAL(bPostGet,lSaveFlagArray,lUpDated)
                     LOOP
                   ENDIF
                 ENDIF
                 IF ((lBlock:=IF(nApp==2.AND.!lWasApp .AND.!lNoAppend,ADDREC(),RECLOCK())) .AND.;
                    ((nApp==1 .AND. (lUpDated .OR. lNoAppend)) .OR. nApp==2))
                   // qSave надо делать аккуратно! Вася 18 января 2005.
                   IF !lNoInt.OR.(lNoInt.AND.EMPTY(__HiddenError))
                     qSave( aHeads, @bPost ) // Это когда все по человечески и нет никакого импорта - то все просто так.
                     // а если есть импорт - то сохранение только в случае пустого HiddenError
                   ENDIF
                   RunPlugIns("ДОКУМЕНТ","ВЫХОД_ПОСЛЕ_СОХРАНЕНИЯ",nApp)
                   lSaveFlagArray := .T.
                   //SETCOLOR(_cLastColor)
                   IF (!lRefer .AND. VALTYPE(aHeads[1,1])!='A'.AND.nScrInit!=4).OR.nScrInit=2
                     IF (LEN(cIndexKey) > 0)
                       IF (nApp>=2.OR.xIndexKey != &(cIndexKey))
                         Qini(nScroll,2) //nMode=2 - Обновить все строки
                       ELSEIF (LASTKEY()!=K_PGDN .AND. LASTKEY()!=K_PGUP)
                         Qini(nScroll,IF(lbSayHead,2,3)) // nMode=3 - Обновить одну строку
                       ENDIF
                     ELSEIF (LASTKEY()!=K_PGDN .AND. LASTKEY()!=K_PGUP)
                       Qini(nScroll,IF(lbSayHead,2,3))
                     ENDIF
                   ELSEIF (lRefer)
                     lMore:=.F.
                   ENDIF
                   //SETCOLOR(_cColor)
                 ELSEIF !lBlock
                   Error_Lock()
                   lMore := .F.
                 ENDIF
                 UNLOCK ALL
                 _nMore := 1
                 IF (xExit := EVAL(bPostGet,lSaveFlagArray,lUpDated,@_nMore),VALTYPE(xExit) = "L") .AND. !xExit
                   IF nApp = 2 // т.к. в повторный запуск редактирования запись уже создана
                     lSkipApp := .T.
                     nApp := 1
                   ENDIF
                   LOOP
                 ELSEIF lSkipApp   // восстановим пред. режим - для циклического ввода
                   lSkipApp := .F.
                   nApp := 2
                 ENDIF
                 IF VALTYPE(_nMore) = "N" .AND. _nMore = -1
                   lMore := .F.
                 ENDIF
                 IF (nApp == 1)
                   IF (VALTYPE(aHeads[1,1])!='A') //.And.nRow0 >= nTop .And. nRow0<=nBottom)
                     SETCOLOR(_cColor)
                     @ nBottom,nLeft+2 SAY SYM15
                     SETCOLOR(_cLastColor)
                   ENDIF
                   DO CASE
                   CASE (LASTKEY() == K_RETURN .OR. LASTKEY() == K_F10)
                     lMore:=.F.
                   CASE (LASTKEY() == K_PGUP)
                     IF (VALTYPE(aHeads[1,1])!='A'.AND.nScrInit!=4).OR.nScrInit=2
                       IF !QUp(nScroll)
                         IF VALTYPE(aHeads[1,1])!='A'
                           SETCOLOR(_cColor)
                           @ nBottom,nLeft+2 SAY ' Начало базы '
                           SETCOLOR(_cLastColor)
                         ENDIF
                       ENDIF
                     ELSE
                       SKIP -1
                     ENDIF
                   CASE (LASTKEY() == K_PGDN)
                     IF (VALTYPE(aHeads[1,1])!='A'.AND.nScrInit!=4).OR.nScrInit=2
                       IF !QDown(nScroll)
                         IF VALTYPE(aHeads[1,1])!='A'
                           SETCOLOR(_cColor)
                           @ nBottom,nLeft+2 SAY ' Конец базы '
                           SETCOLOR(_cLastColor)
                         ENDIF
                       ENDIF
                     ELSE
                       SKIP
                       IF EOF()
                         SKIP-1
                       ENDIF
                     ENDIF
                   ENDCASE
                 ENDIF
               ENDDO
               GETLIST := {}
               UNLOCK ALL
               WSELECT(nWi)
               IF (nApp==0)
                 DO CASE
                 CASE (LASTKEY()==K_CTRL_W)
                   QSetFilter(aHeads,,"Снять")
                 CASE (LASTKEY()!=K_ESC)
                   BRRESTSCREEN(sRest)
                   QSetFilter(aHeads,cFltr0,,,,cScope,,,,lSubIndex,@xRest23)
                 ENDCASE
               ENDIF
               IF nTopi!=NIL.AND.nBottomi!=NIL .AND. !lNoRestScreen
                 BRRESTSCREEN(sResti)
               ENDIF
               IF !lNoRestScreen
                 BRRESTSCREEN(sRest)
               ENDIF
               IF xRest23 != NIL
                 BRRESTSCREEN(xRest23)
               ENDIF
               SETCOLOR(_cLastColor)
               RestKey(aBlockKey)
               statCod:=NIL
               IF bScrPost!=NIL
                 EVAL(bScrPost)
               ENDIF
               COMMIT
               aNameArray := {}
               sResti:=sRestii
               RETURN (2)