************
*
* Программа..:  Analiz -  Учет запасов на складе
* Имя файла..:  A_Analiz.Prg
* Назначение.:  Графический анализ данных
*
******

// Copyright (c) 1993-2005 "Компания БЭСТ". Все права сохраняются.

#INCLUDE "sc_all.ch"
#INCLUDE "task.ch"
#INCLUDE "s_refer.ch"
#INCLUDE "s_field.ch"
#INCLUDE "inkey.ch"

#define xlCenter    -4108
#define xlPie 5
#define xlColumnClustered 51

#define xlColumns 2
#define xlLocationAsNewSheet 1
#define xlNone -4142 


#define xlPrimary 1

#define xlCategory 1
#define xlValue 2
#define xlSeriesAxis 3
#define xlCategoryScale 2

#define xlDataLabelsShowLabelAndPercent 5



#DEFINE __CENA__   IF(MSCHET->XRAN != '1' .OR. MSCHET->METOD = '3',IF(EMPTY(Partia),MLABEL->Cena,0), SPR_PART->CENA_F)
#DEFINE __CENA0__  IF(MSCHET->XRAN != '1' .OR. MSCHET->METOD = '3',IF(EMPTY(Partia),MLABEL->Cena0,0),SPR_PART->CENA_F)










STATIC oApp,oAs



FUNCTION Anal(n,n2)
LOCAL n3:=1,n4:=1,n5:=1,a,aDiag:={},i
LOCAL sRest:=SAVESCREEN()
LOCAL cTemp :=TEMPFILE(PATH_TMP,'DBF')
LOCAL cTemp2 :=TEMPFILE(PATH_TMP,'DBF')
LOCAL cTempi :=TEMPFILE(PATH_TMP,'IDX')
LOCAL aFilterKey,cText:='',cFilter,cHead,cComment,cField,cEd
LOCAL cHelp_Code:=HELP_CODE
//LOCAL aExpTrue:={0,0,0,0,0,0,0,0,0,0,0}
//LOCAL aExpPrc:={0,0,0,0,0,0,0,0,0,0,0}



PRIVATE Priznak:=' ',;
        lYesBarCode := .f.  
RestPar('MLab')
RestPar('Nak')
RestPar('Ana')
RestPar('SPri')
RestPar('Pric')
RestPar('Sebe')

Moves->(ORDSETFOCUS(2))
HELP_CODE:='1'
ScrTitul(24,' ')
OpenBase({'MDoc','MDocM','MGrup','MLabel','MSclad','MCodOp','MKart','MSchet','Valuta',;
"spr_dop","spr_part"})
SELECT Plan
MakeSchetRefer('Plan1','aIn0[30]',2)
MakeSchetRefer('PlanR','aIn0[50]',2)
MakeSchetRefer('Plan','aIn0[3]',2)
SELECT Analit
SAnalit('Analit','aIn0[31]',3,,'NoInput')
SAnalit('AnalitR','aIn0[51]',3,,'NoInput')
SELECT MSclad
MakeScladRefer('MSclad','aIn0[1]',3)
MakeScladRefer('MSclad1','aIn0[1]',1) //Для подстановки при задании перемещений
MakeScladRefer('MSclad2','aIn0[34]',2) //Для подстановки при задании перемещений

SPR_DOP->(SprDop("_Marka",3,,"aIn0[35]","1",Marka_[1]))
SPR_DOP->(SprDop("_Sort",3,,"aIn0[36]","4",Sort_[1]))
SPR_DOP->(SprDop("_Profil",3,,"aIn0[37]","3",Profil_[1]))
SPR_DOP->(SprDop("_Razmer",3,,"aIn0[38]","2",Razmer_[1]))



SELECT MGrup
MakeGrupRefer('MGrup','aIn0[4]',3)

GO TOP
SELECT MLabel
MakeLabelLRefer('MLabel',,,5,3,'aIn0[4]','aIn0[5]')
SELECT MKart
SET FILTER TO


SPR_PART->(ORDSETFOCUS("TAG_NUM"))



SELECT MDoc
ORDSETFOCUS(2)
SET RELATION TO UPPER(CodeVal) INTO Valuta ADDITIVE
SELECT MDocM
SET ORDER TO 4
SET RELATION TO UPPER(Grup)    INTO MGrup,;
                UPPER(Grup+NNum)   INTO MLabel,;
                UPPER(Grup+NNum)   INTO MKart
                

