-- Шаблон создан мастером бланков
-- 09.10.2007 12:09:30
--
БланкСШаблоном "Движение ЛБО ПБС";

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

fПериод:I;

var Загл:S="Движение ЛБО ПБС"+if(fПериод=1:" первого планового года"|fПериод=2:" второго планового года"|True:" текущего года");

var СчДеб_ЛБО:S=if(fПериод=1:"1.501.22"|fПериод=2:"1.501.32"|True:"1.501.12");
var СчКре_ЛБО:S=if(fПериод=1:"1.501.24"|fПериод=2:"1.501.34"|True:"1.501.14");

var Ан_ЛБО:S="";

var СчКБК_ЛБО:I=1;

var МаскаСч:S="(*."+if(СчКБК_ЛБО=0,СчДеб_ЛБО,СчКре_ЛБО)+".*)";

NewPage:L;

fИтог:L;
fАбсолют:L;

Период:I;

ПризнПБС:S;
var ПризнПБС_:S=if(Name_A(ПризнПБС)="" or Name_A(ПризнПБС)=" ",ПризнПБС,Name_A(ПризнПБС));

УпрКБК:I;
МаскаКБК[]:S;

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

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

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

ПризнДоп:S;

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

var ff1:S=if(Точн=1,",##0.0;; ",",##0.00;; ");
var ff2:S=if(Точн=1,"+,##0.0;-,##0.0; ","+,##0.00;-,##0.00; ");


Гр[]:I;

var nГр[]:I;

var Дт[]:D;
var Дт_[]:D;

var KeyСтр[]:S;

var НаимКБК[]:S;
var Призн1[]:S;
var Призн2[]:S;
var Призн3[]:S;
var Призн4[]: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 НаимПризн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 ЛБОН[]:N;
var ЛБОК[]:N;
var Итог[]:I;

var ВсегоКолЛБОН:N;
var ВсегоКолЛБОК:N;


var KeyКол[]:S;
var ЛБО[]:N;
var ВсегоКолЛБО[]:N;

var ЛБО0:I=0;

Rep:Section;

var r0:I=3;
var c0:I=6;

var BufVoc[]:S;
var Buf[]:S;
var Buf2[]:S;
var BufN[]:N;

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

var tCache[]:S;
--
--Процедуры и функции -------------
Func YYYYMMDD (Val:D):S;
var tmp:S;
 tmp=DateToString(Val);
 ^SubStr(tmp,7,4)+"."+SubStr(tmp,4,2)+"."+SubStr(tmp,1,2);
end;

Proc Очистить;
 ClearVariable(KeyСтр);
 ClearVariable(НаимКБК);
 ClearVariable(Призн1);
 ClearVariable(Призн2);
 ClearVariable(Призн3);
 ClearVariable(Призн4);
 ClearVariable(ЛБОН);
 ClearVariable(ЛБОК);
 ClearVariable(Итог);
 ClearVariable(ВсегоКолЛБОН);
 ClearVariable(ВсегоКолЛБОК);
 ClearVariable(KeyКол);
 ClearVariable(ЛБО);
 ClearVariable(ВсегоКолЛБО);
 ClearVariable(Дт);
 if AsString(Template.Name)="Rep":
    Template.Column=1;
    Template.Row=2;
 fi;
 Rep.ColsCount=c0;
 Rep.RowsCount=r0;
end;

Proc Оформление;
var v,z,n:i;
var Справ_:S;
 ClearVariable(Справ);
 ClearVariable(НаимСправ);
 Справ_=СправТабл+" "+СправСтр;
 ЧислоСправ=WordsCount(Справ_," ");
 for v=1..MaxСправ do
  Справ[v]=ExtractWord(v,Справ_," ");
  НаимСправ[v]=Name_A(SubStr(Справ[v],1,Length(Справ[v])-1));
  if НаимСправ[v]="" or НаимСправ[v]=" ": НаимСправ[v]=Справ[v]; fi;
  Rep.Row(1,RowVisible,not СправТабл="");
  Rep.Column(1+v,ColVisible,not Справ[v]="" and (not v=1 or v=1 and СправТабл=""));
 od;
 if СправТабл="": z=0; else z=1; fi;
 for n=2..5  do nГр[n]=n-z; od;
 nГр[6]=ЧислоСправ+6-z-4;
end;

