NControlMem

 //----------------------------------------------------------------------------//

 FUNCTION NControlMem(xKey,cPre,cAlias,lDel)
   //----------------------------------------------------------------------------//
   // Отмена сгенерированного значения NWDOC()
   // xKey - значение ключа для идентификации раздела  !!!
   // [cPre] - префикс для идентификации данного типа генерации в пределах текущего
   //        сеанса выполнения АРМ'а
   // [cAlias] - алиас для доступа к счетчикам. По умолчанию MEMDAT.
   // [lDel] - очистка счетчика
   // ВНИМАНИЕ !! Требует открытой базы с алиасом cAlias с полями :
   //             IDENT C 50, VALUE C 50, LEN N 2 0
   //             проиндексированной по UPPER(IDENT)
   // Смотри: NWDOC(), NVDOC()
   LOCAL cIdent := UPPER(cPre+IF(xKey=NIL,"",xKey))
   LOCAL cNum0:=pNextNum,cFile, lBottom, nRec := RECNO()
   xKey:=IF(xKey==NIL,'',xKey)
   cPre:=IF(cPre=NIL,"",cPre)
   IF(VALTYPE(cAlias) = "C",,cAlias := "MEMDAT")
     IF (cAlias)->(DBSEEK(PADR(cIdent,LEN((cAlias)->IDENT))))
       IF (cAlias)->TYPE = "C"
         pNextNum := LEFT((cAlias)->VALUE,(cAlias)->LEN)
       ELSEIF (cAlias)->TYPE = "D"
         pNextNum := CTOD((cAlias)->VALUE)
       ENDIF
     ENDIF
     IF pNextNum=cNum0
       pNextNum:= pLastNum
       IF (cAlias)->(EOF() .AND. AddRec()) .OR. (cAlias)->(RecLock())
         IF EMPTY(lDel) .AND. VALTYPE(XTOC(pNextNum)) = "C"
           (cAlias)->VALUE := XTOC(pNextNum)
           (cAlias)->LEN := LEN(XTOC(pNextNum))
           (cAlias)->IDENT := cIdent
           (cAlias)->TYPE := VALTYPE(pNextNum)
           (cAlias)->(DBUNLOCK())
         ELSEIF !EMPTY(lDel).OR.(dbPush(),DBGOBOTTOM(),lBottom := (nRec = RECNO()),dbPop(),lBottom)
           (cAlias)->VALUE := BLANK((cAlias)->VALUE,.T.)
         ENDIF
       ENDIF
     ENDIF
     RETURN(NIL)