DO CASE
   CASE (n==1) //Остатки
   SELECT MKart

   SET RELATION ;
   TO UPPER(Grup+NNum) INTO MLabel,;
   TO UPPER(Grup+NNum+Partia) INTO SPR_PART,;
   TO UPPER(SCHET) INTO MSCHET

   DO CASE
      CASE n2==1   //По складам
      aFilterKey:=ReportFrame("Остатки по складам",(a:={1,3,4,5,35,36,37,38,22,24}),.T.)
      n3:=aFilterKey[2,1] //1-текущие,2-на нач.периода
      n5:=aFilterKey[2,9] //1-без резерва,2-с резервом
      cComment:='MSclad->ShortName'
      cText:='складам'
      CASE n2==2   //По группам
      aFilterKey:=ReportFrame("Остатки по группам",(a:={1,3,4,5,35,36,37,38,22,24,23}),.T.)
      n3:=aFilterKey[2,9]
      n5:=aFilterKey[2,10] //1-без резерва,2-с резервом
      n4:=aFilterKey[2,11] //Комментарий:1-наименования,2-н/номера
      cComment:=IF(n4=1,'MGrup->Name','Grup')
      cText:='группам'
      CASE n2==3   //По н/номерам
      aFilterKey:=ReportFrame("Остатки по н/номерам",(a:={1,3,4,5,35,36,37,38,22,24,23}),.T.)
      n3:=aFilterKey[2,9]
      n5:=aFilterKey[2,10] //1-без резерва,2-с резервом
      n4:=aFilterKey[2,11]
      cComment:=IF(n4=1,'MLabel->Name','MLabel->NNum')
      cText:='н/номерам'
   ENDCASE
   IF (LASTKEY()==K_ENTER)
      DO CASE
         CASE n2==1 //По складам
         CreIndex(cTempi,'UPPER(Sclad)',aFilterKey[1]+'.AND.!EMPTY(NNum).AND.!EMPTY(Sclad)')
         TOTAL('UPPER(Sclad)',{'Kol0','KolTek','KolRes'},cTemp,,;
         {{||__CENA0__*Kol0},{||__CENA__*KolTek},{||__CENA__*KolRes}})
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(SCLAD) INTO MSCLAD
         CASE n2==2 //По группам
         CreIndex(cTempi,'UPPER(Grup)',aFilterKey[1]+'.AND.!EMPTY(NNum).AND.!EMPTY(Sclad)')
         TOTAL('UPPER(Grup)',{'Kol0','KolTek','KolRes'},cTemp,,;
         {{||__CENA0__*Kol0},{||__CENA__*KolTek},{||__CENA__*KolRes}})
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Grup) INTO MGrup

         CASE n2==3 //По н/ном
         CreIndex(cTempi,'UPPER(Grup+NNum)',aFilterKey[1]+'.AND.!EMPTY(NNum).AND.!EMPTY(Sclad)')
         TOTAL('UPPER(Grup+NNum)',{'Kol0','KolTek','KolRes'},cTemp,,;
         {{||__CENA0__*Kol0},{||__CENA__*KolTek},{||__CENA__*KolRes}})
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Grup+NNum) INTO MLabel
      ENDCASE





      Pie('Структура '+IF(n3=1,'текущих','начальных')+' остатков по '+cText,;
      'на складе',cTempi,;
      IF(n5=1,IF(n3=1,'KolTek','Kol0'),IF(n3=1,'(KolTek-KolRes)','(Kol0-KolRes)')),;
      cComment,'В ценах складского учета '+IF(n5==1,'без учета','с учетом')+;
      ' резерва',,a)
   ENDIF
   CASE (n==2.OR.n==3) //Объемы реализации или поступлений
   DO CASE
      CASE (n==2)
      cHead:='Поступление товаров'
      CASE (n==3)
      cHead:='Расход товаров'
   ENDCASE

   pVid:=IF(n=2,'1','2')
   pType:=' '
   DO CASE
      CASE (n2==1) //По складам
      aFilterKey:=ReportFrame(cHead,GetNums({;
      IF(n=2,27,28),1,3,4,5,30,31,32,8,9}))
      cComment:='MSclad->ShortName'
      cText:='складам'

      CASE (n2==2) //По группам
      aFilterKey:=ReportFrame(cHead,GetNums({;
      IF(n=2,27,28),1,3,4,5,30,31,32,8,9,23}))
      cComment:=IF(aFilterKey[2,4]=1,'MGrup->Name','Grup')
      cText:='группам'

      CASE (n2==3) //По н/номерам
      aFilterKey:=ReportFrame(cHead,GetNums({;
      IF(n=2,27,28),1,3,4,5,30,31,32,8,9,23}))
      cComment:=IF(aFilterKey[2,6]=1,'MLabel->Name','NNum')
      cText:='н/номерам'

      CASE (n2==4) //По клиентам
      aFilterKey:=ReportFrame(cHead,GetNums({;
      IF(n=2,27,28),1,3,4,5,30,31,32,8,9,23}))
      cComment:=IF(aFilterKey[2,4]=1,'MDoc->AgentName','AgentCode')
      cText:=IF(n=2,'поставщикам','покупателям')
   ENDCASE

   IF (LASTKEY()==K_ENTER)
      cFilter:=".AND.!EMPTY(Sclad).AND.EMPTY(Input1).AND.Vid==pVid"
      IF !EMPTY(pType)
         i:=Moves->(OrdSetFocus(2))
         Moves->(DBSEEK(UPPER(pVid+pType)))
         cFilter+=".AND.Type==pType"
         cText+=ALLTRIM(UPPER(Moves->Name))
         MOVES->(ORDSETFOCUS(i))
      ELSEIF !'SCLAD'$UPPER(aFilterKey[1])
         cFilter+=".AND.Type!='4'"
      ENDIF
      Analit->(DBSEEK(UPPER(aIn0[30]+aIn0[31])))
      IF !EMPTY(aIn0[31])
         cText+=IF(EMPTY(cText),'По контрагенту "',',контрагент "')+;
         TRIM(Analit->Code)+' '+IF('*'$aIn0[31],'',TRIM(Analit->Name))+'"'
      ELSEIF !EMPTY(aIn0[32])
         cText+=IF(EMPTY(cText),'По контрагенту "',',контрагент "')+;
         TRIM(aIn0[32])+'"'
      ELSEIF !EMPTY(aIn0[30])
         cText+=IF(EMPTY(cText),'По кор.счету ',',кор.счет ')+;
        TRIM(aIn0[30])
      ENDIF
      IF !EMPTY(aIn0[3])
         cText+=IF(EMPTY(cText),'По счету ',',счет ')+ALLTRIM(aIn0[3])
      ENDIF
      IF !EMPTY(aIn0[4])
         IF !DBSEEK(UPPER(aIn0[4]+aIn0[5]))
            cText+=IF(EMPTY(cText),'По группе ',',группа ')+ALLTRIM(aIn0[4])
            IF !EMPTY(aIn0[5])
               cText+=IF(EMPTY(cText),'Н/ном ',',н/ном ')+ALLTRIM(aIn0[5])
            ENDIF
         ELSE
            cText+=IF(!EMPTY(cText),',','')+TRIM(MLabel->Name)
         ENDIF
      ENDIF
      cFilter:=aFilterKey[1]+cFilter

      Busy(.T.,'Подготовка данных')
      SELECT MDocM
      DO CASE
         CASE n2==1
         ORDSETFOCUS('MDocM_K')  //Sclad
         TOTAL('UPPER(Sclad)',{'Sum','SumOutR'},(cTemp),cFilter)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(SCLAD) INTO MSCLAD
         CASE n2==2
         ORDSETFOCUS('MDocM_S')  //Grup+NNum
         TOTAL('UPPER(Grup)',{'Sum'},cTemp,cFilter)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Grup) INTO MGrup
         CASE n2==3
         SELECT MDocM
         ORDSETFOCUS('MDocM_S')  //Grup+NNum
         GO TOP
         TOTAL('UPPER(Grup+NNum)',{'Sum'},cTemp,cFilter)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Grup+NNum) INTO MLabel
         CASE n2==4 //по контрагентам
         SELECT MDocM
         SET RELATION TO UPPER(Sclad+Vid+Type+CodeDoc+NumDoc) INTO MDoc
         CreIndex(cTempi,'UPPER(MDoc->(AgentName+AgentCode))',cFilter)
         TOTAL('UPPER(MDoc->(AgentName+AgentCode))',{'Sum'},cTemp)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Sclad+Vid+Type+CodeDoc+NumDoc) INTO MDoc
      ENDCASE
      Pie(cHead+' по '+cText,;
      'на складе ',cTempi,'Sum',cComment,'В ценах складского учета',,a)
   ENDIF


   CASE (n==4) //Продажи товаров
   cHead:='Структура продаж'
   cFilter:=".AND.!EMPTY(Sclad).AND.EMPTY(Input1).AND.Vid=='2'.AND.Type!='4'"
   pType:=" "

   DO CASE
      CASE (n2==1) //По группам
      aFilterKey:=ReportFrame(cHead,(a:={28,3,4,5,30,31,32,8,9,23}))
      cComment:=IF(ATAIL(aFilterKey[2])=1,'MGrup->Name','Grup')
      cText:='группам'
      CASE (n2==2) //По н/номерам
      aFilterKey:=ReportFrame(cHead,(a:={28,3,4,5,30,31,32,8,9,23}))
      cComment:=IF(ATAIL(aFilterKey[2])=1,'MLabel->Name','NNum')
      cText:='н/номерам'
      CASE (n2==3) //По клиентам
      aFilterKey:=ReportFrame(cHead,(a:={28,3,4,5,30,31,32,8,9,23}))
      cComment:=IF(ATAIL(aFilterKey[2])=1,'MDoc->AgentName','MDoc->AgentCode')
      cText:=IF(n=2,'поставщикам','покупателям')
      CASE (n2==4.AND.YesReal) //По торговым агентам
      aFilterKey:=ReportFrame(cHead,(a:={28,3,4,5,30,31,32,8,9}))
      cComment:='RAgent->Name'
      cText:='торговым агентам'
   ENDCASE
   IF (LASTKEY()==K_ENTER)
      IF !EMPTY(pType)
         i:=Moves->(OrdSetFocus(2))
         Moves->(DBSEEK(UPPER(pVid+pType)))
         cFilter+=".AND.!EMPTY(Sclad).AND.EMPTY(Input1).AND.Type==pType"
         cText+=ALLTRIM(UPPER(Moves->Name))
         MOVES->(ORDSETFOCUS(i))
      ELSEIF !'SCLAD'$UPPER(aFilterKey[1])
         cFilter+=".AND.!EMPTY(Sclad).AND.EMPTY(Input1).AND.Type!='4'"
      ENDIF
      Analit->(DBSEEK(UPPER(aIn0[30]+aIn0[31])))
      IF !EMPTY(aIn0[31])
         cText+=IF(EMPTY(cText),'По контрагенту "',',контрагент "')+;
         TRIM(Analit->Code)+' '+IF('*'$aIn0[31],'',TRIM(Analit->Name))+'"'
      ELSEIF !EMPTY(aIn0[32])
         cText+=IF(EMPTY(cText),'По контрагенту "',',контрагент "')+;
         TRIM(aIn0[32])+'"'
      ELSEIF !EMPTY(aIn0[30])
         cText+=IF(EMPTY(cText),'По кор.счету ',',кор.счет ')+;
        TRIM(aIn0[30])
      ENDIF
      IF !EMPTY(aIn0[3])
         cText+=IF(EMPTY(cText),'По счету ',',счет ')+ALLTRIM(aIn0[3])
      ENDIF
      IF !EMPTY(aIn0[4])
         IF !DBSEEK(UPPER(aIn0[4]+aIn0[5]))
            cText+=IF(EMPTY(cText),'По группе ',',группа ')+ALLTRIM(aIn0[4])
            IF !EMPTY(aIn0[5])
               cText+=IF(EMPTY(cText),'Н/ном ',',н/ном ')+ALLTRIM(aIn0[5])
            ENDIF
         ELSE
            cText+=IF(!EMPTY(cText),',','')+TRIM(MLabel->Name)
         ENDIF
      ENDIF
      cFilter:=aFilterKey[1]+cFilter
      Busy(.T.,'Подготовка данных для отчета')
      SELECT MDocM
      DO CASE
         CASE n2==1 //По группам
         ORDSETFOCUS('MDocM_S')  //Grup+NNum
         TOTAL('UPPER(Grup)',{'SumOutR'},cTemp,cFilter)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Grup) INTO MGrup
         CASE n2==2 //По н/ном
         ORDSETFOCUS('MDocM_S')  //Grup+NNum
         TOTAL('UPPER(Grup+NNum)',{'SumOutR'},cTemp,cFilter)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Grup+NNum) INTO MLabel
         CASE n2==3  //По клиентам
         SELECT MDocM
         SET RELATION TO UPPER(Sclad+Vid+Type+CodeDoc+NumDoc) INTO MDoc
         CreIndex(cTempi,'UPPER(MDoc->(AgentName+AgentCode))',cFilter)
         TOTAL('UPPER(MDoc->(AgentName+AgentCode))',{'SumOutR'},cTemp)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Sclad+Vid+Type+CodeDoc+NumDoc) INTO MDoc
         CASE n2==4  //По торговым агентам
         cFilter+='.AND.!EMPTY(DopCode).AND.!RBook->(EOF())'
         NetUse('Rbook','RBook')
         NetUse('RAgent','RAgent')
         SELECT RBook
         SET RELATION TO UPPER(AgentCod) INTO RAgent
         SELECT MDoc
         SET RELATION TO UPPER(LEFT(DopCode,6)) INTO RBook
         SELECT MDocM
         SET RELATION TO UPPER(Sclad+Vid+Type+CodeDoc+NumDoc) INTO MDoc
         CreIndex(cTempi,'UPPER(MDoc->DopCode)',cFilter)
         GO TOP
         TOTAL('UPPER(RAgent->Name)',{'SumOutR'},cTemp)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(DopCode) INTO RBook
      ENDCASE
      Pie(cHead+' по '+cText,;
      'на складе ',cTempi,'SumOutR',cComment,'В ценах продаж',,a)
   ENDIF

   CASE (n==5) //Прибыль
   cHead:='Прибыль'
   cFilter:=".AND.!EMPTY(Sclad).AND.EMPTY(Input1).AND.Vid=='2'.AND.Type!='4'"
   DO CASE
      CASE (n2==1) //По группам
      aFilterKey:=ReportFrame(cHead,(a:={25,8,9,23}))
      cComment:=IF(aFilterKey[2,4]=1,'MGrup->Name','Grup')
      cText:='группам'
      CASE (n2==2) //По н/номерам
      aFilterKey:=ReportFrame(cHead,(a:={26,4,8,9,23}))
      cComment:=IF(aFilterKey[2,5]=1,'MLabel->Name','NNum')
      cText:='н/номерам'
      CASE (n2==3) //По клиентам
      aFilterKey:=ReportFrame(cHead,(a:={25,8,9,23}))
      cComment:=IF(aFilterKey[2,4]=1,'MDoc->AgentName','MDoc->AgentCode')
      cText:=IF(n=2,'поставщикам','покупателям')
      CASE (n2==4) //По торговым агентам
      aFilterKey:=ReportFrame(cHead,(a:={25,8,9}))
      cComment:='RAgent->Name'
      cText:='торговым агентам'
   ENDCASE
   IF (LASTKEY()==K_ENTER)
      Busy(.T.,'Подготовка данных для отчета')
      SELECT MDocM
      DO CASE
         CASE n2==1 //По группам
         ORDSETFOCUS('MDocM_S')  //Grup+NNum
         TOTAL('UPPER(Grup)',{'Sum','SumOutR'},cTemp,aFilterKey[1]+cFilter)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Grup) INTO MGrup
         CASE n2==2 //По н/ном
         ORDSETFOCUS('MDocM_S')  //Grup+NNum
         TOTAL('UPPER(Grup+NNum)',{'Sum','SumOutR'},cTemp,aFilterKey[1]+cFilter)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Grup+NNum) INTO MLabel
         CASE n2==3  //По клиентам
         SELECT MDocM
         SET RELATION TO UPPER(Sclad+Vid+Type+CodeDoc+NumDoc) INTO MDoc
         CreIndex(cTempi,'UPPER(MDoc->(AgentName+AgentCode))',aFilterKey[1]+cFilter)
         TOTAL('UPPER(MDoc->(AgentName+AgentCode))',{'Sum','SumOutR'},cTemp)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(Sclad+Vid+Type+CodeDoc+NumDoc) INTO MDoc
         CASE n2==4  //По торговым агентам
         cFilter+='.AND.!EMPTY(DopCode).AND.!RBook->(EOF())'
         NetUse('Rbook','RBook')
         NetUse('RAgent','RAgent')
         SELECT RBook
         SET RELATION TO UPPER(AgentCod) INTO RAgent
         SELECT MDocM
         SET RELATION TO UPPER(DopCode) INTO RBook
         CreIndex(cTempi,'UPPER(DopCode)',aFilterKey[1]+cFilter)
         GO TOP
         TOTAL('UPPER(RAgent->Name)',{'Sum','SumOutR'},cTemp)
         NetUse('Temp',cTemp)
         SET RELATION TO UPPER(DopCode) INTO RBook
      ENDCASE
      n3:=aFilterKey[2,1]
      DO CASE
         CASE n3==1
         cHead+=' валовая'
         cField:='(SumOutR-Sum)'
         CASE n3==2
         cHead+=' на рубль себестоимости'
         cField:='IF(Sum!=0,100*(SumOutR-Sum)/Sum,0)'
         cEd:='%'
         IF UPPER(GlobalValuta)!='РУБ'
            cHead:=STRTRAN(cHead,'рубль',LOWER(GlobalValuta))
         ENDIF
         CASE n3==3
         cHead+=' на единицу ТМЦ'
         cField:='IF(Kol!=0,(SumOutR-Sum)/Kol,0)'
         cEd:=LOWER(GlobalValuta)
      ENDCASE
      Pie(cHead+' по '+cText,;
      'по складу ',cTempi,cField,cComment,,cEd,a)
   ENDIF
   CASE (n==6) //Оперативные справки
   DO CASE
     CASE n2=1   //закупки
     cHead:="Поступление"
     CASE n2=2   //продажи
     cHead:="Выбытие"
     CASE n2=3   //прибыль 
     cHead:="Прибыль"
   ENDCASE
   pVid:=IF(n2=1,'1','2')
   pType:=' '
   aFilterKey:=ReportFrame(cHead,GetNums({;
   IF(n2=1,27,28),IF(n2=3,25,60),63,61,1,3,4,5,30,31,32,8,9}))

   IF (LASTKEY()==K_ENTER)
      cFilter:=".AND.!EMPTY(Sclad).AND.EMPTY(Input1).AND.Vid==pVid"
      IF !EMPTY(pType)
         i:=Moves->(OrdSetFocus(2))
         Moves->(DBSEEK(UPPER(pVid+pType)))
         cFilter+=".AND.!EMPTY(Sclad).AND.EMPTY(Input1).AND.Type==pType"
         cText+=ALLTRIM(UPPER(Moves->Name))
         MOVES->(ORDSETFOCUS(i))
      ELSEIF !'SCLAD'$UPPER(aFilterKey[1])
         cFilter+=".AND.!EMPTY(Sclad).AND.EMPTY(Input1).AND.Type!='4'"
      ENDIF
      Analit->(DBSEEK(UPPER(aIn0[30]+aIn0[31])))
      IF !EMPTY(aIn0[31])
         cText+=IF(EMPTY(cText),'По контрагенту "',',контрагент "')+;
         TRIM(Analit->Code)+' '+IF('*'$aIn0[31],'',TRIM(Analit->Name))+'"'
      ELSEIF !EMPTY(aIn0[32])
         cText+=IF(EMPTY(cText),'По контрагенту "',',контрагент "')+;
         TRIM(aIn0[32])+'"'
      ELSEIF !EMPTY(aIn0[30])
         cText+=IF(EMPTY(cText),'По кор.счету ',',кор.счет ')+;
        TRIM(aIn0[30])
      ENDIF
      IF !EMPTY(aIn0[3])
         cText+=IF(EMPTY(cText),'По счету ',',счет ')+ALLTRIM(aIn0[3])
      ENDIF
      IF !EMPTY(aIn0[4])
         IF !DBSEEK(UPPER(aIn0[4]+aIn0[5]))
            cText+=IF(EMPTY(cText),'По группе ',',группа ')+ALLTRIM(aIn0[4])
            IF !EMPTY(aIn0[5])
               cText+=IF(EMPTY(cText),'Н/ном ',',н/ном ')+ALLTRIM(aIn0[5])
            ENDIF
         ELSE
            cText+=IF(!EMPTY(cText),',','')+TRIM(MLabel->Name)
         ENDIF
      ENDIF
      cFilter:=aFilterKey[1]+cFilter

      Busy(.T.,'Подготовка данных для отчета')
      SELECT MDocM
      ORDSETFOCUS('MDocM_D')
      SET RELATION TO UPPER(Sclad+Vid+Type+CodeDoc+NumDoc) INTO MDoc,;
      UPPER(Grup+NNum) INTO MLabel
      DBSEEK(DTOS(aIn0[8]))
      DO CASE
         CASE aFilterKey[2,4]==1 //посуточно
         TOTAL('DTOS(Date)',{'Kol','Sum','SumOutR'},cTemp,cFilter,,IF(EMPTY(aIn0[9]),NIL,{||Date<=aIn0[9]}),aFilterKey[2,3]==1)
         CASE aFilterKey[2,4]==2 //поннедельно
         TOTAL('MyWeek(Date)',{'Kol','Sum','SumOutR'},cTemp,cFilter,,IF(EMPTY(aIn0[9]),NIL,{||Date<=aIn0[9]}),aFilterKey[2,3]==1)
         CASE aFilterKey[2,4]==3 //помесячно
         TOTAL('Month(Date)',{'Kol','Sum','SumOutR'},cTemp,cFilter,,IF(EMPTY(aIn0[9]),NIL,{||Date<=aIn0[9]}),aFilterKey[2,3]==1)
      ENDCASE
      NetUse('Temp',cTemp)
      
      
      IF n2=3 //прибыль
         n3:=aFilterKey[2,2]
         WHILE !EOF().AND.LEN(aDiag)<367
            AADD(aDiag,{(i:=IF(n3=1,SumOutR-Sum,IF(n3=2,IF(Sum!=0,100*(SumOutR-Sum)/Sum,0),IF(Kol!=0,(SumOutR-Sum)/Kol,0)))),;
            ALLTRIM(TRANSFORM(i,SummaPic(0,16,.T.)))+' ',IF(aFilterKey[2,4]=1,DTOC(Date),IF(aFilterKey[2,4]=2,MyWeek(Date),CMONTH(Date)))+' ','GR+'})
            SKIP
         ENDDO
         DO CASE
            CASE n3==1
            cHead+=' валовая'
            cEd:=m->GlobalValuta
            CASE n3==2
            cHead+=' на рубль себестоимости'
            IF UPPER(GlobalValuta)!='РУБ'
               cHead:=STRTRAN(cHead,'рубль',LOWER(GlobalValuta))
            ENDIF
            cEd:='%'
            CASE n3==3 //не используется пока
            cHead+=' на единицу ТМЦ'
            cEd:=m->GlobalValuta
         ENDCASE
         
      ELSE
         WHILE !EOF().AND.LEN(aDiag)<367
            AADD(aDiag,{(i:=IF(aFilterKey[2,2]=1,Sum,IF(aFilterKey[2,2]=2,SumOutR,Kol))),ALLTRIM(TRANSFORM(i,SummaPic(0,16,.T.)))+' ',IF(aFilterKey[2,4]=1,DTOC(Date),IF(aFilterKey[2,4]=2,MyWeek(Date),CMONTH(Date)))+' ','GR+'})
            SKIP
         ENDDO
         IF aFilterKey[2,2]=1
            cHead+=' в складских ценах'
         ELSEIF aFilterKey[2,2]==2
            cHead+=' в '+IF(pVid='1','ценах поставки','в отпускных ценах')
         ELSE
            cHead+=' в колич.выражении'
         ENDIF
      ENDIF
      cHead+=' за период '+DTOC(aIn0[8])+'-'+DTOC(aIn0[9])
      IF !EMPTY(aIn0[1])
         cHead+=' по складу '+ALLTRIM(aIn0[1])
      ENDIF
      IF n2=3 //прибыль
         BarBarian(aDiag,cHead,'Прибыль '+cEd,cText)
      ELSE
         BarBarian(aDiag,cHead,IF(aFilterKey[2,2]=1,'Стоимость '+GlobalValuta,IF(aFilterkey[2,2]=2,'Сумма '+GlobalValuta,'Количество')),cText)
      ENDIF
   ENDIF
