-- Шаблон создан мастером бланков
-- 26.05.2005 11:26:39
--
БланкСШаблоном [03.04.2007] "Отчет по кассе в разрезе КБК";

var FlagEdit:L;

HStr:Section;

Табл1: Section;
Табл2: Section;
Табл3: Section;
Rep  : Section;

btnРасчет:Object;
cbНС:Object;

fНС:L;

var notRecoveryRep:L;

ВД:S=["1"];
ВД_:S;
var СчДеб:S=ВД+".201.34";
var Ан:S;

var МаскаСч:S="*."+СчДеб+".*";

var Заголовок:S="Отчет по кассе в разрезе КБК";

ДК:D=[ToDay+1];
var YYYY:I=Year(ДК-1);
var ДН:D=Dat(1,1,YYYY);

СправТабл:S;
var СправТабл_:s=СправТабл;

СправПодТабл:S;
var СправПодТабл_:s=СправПодТабл;
fИтогПодТабл:L;
var fИтогПодТабл_:S=if(fИтогПодТабл,"V","");

СправСтр:S;
var СправСтр_:s=СправСтр;

var Справ[]:S;
var НаимСправ[]:S;
var МаскаСправ:S;
var MaxСправ:I=5;
var ЧислоСправ:I;
var FlagКБК:L;

УСС[]:I;
var УСС_[]:S=if(УСС[$]=0 and not FlagEdit,"Нет",Str(УСС[$]));
hУСС[]:I;
hСправ[]:S;

ПризнДоп:S;

ЕдИзм:I=[1];
var ЕдИзм_:S=if(ЕдИзм=1000:"Тыс. руб."|ЕдИзм=1000000:"Млн. руб."|true:"Руб.");
var Точн:I=if(ЕдИзм=1,2,2);

var Упр:I;

Гр[]:I;

var nГр[]:I;

var KeyОтчет[]:S;
var пп[]:I=$;
var НаимКБК[]:S;
var Призн1[]:S;
var Призн2[]:S;
var Призн3[]:S;
var Призн4[]:S;
var Призн5[]:S;
var ПризнБК[]:S;
var ПризнКОСГУ[]:S;
var Призн1_[]:S=if(Справ[1]="КБК.",НаимКБК[$],Name_A(Призн1[$]));
var Призн2_[]:S=if(Справ[2]="КБК.",НаимКБК[$],Name_A(Призн2[$]));
var Призн3_[]:S=if(Справ[3]="КБК.",НаимКБК[$],Name_A(Призн3[$]));
var Призн4_[]:S=if(Справ[4]="КБК.",НаимКБК[$],Name_A(Призн4[$]));
var Призн5_[]:S=if(Справ[5]="КБК.",НаимКБК[$],Name_A(Призн5[$]));
var НаимПризн1[]:S=if(Гр[2]=0 or Призн1_[$]="" or Призн1_[$]=" ",Призн1[$],if(Гр[2]=1,Призн1_[$],if(Гр[2]=2,Призн1_[$]+" ("+Призн1[$]+")",if(Гр[2]=3,Призн1[$]+" ("+Призн1_[$]+")"))));
var НаимПризн2[]:S=if(Гр[3]=0 or Призн2_[$]="" or Призн2_[$]=" ",Призн2[$],if(Гр[3]=1,Призн2_[$],if(Гр[3]=2,Призн2_[$]+" ("+Призн2[$]+")",if(Гр[3]=3,Призн2[$]+" ("+Призн2_[$]+")"))));
var НаимПризн3[]:S=if(Гр[4]=0 or Призн3_[$]="" or Призн3_[$]=" ",Призн3[$],if(Гр[4]=1,Призн3_[$],if(Гр[4]=2,Призн3_[$]+" ("+Призн3[$]+")",if(Гр[4]=3,Призн3[$]+" ("+Призн3_[$]+")"))));
var НаимПризн4[]:S=if(Гр[5]=0 or Призн4_[$]="" or Призн4_[$]=" ",Призн4[$],if(Гр[5]=1,Призн4_[$],if(Гр[5]=2,Призн4_[$]+" ("+Призн4[$]+")",if(Гр[5]=3,Призн4[$]+" ("+Призн4_[$]+")"))));
var НаимПризн5[]:S=if(Гр[6]=0 or Призн5_[$]="" or Призн5_[$]=" ",Призн5[$],if(Гр[6]=1,Призн5_[$],if(Гр[6]=2,Призн5_[$]+" ("+Призн5[$]+")",if(Гр[6]=3,Призн5[$]+" ("+Призн5_[$]+")"))));
var ОстН[]:N;
var Прих[]:N;
var Расх[]:N;
var ОстК[]:N;
var Итог[]:I;

var ВсегоОстН:N;
var ВсегоПрих:N;
var ВсегоРасх:N;
var ВсегоОстК:N;

var Buf[]:S;
var Buf2[]:S;
var BufVoc[]:S;
var BufI[]:I;

var tCache[]:S;
var KeyСвертка[]:S;
var BufКБК[]:S;
var BufНаимКБК[]:S;
var BufПризнБК[]:S;
var BufПризнКОСГУ[]:S;
var BufПризн1[]:S;
var BufПризн2[]:S;
var BufПризн3[]:S;
var BufПризн4[]:S;
var BufПризн5[]:S;

var RepRow:I;

var Rep_Section[]:S;
var Rep_RowsCount[]:I;
var Rep_ColsCount:I=10;
var Rep_RowVisible[]:L;
var Rep_RowHeight[]:I;
var Rep_RowIndex[]:I;
var Rep_ColVisible[]:L;
var Rep_ColWidth[]:I;
var Rep_ColIndex[]:I;
var Rep_CellBorder[]:S;
var Rep_CellAlignment[]:I;
var Rep_CellFormat[]:S;
var Rep_CellReadOnly[]:L;
var Rep_CellBgColor[]:I;
var Rep_CellFieldType[]:I;
var Rep_CellContents[]:S;
var Rep_CellHint[]:S;
var Rep_CellLookup[]:L;
var Rep_CellEventOnLookup[]:S;
var Rep_CellIndex[]:I;

var НастрGUID:S;

var Отч:S;
--
--Процедуры и функции -------------
Func GetCellIndex (s:i; r:I; c:i):i;
var Ret,Value:I;
 Value=s+BitShl(r,8)+BitShl(c,16);
 Ret=SearchInArray(Rep_CellIndex,Value,True,1);
 if Ret=-1: Ret=InsertInArraySort(Rep_CellIndex,Value); fi;
 ^Ret;
end;

Func GetRowIndex (s:i; r:I):i;
var Ret,Value:I;
 Value=s+BitShl(r,8);
 Ret=SearchInArray(Rep_RowIndex,Value,True,1);
 if Ret=-1: Ret=InsertInArraySort(Rep_RowIndex,Value); fi;
 ^Ret;
end;