Func ВставитьШапку (Obj:Object; r:i; dd:i; i:I):I;
var c,cc,d:i;
var tmp:S;
 cc=c0+dd+1;
 --
 if not r=1:
    c=1; Obj.Cell(r,c,CellBorder,"0,0,0,0"); 
    Obj.CellLinks(c,r,cc,r);
    Obj.Row(r,RowNewPage,NewPage);
    r=r+1;
 fi;
 --
 c=1; Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellBorder,"0,0,0,0"); Obj.Cell(r,c,CellContents,"nГр[1]"); Obj.Cell(r,c,CellFieldType,cftCommonField); Obj.Cell(r,c,CellLookup,True); Rep.Cell(r,c,CellEventOnLookup,"nГр_OnLookup");
 c=2;
 if i=0: tmp="Всего по отчету"; Obj.Cell(r,c,CellFieldType,cftStaticText); else  tmp="НаимПризн1["+Str(i)+"]"; Obj.Cell(r,c,CellFieldType,cftCommonField); fi;
 Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellBorder,"0,0,0,0"); Obj.Cell(r,c,CellContents,tmp);
 Obj.CellLinks(c,r,cc,r);
 --
 r=r+1;
 c=1; Obj.Cell(r,c,CellBorder,"2,2,1,2"); Obj.Cell(r,c,CellContents,"№ п.п."); Obj.Cell(r,c,CellFieldType,cftStaticText); Obj.Cell(r,1,CellEventOnClick,"onClick");
 for c=2..5 do
  Obj.Cell(r,c,CellBorder,"1,2,1,2"); Obj.Cell(r,c,CellContents,"НаимСправ["+Str(c-1)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
 od;
 c=6; Obj.Cell(r,c,CellBorder,"1,2,1,2"); Obj.Cell(r,c,CellContents,"Сумма на начало периода"); Obj.Cell(r,c,CellFieldType,cftStaticText);
 for d=1..dd do
  c=c0+d;
  if Период=0: tmp=DateToString(ДТ[d]);
    |Период=1: tmp=Месяц(Mon(ДТ[d]));
    |True:     tmp=if(Mon(ДТ[d])=3:"I квартал"|Mon(ДТ[d])=6:"II квартал"|Mon(ДТ[d])=9:"III квартал"|True:"IV квартал");
  fi;
  Obj.Cell(r,c,CellBorder,"1,2,1,2"); Obj.Cell(r,c,CellAlignment,2); Obj.Cell(r,c,CellContents,tmp); Obj.Cell(r,c,CellFieldType,cftStaticText);
 od;
 c=cc; Obj.Cell(r,c,CellBorder,"1,2,2,2"); Obj.Cell(r,c,CellAlignment,2); Obj.Cell(r,c,CellContents,"Сумма на конец периода"); Obj.Cell(r,c,CellFieldType,cftStaticText);
 --
 r=r+1;
 c=1; Obj.Cell(r,c,CellBorder,"2,2,1,2"); Obj.Cell(r,c,CellContents,"1"); Obj.Cell(r,c,CellFieldType,cftStaticText);
 for c=2..cc-1 do
  Obj.Cell(r,c,CellBorder,"1,2,1,2"); Obj.Cell(r,c,CellContents,"nГр["+Str(c)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
  if c>1 and c<6: Obj.Cell(r,c,CellLookup,True); Rep.Cell(r,c,CellEventOnLookup,"nГр_OnLookup"); fi;
 od;
 c=cc; Obj.Cell(r,c,CellBorder,"1,2,2,2"); Obj.Cell(r,c,CellContents,"nГр["+Str(c)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
 ^r;
end;

Func ВставитьСтроку (Obj: Object; r:i; dd:i; i:i; p:i):I;
var c,cc,d,z:i;
var tmp:S;
 cc=c0+dd+1;
 c=1; Obj.Cell(r,c,CellBorder,"2,1,1,1"); Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellContents,Str(p)); Obj.Cell(r,1,CellFieldType,cftStaticText); Obj.Cell(r,1,CellEventOnClick,"onClick");
 --
 for c=2..5 do
  Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellContents,"НаимПризн"+Str(c-1)+"["+Str(i)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
 od;
 --
 c=6; Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellFormat,ff1); Obj.Cell(r,c,CellContents,"ЛБОН["+Str(i)+"]"); Obj.Cell(r,c,CellFieldType,cftNumericField); Obj.Cell(r,c,CellLookup,True); Obj.Cell(r,c,CellEventOnLookup,"onLookup");
 --
 for d=1..dd do
  z=SearchInArray(KeyКол,YYYYMMDD(Дт[d])+" "+KeyСтр[i],True);
  if not z=-1: tmp="ЛБО["+Str(z)+"]"; else tmp="ЛБО0"; fi;
  c=c0+d;
  Obj.Cell(r,c,CellContents,tmp);
  Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellFormat,ff2); Obj.Cell(r,c,CellFieldType,cftNumericField); Obj.Cell(r,c,CellLookup,True); Obj.Cell(r,c,CellEventOnLookup,"onLookup");
 od;
 --
 c=cc; Obj.Cell(r,c,CellBorder,"1,1,2,1"); Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellFormat,ff1); Obj.Cell(r,c,CellContents,"ЛБОК["+Str(i)+"]"); Obj.Cell(r,c,CellFieldType,cftNumericField); Obj.Cell(r,c,CellLookup,True); Obj.Cell(r,c,CellEventOnLookup,"onLookup");
 --
 if not Итог[i]=0:
    for c=Итог[i]+1..cc do
     Obj.Cell(r,c,CellFontStyle,fsBold);
     Obj.Cell(r,c,CellBgColor,coLtGray);
    od;
 fi;
 ^r;
end;

Func ВставитьИтог (Obj: Object; r:i; dd:i; i:i):I;
var c,cc,d,z:i;
var tmp:S;
 cc=c0+dd+1;
 c=1; Obj.Cell(r,c,CellBorder,"0,2,0,0");
 c=2; Obj.Cell(r,c,CellBorder,"0,2,0,0"); 
 c=3; Obj.Cell(r,c,CellBorder,"0,2,0,0");
 c=4; Obj.Cell(r,c,CellBorder,"0,2,0,0");
 c=5; Obj.Cell(r,c,CellBorder,"0,2,0,0");
 --Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellContents,"Всего"); Obj.Cell(r,c,CellFieldType,cftStaticText);
 --Obj.CellLinks(c,r,5,r);
 if i=0: tmp="ВсегоКолЛБОН"; else tmp="ЛБОН["+Str(i)+"]"; fi;
 c=6; Obj.Cell(r,c,CellBgColor,coLime); Obj.Cell(r,c,CellBorder,"2,2,1,2"); Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellFormat,ff1); Obj.Cell(r,c,CellContents,tmp); Obj.Cell(r,c,CellFieldType,cftNumericField);
 for d=1..dd do
  c=c0+d;
  if i=0: 
     tmp="ВсегоКолЛБО["+Str(d)+"]"; 
    else 
     z=SearchInArray(KeyКол,YYYYMMDD(Дт[d])+" "+KeyСтр[i],True);
     if not z=-1: tmp="ЛБО["+Str(z)+"]"; else tmp="ЛБО0"; fi;
  fi;
  Obj.Cell(r,c,CellBgColor,coLime); Obj.Cell(r,c,CellBorder,"1,2,1,2"); Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellFormat,ff2); Obj.Cell(r,c,CellContents,tmp); Obj.Cell(r,c,CellFieldType,cftNumericField);
 od;
 if i=0: tmp="ВсегоКолЛБОК"; else tmp="ЛБОК["+Str(i)+"]"; fi;
 c=cc; Obj.Cell(r,c,CellBgColor,coLime); Obj.Cell(r,c,CellBorder,"1,2,2,2"); Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellFormat,ff1); Obj.Cell(r,c,CellContents,tmp); Obj.Cell(r,c,CellFieldType,cftNumericField);
 ^r;