ENDCASE
ClearRefer()

SETBLINK(.F.)
ClosePar('MLab')
ClosePar('Nak')
ClosePar('Ana')
ClosePar('SPri')
ClosePar('Pric')
ClosePar('Sebe')
CLOSE ALL
SLEEP(200)
FERASE(cTemp)
FERASE(cTemp2)
FERASE(cTempi)

Open0()
RESTSCREEN(,,,,sRest)
HELP_CODE:=cHelp_Code
RETURN (NIL)



STATIC FUNCTION Pie(cHead,cHeadSclad,cTempi,cField,cField1,cText,cEd,a)
LOCAL cIndex:='10000000000-'+cField
LOCAL cNtxKey  := ALLTRIM(cIndex)
LOCAL bNtxKey  := &( "{||" +cINDEX + "}" )
LOCAL aName:={},i
LOCAL nSumMax:=0,nSumMax10:=0,aSum:={},aSumFi:={}
LOCAL nSum0:=1,cSum0:="",cHead1:=""
LOCAL sF1:=SETKEY(K_F1,NIL)

cTempi:=TEMPFILE(m->GlobalTmpPath,"IDX")
DBCREATEINDEX(cTempi,;
'(' + cNtxKey + ')',  ;
{|| nSumMax+=&(cField),EVAL( bNtxKey )})
GO TOP
FOR i:=1 TO 10
AADD(aName,TRIM(SUBSTR(&(cField1),1,19)))
AADD(aSum,&(cField))
SKIP
NEXT
CloseBase({'MDoc','MDocM','MLabel','MSclad','MCodOp','MKart','MStru'})