Func GetColIndex (s:i; c:I):i;
var Ret,Value:I;
 Value=s+BitShl(c,8);
 Ret=SearchInArray(Rep_ColIndex,Value,True,1);
 if Ret=-1: Ret=InsertInArraySort(Rep_ColIndex,Value); fi;
 ^Ret;
end;

Proc Очистить;
 ClearVariable(Отч);
 ClearVariable(FlagEdit);
 ClearVariable(Упр);
 ClearVariable(KeyОтчет);
 ClearVariable(НаимКБК);
 ClearVariable(Призн1);
 ClearVariable(Призн2);
 ClearVariable(Призн3);
 ClearVariable(Призн4);
 ClearVariable(Призн5);
 ClearVariable(ПризнБК);
 ClearVariable(ПризнКОСГУ);
 ClearVariable(ОстН);
 ClearVariable(Прих);
 ClearVariable(Расх);
 ClearVariable(ОстК);
 ClearVariable(Итог);
 ClearVariable(ВсегоОстН);
 ClearVariable(ВсегоПрих);
 ClearVariable(ВсегоРасх);
 ClearVariable(ВсегоОстК);
end;

Proc ИнициализироватьОтчет;
var s,r,c,rr,cc,ss,index:i;
var Obj: Object;
var Flag:L;
var StoreУпр:I;
 for s=1..3 do
  if FindObject("Табл"+Str(s),Obj):
     Obj.Visible=True;
     for c=2..5 do
      Obj.Column(c,ColVisible,True);
     od;
  fi;
 od;
 Табл1.Row(1,RowVisible,True);
 ClearVariable(Rep_Section);
 ClearVariable(Rep_RowsCount);
 ClearVariable(Rep_ColsCount);
 ClearVariable(Rep_RowVisible);
 ClearVariable(Rep_RowHeight);
 ClearVariable(Rep_RowIndex);
 ClearVariable(Rep_ColVisible);
 ClearVariable(Rep_ColWidth);
 ClearVariable(Rep_ColIndex);
 ClearVariable(Rep_CellBorder);
 ClearVariable(Rep_CellAlignment);
 ClearVariable(Rep_CellFormat);
 ClearVariable(Rep_CellReadOnly);
 ClearVariable(Rep_CellBgColor);
 ClearVariable(Rep_CellFieldType);
 ClearVariable(Rep_CellContents);
 ClearVariable(Rep_CellHint);
 ClearVariable(Rep_CellLookup);
 ClearVariable(Rep_CellEventOnLookup);
 ClearVariable(Rep_CellIndex);
 StoreУпр=Упр;
 if Упр<1: Упр=1; fi;
 Try
  Rep_Section[1]="Табл1";
  Rep_Section[2]="Табл2";
  Rep_Section[3]="Табл3";
  ss=LengthOfArray(Rep_Section);
  if ss>255: Message("Превышено максимально число (255) секций",mtError); Exit; fi;
  for s=1..ss do
   Flag=FindObject(Rep_Section[s],Obj);
   if Flag=False: Message("Секция "+Rep_Section[s]+" не найдена",mtError); Exit; fi;
   rr=AsInteger(Obj.RowsCount);
   cc=Rep_ColsCount;
   if rr>255: Message("Превышено максимально число (255) строк в секции",mtError); Exit; fi;
   if cc>255: Message("Превышено максимально число (255) колонок в секции",mtError); Exit; fi;
   Rep_RowsCount[s]=rr;
   for r=1..rr do
    Index=GetRowIndex(s,r);
    InsertInArray(Rep_RowVisible,Index,AsLogical(Obj.Row(r,RowVisible,"")));
    InsertInArray(Rep_RowHeight,Index,AsInteger(Obj.Row(r,RowHeight,"")));
    for c=1..cc do
     if r=1:
        Index=GetColIndex(s,c);
        InsertInArray(Rep_ColVisible,index,AsLogical(Obj.Column(c,ColVisible,"")));
        InsertInArray(Rep_ColWidth,index,AsInteger(Obj.Column(c,ColWidth,"")));
     fi;
     Index=GetCellIndex(s,r,c);
     InsertInArray(Rep_CellBorder,Index,AsString(Obj.Cell(r,c,CellBorder,"")));
     InsertInArray(Rep_CellAlignment,Index,AsInteger(Obj.Cell(r,c,CellAlignment,"")));
     InsertInArray(Rep_CellFormat,Index,AsString(Obj.Cell(r,c,CellFormat,"")));
     InsertInArray(Rep_CellReadOnly,Index,AsLogical(Obj.Cell(r,c,CellReadOnly,"")));
     InsertInArray(Rep_CellBgColor,Index,AsInteger(Obj.Cell(r,c,CellBgColor,"")));
     InsertInArray(Rep_CellContents,Index,AsString(Obj.Cell(r,c,CellContents,"")));
     InsertInArray(Rep_CellHint,Index,AsString(Obj.Cell(r,c,CellHint,"")));
     InsertInArray(Rep_CellLookup,Index,AsLogical(Obj.Cell(r,c,CellLookup,"")));
     InsertInArray(Rep_CellFieldType,Index,AsInteger(Obj.Cell(r,c,CellFieldType,"")));
     InsertInArray(Rep_CellEventOnLookup,Index,AsString(Obj.Cell(r,c,CellEventOnLookup,"")));
    od;
   od;
  od;
 Finally
  Упр=StoreУпр;
 end;
end;

Proc ОбновитьОтчет;
var s,r,c,rr,cc,ss,index:i;
var Obj: Object;
var Flag:L;
var StoreУпр:I;
 ClearVariable(Rep_RowVisible);
 ClearVariable(Rep_ColVisible);
 StoreУпр=Упр;
 if Упр<1: Упр=1; fi;
 Try
  ss=LengthOfArray(Rep_Section);
  for s=1..ss do
   Flag=FindObject(Rep_Section[s],Obj);
   if Flag=False: Message("Секция "+Rep_Section[s]+" не найдена",mtError); Exit; fi;
   rr=AsInteger(Obj.RowsCount);
   cc=Rep_ColsCount;
   for r=1..rr do
    Index=GetRowIndex(s,r);
    Rep_RowVisible[Index]=AsLogical(Obj.Row(r,RowVisible,""));
    if r=1:
       for c=1..cc do
        Index=GetColIndex(s,c);
        Rep_ColVisible[index]=AsLogical(Obj.Column(c,ColVisible,""));
       od;
    fi;
   od;
  od;
 Finally
  Упр=StoreУпр;
 end;
end;