end;

Proc ПостроитьОтчет;
var d,dd,r,rr,c,cc,i,ii,p:i;
var Obj:Object;
var hПризн1:S;
 ii=LengthOfArray(KeyСтр);
 if ii=0: Exit; fi;
 ClearVariable(Buf);
 Try
  ShowProgress(ii,"Построение отчета....");
  if FindObject("Rep",Obj):
     Obj.Visible=False;
     dd=LengthOfArray(Дт);
     for d=1..dd+1 do nГр[c0+d]=nГр[c0]+d; od;
     cc=c0+dd+1;
     if not СправТабл="":
	for i=1..ii do
	 AddInArray(Buf,True,False,Призн1[i]);
	od;
	rr=(LengthOfArray(Buf)+1)*4+ii;
       else
	rr=4+ii;
     fi;
     Rep.ColsCount=cc;
     Rep.RowsCount=rr;
     for c=7..cc do
      Obj.Column(c,ColWidth,250);
     od;
     r=ВставитьШапку(Obj,1,dd,1);
     if СправТабл="":
	for i=1..ii do
	 ProgressPos(i);
	 r=ВставитьСтроку(Obj,r+1,dd,i,i);
	od;
	r=ВставитьИтог(Obj,r+1,dd,0);
       else
	hПризн1=Призн1[1];
	p=1;
	for i=1..ii do
	 ProgressPos(i);
	 if not hПризн1=Призн1[i]:
	    p=1;
	    r=ВставитьШапку(Obj,r+1,dd,i);
	    r=ВставитьСтроку(Obj,r+1,dd,i,p);
	    hПризн1=Призн1[i];
	   else
	    if Итог[i]=1: r=ВставитьИтог(Obj,r+1,dd,i); else r=ВставитьСтроку(Obj,r+1,dd,i,p); fi;
	 fi; --if not hПризн1=Призн1[i]:
	 p=p+1;
	od; --for i=1..ii do
	r=ВставитьШапку(Obj,r+1,dd,0);
	r=ВставитьИтог(Obj,r+1,dd,0);
     fi; --if СправТабл="":
     Obj.Visible=True;
  fi;
 Finally
  CloseProgress;
 end;
end;

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

Func ВыборСправ:S;
var n:i;
 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;

Proc УдалитьПустыеМаскиКБК;
var n:i;
 n=1;
 While n<=УпрКБК do
  if МаскаКБК[n]="": DeleteFrame(УпрКБК,n); else n=n+1; fi;
 od;
end;

Func ПроверитьМаскиКБК:L;
var n1,n2:i;
var acc,КБК1_,КОСГУ1_,КБК2_,КОСГУ2_:s;
 for n1=1..УпрКБК do
  КБК1_=Раб.Бюджет2005.ВзятьКодКБК(МаскаКБК[n1],"ФКР","КБК",False);
  КОСГУ1_=Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[n1],"ФКР","КОСГУ",False);
  for n2=n1+1..УпрКБК do
   КБК2_=Раб.Бюджет2005.ВзятьКодКБК(МаскаКБК[n2],"ФКР","КБК",False);
   КОСГУ2_=Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[n2],"ФКР","КОСГУ",False);
   for Account acc=Раб.Бюджет2005.Объединить(КБК1_+".?.???.??."+КОСГУ1_,КБК2_+".?.???.??."+КОСГУ2_,"&") do
    Message("Повторный ввод классификации "+МаскаКБК[n1],mtError);
    Template.Field="МаскаКБК_";
    Template.Frame=n2;
    ^False;
   od;
  od;
 od;
 ^True;
end;

Func СжатиеУслКБК(vКБК:S):S;
var ППП,РП,СТ,ВР:S;
 ППП=SubStr(vКБК,1,3); if ППП="???": ППП="*"; fi;
 РП=SubStr(vКБК,5,4); if РП="????": РП="*"; fi;
 СТ=SubStr(vКБК,10,7); if СТ="???????": СТ="*"; fi;
 ВР=SubStr(vКБК,18,3); if ВР="???": ВР="*"; fi;
 ^ППП+"."+РП+"."+СТ+"."+ВР;
end;

Func ОбработатьДаты(УслСчОбщ:S; УслАнОбщ:S; k:i):I;
var n,nn,z:i;
var Д:D;
 if Период=0:
    ClearVariable(Дт_);
    nn=ДК-ДН;
    for n=0..nn do
     Д=ДН+n;
     if ExistsTransactions(УслСчОбщ+"{"+УслАнОбщ+"}",Д,Д+1): 
	if SearchInArray(Дт,Д,True)=-1:
	   z=InsertInArraySort(Дт,Д);
	   InsertInArray(ВсегоКолЛБО,z,0);
	fi;
	AddInArray(Дт_,True,False,Д);
     fi;
    od;
   |Период=1 and k=1:
    for n=Mon(ДН)..Mon(ДК) do
     if n=Mon(ДК): Д=ДК; else Д=Dat(1,n+1,Year(ДН))-1; fi;
     AddInArray(Дт,True,False,Д);
    od;
    CopyArray(Дт,Дт_);
   |Период=2 and k=1:
    if Mon(ДН)<4 : Дт[1]=Dat(31,3 ,Year(ДН));
      |Mon(ДН)<7 : Дт[1]=Dat(30,6 ,Year(ДН));
      |Mon(ДН)<10: Дт[1]=Dat(30,9 ,Year(ДН));
      |True:	   Дт[1]=Dat(31,12,Year(ДН));
    fi;
    if Mon(ДК)>3 and 3>Mon(ДН): AddInArray(Дт,True,False,Dat(30,6 ,Year(ДК))); fi;
    if Mon(ДК)>6 and 6>Mon(ДН): AddInArray(Дт,True,False,Dat(30,9 ,Year(ДК))); fi;
    if Mon(ДК)>9 and 9>Mon(ДН): AddInArray(Дт,True,False,Dat(31,12,Year(ДК))); fi;
    CopyArray(Дт,Дт_);
 fi;
 ^LengthOfArray(Дт_);