BUSY(.F.)
IF (nSumMax>0)
   nSumMax10:=0
   FOR i=1 TO LEN(aSum)
   IF (aSum[i]>0.AND.aSum[i]/nSumMax>0.033) //Коэффициент чувствительности (подобран)
      AADD(aSumFi,aSum[i])
      nSumMax10+=aSum[i]
   ENDIF
   NEXT
   ASIZE(aName,LEN(aSumFi))
   IF (nSumMax-nSumMax10) > 0
      AADD(aSumFi,nSumMax-nSumMax10)
      AADD(aName,"Прочие")
   ENDIF

   //Выправление aSumFi
   DO CASE
      CASE nSumMax>1000000000000
      nSum0:=1000000000000
      cSum0:='трлн '
      CASE nSumMax>1000000000
      nSum0:=1000000000
      cSum0:='млрд '
      CASE nSumMax>1000000
      nSum0:=1000000
      cSum0:='млн '
      CASE nSumMax>1000
      nSum0:=1000
      cSum0:='тыс.'
      OTHERWISE
      nSum0:=1
      cSum0:=''
   ENDCASE
   
   cSum0+=IF(cEd==NIL,LOWER(GlobalValuta),cEd)
   i:=0
   AEVAL(aSumFi,{|x|aSumFi[++i]:=ROUND(x/nSum0,3)})

   cHead:=cHead+;
   IF(!EMPTY(aIn0[1]).AND.ASCAN(a,1)>0,' '+cHeadSclad+' N '+ALLTRIM(aIn0[1]),'')+;
      "RRRR"+', '+cSum0

   IF !EMPTY(aIn0[8]).AND.ASCAN(a,8)>0
      cHead+=CHR(10)+'за период с '+DTOC(aIn0[8])+' по '+DTOC(aIn0[9])
   ENDIF

   cHead1:=''
   IF !EMPTY(aIn0[3]).AND.ASCAN(a,3)>0
      cHead1:='/ Счет '+TRIM(aIn0[3])
   ENDIF
   IF !EMPTY(aIn0[4]).AND.ASCAN(a,4)>0
      MGrup->(DBSEEK(UPPER(aIn0[4])))
      cHead1+=IF(EMPTY(cHead),'/ Группа ',', группа ')+TRIM(MGrup->Name)
   ENDIF
   IF !EMPTY(cHead1)
      cHead1+=' /'
      cHead+=CHR(10)+cHead1
   ENDIF
   IF !EMPTY(cText)
      cHead+=CHR(10)+cText
   ENDIF


   CreateExcelChart(cHead,aName,aSumFi,xlPie)