Proc ПодготовитьОтчет;
var Obj: Object;
var nТабл,nПодТабл,n,rr:I;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 Rep.RowsCount=1;
 Rep.ColsCount=1;
 if FindObject("Rep",Obj):
    Rep.ColsCount=Rep_ColsCount;
    for n=1..Упр do
     AddInArray(Buf,True,False,Призн1[n]);
     if not СправТабл="" and not СправПодТабл="" and not Призн2[n]="":
        AddInArray(Buf2,True,False,Призн1[n]+"#"+Призн2[n]);
     fi;
    od;
    if СправТабл="":
       nТабл=1;
       nПодТабл=LengthOfArray(Buf);
      else
       nТабл=LengthOfArray(Buf)+1; -- +1 это итоговая таблица
       nПодТабл=LengthOfArray(Buf2);
    fi;
    rr=((nТабл*(Rep_RowsCount[1]+Rep_RowsCount[3]+1)-Rep_RowsCount[1]-Rep_RowsCount[3])+(Упр*Rep_RowsCount[2])-nТабл)+nПодТабл; -- +1 это строка между таблицами -Rep_RowsCount[1],Rep_RowsCount[3] это первая и последняя шапка, уже есть, -nТабл минус итоговые строки (у которых итог не 0)
    Rep.RowsCount=rr;
 fi;
end;

Func ВставитьСтроку (Sec:S):I;
var s,r,c,rr,cc,index:i;
var Obj: Object;
var Flag:L;
 s=SearchInArray(Rep_Section,Sec);
 if s=-1: Message("Имя секции ("+Sec+") не найдено",mtError); ^s; fi;
 Flag=FindObject(Rep_section[s],Obj);
 if Flag=False: Message("Секция "+Rep_Section[s]+" не найдена",mtError); ^-1; fi;
 rr=Rep_RowsCount[s];
 cc=Rep_ColsCount;
 for r=1..rr do
  Index=GetRowIndex(s,r);
  Rep.Row(RepRow+r,RowVisible,Rep_RowVisible[Index]);
  if Sec="Табл1": Rep.Row(RepRow+r,RowHeight,Rep_RowHeight[Index]); fi;
  for c=1..cc do
   if r=1:
      Index=GetColIndex(s,c);
      Rep.Column(c,ColVisible,Rep_ColVisible[Index]);
      Rep.Column(c,ColWidth,Rep_ColWidth[Index]);
   fi;
   Index=GetCellIndex(s,r,c);
   Rep.Cell(RepRow+r,c,CellBorder,Rep_CellBorder[Index]);
   Rep.Cell(RepRow+r,c,CellAlignment,Rep_CellAlignment[Index]);
   Rep.Cell(RepRow+r,c,CellFormat,Rep_CellFormat[Index]);
   Rep.Cell(RepRow+r,c,CellReadOnly,Rep_CellReadOnly[Index]);
   Rep.Cell(RepRow+r,c,CellBgColor,Rep_CellBgColor[Index]);
   Rep.Cell(RepRow+r,c,CellHint,Rep_CellHint[Index]);
   Rep.Cell(RepRow+r,c,CellLookup,Rep_CellLookup[Index]);
   Rep.Cell(RepRow+r,c,CellEventOnLookup,Rep_CellEventOnLookup[Index]);
   Rep.Cell(RepRow+r,c,CellFieldType,Rep_CellFieldType[Index]);
  od;
 od;
 ^S;
end;

Proc ВставитьШапку (Iter:I);
var s,r,c,rr,cc,index:i;
 if not Iter=1:
    RepRow=RepRow+1; 
    Rep.Row(RepRow,RowNewPage,fНС);
 fi;
 s=ВставитьСтроку("Табл1");
 rr=Rep_RowsCount[s];
 cc=Rep_ColsCount;
 for r=1..rr do
  for c=1..cc do
   Index=GetCellIndex(s,r,c);
   if Rep_CellContents[Index]="НаимПризн1":
      if Iter=0:
         Rep.Cell(RepRow+r,c,CellContents,"ИТОГО ПО ОТЧЕТУ");
         Rep.Cell(RepRow+r,c,CellFieldType,1);
        else
         Rep.Cell(RepRow+r,c,CellContents,Rep_CellContents[Index]+"["+Str(Iter)+"]");
      fi;
     else
      Rep.Cell(RepRow+r,c,CellContents,Rep_CellContents[Index]);
   fi;
  od;
 od;
 Rep.CellLinks(2 ,RepRow+1,10,RepRow+1); --#НаимПризн1

 RepRow=RepRow+rr;
end;

Proc ВставитьПодСтрокуОтчета(Iter:I);
var s:i;
var val:S;
 s=ВставитьСтроку("Табл2");
 if not СправТабл="" and not СправПодТабл="":
    val="НаимПризн2";
   else
    val="НаимПризн1";
 fi;
 Rep.Cell(RepRow+1,1,CellContents,val+"["+Str(Iter)+"]");
 Rep.Cell(RepRow+1,1,CellFieldType,cftCommonField);
 Rep.Cell(RepRow+1,1,CellFontColor,coBlack);
 Rep.Cell(RepRow+1,1,CellBgColor,12902076);
 Rep.Cell(RepRow+1,1,CellFontStyle,fsBold);
 Rep.Cell(RepRow+1,1,CellAlignment,2);
 Rep.Cell(RepRow+1,1,CellBorder,"2,2,2,0");
 Rep.Cell(RepRow+1,1,CellLookup,True);
 Rep.Cell(RepRow+1,1,CellEventOnEnter,"Гр_OnEnter"); --CellEventOnLookUp не работает ?
 Rep.CellLinks(1,RepRow+1,Rep_ColsCount,RepRow+1);
 RepRow=RepRow+1;
end;

Proc ВставитьСтрокуОтчета (Iter:I; пп_:I; aИтог:I);
var s,r,c,rr,cc,index:i;
var tmp:S;
 s=ВставитьСтроку("Табл2");
 rr=Rep_RowsCount[s];
 cc=Rep_ColsCount;
 for r=1..rr do
  if aИтог=2:
     Rep.Cell(RepRow+r,1,CellBorder,"2,0,0,2");
     Rep.Cell(RepRow+r,2,CellBorder,"0,0,0,2");
     Rep.Cell(RepRow+r,3,CellBorder,"0,0,0,2");
     Rep.Cell(RepRow+r,4,CellBorder,"0,0,0,2");
     Rep.Cell(RepRow+r,5,CellBorder,"0,0,0,2");
     Rep.Cell(RepRow+r,6,CellBorder,"0,0,0,2");
  fi;
  for c=1..cc do
   Index=GetCellIndex(s,r,c);
   if aИтог=2:
      if c<cc:
         Rep.Cell(RepRow+r,c,CellBgColor,12902076);
         if c>6:
            tmp=SubStr(Rep_CellBorder[Index],1,1)+",2,"+SubStr(Rep_CellBorder[Index],5,3);
            Rep.Cell(RepRow+r,c,CellBorder,tmp);
         fi;
      fi;
   fi;
   if Rep_CellFieldType[Index]=1:
      Rep.Cell(RepRow+r,c,CellContents,Rep_CellContents[Index]);
     else
      if Rep_CellContents[Index]="пп":
         if aИтог=2:
            Rep.Cell(RepRow+r,c,CellContents,"",True);
           else
            Rep.Cell(RepRow+r,c,CellContents,Str(пп_));
         fi;
         Rep.Cell(RepRow+r,c,CellFieldType,1);
        else
         Rep.Cell(RepRow+r,c,CellContents,Rep_CellContents[index]+"["+Str(Iter)+"]");
         if Round(ОстК[Iter],2)<0:
            Rep.Cell(RepRow+r,c,CellBgColor,coYellow);
            Rep.Cell(RepRow+r,10,CellFontColor,coRed);
         fi;
      fi;
   fi;
  od;
 od;
 RepRow=RepRow+rr;