end;

Proc ReadJur(k:i; kk:i; FName:S; nn:i);
var F,n,z,s,ss,x:i;
var tmp,Спр1,Спр2,Спр3,Спр4:S;
var Key,tВал1,tВал2,tСчДеб,tСчКре,tКмнт,tКБК,v1,v2,v3,v4:S;
var tДата:D;
var tСум1,tСум2:N;
 if ExistFile(FName)=False: Exit; fi;
 ClearVariable(KeyСвертка);
 ClearVariable(BufНаимКБК);
 ClearVariable(BufПризн1);
 ClearVariable(BufПризн2);
 ClearVariable(BufПризн3);
 ClearVariable(BufПризн4);
 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]));
 ShowProgress(nn*2,"Расчет..."+Str(k)+" из "+Str(kk));
 if FlagКБК: Раб.КБК.CrdToCache("КОСГУ2006",False); Раб.КБК.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);
      if FlagКБК:
	 if tСчДеб="00" or tСчДеб="00Z":
	    tКБК=Раб.Бюджет2005.ВзятьКодСчета(tСчКре,"ФКР","КБК",False)+"."+Раб.Бюджет2005.ВзятьКодСчета(tСчКре,"ФКР","КОСГУ",False);
	   else
	    tКБК=Раб.Бюджет2005.ВзятьКодСчета(tСчДеб,"ФКР","КБК",False)+"."+Раб.Бюджет2005.ВзятьКодСчета(tСчДеб,"ФКР","КОСГУ",False);
	 fi;
      fi;
      ss=LengthOfArray(Buf);
      if ss=0: v1=tКБК; fi;
      for s=1..ss do
       if Справ[1]="КБК.": v1=tКБК; else if Pos(Спр1,Buf[s])=1: v1=Buf[s]; fi; fi;
       if Справ[2]="КБК.": v2=tКБК; else if Pos(Спр2,Buf[s])=1: v2=Buf[s]; fi; fi;
       if Справ[3]="КБК.": v3=tКБК; else if Pos(Спр3,Buf[s])=1: v3=Buf[s]; fi; fi;
       if Справ[4]="КБК.": v4=tКБК; else if Pos(Спр4,Buf[s])=1: v4=Buf[s]; fi; fi;
      od;
      --почемуто в свертку попадают проводки, по аналитике которых быть не должно
      if not ((not Справ[1]="" and v1="") or (not Справ[2]="" and v2="") or (not Справ[3]="" and v3="") or (not Справ[4]="" and v4="")):
	 Key=v1+" "+v2+" "+v3+" "+v4;
	 z=SearchInArray(KeyСвертка,Key,True);
	 if z=-1:
	    z=InsertInArraySort(KeyСвертка,Key);
	    InsertInArray(BufПризн1,z,v1);
	    InsertInArray(BufПризн2,z,v2);
	    InsertInArray(BufПризн3,z,v3);
	    InsertInArray(BufПризн4,z,v4);
	    if FlagКБК:
	       x=SearchInArray(Раб.КБК.cacheКОСГУ_Код,SubStr(tКБК,22,3),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;

Func ПолучитьУслСч (vБК:S; vКОСГУ:S; vСчКБК:I; vСчДеб:S; vСчКре:S):S;
var Res:S;
 if vСчКБК=0:
    Res=vБК+"."+vСчДеб+"."+vКОСГУ+"/*."+vСчКре+".*";
   else
    Res="*."+vСчДеб+".*/"+vБК+"."+vСчКре+"."+vКОСГУ;
 fi;
 ^Res;
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 РасчетСтроки (dd:I; vKeyСтр:S; vПризн1:S; vПризн2:S; vПризн3:S; vПризн4:S; vНаимКБК:S; vЛБОН:N; vЛБОК:N; vИтог:I):I;
var d,Iter,z:I;
var tmp:S;
 Iter=SearchInArray(KeyСтр,vKeyСтр,True);
 if Iter=-1:
    Iter=InsertInArraySort(KeyСтр,vKeyСтр);
    InsertInArray(Призн1,Iter,vПризн1);
    InsertInArray(Призн2,Iter,vПризн2);
    InsertInArray(Призн3,Iter,vПризн3);
    InsertInArray(Призн4,Iter,vПризн4);
    InsertInArray(НаимКБК,Iter,vНаимКБК);
    InsertInArray(ЛБОН,Iter,vЛБОН);
    InsertInArray(ЛБОК,Iter,vЛБОК);
    InsertInArray(Итог,Iter,vИтог);
   else
    ЛБОН[Iter]=ЛБОН[Iter]+vЛБОН;
    ЛБОК[Iter]=ЛБОК[Iter]+vЛБОК;
 fi; --if Iter=-1:
 if vИтог=0:
    ВсегоКолЛБОН=ВсегоКолЛБОН+vЛБОН;
    ВсегоКолЛБОК=ВсегоКолЛБОК+vЛБОК;
 fi;
 --заполняем колонки
 for d=1..dd do
  if not BufN[d]=0:
     tmp=YYYYMMDD(Дт_[d])+" "+vKeyСтр;
     z=SearchInArray(KeyКол,tmp,True);
     if z=-1:
	z=InsertInArraySort(KeyКол,tmp);
	InsertInArray(ЛБО,z,BufN[d]);
       else
	ЛБО[z]=ЛБО[z]+BufN[d];
     fi; --if z=-1:
     if vИтог=0: 
	z=d;
	if Период=0:
	   z=SearchInArray(Дт,Дт_[d],True);
	fi;
	ВсегоКолЛБО[z]=ВсегоКолЛБО[z]+BufN[d];
     fi;
  fi; --if not BufN[d]=0:
 od; --for d=1..dd do
 ^Iter;
end;

Proc Расчет (k:i; kk:i; vКБК:S; vКОСГУ:S);
var n,nn,v,d,dd,z,Iter:i;
var FName,ПризнДоп_,УслСчОбщ,УслСчЛБО,УслАнОбщ,УслАнЛБО,УслСжатияАн,tmp:S;
var ЛБОН_,ЛБОК_:N;
var БК,КОСГУ:S;
var prevД:D;
var Flag:L;
 УслСчОбщ=МаскаСч+"&("+vКБК+"."+Раб.Бюджет2005.МаскаСч6+"."+vКОСГУ+")";
 УслСчЛБО=ПолучитьУслСч(vКБК,vКОСГУ,СчКБК_ЛБО,СчДеб_ЛБО,СчКре_ЛБО);
 ПризнДоп_=if(ПризнДоп="","","("+ПризнДоп+")");
 УслАнОбщ=Раб.Бюджет2005.Объединить(ПризнДоп_,ПризнПБС,"&");
 УслСжатияАн=Раб.Бюджет2005.СписокСправ(МаскаСч,0,"");
 if not МаскаСправ="": 
    УслАнОбщ=Раб.Бюджет2005.Объединить(УслАнОбщ,"("+МаскаСправ+")","&"); 
    УслСжатияАн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(УслСжатияАн,"|",МаскаСправ,"&");
 fi;
 FName=PlanVar("CACHE")+"\"+GetGUID;
 nn=TujReport(FName,ДН,ДК+1,УслСчОбщ,УслАнОбщ,УслСжатияАн,"","",TujRepTurnDebCre+TujRepZabalance+TujRepCombinedAna,False);
 Try
  ReadJur(k,kk,FName,nn);
  nn=LengthOfArray(KeyСвертка);
  ShowProgress(nn*2,"Расчет..."+Str(k)+" из "+Str(kk));
  dd=ОбработатьДаты(УслСчОбщ,УслАнОбщ,k);
  for n=1..nn do
   ProgressPos(nn+n);
   УслАнЛБО=Раб.Бюджет2005.Объединить(ПризнДоп_,if(Ан_ЛБО="","","("+Ан_ЛБО+")"),"&");
   УслАнЛБО=Раб.Бюджет2005.Объединить(УслАнЛБО,ПризнПБС,"&");
   for v=1..ЧислоСправ do
    tmp=GetVariableS("BufПризн"+Str(v)+"["+Str(n)+"]");
    if Справ[v]="КБК.":
       БК=SubStr(tmp,1,20);
       КОСГУ=SubStr(tmp,22,3);
       УслСчЛБО=ПолучитьУслСч(БК,КОСГУ,СчКБК_ЛБО,СчДеб_ЛБО,СчКре_ЛБО);
      else
       УслАнЛБО=Раб.Бюджет2005.Объединить(УслАнЛБО,tmp,"&");
    fi; --if Справ[v]="КБК.":
   od; --for v=1..ЧислоСправ do
   --
   Flag=False;
   prevД=ДН;
   for d=1..dd do
    BufN[d]=MyTurn(УслСчЛБО,УслАнЛБО,prevД,Дт_[d]+1);
    prevД=Дт_[d]+1;
    if not BufN[d]=0: Flag=True; fi;
   od;
   --
   if Flag:
      ЛБОН_=MyTurn(УслСчЛБО,УслАнЛБО,ДНГ,ДН);
      ЛБОК_=MyTurn(УслСчЛБО,УслАнЛБО,ДНГ,ДК+1);
      Iter=РасчетСтроки(dd,KeyСвертка[n],BufПризн1[n],BufПризн2[n],BufПризн3[n],BufПризн4[n],BufНаимКБК[n],ЛБОН_,ЛБОК_,0);
      if fИтог:
	 for v=1..ЧислоСправ-1 do
	  tmp=ExtractWords(1,ЧислоСправ-v,KeyСвертка[n]," ")+" я";
	  РасчетСтроки(dd,tmp,BufПризн1[n],if(ЧислоСправ-v>1,BufПризн2[n],""),if(ЧислоСправ-v>2,BufПризн3[n],""),"",BufНаимКБК[n],ЛБОН_,ЛБОК_,ЧислоСправ-v);
	 od;
	 if not СправТабл="" and ЧислоСправ=1:
	    tmp=ExtractWord(1,KeyСвертка[n]," ")+" я";
	    РасчетСтроки(dd,tmp,BufПризн1[n],"","","",BufНаимКБК[n],ЛБОН_,ЛБОК_,1);
	 fi;
	else
	 if not СправТабл="":
	    tmp=ExtractWord(1,KeyСвертка[n]," ")+" я";
	    РасчетСтроки(dd,tmp,BufПризн1[n],"","","",BufНаимКБК[n],ЛБОН_,ЛБОК_,1);
	 fi;
      fi;
   fi; --if Flag:
  od; --for n=1..nn do
 Finally
  CloseProgress;
 end;
end;

Proc ЗадатьФорматЧисел(Frmt:I);
var Obj: Object;
var r,rr,c,cc,z:i;
var ff,tmp:s;
 ff=if(Точн=1,"0.0[D,]","0.00[D,]");
 if Frmt=ieExcel:
    ClearVariable(Buf);
    ClearVariable(Buf2);
 fi;
 if FindObject("Rep",Obj):
    rr=AsInteger(Obj.RowsCount);
    cc=AsInteger(Obj.ColsCount);
    for r=r0..rr do
     for c=c0..cc do
      if AsInteger(Obj.Cell(r,c,CellFieldType,""))=cftNumericField:
	 tmp=AsString(Obj.Cell(r,c,CellContents,"",False));
	 if Frmt=ieExcel:
	    z=InsertInArraySort(Buf,tmp);
	    InsertInArray(Buf2,z,AsString(Obj.Cell(r,c,CellFormat,"")));
	    Obj.Cell(r,c,CellFormat,ff);
	   else
	    z=SearchInArray(Buf,tmp,True);
	    if not z=-1:
	       Obj.Cell(r,c,CellFormat,Buf2[z]);
	    fi;
	 fi;
      fi;
     od;
    od;
 fi;
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
Proc Д_OnExit(FieldName: String; Iter: Integer);
 if Период=1:
    if FieldName="ДН": 
       ДН=Dat(1,Mon(ДН),Year(ДН)); 
      else 
       if Mon(ДК)=12: ДК=Dat(31,12,Year(ДК)); else ДК=Dat(1,Mon(ДН)+1,Year(ДН))-1; fi;
    fi;
   |Период=2:
    if FieldName="ДН": 
       if Mon(ДН)<4 : ДН=Dat(1,1 ,Year(ДН));
	 |Mon(ДН)<7 : ДН=Dat(1,4 ,Year(ДН));
	 |Mon(ДН)<10: ДН=Dat(1,7 ,Year(ДН));
	 |True:       ДН=Dat(1,10,Year(ДН));
       fi;
      else 
       if Mon(ДК)<4 : ДК=Dat(31,3 ,Year(ДН));
	 |Mon(ДК)<7 : ДК=Dat(30,6 ,Year(ДН));
	 |Mon(ДК)<10: ДК=Dat(30,9 ,Year(ДН));
	 |True:       ДК=Dat(31,12,Year(ДН));
       fi;
    fi;
 fi;
 Очистить;
end;

Func Д_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:D;
var Field:S;
var n:i;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 if Период=0:
    tmp=Calendar;
    if tmp=1.1.100: ^Cur; fi;
   |Период=1:
    ClearVariable(Buf);
    for n=1..12 do
     Buf[n]=Месяц(n);
    od;
    n=Alternate("Выберите период расчета",Buf,-1,Mon(GetVariableD(Field)),12);
    if n=0: ^Cur; fi;
    if Field="ДК":
       if n=12: tmp=Dat(31,n,Year(ToDay)); else tmp=Dat(1,n+1,Year(ToDay))-1; fi;
      else
       tmp=Dat(1,n,Year(ToDay));
    fi;
   |Период=2:
    ClearVariable(Buf);
    Buf[1]="I квартал"; Buf[2]="II квартал"; Buf[3]="III квартал"; Buf[4]="IV квартал";
    n=Mon(GetVariableD(Field));
    if n<4: n=1;|n<7: n=2;|n<10: n=3;|True: n=4; fi;
    n=Alternate("Выберите период расчета",Buf,-1,n,12);
    if n=1: tmp=if(Field="ДН",Dat(1,1 ,Year(ToDay)),Dat(31,3 ,Year(ToDay)));
      |n=2: tmp=if(Field="ДН",Dat(1,4 ,Year(ToDay)),Dat(30,6 ,Year(ToDay)));
      |n=3: tmp=if(Field="ДН",Dat(1,7 ,Year(ToDay)),Dat(30,9 ,Year(ToDay)));
      |n=4: tmp=if(Field="ДН",Dat(1,10,Year(ToDay)),Dat(31,12,Year(ToDay)));
      |True: ^Cur;
    fi;
 fi;
 PutVariableD(Field,tmp);
 Очистить;
 Return Cur;
end;

Func ПризнПБС_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("ПБС.*");
 if tmp="": ^False; fi;
 ПризнПБС=tmp;
 Очистить;
 ^False;
end;

Proc ПризнПБС_OnExit(FieldName: String; Iter: Integer);
 ПризнПБС="";
 Очистить;
end;

Func МаскаКБК_OnEnter(FieldName: String; Iter: Integer): logical;
 МаскаКБК[Iter]=Раб.КБК.ВыбратьМаскуКБК("ФКР",МаскаСч,МаскаКБК[Iter],True);
 Очистить;
 Оформление;
 ^False;
end;

Proc МаскаКБК_OnExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Proc OnClick1(Row: Integer; Col: Integer; Double: Logical);
var Iter:I;
 Iter=AsInteger(Template.Frame);
 InsertFrame(УпрКБК,Iter+1);
 Очистить;
 Оформление;
end;

Proc OnClick2(Row: Integer; Col: Integer; Double: Logical);
var Iter:I;
 Iter=AsInteger(Template.Frame);
 DeleteFrame(УпрКБК,Iter);
 Очистить;
 Оформление;
end;

Func СправСтр_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,Справ_:S;
 Справ_=СправТабл+" "+СправСтр;
 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;
 Очистить;
 Оформление;
 ^False;
end;

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

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

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

Func ПризнДоп_OnVerify(FieldName: String; Iter: Integer; Value: S): Logical;
var z:n;
 Try
  z=Saldo("{"+Value+"}",1.1.100);
 Except
  if ErrorCode<>23759:
     Raise;
    else
     Message("Недопустимо использовать '+' или '-' в данном условие отбора !",mtError);
  fi;
  ^False;
 end;
 ^True;
end;

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

Func ПризнДоп_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:S;
 Template.HideEditor(False);
 tmp=AnaElection("*");
 if tmp="": ^Cur; fi;
 ПризнДоп=Раб.Парам_Отч.Объединить(ПризнДоп,tmp);
 Очистить;
 Оформление;
 ^Cur;
end;

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

Func nГр_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);
 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;
 fi;
 ^Cur;