ELSEIF nSumMax=0
   SayError('Нет данных,удовлетворяющих условиям')
ELSE
   SayError('Сумма данных меньше нуля')
ENDIF
SETKEY(K_F1,sF1)
RETURN(NIL)




STATIC FUNCTION CreateExcelChart(cHead,aName,aSumFi,nType,cDownText)
LOCAL i,cText,oWorkBook,oChart


   TRY
      oApp := GetActiveObject( "Excel.Application" )
      oApp:Visible := .F.
      IF oApp:WorkBooks:count=0
         oApp := CreateObject( "Excel.Application" )
      ENDIF
   CATCH
      TRY
         oApp := CreateObject( "Excel.Application" )
      CATCH
         Alert("Excel не доступен!")
         RETURN 0
      END
   END


   IF VAL(oApp:Version)>=10
      cHead:=STRTRAN(cHead,"RRRR","")
   ELSE
      cHead:=STRTRAN(cHead,"RRRR"," в процентном отношении")
   ENDIF


   oWorkBook:=oApp:WorkBooks:Add()
   oAS:=oWorkBook:Worksheets(1)
   oAS:Activate()

FOR i:=1 TO LEN(aName)
oAS:Cells(i,1):value:=HB_OEMTOANSI(TRIM(aName[i]))	
oAS:Cells(i,2):value:=aSumFi[i]	
NEXT