end;

Proc ВставитьИтог(Iter:I);
var s,r,c,rr,cc,index:i;
var Val:s;
 s=ВставитьСтроку("Табл3");
 rr=Rep_RowsCount[s];
 cc=Rep_ColsCount;
 for r=1..rr do
  for c=1..cc do
   Index=GetCellIndex(s,r,c);
   Val=Str(Iter);
   if Rep_CellContents[Index]="ВсегоОстН": Val="ОстН["+Val+"]";
     |Rep_CellContents[Index]="ВсегоПрих": Val="Прих["+Val+"]";
     |Rep_CellContents[Index]="ВсегоРасх": Val="Расх["+Val+"]";
     |Rep_CellContents[Index]="ВсегоОстК": Val="ОстК["+Val+"]";
     |True: Rep.Cell(RepRow+r,c,CellContents,Rep_CellContents[Index]); Val="";
   fi;
   if not Val="": Rep.Cell(RepRow+r,c,CellContents,Val); fi;
  od;
 od;
 --Rep.CellLinks(2,RepRow+rr,5,RepRow+rr); --всего
 RepRow=RepRow+rr;
end;

Proc Оформление(Full:L);
var v,n,c,w,z:i;
var Справ_:S;
var Flag:L;
 Rep.Visible=False;
 Табл1.Visible=True;
 Табл2.Visible=True;
 Табл3.Visible=True;
 if not Full: Exit; fi;
 ClearVariable(Справ);
 ClearVariable(НаимСправ);
 Справ_=Trim(Trim(СправТабл+" "+СправПодТабл)+" "+СправСтр);
 ЧислоСправ=WordsCount(Справ_," ");
 w=300;
 for v=1..MaxСправ do
  Справ[v]=ExtractWord(v,Справ_," ");
  НаимСправ[v]=Name_A(SubStr(Справ[v],1,Length(Справ[v])-1));
  if НаимСправ[v]="" or НаимСправ[v]=" ": НаимСправ[v]=Справ[v]; fi;
  УСС[v]=0;
  z=SearchInArray(hСправ,Справ[v],True);
  if not z=-1:
     УСС[v]=hУСС[z];
  fi;
  Табл1.Row(1,RowVisible,not СправТабл="");
  if v=1 : Flag=not Справ[v]="" and СправТабл="" and СправПодТабл="";
    |v=2 : Flag=not Справ[v]="" and (СправТабл="" or (not СправТабл="" and СправПодТабл=""));
    |True: Flag=not Справ[v]="";
  fi;
  Табл1.Column(1+v,ColVisible,Flag);
  Табл2.Column(1+v,ColVisible,Flag);
  Табл3.Column(1+v,ColVisible,Flag);

  Табл1.Column(1+v,ColWidth,w);
  Табл2.Column(1+v,ColWidth,w);
  Табл3.Column(1+v,ColWidth,w);
 od;
 n=1;
 for c=2..Rep_ColsCount do
  if AsLogical(Табл1.Column(c,ColVisible,"")):
     n=n+1;
     nГр[c]=n;
  fi;
 od;
 ОбновитьОтчет;
end;

Func GetColWidth(Val:S; Line:I; W:I):i;
var l:i;
 l=Int(Length(Val)*10);
 HStr.Column(1,ColWidth,l);
 While not AsInteger(HStr.Cell(1,1,CellLinesCount,Val))=1 do
  l=l+10;
  HStr.Column(1,ColWidth,l);
 od;
 if Line>1 and l>w:
    While not AsInteger(HStr.Cell(1,1,CellLinesCount,Val))>Line do
     l=l-10;
     HStr.Column(1,ColWidth,l);
    od;
    l=l+10;
 fi;
 ^l;
end;

Proc ПостОбработка;
var Iter,s,i:i;
var tmp:S;
var Obj:Object;
 if Упр=0: Exit; fi;
 ClearVariable(Buf);
 ClearVariable(BufI);
 for Iter=1..Упр do
  if not НаимПризн1[Iter]="":
     Buf[1]=if(НаимПризн1[Iter]>Buf[1],НаимПризн1[Iter],Buf[1]);
  fi;
  if not НаимПризн2[Iter]="":
     Buf[2]=if(НаимПризн2[Iter]>Buf[2],НаимПризн2[Iter],Buf[2]);
  fi;
  if not НаимПризн3[Iter]="":
     Buf[3]=if(НаимПризн3[Iter]>Buf[3],НаимПризн3[Iter],Buf[3]);
  fi;
  if not НаимПризн4[Iter]="":
     Buf[4]=if(НаимПризн4[Iter]>Buf[4],НаимПризн4[Iter],Buf[4]);
  fi;
  if not НаимПризн5[Iter]="":
     Buf[5]=if(НаимПризн5[Iter]>Buf[5],НаимПризн5[Iter],Buf[5]);
  fi;
 od;
 for i=1..5 do
  BufI[i]=GetColWidth(Buf[i],1,300);
 od;
 for s=1..3 do
  if (not СправТабл="" or not СправПодТабл="") and s=2:
     tmp="Rep";
    else
     tmp="Табл"+Str(s);
  fi;
  if FindObject(tmp,Obj):
     Obj.Column(2,ColWidth,if(BufI[1]=0,300,BufI[1]));
     Obj.Column(3,ColWidth,if(BufI[2]=0,300,BufI[2]));
     Obj.Column(4,ColWidth,if(BufI[3]=0,300,BufI[3]));
     Obj.Column(5,ColWidth,if(BufI[4]=0,300,BufI[4]));
     Obj.Column(6,ColWidth,if(BufI[5]=0,300,BufI[5]));
  fi;
 od;
end;