end;

Func onLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var СчУсл,АнУсл,УслКБК,СчДеб,СчКре,Ан,tmp:S;
var v,Iter,СчКБК,p1,p2:i;
var FieldName:S;
var ДН_,ДК_:D;
 Template.HideEditor(False);
 FieldName=AsString(Rep.Cell(Row,c0,CellContents,"",False));
 p1=Pos("[",FieldName);
 p2=Pos("]",FieldName);
 Iter=Int(SubStr(FieldName,p1+1,p2-p1-1));
 if Col=c0:
    ДН_=ДНГ; ДК_=ДН;
   |Col=AsInteger(Rep.ColsCount):
    ДН_=ДНГ; ДК_=ДК+1;
   |True: 
    if Период=0: ДН_=Дт[Col-6]; ДК_=ДН_+1; 
      |Период=1: ДН_=Dat(1,Mon(Дт[Col-6]),Year(Дт[Col-6])); ДК_=Дт[Col-6]+1;
      |Период=2: ДН_=Dat(1,Mon(Дт[Col-6])-2,Year(Дт[Col-6])); ДК_=Дт[Col-6]+1;
    fi;
 fi;
 СчДеб=СчДеб_ЛБО; СчКре=СчКре_ЛБО; СчКБК=СчКБК_ЛБО; Ан=Ан_ЛБО;
 АнУсл=if(ПризнДоп="","","("+ПризнДоп+")");
 АнУсл=Раб.Бюджет2005.Объединить(АнУсл,ПризнПБС,"&");
 АнУсл=Раб.Бюджет2005.Объединить(АнУсл,Ан,"&");
 if not МаскаКБК[1]="" and not flagКБК:
    УслКБК="";
    for v=1..УпрКБК do
     tmp=СжатиеУслКБК(Раб.Бюджет2005.ВзятьКодКБК(МаскаКБК[v],"ФКР","КБК",False))+".*."+Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[v],"ФКР","КОСГУ",False);
     УслКБК=Раб.Бюджет2005.Объединить(УслКБК,tmp,"|");
    od;
    for v=1..ЧислоСправ do
     tmp=GetVariableS("Призн"+Str(v)+"["+Str(Iter)+"]");
     АнУсл=Раб.Бюджет2005.Объединить(АнУсл,tmp,"&");
    od;
    if СчКБК=0: 
       СчУсл="*."+СчДеб+".*"+"&("+УслКБК+")/*."+СчКре+".*";
      else
       СчУсл="*."+СчДеб+".*/*."+СчКре+".*&("+УслКБК+")";
    fi;
   else
    СчУсл=ПолучитьУслСч("*","*",СчКБК,СчДеб,СчКре);
    for v=1..ЧислоСправ do
     tmp=GetVariableS("Призн"+Str(v)+"["+Str(Iter)+"]");
     if Справ[v]="КБК.":
	if tmp="":
	   СчУсл=ПолучитьУслСч("*","*",СчКБК,СчДеб,СчКре);
	  else
	   СчУсл=ПолучитьУслСч(SubStr(tmp,1,20),SubStr(tmp,22,3),СчКБК,СчДеб,СчКре);
	fi;
       else
	АнУсл=Раб.Бюджет2005.Объединить(АнУсл,tmp,"&");
     fi;
    od;
 fi;
 if 253-Length(АнУсл)<Length(СчУсл): Message("Расшифровка невозможна. Слишком сложное условие отбора проводок^MВыполните расчет в разрезе КБК",mtError); ^Cur; fi;
 Report('"'+PlanVar("Общие")+'\Отчеты\Служебные отчеты.lst"."001"',ДН_,ДК_,СчУсл,АнУсл);
 Return Cur;