oChart:=oApp:Charts:Add()
oChart:ChartType:=nType
oChart:SetSourceData(oAS:Range(oAS:Cells(1,1),oAS:Cells(LEN(aName),2)),xlColumns)
oChart:Location(xlLocationAsNewSheet)
oChart:HasTitle = .T.
oChart:ChartTitle:Text = HB_OEMTOANSI(TRIM(cHead))	
oChart:ChartArea:Interior:colorIndex:= xlNone 
oChart:PlotArea:Interior:colorIndex:= xlNone 
oChart:PlotArea:Border:LineStyle:= xlNone 
oChart:HasLegend:=.F.


/*****
ApplyDataLabels(Type, LegendKey, AutoText, HasLeaderLines, ShowSeriesName,;
 ShowCategoryName, ShowValue, ShowPercentage, ShowBubbleSize, Separator)
*******/

IF nType==xlPie
   IF VAL(oApp:Version)>=10
      oChart:ApplyDataLabels(,.F.,.T.,.T.,.F.,.T.,.T.)
      FOR i:=1 TO oChart:SeriesCollection(1):Points():Count
      cText:=oChart:SeriesCollection(1):Points(i):DataLabel:Characters:Text
      cText:=STRTRAN(cText,";",":")
      oChart:SeriesCollection(1):Points(i):DataLabel:Characters:Text:=cText
      NEXT

   ELSE
      oChart:ApplyDataLabels(xlDataLabelsShowLabelAndPercent)
   ENDIF