Proc РазбитьТаблицы;
var Iter,p,v,w:i;
var Табл_,ПодТабл_:S;
 Табл1.Visible=False; Табл2.Visible=False; Табл3.Visible=False; Rep.Visible=False;
 ПодготовитьОтчет;
 Табл_=Призн1[1];
 ПодТабл_="";
 p=0;
 for Iter=1..Упр do
  Hint("Построение отчета "+Str(Iter*100/Упр)+" %");
  if Итог[Iter]=0:
     p=p+1;
  fi;
  if not Табл_=Призн1[Iter] and not СправТабл="":
     if not Iter=1: ВставитьШапку(Iter); fi;
     p=0;
     Табл_=Призн1[Iter];
  fi;
  if Итог[Iter]=1:
     ВставитьИтог(Iter);
    else
     if not ПодТабл_=if(СправТабл="",Призн1[Iter],Призн1[Iter]+"#"+Призн2[Iter]) and not СправПодТабл="":
        ВставитьПодСтрокуОтчета(Iter);
        ПодТабл_=if(СправТабл="",Призн1[Iter],Призн1[Iter]+"#"+Призн2[Iter]);
     fi;
     ВставитьСтрокуОтчета(Iter,p,Итог[Iter]);
  fi;
 od;
 --Итого по отчету
 if not СправТабл="":
    ВставитьШапку(0);
 fi;
 w=300;
 Табл1.Visible=True; Табл3.Visible=True; Rep.Visible=True;
 for v=1..MaxСправ do
  Табл1.Column(1+v,ColWidth,w);
  Табл2.Column(1+v,ColWidth,w);
  Табл3.Column(1+v,ColWidth,w);
 od;
end;

Proc ЧитатьЖурнал(FName:S; nn:i);
var n,z,s,ss,x:i;
var Спр1,Спр2,Спр3,Спр4,Спр5:S;
var Key,tВал1,tВал2,tСчДеб,tСчКре,tКмнт,vБК,vКОСГУ,vПризнБК,vПризнКОСГУ,v1,v2,v3,v4,v5:S;
var tДата:D;
var tСум1,tСум2:N;
 if ExistFile(FName)=False: Exit; fi;
 ClearVariable(KeyСвертка);
 ClearVariable(BufКБК);
 ClearVariable(BufНаимКБК);
 ClearVariable(BufПризнБК);
 ClearVariable(BufПризнКОСГУ);
 ClearVariable(BufПризн1);
 ClearVariable(BufПризн2);
 ClearVariable(BufПризн3);
 ClearVariable(BufПризн4);
 ClearVariable(BufПризн5);
 ClearVariable(tCache);
 Спр1=SubStr(Справ[1],1,Pos(".",Справ[1]));
 Спр2=SubStr(Справ[2],1,Pos(".",Справ[2]));
 Спр3=SubStr(Справ[3],1,Pos(".",Справ[3]));
 Спр4=SubStr(Справ[4],1,Pos(".",Справ[4]));
 Спр5=SubStr(Справ[5],1,Pos(".",Справ[5]));
 ShowProgress(nn*2,"Расчет...");
 if FlagКБК: 
    Раб.КБК.CrdToCache("КОСГУ2006",False);
 fi;
 OpenTextJur(FName);
 Try
  While not GetTransFromTextJur(tДата,tСум1,tВал1,tСум2,tВал2,tСчДеб,tСчКре,Buf,tКмнт) do
   n=n+1;
   ProgressPos(n);
   ss=LengthOfArray(Buf);
   Key=tСчДеб+" "+tСчКре;
   for s=1..ss do
    Key=Key+" "+Buf[s];
   od;
   if SearchInArray(tCache,Key,True)=-1:
      InsertInArraySort(tCache,Key);
      v1=""; v2=""; v3=""; v4=""; v5=""; vБК=""; vКОСГУ=""; vПризнБК=""; vПризнКОСГУ="";
      for s=1..ss do
       if FlagКБК:
          if Pos("ФКР."  ,Buf[s])=1: vПризнБК=Buf[s];    vБК=SubStr(Buf[s],5,20);
            |Pos("КД."   ,Buf[s])=1: vПризнБК=Buf[s];    vБК=SubStr(Buf[s],4,22);
            |Pos("КИФД." ,Buf[s])=1: vПризнБК=Buf[s];    vБК=SubStr(Buf[s],6,24);
            |Pos("КОСГУ.",Buf[s])=1: vПризнКОСГУ=Buf[s]; vКОСГУ=SubStr(Buf[s],7,3);
          fi;
       fi;
       if Pos(Спр1,Buf[s])=1: v1=if(УСС[1]=0:Buf[s]|УСС[1]>0:ExtractWords(1,УСС[1]+1,Buf[s],".")|true:Спр1+"*."+ExtractWords(Abs(УСС[1])+2,127,Buf[s],".")); fi;
       if Pos(Спр2,Buf[s])=1: v2=if(УСС[2]=0:Buf[s]|УСС[2]>0:ExtractWords(1,УСС[2]+1,Buf[s],".")|true:Спр2+"*."+ExtractWords(Abs(УСС[2])+2,127,Buf[s],".")); fi;
       if Pos(Спр3,Buf[s])=1: v3=if(УСС[3]=0:Buf[s]|УСС[3]>0:ExtractWords(1,УСС[3]+1,Buf[s],".")|true:Спр3+"*."+ExtractWords(Abs(УСС[3])+2,127,Buf[s],".")); fi;
       if Pos(Спр4,Buf[s])=1: v4=if(УСС[4]=0:Buf[s]|УСС[4]>0:ExtractWords(1,УСС[4]+1,Buf[s],".")|true:Спр4+"*."+ExtractWords(Abs(УСС[4])+2,127,Buf[s],".")); fi;
       if Pos(Спр5,Buf[s])=1: v5=if(УСС[5]=0:Buf[s]|УСС[5]>0:ExtractWords(1,УСС[5]+1,Buf[s],".")|true:Спр5+"*."+ExtractWords(Abs(УСС[5])+2,127,Buf[s],".")); fi;
      od;
      if FlagКБК:
         if Справ[1]="КБК.": v1=vБК+"."+vКОСГУ;
           |Справ[2]="КБК.": v2=vБК+"."+vКОСГУ;
           |Справ[3]="КБК.": v3=vБК+"."+vКОСГУ;
           |Справ[4]="КБК.": v4=vБК+"."+vКОСГУ;
           |Справ[5]="КБК.": v5=vБК+"."+vКОСГУ;
         fi;
      fi;
      --почемуто в свертку попадают проводки, по аналитике которых быть не должно
      if not ((not Справ[1]="" and v1="") or (not Справ[2]="" and v2="") or (not Справ[3]="" and v3="") or (not Справ[4]="" and v4="") or (not Справ[5]="" and v5="")):
         Key=v1+" "+v2+" "+v3+" "+v4+" "+v5;
         z=SearchInArray(KeyСвертка,Key,True);
         if z=-1:
            z=InsertInArraySort(KeyСвертка,Key);
            InsertInArray(BufКБК,z,if(FlagКБК,vБК+"."+vКОСГУ,""));
            InsertInArray(BufПризнБК,z,vПризнБК);
            InsertInArray(BufПризнКОСГУ,z,vПризнКОСГУ);
            InsertInArray(BufПризн1,z,v1);
            InsertInArray(BufПризн2,z,v2);
            InsertInArray(BufПризн3,z,v3);
            InsertInArray(BufПризн4,z,v4);
            InsertInArray(BufПризн5,z,v5);
            if FlagКБК:
               x=SearchInArray(Раб.КБК.cacheКОСГУ_Код,vКОСГУ,True);
               if x=-1: x=0; fi;
               InsertInArray(BufНаимКБК,z,Раб.КБК.cacheКОСГУ_Наим[x]);
            fi;
         fi;
      fi; --if (not Справ1="" and v1="") or (not Справ2="" and v2="") or (not Справ3="" and v3="") or (not Справ4="" and v4="") or (not Справ5="" and v5=""):
   fi; --if SearchInArray(tCache,Key,True)=-1:
  od; --While not GetTransFromTextJur(tДата,tСум1,tВал1,tСум2,tВал2,tСчДеб,tСчКре,Buf,tКмнт) do
 Finally
  CloseTextJur;
 end;
 if ExistFile(FName): DeleteFile(FName); fi;