end;

Proc OnClick(Row: Integer; Col: Integer; Double: Logical);
var c,cc,co,r:i;
var Obj: Object;
 if not Double: Exit; fi;
 if FindObject("Rep",Obj):
    cc=AsInteger(Obj.ColsCount);
    if AsString(Obj.Cell(Row,Col,CellContents,"",False))="№ п.п.":
       r=Row+2;
       if AsInteger(Obj.Cell(r,1,CellBgColor,""))=coLtGray: co=coTransparent; else co=coLtGray; fi;
       While not AsString(Obj.Cell(r,Col,CellContents,"",False))="" do
	for c=1..cc do
	 Obj.Cell(r,c,CellBgColor,co);
	od;
	r=r+1;
       od;
      else
       if AsInteger(Obj.Cell(Row,1,CellBgColor,""))=coLtGray: co=coTransparent; else co=coLtGray; fi;
       for c=1..cc do
	Obj.Cell(Row,c,CellBgColor,co);
       od;
    fi;
 fi;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnРасчет_OnClick(Sender: String);
var n:i;
var КБК_,КОСГУ_,Справ_:S;
 if ДН=1.1.100: Message("Введите начальную дату",mtError); Template.Field="ДН"; Exit; fi;
 if ДК=1.1.100: Message("Введите конечную дату",mtError); Template.Field="ДК"; Exit; fi;
 if ДН>ДК: Message("Начальная дата превышает конечную",mtError); Template.Field="ДН"; Exit; fi;
 Справ_=СправТабл+" "+СправСтр;
 ЧислоСправ=WordsCount(Справ_," ");
 if ЧислоСправ=0: Message("Задайте разрез аналитических справочников",mtError); Template.Field="СправСтр_"; Exit; fi;
 Refresh;
 УдалитьПустыеМаскиКБК;
 if not ПроверитьМаскиКБК: Exit; fi;
 МаскаСправ=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Справ_," ","КБК.","");
 FlagКБК=not WordsCount(МаскаСправ," ")=ЧислоСправ;
 МаскаСправ=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(МаскаСправ," ","&");
 if УпрКБК=0: УпрКБК=1; fi;
 Очистить;
 for n=1..УпрКБК do
  if МаскаКБК[n]="":
     КБК_="*";
     КОСГУ_="*";
    else
     КБК_=Раб.Бюджет2005.ВзятьКодКБК(МаскаКБК[n],"ФКР","КБК",False);
     КОСГУ_=Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[n],"ФКР","КОСГУ",False);
  fi;
  Расчет(n,УпрКБК,КБК_,КОСГУ_);
 od;
 ПостроитьОтчет;
 Message("Расчет завершен",mtInformation);