ELSE

   oChart:Axes(xlCategory,xlPrimary):CategoryType = xlCategoryScale
   oChart:Axes(xlValue, xlPrimary):HasTitle = .T.
   oChart:Axes(xlValue, xlPrimary):AxisTitle:Characters:Text:=HB_OEMTOANSI(cDownText)
//   oChart:ApplyDataLabels(,.F.,.F.,.F.,.F.,.F.,.F.,.F.,.F.)

ENDIF


oChart:deselect()

oApp:visible:=.T.

RETURN NIL



STATIC FUNCTION Barbarian(aDiag,cHead,DownString,TopString)
LOCAL i,aSumFi:={},aName:={}
FOR i:=1 TO LEN(aDiag)
IF aDiag[i,1]>0
   AADD(aName,aDiag[i,3])
   AADD(aSumFi,aDiag[i,1])
ENDIF
NEXT
IF LEN(aName)>1
   CreateExcelChart(cHead,aName,aSumFi,xlColumnClustered,DownString)
ELSE
   SayError("Нет данных!")
ENDIF
RETURN


FUNCTION MyWeek(d)
LOCAL nDay:=DOW(d)-1
d-=(DOW(d)-2)
RETURN STR(Year(d),4,0)+"."+ALLTRIM(STR(MONTH(d),2,0))+"."+LEFT(DTOC(d),2)+"-"+LEFT(DTOC(d+6),2)