end;

Proc СписокСправ;
 Раб.Бюджет2005.СписокСправ(МаскаСч,0,"");
 CopyArray(Раб.Бюджет2005.BufСправ,BufVoc);
 InsertInArray(BufVoc,1,"Обновить список справочников");
 InsertInArray(BufVoc,2,"КБК. --Бюджетная классификация");
end;

Func ВыборСправ:S;
var n:i;
 if LengthOfArray(BufVoc)=0: СписокСправ; fi;
 n=1;
 While n=1 do
  n=Alternate("Аналитические справочники",BufVoc,-1,1,12);
  if n=0: ^""; fi;
  if n=1: СписокСправ; fi;
 od;
 ^SubStr(BufVoc[n],1,Pos(" --",BufVoc[n])-1);
end;

Func MyTurn(vСч:S; vАн:S; ДН_:D; ДК_:D):N;
var Ret:N;
 if vСч="": ^0; fi;
 Try
  Ret=Round(Turn(vСч+"{"+vАн+"}",ДН_,ДК_)/ЕдИзм,Точн);
 Except
  Ret=0;
 end;
 ^Ret;
end;

Func MySaldo(vСч:S; vАн:S; Д_:D):N;
var Ret:N;
 if vСч="": ^0; fi;
 Try
  Ret=Round(Saldo(ExtractWord(1,vСч,"/")+"{"+vАн+"}",Д_)/ЕдИзм,Точн);
 Except
  Ret=0;
 end;
 ^Ret;
end;

Func МаскаСчета(aКодСч:S):S;
 if aКодСч="?.???.??": ^"*"; else  ^"*."+aКодСч+".*"; fi;
end;

Func ПолучитьУслСч (aБК:S; aКОСГУ:S; aСчДеб:S):S;
var Res:S;
 Res=aБК+"."+aСчДеб+"."+aКОСГУ;
 ^Res;
end;

Proc РасчетСтроки (vKey:S; vПризн1:S; vПризн2:S; vПризн3:S; vПризн4:S; vПризн5:S; vНаимКБК:S; vПризнБК:S; vПризнКОСГУ:S; vОстН:N; vПрих:N; vРасх:N; vОстК:N; vИтог:I);
var Iter:I;
 Iter=SearchInArray(KeyОтчет,vKey,True);
 if Iter=-1:
    Iter=InsertInArraySort(KeyОтчет,vKey);
    InsertFrame(Упр,Iter);
    Призн1[Iter]=vПризн1;
    Призн2[Iter]=vПризн2;
    Призн3[Iter]=vПризн3;
    Призн4[Iter]=vПризн4;
    Призн5[Iter]=vПризн5;
    НаимКБК[Iter]=vНаимКБК;
    ПризнБК[Iter]=vПризнБК;
    ПризнКОСГУ[Iter]=vПризнКОСГУ;
    ОстН[Iter]=vОстН;
    Прих[Iter]=vПрих;
    Расх[Iter]=vРасх;
    ОстК[Iter]=vОстК;
    Итог[Iter]=vИтог;
   else
    ОстН[Iter]=ОстН[Iter]+vОстН;
    Прих[Iter]=Прих[Iter]+vПрих;
    Расх[Iter]=Расх[Iter]+vРасх;
    ОстК[Iter]=ОстК[Iter]+vОстК;
 fi;
 if vИтог=0:
    ВсегоОстН=ВсегоОстН+vОстН;
    ВсегоПрих=ВсегоПрих+vПрих;
    ВсегоРасх=ВсегоРасх+vРасх;
    ВсегоОстК=ВсегоОстК+vОстК;
 fi;
end;

Proc Расчет;
var n,nn,v:i;
var FName,УслСчОбщ,УслАнОбщ,УслСжатияАн,ПризнДоп_,Key_,tmp:S;
var УслСч:S;
var УслАн:S;
var ОстН_,Прих_,Расх_,ОстК_:N;
 УслСчОбщ=МаскаСч;
 ПризнДоп_=if(ПризнДоп="","","("+ПризнДоп+")");
 УслАнОбщ=ПризнДоп_;
 УслСжатияАн=Раб.Бюджет2005.СписокСправ(МаскаСч,0,"ФКР.*|КД.*|КИФД.*|КОСГУ.*");
 if not МаскаСправ="": 
    УслАнОбщ=Раб.Бюджет2005.Объединить(УслАнОбщ,"("+МаскаСправ+")","&"); 
    УслСжатияАн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(УслСжатияАн,"|",МаскаСправ,"&");
 fi;
 FName=PlanVar("CACHE")+"\"+GetGUID;
 nn=TujReport(FName,1.1.100,ДК,УслСчОбщ,УслАнОбщ,УслСжатияАн,"","",TujRepTurnDebCre+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna,False);
 Try
  ЧитатьЖурнал(FName,nn);
  nn=LengthOfArray(KeyСвертка);
  ShowProgress(nn*2,"Расчет...");
  УслСч=ПолучитьУслСч("*","*",СчДеб);
  for n=1..nn do
   ProgressPos(nn+n);
   УслАн=Раб.Бюджет2005.Объединить(ПризнДоп_,"","&");
   Key_="";
   for v=1..ЧислоСправ do
    tmp=GetVariableS("BufПризн"+Str(v)+"["+Str(n)+"]");
    if Справ[v]="КБК.":
       УслАн=Раб.Бюджет2005.Объединить(УслАн,BufПризнБК[n],"&");
       УслАн=Раб.Бюджет2005.Объединить(УслАн,BufПризнКОСГУ[n]+"!","&");
       Key_=Key_+" "+tmp;
      else
       Key_=Key_+" "+tmp;
       if УСС[v]>0:
          if WordsCount(tmp,".")>УСС[v]:
             tmp=tmp+"!";
          fi;
       fi;
       УслАн=Раб.Бюджет2005.Объединить(УслАн,tmp,"&");
    fi;
   od;
   Key_=SubStr(Key_,2,255);
   ОстН_=MySaldo(УслСч,УслАн,ДН);
   Прих_=MyTurn("+"+УслСч,УслАн,ДН,ДК);
   Расх_=-MyTurn("-"+УслСч,УслАн,ДН,ДК);
   ОстК_=MySaldo(УслСч,УслАн,ДК);
   if not ОстН_=0 or not Прих_=0 or not Расх_=0 or not ОстК_=0:
      РасчетСтроки(Key_,BufПризн1[n],BufПризн2[n],BufПризн3[n],BufПризн4[n],BufПризн5[n],BufНаимКБК[n],BufПризнБК[n],BufПризнКОСГУ[n],ОстН_,Прих_,Расх_,ОстК_,0);
      if СправТабл="":
         if not СправПодТабл="" and fИтогПодТабл:
            tmp=BufПризн1[n]+" !";
            РасчетСтроки(tmp,BufПризн1[n],"","","","",BufНаимКБК[n],BufПризнБК[n],BufПризнКОСГУ[n],ОстН_,Прих_,Расх_,ОстК_,2);
         fi;
        else
         tmp=BufПризн1[n]+" я";
         РасчетСтроки(tmp,BufПризн1[n],"","","","",BufНаимКБК[n],BufПризнБК[n],BufПризнКОСГУ[n],ОстН_,Прих_,Расх_,ОстК_,1);
         if not СправПодТабл="" and fИтогПодТабл:
            tmp=BufПризн1[n]+" "+BufПризн2[n]+" !";
            РасчетСтроки(tmp,BufПризн1[n],BufПризн2[n],"","","",BufНаимКБК[n],BufПризнБК[n],BufПризнКОСГУ[n],ОстН_,Прих_,Расх_,ОстК_,2);
         fi;
      fi;
   fi;
  od;
 Finally
  CloseProgress;
 end;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func Ан_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var z:n;
 Try
  z=Saldo("{"+Value+"}",1.1.100);
 Except
  if ErrorCode<>23759:
     Raise;
    else
     Message("Недопустимо использовать '+' или '-' в данном условии",mtError);
  fi;
  ^False;
 end;
 ^True;