end;

Proc rbПериод_OnChange(Sender: String);
 Д_OnExit("ДН",1);
 Д_OnExit("ДК",1);
end;

Proc cbПериод_OnChange(Sender: String);
 Очистить;
end;

Proc cbИтог_OnChange(Sender: String);
 Очистить;
 if EnqOkCancel("Для вступления изменений в силу, необходимо выполнить расчет")=cmOk: btnРасчет_OnClick(Sender); fi;
end;

Proc btnЭкспорт_OnClick(Sender: String);
var FName,Ext:S;
var n,Frmt:i;
 ClearVariable(Buf);
 Buf[1]="MS Excel";
 Buf[2]="MS Word";
 n=Alternate("Передать в ...",Buf,-1,1,12);
 if n=1: FName="Движение ЛБО ПБС.xls"; Ext="Файлы MS Excel (*.xls)|*.xls"; Frmt=ieExcel;
   |n=2: FName="Движение ЛБО ПБС.rtf"; Ext="Файлы MS Word (*.rtf)|*.rtf"; Frmt=ieRTF;
   |True: Exit;
 fi;
 if ChooseSaveFile(FName,"Сохранить отчет в формате "+Buf[n],Ext)=cmCancel: Exit; fi;
 if ExistFile(FName):
    if EnqOkCancel("Файл "+FName+" уже существует, перезаписать ?",mtWarning)=cmCancel: Exit; fi;
    DeleteFile(FName);
 fi;
 Try
  if Frmt=ieExcel: ЗадатьФорматЧисел(ieExcel); fi;
  ExportBlank(Frmt,GetActiveBlankName,FName,False);
 Finally
  if Frmt=ieExcel: ЗадатьФорматЧисел(-1); fi;
 end;
 if ExistFile(FName):
    if EnqOkCancel("Бланк успешно сохранен. Открыть его ?")=cmOk: ExecuteProgram('"'+FName+'"'); fi;
 fi;
