GenPro

 FUNCTION GenPro( dDat1, dDat2, nMode, nMode1, lPriS0, lPereMbp, aDoc, lOnly, lAct)
   #DEFINE VIDTYPE IF(m->plAct, Status+"$", Vid+TYPE)
   //nMode=2 - все проводки, 1 - отложенные
   //nMode1=1 - запись в главную книгу, 2 - в буфер MProBuf
   //lPris0   - если присутствует, то обрабатываются только проводки c S0
   //lSpisMbp - перерасчитывать ведомости списания МБП
   //aDoc - массив документов {UPPER(Sclad+Vid+Type+CodeDoc+NumDoc)}
   //lOnly - только новые проводки
   //lAct - Проводки по актам переоценки (только для "розницы", обязательно aDoc)
   LOCAL cSDoc:= IF(EMPTY(lAct), "MDoc", "MPere")
   LOCAL nArea := SELECT()
   LOCAL nSumma, aMat, aPro, aPrePro, i, nSum, nDoc := 1
   LOCAL nWin      := WSELECT()
   LOCAL nWin1     := NoOrYes( {'','Генерация проводок   [ ]',''},,,15,35,COL_REFER )
   LOCAL lYes      := INDIK_NEW(18,61)
   LOCAL aBase     := {'MAIN','VALUTA','SPR_PART','S45','S45M','KALK','KALK_S',;
         {"SSH_FACT",LoadPath()+"REAL\SH_FACT.DBF"},{"SSH_OP",LoadPath()+"REAL\SH_OP.DBF"},{"SH_FACT",LoadPath()+"TOVAR\SH_FACT.DBF"},{"SH_OP",LoadPath()+"TOVAR\SH_OP.DBF"},"SPR_NDS";
         }
   LOCAL cVid:=m->pVid,cType:=m->pType,cSclad:=m->pSclad
   LOCAL nRec1:=MCodOp->(RECNO())
   PRIVATE pSclad:=cSclad,pType:=cType,pVid:=cVid,pCodeDoc,pNumDoc
   PRIVATE pAgentCode,pDate,DEF_TSUM,TZR1,TZR2,TZR3,pCodeVal,pCenaVal,pPrim,CURS,FLAG := .T.
   PRIVATE SP,SPV,SPP,SPPV,S,SV,S0,Q0,NI,NDS,CSH,SFN,PA,TP,TN,EU,TZR1M,TZR2M,TZR3M,TZR1MN,TZR2MN,TZR3MN,DOP1,DOP2,DOP3,PP1,PP2,R,MEM_MODEL,DEF_PCENA0,SNal
   PRIVATE SPV0,S_NEW,S_OLD,C_NEW,C_OLD, OCN1,OCN2,OCN3,OCN4,OCV1,OCV2,OCV3,OCV4,CenSpCon
   PRIVATE _SUM_OUT_DOC
   PRIVATE pVidType  := IF( GlobalTask == '03', '23', '26' )
   PRIVATE pVidType1 := IF( GlobalTask == '03', '52', '53' )
   PRIVATE plAct
   PRIVATE pOrder   // заказы закупок victor
   PRIVATE nIzn_All, nIzn_AllN, pA_Grup, dPereoc_D, cSchetZM, cSchetZMN, cZCodeM, cZCodeMN,lLinMet:=.F.,lLinMetN:=.F.    // victor спецодежда
   plAct:= IF(lAct==NIL, lAct:= .F., lAct)
   IF VALTYPE(aDoc)=="C"
     aDoc:={aDoc}
   ENDIF
   IF VALTYPE(aDoc)=="A"
     FOR i:=1 TO LEN(aDoc)
       aDoc[i]:=UPPER(aDoc[i])
     NEXT
   ENDIF
   BEGIN SEQUENCE
   (cSDoc)->(DbPush())
   MDocM->(DbPush())
   (cSDoc)->( ORDSETFOCUS( IF( aDoc == NIL, 'MDoc_Dat', IF(EMPTY(lAct),'MDoc', 'TAG_NOM') ) ) )
   MDocM->( ORDSETFOCUS( 'MDocM') )
   dbOpenBases(aBase,,,,.T.)
   KALK->(ORDSETFOCUS("TAG_OPER"))
   KALK_S->(ORDSETFOCUS("TAG_NNOPER"))
   SH_OP->(ORDSETFOCUS("TAG_OPER"))
   SPR_PART->( ORDSETFOCUS("TAG_NUM") )
   MAIN->( ORDSETFOCUS('Tag_NNOper') )
   VALUTA->( ORDSETFOCUS('CODE') )
   SH_OP->(ORDSETFOCUS("TAG_OPER"))
   SPR_NDS->(ORDSETFOCUS("TAG_OPER"))
   SH_FACT->(ORDSETFOCUS("TAG_OPER"))
   SSH_OP->(ORDSETFOCUS("TAG_OPER"))
   SSH_FACT->(ORDSETFOCUS("TAG_OPER"))
   SELECT MDocM
   SET RELATION TO;
       UPPER(Grup+NNum) INTO MLabel,;
       UPPER(Grup) INTO MGrup,;
       UPPER(CodeVal) INTO Valuta,;
       UPPER(Schet) INTO MSchet,;
       UPPER(Sclad+Grup) INTO MStru,;
       UPPER(Grup+NNum+Partia) INTO SPR_PART
   SELECT (cSDoc)
   IF nMode1 = 1
     SET RELATION TO UPPER( VIDTYPE + CodeOper ) INTO MCodOp,;
         Pro                         INTO Main,;
         UPPER( VIDTYPE )            INTO Moves
   ELSE
     SET RELATION TO UPPER( VIDTYPE + CodeOper ) INTO MCodOp,;
         UPPER( VIDTYPE )            INTO Moves
   ENDIF
   IF aDoc == NIL
     DBSEEK( DTOS( dDat1 ), .T. )
   ENDIF
   // Суммы для накопления в заголовке документа
   IF IS_MODEL
     InitSumModel(@aSumModel)
   ENDIF
   WHILE ( aDoc == NIL .AND. DATE <= dDat2 .AND. !EOF() ).OR.;
         ( aDoc != NIL .AND. nDoc <= LEN( aDoc ) )
     IF aDoc!=NIL
       DBSEEK( IF(lAct, SUBSTR(aDoc[ nDoc++ ],-6,6), aDoc[ nDoc++ ]) )
       IF lAct.AND.(cSDoc)->PRO<1
         (cSDoc)->(RecLock())
         (cSDoc)->PRO:= Main->(StepPlus())
         (cSDoc)->(DBUNLOCK())
       ENDIF
     ENDIF
     INDIK_UPDATE(lYes)
     IF !( !lAct .AND. TYPE == '9' .AND. EMPTY( Date1 ) ) .AND. (;
        ( nMode = 2 .OR. ( nMode = 1 .AND. MCodOp->Status = 1 ) .OR.;
        ( lPriS0 != NIL .AND. ( (IF(lAct,(cSDoc)->Status,Vid ) = '2') .OR.;
        !Moves->YesSeb .OR. (Vid+TYPE)=="1#" ) ) ) )
       pDate      := DATE
       pVid       := IF(lAct, (cSDoc)->Status, Vid)
       pSclad     := IF(lAct, SUBSTR(aDoc[nDoc-1],1,6), Sclad)
       pType      := IF(lAct, "$", TYPE)
       pModel     := IF(lAct,pModel,Model)
       pCodeDoc   := IF(lAct, SPACE(3), CodeDoc)
       pNumDoc    := IF(lAct, SUBSTR(aDoc[nDoc-1],-6,6), NumDoc)
       pAgentCode := IF(lAct, SPACE(6), AgentCode)
       pAgentCod1 := IF(lAct, SPACE(6), AgentCod1)
       pCodeVal   := IF(lAct, GLOBALVALUTA, CodeVal)
       pCenaVal   := IF(lAct, 1, CenaVal)
       pPrim      := IF(lAct, PADR(FIELD->Name,37), PRIM)
       pOrder      := IF(lAct, SPACE(6), FIELD->ORDER)   // заказы закупок victor
       aPrePro    := MakePrePro()
       SELECT MDocM
       DBSEEK(MDoc->( UPPER( pSclad + pVid + pType + pCodeDoc + pNumDoc ) ) )
       DOC_FLAG
       DOC_TSUM
       aMat := {{}}
       nSum := nSumma := 0
       WHILE ( UPPER( IF(lAct,"",Sclad) + Vid + TYPE + CodeDoc + NumDoc ) ==;
             UPPER( IF(lAct,"",pSclad) + pVid + pType + pCodeDoc + pNumDoc ) .AND. !EOF())
         INDIK_UPDATE(lYes)
         IF MSchet->Uchet=='1'
           m->S0:=__CENA*MDocM->Kol
         ELSE
           m->S0:=MDocM->SUM
         ENDIF
         m->ST:=MLabel->Koef
         m->ST1:=MLabel->Koef1
         m->OCN1 := __RLABEL->OCENA1
         m->OCN2 := __RLABEL->OCENA2
         m->OCN3 := __RLABEL->OCENA3
         m->OCN4 := __RLABEL->OCENA4
         m->OCV1 := __RLABEL->VCENA1
         m->OCV2 := __RLABEL->VCENA2
         m->OCV3 := __RLABEL->VCENA3
         m->OCV4 := __RLABEL->VCENA4
         m->CenSpCon := GetCenSpCon()
         m->CURS:= pCENAVAL
         m->Q0:= IF(MDocM->TYPE=="$",MDocM->Kol0,MDocM->Kol)
         m->Q_BR:= MDocM->KOLBR
         m->Q_NED:= MDocM->KOLNED
         m->SP:=MDocM->SUMOUTR
         m->SNal:=MDocM->SUMN
         m->SPV:=MDocM->SUMOUT
         m->SPP:=SPR_PART->CENA_P
         m->SPPV:=SPR_PART->CENA_P_V
         m->SPV0:=SPR_PART->CENA_F_V
         IF MDocM->TYPE=="$"
           m->S_NEW:= MDocM->Cena0+IF(MDocM->Vid=='1',1,-1)*(MDocM->SUM/Q0)*Q0
           m->S_OLD:= MDocM->Cena0*Q0
           m->C_NEW:= MDocM->Cena0+IF(MDocM->Vid=='1',1,-1)*(MDocM->SUM/Q0)
           m->C_OLD:= MDocM->Cena0
         ENDIF
         m->S:=MDocM->SUMFACT
         m->SV:=MDocM->SUMOUT
         m->NI:=MDocM->IZNOS
         m->NDS:=MDocM->NDS
         m->CSH:=MDocM->CSH
         m->SFN:=MDocM->SFN
         DOC_MODEL
         DEF_DOC_CENA0
         m->PA:=MDocM->PA
         m->TP:=MDocM->TP
         m->TN:=MDocM->TN
         m->EU:=MDocM->EU
         m->DOP1:=MDocM->DOP1
         m->DOP2:=MDocM->DOP2
         m->DOP3:=MDocM->DOP3
         m->TZR1M:=m->TZR1:=MDocM->TZR1M
         m->TZR2M:=m->TZR2:=MDocM->TZR2M
         m->TZR3M:=m->TZR3:=MDocM->TZR3M
         m->TZR1MN:=MDocM->TZR1MN
         m->TZR2MN:=MDocM->TZR2MN
         m->TZR3MN:=MDocM->TZR3MN
         m->PP1:=MDocM->PP1
         m->PP2:=MDocM->PP2
         m->pA_Grup:=MDocM->A_Grup    // victor спецодежда  10
         m->nIzn_All:=MDocM->Izn_All
         m->nIzn_AllN:=MDocM->Izn_AllN
         m->dPereoc_D:=MDocM->Pereoc_D
         IF GlobalTask $ '09ZR'
           m->cSchetZM:=MDocM->SchetZM
           m->cSchetZMN:=MDocM->SchetZMN
           m->cZCodeM:=MDocM->ZCodeM
           m->cZCodeMN:=MDocM->ZCodeMN
           m->lLinMet:=LinMetod(MDocM->PERIOD,,,MDocm->DATE)
           m->lLinMetN:=LinMetod(MDocM->PERIOD,'nal',MDocM->Cena0N,MDocm->DATE)
         ENDIF
         m->R:=MDocM->R
         IF(LEN(aMat[LEN(aMat)])>999,AADD(aMat,{}),) // (aMat{{}})
           AADD(aMat[LEN(aMat)],;
                MakeMat(IF(MDocM->TYPE=="$",Kol0,KolOut),Ed1,IF(MDocM->TYPE=="$",Kol0,Kol),CenaOut,Ed2,;
                SumOut,SumOutR,SumFact,SUM,Iznos,;
                Period,MLabel->Ed,Schet,Kol1,CodeDoc1,;
                NumDoc1,Sclad1,Kol2,KolBr,KolNed,;
                Oper_Fact,0,,,Date1,;
                ,MDocM->SumN))
           nSumma+=SumFact
           nSum+=IF(Vid='2'.OR.!Moves->YesSeb,SUM,SumOutR)
           SKIP
           DO WHILE lAct.AND.;
              (EOF().OR.UPPER(Vid+TYPE+CodeDoc+NumDoc)!=UPPER(pVid+pType+pCodeDoc+pNumDoc)).AND.;
              nDoc<=LEN(aDoc).AND.SUBSTR(aDoc[nDoc],-6,6)==pNumDoc.AND.;
              (pSclad:= SUBSTR(aDoc[nDoc],1,6), nDoc++, !DBSEEK(aDoc[nDoc-1]))
             // Неоходимо для нагонки в aMat[{}] строк по акту переоценки
             // по всем складам.
           ENDDO
         ENDDO
         aPro := AddPro({},aMat,lPriS0,aPrePro)
         IF !lAct.AND.lPriS0!=NIL.AND.MDOC->(RecLock())
           IF TYPE("pModel")=="U"
             PRIVATE pModel
           ENDIF
           pModel:= MDOC->Model  // !!!!!!!!!!!! Не убирать
           SaveSumFact()
           MDOC->(DBUNLOCK())
         ENDIF
         WritePro1(nMode,nMode1,aPro,(cSDoc)->Pro,lPriS0,,lOnly,lAct)
       ENDIF
       SELECT (cSDoc)
       IF aDoc==NIL
         SKIP
       ENDIF
     ENDDO
     //Списание товаров отгруженных
     MDocM->( ORDSETFOCUS('MDocM_W') )
     SELECT S45M
     SET RELATION TO UPPER(Sclad+pVidType+CodeDoc1+NumDoc1+Grup+NNum+Partia+Schet_A+AgentCode+IF(GlobalTask=="09",STR(FIELD->NumMbp,17,0)+DTOS(DATE),"")) INTO MDocM
     SELECT S45 // Здесь возможен и "54"
     IF nMode1 = 1
       SET RELATION TO Pro                           INTO Main,;
           UPPER( IF(GlobalTask=="09".AND.!EMPTY(Vid),"54",pVidType1) + CodeOper ) INTO MCodOp
     ELSE
       SET RELATION TO UPPER( IF(GlobalTask=="09".AND.!EMPTY(Vid),"54",pVidType1) + CodeOper ) INTO MCodOp
     ENDIF
     //  IF lPris0 # NIL .AND. GlobalTask == "09"
     //    OrdSetFocus(0)
     //    DbGoTop()
     //  ELSE
     DBSEEK( DTOS( dDat1 ), .T. )
     //  ENDIF
     /*IF lPris0 == NIL
     DbSeek( Dtos( dDat1 ), .T. )
     ELSE
     if( GlobalTask == "09", OrdSetFocus(0), NIL )
     DbGoTop()
     ENDIF */
     //   WHILE ( lPris0 != NIL .OR. ( lPris0 == NIL .AND. Date <= dDat2 ) ) .AND. !EOF()
     WHILE ( /*(lPris0 != NIL.AND. GlobalTask == "09") .OR.*/ ( DATE <= dDat2 ) ) .AND. !EOF()
       INDIK_UPDATE(lYes)
       pDate    := DATE
       pVid     := LEFT( pVidType1, 1 )
       pType    := RIGHT( pVidType1, 1 )
       pSclad   := SPACE(6)
       pCodeDoc := SPACE(3)
       pNumDoc  := NumDoc
       m->SNal  := 0
       SELECT S45M
       pCodeVal := CodeVal
       pCenaVal := CenaVal
       IF GlobalTask == "09"
         SetScope( 'UPPER(Vid+NumDoc)', UPPER( S45->(Vid+NumDoc) ) )
       ELSE
         SetScope( 'UPPER(NumDoc)', UPPER( S45->NumDoc ) )
       ENDIF
       aPro     := AddInsM( 'Только проводки', lPriS0, lPereMbp, IF( lPris0 != NIL, 2, nMode ) )
       SELECT S45
       IF nMode = 2 .OR. ( nMode = 1 .AND. MCodOp->Status = 1 )
         WritePro1( nMode, nMode1, aPro, S45->Pro, lPriS0, 'l45', lOnly, lAct)
       ENDIF
       DBSKIP()
     ENDDO
     IF GlobalTask $ '09ZR'
       ORDSETFOCUS('S45_D_M')
       DBSEEK( DTOS( dDat1 ), .T. )
       WHILE ( /*(lPris0 != NIL.AND. GlobalTask == "09") .OR.*/ ( DATE <= dDat2 ) ) .AND. !EOF()
         INDIK_UPDATE(lYes)
         pDate    := DATE
         pVid     := LEFT( pVidType1, 1 )
         pType    := RIGHT( pVidType1, 1 )
         pSclad   := SPACE(6)
         pCodeDoc := SPACE(3)
         pNumDoc  := NumDoc
         m->SNal  := 0
         SELECT S45M
         pCodeVal := CodeVal
         pCenaVal := CenaVal
         IF GlobalTask == "09"
           SetScope( 'UPPER(Vid+NumDoc)', UPPER( S45->(Vid+NumDoc) ) )
         ELSE
           SetScope( 'UPPER(NumDoc)', UPPER( S45->NumDoc ) )
         ENDIF
         aPro     := AddInsM( 'Только проводки', lPriS0, lPereMbp, IF( lPris0 != NIL, 2, nMode ) )
         SELECT S45
         IF nMode = 2 .OR. ( nMode = 1 .AND. MCodOp->Status = 1 )
           WritePro1( nMode, nMode1, aPro, S45->Pro, lPriS0, 'l45', lOnly, lAct)
         ENDIF
         DBSKIP()
       ENDDO
     ENDIF
     END SEQUENCE
   MDocM->(DbPop())
   (cSDoc)->(DbPop())
   dbCloseBases(aBase)
   INDIK_END(lYes)
   WSELECT(nWin1)
   WCLOSE()
   WSELECT(nWin)
   SELECT(nArea)
   COMMIT
   IF lPereMbp != NIL
     GenSumFact( dDat1, dDat2, 'OnlySpisMbp' )
   ENDIF
   MCodOp->(DBGOTO(nRec1))
   RETURN NIL