end;

Func Ан_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var FieldName:S;
 FieldName=AsString(Template.Field);
 Cur=AnaElection("*");
 if Cur="": Template.HideEditor(False); ^Cur; fi;
 Cur=Раб.Бюджет2005.Объединить_Диалог(GetVariableS(FieldName),Cur,"&=И;|=ИЛИ;&~=И ИСКЛЮЧИТЬ;_=ЗАМЕНИТЬ","_");
 if Раб.Бюджет2005.HideEditor: 
    Template.HideEditor(False);
    PutVariableS(FieldName,Cur);
 fi;
 Очистить;
 Оформление(False);
 ^Cur;
end;

Proc ДК_OnExit(FieldName: String; Iter: Integer);
 Очистить;
 Оформление(False);
end;

Func ДК_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:D;
 Template.HideEditor(False);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 ДК=tmp;
 Очистить;
 Оформление(False);
 ^Cur;
end;

Func ВД_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=Раб.КБК.Список("","","ВД+?");
 if tmp="": ^False; fi;
 ВД=tmp;
 if ВД="?":
    tmp="Все источники";
   else
    tmp=Раб.Бюджет.НаимКБК("СЧ",ВД);
 fi;
 ВД_=tmp+" ("+ВД+")";
 ClearVariable(BufVoc);
 Очистить;
 Оформление(False);
 ^False;
end;

Proc ВД_OnExit(FieldName: String; Iter: Integer);
 ВД="?";
 ВД_="Все источники (?)";
 ClearVariable(BufVoc);
end;

Func СправСтр_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,Справ_:S;
 Справ_=Trim(Trim(СправТабл+" "+СправПодТабл)+" "+СправСтр);
 if WordsCount(Справ_," ")>=MaxСправ: Message("Число справочников не может больше "+Str(MaxСправ)+"",mtError); ^False; fi;
 tmp=ВыборСправ;
 if tmp="": ^False; fi;
 if WordInString(tmp,Справ_," "): Message("Повторный ввод сравочника",mtError); ^False; fi;
 if СправСтр="": СправСтр=tmp; else СправСтр=СправСтр+" "+tmp; fi;
 Очистить;
 Оформление(True);
 ^False;
end;

Proc СправСтр_OnExit(FieldName: String; Iter: Integer);
var tmp:S;
 tmp=СправСтр;
 СправСтр=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(СправСтр," ","Name_A");
 if not tmp=СправСтр: Очистить; Оформление(True); fi;
end;

Func СправТабл_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,Справ_:S;
 Справ_=Trim(Trim(СправТабл+" "+СправПодТабл)+" "+СправСтр);
 if WordsCount(Справ_," ")>=MaxСправ: Message("Число справочников не может быть больше "+Str(MaxСправ)+"",mtError); ^False; fi;
 tmp=ВыборСправ;
 if tmp="": ^False; fi;
 if WordInString(tmp,Справ_," "): Message("Повторный ввод сравочника",mtError); ^False; fi;
 if FieldName="СправПодТабл_":
    СправПодТабл=tmp;
   else
    СправТабл=tmp;
 fi;
 Очистить;
 Оформление(True);
 ^False;
end;

Proc СправТабл_OnExit(FieldName: String; Iter: Integer);
 if FieldName="СправПодТабл_":
    СправПодТабл="";
   else
    СправТабл="";
 fi;
 Очистить; 
 Оформление(True);
end;

Func fИтогПодТабл_OnEnter(FieldName: String; Iter: Integer): logical;
 fИтогПодТабл=not fИтогПодТабл;
 Очистить;
 Оформление(True);
 Return False;
end;

Func УСС_OnEnter(FieldName: String; Iter: Integer): logical;
 if Справ[Iter]="КБК.": Message("Для данного справочника свертка не предусмотрена",mtWarning); УСС[Iter]=0; ^False; fi;
 FlagEdit=True;
 Return True;
end;

Func УСС_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 УСС[Iter]=Int(Value);
 Return True;
end;

Proc УСС_OnExit(FieldName: String; Iter: Integer);
var z:i;
 if FlagEdit: 
    FlagEdit=False;
   else
    УСС[Iter]=0;
 fi;
 z=SearchInArray(hСправ,Справ[Iter],True);
 if z=-1:
    z=InsertInArraySort(hСправ,Справ[Iter]);
    InsertInArray(hУСС,z,УСС[Iter]);
   else
    hУСС[z]=УСС[Iter];
 fi;
 Очистить; 
 Оформление(False);
end;

Proc ПризнДоп_OnExit(FieldName: String; Iter: Integer);
 Очистить;
 Оформление(False);
end;