end;

Proc cbNewPage_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,NewPage);
     fi;
    od;
 fi;
end;

Proc btnГрафик_OnClick(Sender: String);
var Obj: Object;
var r,rr,c,cc,Iter,p1,p2:i;
var FieldName,v1,v2:S;
var Flag:L;
var Y,Y_:N;
 Flag=False;
 Раб.Вспом.График.Очистить;
 if FindObject("Rep",Obj):
    rr=AsInteger(Obj.RowsCount);
    cc=AsInteger(Obj.ColsCount);
    for r=1..rr do
     if AsInteger(Obj.Cell(r,1,CellBgColor,""))=coLtGray:
	FieldName=AsString(Rep.Cell(r,c0,CellContents,"",False));
	p1=Pos("[",FieldName);
	p2=Pos("]",FieldName);
	Iter=Int(SubStr(FieldName,p1+1,p2-p1-1));
	if fАбсолют: p1=c0; p2=cc; else p1=c0+1; p2=cc-1; fi;
	for c=p1..p2 do
	 v1=AsString(Obj.Cell(2,c,CellContents,"",False));
	 v2=AsString(Obj.Cell(r,c,CellContents,"",False));
	 Y=GetVariableN(v2);
	 if fАбсолют:
	    if c=c0: y_=y;|not c=cc:  y=y_+y; y_=y; fi;
	 fi;
	 Раб.Вспом.График.Добавить(Trim(Призн1[Iter]+" "+Призн2[Iter]+" "+Призн3[Iter]+Призн4[Iter]),Y,v1);
	od;
	Flag=True;
     fi;
    od;
 fi;
 if Flag: Раб.Вспом.График.Построить; else Message("Для построения графика необходимо указать в таблице область данных^MДля этого дважды кликните мышкой по номеру строки или по '№ п.п.' для выделения всей таблицы",mtWarning); fi;
end;

Proc btnЗагрКБК_OnClick(Sender: String);
var FName,tmp:S;
var F,n:I;
 if ChooseFile(FName,"Открыть файл...", "Текстовые файлы(*.txt)|*.txt")=cmCancel: Exit; fi;
 F=TextFileOpenRead(FName);
 Try
  Раб.Бюджет2005.РежимМаски="?";
  ClearVariable(УпрКБК);
  ClearVariable(МаскаКБК);
  n=0;
  While not TextFileEndOfFile(F) do
   n=n+1;
   Hint("Чтение списка КБК..."+Str(n));
   tmp=TextFileReadLn(F);
   if Match(tmp,Раб.Бюджет2005.МаскаФКР+".???"):
      InsertFrame(УпрКБК,УпрКБК+1);
      МаскаКБК[УпрКБК]=tmp;
   fi;
  od;
 Finally
  TextFileClose(F);
 end;
 УдалитьПустыеМаскиКБК;
 if not МаскаКБК[1]="": Message("Список КБК успешно загружен"); else Message("Выбранный файл не являеться списком КБК",mtError); fi;
end;

Proc btnСохрКБК_OnClick(Sender: String);
var FName:S;
var F,n:I;
 УдалитьПустыеМаскиКБК;
 if МаскаКБК[1]="": Message("Список КБК пуст",mtError); Exit; fi;
 FName="Список КБК.txt";
 if ChooseFile(FName,"Сохранить файл...", "Текстовые файлы(*.txt)|*.txt")=cmCancel: Exit; fi;
 if ExistFile(FName): if EnqOkCancel("Файл "+FName+" существует, переписать ?")=cmCancel: Message("Отказ от сохранения данных"); Exit; fi; fi;
 F=TextFileCreate(FName);
 Try
  for n=1..УпрКБК do
   TextFileWriteLn(F,МаскаКБК[n]);
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Список КБК успешно сохранен");
end;

Proc btnОчистКБК_OnClick(Sender: String);
 ClearVariable(УпрКБК);
 ClearVariable(МаскаКБК);
 Очистить;
 Оформление;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc AfterOpen(Destroy: Logical);
 Оформление;
 ПостроитьОтчет;
end;

Proc OnOpen(Create: Logical);
 СписокСправ;
end;
--Обработчики событий шаблона -----
--

Конец