Func ПризнДоп_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:S;
 tmp=Раб.Бюджет2005.СписокСправ(МаскаСч,0,"");
 if not tmp="": tmp="("+tmp+")|~*.*"; fi;
 Cur=AnaElection(tmp,false,true);
 if Cur="": Template.HideEditor(False); ^Cur; fi;
 if SubStr(cur,length(cur),1)=".": cur=SubStr(cur,1,length(cur)-1)+"!"; fi;
 Cur=Раб.Бюджет2005.Объединить_Диалог(ПризнДоп,Cur,"&=И;|=ИЛИ;&~=И ИСКЛЮЧИТЬ;_=ЗАМЕНИТЬ","_");
 if Раб.Бюджет2005.HideEditor: 
    Template.HideEditor(False);
    ПризнДоп=Cur;
 fi;
 Очистить;
 Оформление(False);
 Return Cur;
end;

Func ЕдИзм_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="Руб.";
 Buf[2]="Тыс. руб.";
 Buf[3]="Млн. руб.";
 n=Alternate("Выбор единицы измерения",Buf,-1,if(ЕдИзм=1000:2|ЕдИзм=1000000:3|true:1),12);
 if n=1: ЕдИзм=1;
   |n=2: ЕдИзм=1000;
   |n=3: ЕдИзм=1000000;
   |True: ^False;
 fi;
 Очистить;
 Оформление(False);
 Return False;
end;

Func Гр_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var n:i;
var Field:S;
 Template.HideEditor(False);
 ClearVariable(Buf);
 Buf[1]="Аналитический признак";
 Buf[2]="Наименование";
 Buf[3]="Наименование (Аналитический признак)";
 Buf[4]="Аналитический признак (Наименование)";
 n=Alternate("Режим показа элемента колонки",Buf,-1,1,12);
 if n=0: ^Cur; fi;
 Field=AsString(Template.Field);
 if Field="nГр[2]" or Field="nГр[1]": Гр[2]=n-1;
   |Field="nГр[3]": Гр[3]=n-1;
   |Field="nГр[4]": Гр[4]=n-1;
   |Field="nГр[5]": Гр[5]=n-1;
   |Field="nГр[6]": Гр[6]=n-1;
   |Match(Field,"НаимПризн1*"): Гр[2]=n-1;
   |Match(Field,"НаимПризн2*"): Гр[3]=n-1;
 fi;
 ^Cur;
end;

Func Гр_OnEnter(FieldName: String; Iter: Integer): logical;
 Гр_OnLookup("",1,1,"");
 Return False;
end;

Func onLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var СчУсл,АнУсл,tmp:S;
var p1,p2,v,Iter:i;
var FieldName:S;
 Template.HideEditor(False);
 FieldName=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 p1=Pos("[",FieldName);
 p2=Pos("]",FieldName);
 if not p1=0 and not p2=0: Iter=Int(SubStr(FieldName,p1+1,p2-p1-1)); fi;
 АнУсл=Раб.Бюджет2005.Объединить(if(ПризнДоп="","","("+ПризнДоп+")"),Ан,"&");
 СчУсл=ПолучитьУслСч("*","*",СчДеб);
 for v=1..ЧислоСправ do
  if Справ[v]="КБК.":
     АнУсл=Раб.Бюджет2005.Объединить(АнУсл,GetVariableS("ПризнБК"+"["+Str(Iter)+"]"),"&");
     АнУсл=Раб.Бюджет2005.Объединить(АнУсл,GetVariableS("ПризнКОСГУ"+"["+Str(Iter)+"]")+"!","&");
    else
     tmp=GetVariableS("Призн"+Str(v)+"["+Str(Iter)+"]");
     if УСС[v]>0:
       if WordsCount(tmp,".")>УСС[v]:
          tmp=tmp+"!";
       fi;
     fi;
     АнУсл =Раб.Бюджет2005.Объединить(АнУсл ,tmp,"&");
  fi;
 od;
 if 253-Length(АнУсл)<Length(СчУсл): Message("Расшифровка невозможна. Слишком сложное условие отбора проводок^MВыполните расчет в разрезе КБК",mtError); ^Cur; fi;
 Report('"'+PlanVar("Общие")+'\Отчеты\Служебные отчеты.lst"."001"',ДН,ДК,СчУсл,АнУсл);
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnРасчет_OnClick(Sender: String);
var n,err:i;
var Справ_:S;
 Try
  Очистить;
  Оформление(True);
  if ДК=1.1.100: Message("Введите дату расчета",mtError); Template.Field="ДК"; Exit; fi;
  if ВД="": Message("Выберите источник",mtError); Template.Field="ВД_"; Exit; fi;
  Справ_=Trim(Trim(СправТабл+" "+СправПодТабл)+" "+СправСтр);
  ЧислоСправ=WordsCount(Справ_," ");
  if ЧислоСправ=0: Message("Задайте разрез аналитических справочников",mtError); Template.Field="СправСтр_"; Exit; fi;
  if ЕдИзм=0: ЕдИзм=1; fi;
  Refresh;
  МаскаСправ=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Справ_," ","КБК.","");
  FlagКБК=not WordsCount(МаскаСправ," ")=ЧислоСправ;
  МаскаСправ=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(МаскаСправ," ","&");
  Расчет;
  if (not СправТабл="" or not СправПодТабл="") and Упр>0: RepRow=0; РазбитьТаблицы; fi;
  ПостОбработка;
  err=0;
  for n=1..Упр do
   if Round(ОстК[n],2)<0: err=n; Break; fi;
  od;
 Finally
  Отч="Составлен: "+DateToString(ToDay)+" в "+Раб.Бюджет2005.TimeToStr(Time,"")+" Пользователь: "+UserName(AliasName("РПО_БЮДЖ_КЛАСС"));
 end;
 Message("Расчет завершен"+if(err=0,"",chr(13)+"Внимание! Обнаружен отрицательный остаток кассы"),if(err=0,mtInformation,mtWarning));
 if not Err=0: 
    if СправТабл="":
       Template.Field="ОстК";
       Template.Frame=err;
      else
       Template.Field="ОстК["+Str(err)+"]";
    fi;
 fi;
end;

Proc cb_OnChange(Sender: String);
 Очистить;
 Оформление(True);
end;

Proc cbНС_OnChange(Sender: String);
var r,rr:I;
var Obj: Object;
 if FindObject("Rep",Obj):
    rr=AsInteger(Obj.RowsCount);
    for r=1..rr do
     if Pos("nГр",AsString(Obj.Cell(r,1,CellContents,"")))=1:
        Obj.Row(r-1,RowNewPage,fНС);
     fi;
    od;
 fi;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 СписокСправ;
 if СправТабл="" and СправСтр="": СправСтр="КБК."; fi;
 if notRecoveryRep: Очистить; notRecoveryRep=False; fi;
end;

Proc AfterOpen(Destroy: Logical);
 ИнициализироватьОтчет;
 Оформление(True);
 if not СправТабл="" and Упр>0: RepRow=0; РазбитьТаблицы; fi;
end;
--Обработчики событий шаблона -----
--


Конец