-- Шаблон создан мастером бланков
-- 26.05.2005 11:26:39
--
БланкСШаблоном [03.04.2007] "Лимиты бюджетных обязательств, ассигнования плановых периодов";

var FlagEdit:L;

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

btnРасчет:Object;
btnНастр :Object;
cbНС:Object;
cbЗК:Object;
btnЗагрКБК:Object;
btnСохрКБК:Object;
btnОчистКБК:Object;

fНС:L;
fЗК:L;

var notRecoveryRep:L;

var УпрНастр:L;

var НастрПоУмолч:S="Настройка по умолчанию";
var НастрЗакр:S="Закрыть настройку";

var defСчДеб_Асс2:S="1.503.25";
var defСчКре_Асс2:S="1.503.23";
var defСчДеб_Асс3:S="1.503.35";
var defСчКре_Асс3:S="1.503.33";
var defСчДеб_ЛБО2:S="1.501.25";
var defСчКре_ЛБО2:S="1.501.23";
var defСчДеб_ЛБО3:S="1.501.35";
var defСчКре_ЛБО3:S="1.501.33";
var defСчДеб_ЗК  :S="1.ЗАБ.ЗК";
var defСчКре_ЗК  :S="?.???.??";
var defСчДеб_ПБА2:S="1.503.23";
var defСчКре_ПБА2:S="1.502.21";
var defСчДеб_ПБА3:S="1.503.33";
var defСчКре_ПБА3:S="1.502.31";
var defСчДеб_ПБО2:S="1.501.23";
var defСчКре_ПБО2:S="1.502.21";
var defСчДеб_ПБО3:S="1.501.33";
var defСчКре_ПБО3:S="1.502.31";

var defАн_Асс2:S="";
var defАн_Асс3:S="";
var defАн_ЛБО2:S="";
var defАн_ЛБО3:S="";
var defАн_ЗК  :S="";
var defАн_ПБА2:S="";
var defАн_ПБА3:S="";
var defАн_ПБО2:S="";
var defАн_ПБО3:S="";

var defСчКБК_Асс2:I=-1;
var defСчКБК_Асс3:I=-1;
var defСчКБК_ЛБО2:I=-1;
var defСчКБК_ЛБО3:I=-1;
var defСчКБК_ЗК  :I= 1;
var defСчКБК_ПБА2:I=-1;
var defСчКБК_ПБА3:I=-1;
var defСчКБК_ПБО2:I=-1;
var defСчКБК_ПБО3:I=-1;

var СчДеб_Асс2:S=[defСчДеб_Асс2];
var СчКре_Асс2:S=[defСчКре_Асс2];
var СчДеб_Асс3:S=[defСчДеб_Асс3];
var СчКре_Асс3:S=[defСчКре_Асс3];
var СчДеб_ЛБО2:S=[defСчДеб_ЛБО2];
var СчКре_ЛБО2:S=[defСчКре_ЛБО2];
var СчДеб_ЛБО3:S=[defСчДеб_ЛБО3];
var СчКре_ЛБО3:S=[defСчКре_ЛБО3];
var СчДеб_ЗК  :S=[defСчДеб_ЗК];
var СчКре_ЗК  :S=[defСчКре_ЗК];
var СчДеб_ПБА2:S=[defСчДеб_ПБА2];
var СчКре_ПБА2:S=[defСчКре_ПБА2];
var СчДеб_ПБА3:S=[defСчДеб_ПБА3];
var СчКре_ПБА3:S=[defСчКре_ПБА3];
var СчДеб_ПБО2:S=[defСчДеб_ПБО2];
var СчКре_ПБО2:S=[defСчКре_ПБО2];
var СчДеб_ПБО3:S=[defСчДеб_ПБО3];
var СчКре_ПБО3:S=[defСчКре_ПБО3];

var Ан_Асс2:S=[defАн_Асс2];
var Ан_Асс3:S=[defАн_Асс3];
var Ан_ЛБО2:S=[defАн_ЛБО2];
var Ан_ЛБО3:S=[defАн_ЛБО3];
var Ан_ЗК  :S=[defАн_ЗК];
var Ан_ПБА2:S=[defАн_ПБА2];
var Ан_ПБА3:S=[defАн_ПБА3];
var Ан_ПБО2:S=[defАн_ПБО2];
var Ан_ПБО3:S=[defАн_ПБО3];

var СчКБК_Асс2:I=[defСчКБК_Асс2];
var СчКБК_Асс3:I=[defСчКБК_Асс3];
var СчКБК_ЛБО2:I=[defСчКБК_ЛБО2];
var СчКБК_ЛБО3:I=[defСчКБК_ЛБО3];
var СчКБК_ЗК  :I=[defСчКБК_ЗК];
var СчКБК_ПБА2:I=[defСчКБК_ПБА2];
var СчКБК_ПБА3:I=[defСчКБК_ПБА3];
var СчКБК_ПБО2:I=[defСчКБК_ПБО2];
var СчКБК_ПБО3:I=[defСчКБК_ПБО3];

var СчКБК_Асс2_:S=if(СчКБК_Асс2=1:"По деб. счета"|СчКБК_Асс2=-1:"По кре. счета"|True:"");
var СчКБК_Асс3_:S=if(СчКБК_Асс3=1:"По деб. счета"|СчКБК_Асс3=-1:"По кре. счета"|True:"");
var СчКБК_ЛБО2_:S=if(СчКБК_ЛБО2=1:"По деб. счета"|СчКБК_ЛБО2=-1:"По кре. счета"|True:"");
var СчКБК_ЛБО3_:S=if(СчКБК_ЛБО3=1:"По деб. счета"|СчКБК_ЛБО3=-1:"По кре. счета"|True:"");
var СчКБК_ЗК_  :S=if(СчКБК_ЗК  =1:"По деб. счета"|СчКБК_ЗК  =-1:"По кре. счета"|True:"");
var СчКБК_ПБА2_:S=if(СчКБК_ПБА2=1:"По деб. счета"|СчКБК_ПБА2=-1:"По кре. счета"|True:"");
var СчКБК_ПБА3_:S=if(СчКБК_ПБА3=1:"По деб. счета"|СчКБК_ПБА3=-1:"По кре. счета"|True:"");
var СчКБК_ПБО2_:S=if(СчКБК_ПБО2=1:"По деб. счета"|СчКБК_ПБО2=-1:"По кре. счета"|True:"");
var СчКБК_ПБО3_:S=if(СчКБК_ПБО3=1:"По деб. счета"|СчКБК_ПБО3=-1:"По кре. счета"|True:"");

var МаскаСч:S="(*."+if(СчКБК_Асс2=1,СчДеб_Асс2,СчКре_Асс2)+".*"+
	      "|*."+if(СчКБК_Асс3=1,СчДеб_Асс3,СчКре_Асс3)+".*"+
	      "|*."+if(СчКБК_ЛБО2=1,СчДеб_ЛБО2,СчКре_ЛБО2)+".*"+
	      "|*."+if(СчКБК_ЛБО3=1,СчДеб_ЛБО3,СчКре_ЛБО3)+".*"+
	      if(fЗК,"|*."+if(СчКБК_ЗК=1,СчДеб_ЗК,СчКре_ЗК)+".*","")+
	      "|*."+if(СчКБК_ПБА2=1,СчДеб_ПБА2,СчКре_ПБА2)+".*"+
	      "|*."+if(СчКБК_ПБА3=1,СчДеб_ПБА3,СчКре_ПБА3)+".*"+
	      "|*."+if(СчКБК_ПБО2=1,СчДеб_ПБО2,СчКре_ПБО2)+".*"+
	      "|*."+if(СчКБК_ПБО3=1,СчДеб_ПБО3,СчКре_ПБО3)+".*)";

var Заголовок:S="Лимиты бюджетных обязательств, ассигнования плановых периодов";

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

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

fКБК_ГЛ:L;
var КБК_ГЛ:S=if(fКБК_ГЛ,"ГЛ","X");
fКБК_РП:L;
var КБК_РП:S=if(fКБК_РП,"РП","X");
fКБК_ЦС:L;
var КБК_ЦС:S=if(fКБК_ЦС,"ЦС","X");
fКБК_ВР:L;
var КБК_ВР:S=if(fКБК_ВР,"ВР","X");
fКБК_КОСГУ:L;
var КБК_КОСГУ:S=if(fКБК_КОСГУ,"КОСГУ","X");

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

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

СправСтр: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 Призн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(Призн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 НаимПризн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 ЛБО2[]:N;
var ЛБО3[]:N;
var ЗК2 []:N;
var ЗК3 []:N;
var ПБО2[]:N;
var ПБО2_Пр[]:N=Round((if(fЗК,ЗК2[$],0)+ПБО2[$])*100/ЛБО2[$],1);
var ПБО3[]:N;
var ПБО3_Пр[]:N=Round((if(fЗК,ЗК3[$],0)+ПБО3[$])*100/ЛБО3[$],1);
var ЛБО2_Ост[]:N=ЛБО2[$]-if(fЗК,ЗК2[$],0)-ПБО2[$];
var ЛБО2_Ост_Пр[]:N=Round(ЛБО2_Ост[$]*100/ЛБО2[$],1);
var ЛБО3_Ост[]:N=ЛБО3[$]-if(fЗК,ЗК3[$],0)-ПБО3[$];
var ЛБО3_Ост_Пр[]:N=Round(ЛБО3_Ост[$]*100/ЛБО3[$],1);
var Итог[]:I;

var ВсегоЛБО2:N;
var ВсегоЛБО3:N;
var ВсегоЗК2:N;
var ВсегоЗК3:N;
var ВсегоПБО2:N;
var ВсегоПБО2_Пр:N=Round((if(fЗК,ВсегоЗК2,0)+ВсегоПБО2)*100/ВсегоЛБО2,1);
var ВсегоПБО3:N;
var ВсегоПБО3_Пр:N=Round((if(fЗК,ВсегоЗК3,0)+ВсегоПБО3)*100/ВсегоЛБО3,1);
var ВсегоЛБО2_Ост:N=ВсегоЛБО2-if(fЗК,ВсегоЗК2,0)-ВсегоПБО2;
var ВсегоЛБО2_Ост_Пр:N=Round(ВсегоЛБО2_Ост*100/ВсегоЛБО2,1);
var ВсегоЛБО3_Ост:N=ВсегоЛБО3-if(fЗК,ВсегоЗК3,0)-ВсегоПБО3;
var ВсегоЛБО3_Ост_Пр:N=Round(ВсегоЛБО3_Ост*100/ВсегоЛБО3,1);

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

var tCache[]:S;
var KeyСвертка[]: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=19;
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;
--
--Процедуры и функции -------------
Proc Настр(aСохр:L);
var n,nn:i;
var Flag:L;
 if НастрGUID="" or aСохр: НастрGUID=GetGUID; fi;
 if Раб.Настр.Начать("ОТЧЕТЫ.СПРАВКИ.ЛБО_ПЛАН_ПЕРИОД",0,0,"",НастрGUID):
    ClearVariable(Buf);
    Buf[1]="Асс2"; Buf[2]="Асс3"; Buf[3]="ЛБО2"; Buf[4]="ЛБО2"; Buf[5]="ПБА2"; Buf[6]="ПБА3"; Buf[7]="ПБО2"; Buf[8]="ПБО3"; Buf[9]="ЗК";
    nn=9;
    for n=1..nn do
     Раб.Настр.Добавить("СчДеб_"+Buf[n],"S");
     Раб.Настр.Добавить("СчКре_"+Buf[n],"S");
     Раб.Настр.Добавить("СчКБК_"+Buf[n],"I");
     Раб.Настр.Добавить("Ан_"+Buf[n],"S");
    od;
    if aСохр: 
       Раб.Настр.Сохранить; 
      else 
       НастрGUID=Раб.Настр.Загрузить("","");
       if НастрGUID="":
	  Flag=ExecuteFuncL("НастрПоУмолч_OnEnter","",1);
       fi;
    fi;
 fi;
end;

Proc ОткрНастр(Flag:L);
 btnРасчет.Visible=not Flag;
 btnНастр.Visible=not Flag;
 cbЗК.Visible=not Flag;
 cbНС.Visible=not Flag;
 btnЗагрКБК.Visible=not Flag;
 btnСохрКБК.Visible=not Flag;
 btnОчистКБК.Visible=not Flag;
 УпрНастр=Flag;
end;

Func ПроверитьНастр:L;
 if СчДеб_Асс2="" or СчКре_Асс2="" or СчКБК_Асс2=0: Message("Заполните условие отбора поступивших ассигнований",mtError); Template.Field=if(СчДеб_Асс2="":"СчДеб_Асс2"|СчКре_Асс2="":"СчКре_Асс2"|СчКБК_Асс2=0:"СчКБК_Асс2_"); ^False; fi;
 if СчДеб_Асс3="" or СчКре_Асс3="" or СчКБК_Асс3=0: Message("Заполните условие отбора поступивших ассигнований",mtError); Template.Field=if(СчДеб_Асс3="":"СчДеб_Асс3"|СчКре_Асс3="":"СчКре_Асс3"|СчКБК_Асс3=0:"СчКБК_Асс3_"); ^False; fi;
 if СчДеб_ЛБО2="" or СчКре_ЛБО2="" or СчКБК_ЛБО2=0: Message("Заполните условие отбора поступивших ЛБО",mtError); Template.Field=if(СчДеб_ЛБО2="":"СчДеб_ЛБО2"|СчКре_ЛБО2="":"СчКре_ЛБО2"|СчКБК_ЛБО2=0:"СчКБК_ЛБО2_"); ^False; fi;
 if СчДеб_ЛБО3="" or СчКре_ЛБО3="" or СчКБК_ЛБО3=0: Message("Заполните условие отбора поступивших ЛБО",mtError); Template.Field=if(СчДеб_ЛБО3="":"СчДеб_ЛБО3"|СчКре_ЛБО3="":"СчКре_ЛБО3"|СчКБК_ЛБО3=0:"СчКБК_ЛБО3_"); ^False; fi;
 if СчДеб_ЗК=""   or СчКре_ЗК=""   or СчКБК_ЗК=0 :  Message("Заполните условие отбора планируемых обязательств",mtError); Template.Field=if(СчДеб_ЗК="":"СчДеб_ЗК"|СчКре_ЗК="":"СчКре_ЗК"|СчКБК_ЗК=0:"СчКБК_ЗК_"); ^False; fi;
 if СчДеб_ПБА2="" or СчКре_ПБА2="" or СчКБК_ПБА2=0: Message("Заполните условие отбора ПБО (за счет ассигнований)",mtError); Template.Field=if(СчДеб_ПБА2="":"СчДеб_ПБА2"|СчКре_ПБА2="":"СчКре_ПБА2"|СчКБК_ПБА2=0:"СчКБК_ПБА2_"); ^False; fi;
 if СчДеб_ПБА3="" or СчКре_ПБА3="" or СчКБК_ПБА3=0: Message("Заполните условие отбора ПБО (за счет ассигнований)",mtError); Template.Field=if(СчДеб_ПБА3="":"СчДеб_ПБА3"|СчКре_ПБА3="":"СчКре_ПБА3"|СчКБК_ПБА3=0:"СчКБК_ПБА3_"); ^False; fi;
 if СчДеб_ПБО2="" or СчКре_ПБО2="" or СчКБК_ПБО2=0: Message("Заполните условие отбора ПБО",mtError); Template.Field=if(СчДеб_ПБО2="":"СчДеб_ПБО2"|СчКре_ПБО2="":"СчКре_ПБО2"|СчКБК_ПБО2=0:"СчКБК_ПБО2_"); ^False; fi;
 if СчДеб_ПБО3="" or СчКре_ПБО3="" or СчКБК_ПБО3=0: Message("Заполните условие отбора ПБО",mtError); Template.Field=if(СчДеб_ПБО3="":"СчДеб_ПБО3"|СчКре_ПБО3="":"СчКре_ПБО3"|СчКБК_ПБО3=0:"СчКБК_ПБО3_"); ^False; fi;
 ^True;
end;

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(ЛБО2);
 ClearVariable(ЛБО3);
 ClearVariable(ЗК2);
 ClearVariable(ЗК3);
 ClearVariable(ПБО2);
 ClearVariable(ПБО3);
 ClearVariable(ВсегоЛБО2);
 ClearVariable(ВсегоЛБО3);
 ClearVariable(ВсегоЗК2);
 ClearVariable(ВсегоЗК3);
 ClearVariable(ВсегоПБО2);
 ClearVariable(ВсегоПБО3);
 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,18,RepRow+1); --#НаимПризн1
 Rep.CellLinks(1 ,RepRow+2,1 ,RepRow+4); --#№ п.п.
 Rep.CellLinks(2 ,RepRow+2,2 ,RepRow+4); --#НаимСправ1
 Rep.CellLinks(3 ,RepRow+2,3 ,RepRow+4); --#НаимСправ2
 Rep.CellLinks(4 ,RepRow+2,4 ,RepRow+4); --#НаимСправ3
 Rep.CellLinks(5 ,RepRow+2,5 ,RepRow+4); --#НаимСправ4
 Rep.CellLinks(6 ,RepRow+2,6 ,RepRow+4); --#НаимСправ5

 Rep.CellLinks(7 ,RepRow+2,12,RepRow+2); --Первый плановый год
 Rep.CellLinks(7 ,RepRow+3,7 ,RepRow+4); --ЛБО, ассигнования
 Rep.CellLinks(8 ,RepRow+3,10,RepRow+3); --обязательства
 Rep.CellLinks(11,RepRow+3,12,RepRow+3); --Остатки

 Rep.CellLinks(13,RepRow+2,18,RepRow+2); --Второй плановый год
 Rep.CellLinks(13,RepRow+3,13,RepRow+4); --ЛБО, ассигнования
 Rep.CellLinks(14,RepRow+3,16,RepRow+3); --обязательства
 Rep.CellLinks(17,RepRow+3,18,RepRow+3); --Остатки

 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,1,2,0");
 Rep.Cell(RepRow+1,1,CellLookup,True);
 Rep.Cell(RepRow+1,1,CellEventOnEnter,"Гр_OnEnter"); --CellEventOnLookUp не работает ?
 Rep.CellLinks(1,RepRow+1,Rep_ColsCount-1,RepRow+1);
 RepRow=RepRow+1;
end;


Proc ВставитьСтрокуОтчета (Iter:I; пп_:I);
var s,r,c,rr,cc,index:i;
 s=ВставитьСтроку("Табл2");
 rr=Rep_RowsCount[s];
 cc=Rep_ColsCount;
 for r=1..rr do
  for c=1..cc do
   Index=GetCellIndex(s,r,c);
   if Rep_CellFieldType[Index]=1:
      Rep.Cell(RepRow+r,c,CellContents,Rep_CellContents[Index]);
     else
      if Rep_CellContents[Index]="пп":
	 Rep.Cell(RepRow+r,c,CellContents,Str(пп_));
	 Rep.Cell(RepRow+r,c,CellFieldType,1);
	else
	 Rep.Cell(RepRow+r,c,CellContents,Rep_CellContents[index]+"["+Str(Iter)+"]");
	 if Round(ЛБО2_Ост[Iter],2)<0 or Round(ЛБО3_Ост[Iter],2)<0:
	    Rep.Cell(RepRow+r,c,CellBgColor,coYellow);
	    if Round(ЛБО2_Ост[Iter],2)<0:
	       Rep.Cell(RepRow+r,10,CellFontColor,coRed);
	       Rep.Cell(RepRow+r,11,CellFontColor,coRed);
	    fi;
	    if Round(ЛБО3_Ост[Iter],2)<0:
	       Rep.Cell(RepRow+r,16,CellFontColor,coRed);
	       Rep.Cell(RepRow+r,17,CellFontColor,coRed);
	    fi;
	 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]="ВсегоЛБО2"	: Val="ЛБО2["+Val+"]";
     |Rep_CellContents[Index]="ВсегоЛБО3"	: Val="ЛБО3["+Val+"]";
     |Rep_CellContents[Index]="ВсегоЗК2"	: Val="ЗК2["+Val+"]";
     |Rep_CellContents[Index]="ВсегоЗК3"	: Val="ЗК3["+Val+"]";
     |Rep_CellContents[Index]="ВсегоПБО2"	: Val="ПБО2["+Val+"]";
     |Rep_CellContents[Index]="ВсегоПБО2_Пр"	: Val="ПБО2_Пр["+Val+"]";
     |Rep_CellContents[Index]="ВсегоПБО3"	: Val="ПБО3["+Val+"]";
     |Rep_CellContents[Index]="ВсегоПБО3_Пр"	: Val="ПБО3_Пр["+Val+"]";
     |Rep_CellContents[Index]="ВсегоЛБО2_Ост"	: Val="ЛБО2_Ост["+Val+"]";
     |Rep_CellContents[Index]="ВсегоЛБО2_Ост_Пр": Val="ЛБО2_Ост_Пр["+Val+"]";
     |Rep_CellContents[Index]="ВсегоЛБО3_Ост"	: Val="ЛБО3_Ост["+Val+"]";
     |Rep_CellContents[Index]="ВсегоЛБО3_Ост_Пр": Val="ЛБО3_Ост_Пр["+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,s:i;
var Справ_:S;
var Obj: Object;
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(Справ_," ");
 if fКБК_ГЛ and fКБК_РП and fКБК_ЦС and fКБК_ВР and fКБК_КОСГУ: w=370; else w=320; fi;
 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,if(Справ[v]="КБК.",w,300));
  Табл2.Column(1+v,ColWidth,if(Справ[v]="КБК.",w,300));
  Табл3.Column(1+v,ColWidth,if(Справ[v]="КБК.",w,300));
 od;
 --Текущий финансовый год
 for s=1..3 do
  if FindObject("Табл"+Str(s),Obj):
     --Первый плановый год
     Obj.Column(8,ColVisible,fЗК); --Планируемые обязательства
     --Второй плановый год
     Obj.Column(14,ColVisible,fЗК); --Планируемые обязательства
  fi;
 od;
 --
 n=1;
 for c=2..Rep_ColsCount do
  if AsLogical(Табл1.Column(c,ColVisible,"")):
     n=n+1;
     nГр[c]=n;
  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/Упр)+" %");
  p=p+1;
  if not Табл_=Призн1[Iter] and not СправТабл="":
     if not Iter=1: ВставитьШапку(Iter); fi;
     p=1;
     Табл_=Призн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);
  fi;
 od;
 --Итого по отчету
 if not СправТабл="":
    ВставитьШапку(0);
 fi;
 if fКБК_ГЛ and fКБК_РП and fКБК_ЦС and fКБК_ВР and fКБК_КОСГУ: w=370; else w=320; fi;
 Табл1.Visible=True; Табл3.Visible=True; Rep.Visible=True;
 for v=1..MaxСправ do
  Табл1.Column(1+v,ColWidth,if(Справ[v]="КБК.",w,300));
  Табл2.Column(1+v,ColWidth,if(Справ[v]="КБК.",w,300));
  Табл3.Column(1+v,ColWidth,if(Справ[v]="КБК.",w,300));
  if Справ[v]="КБК.":
     Rep.Column(1+v,ColWidth,w);
  fi;
 od;
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;
 if ППП="*" and РП="*" and СТ="*" and ВР="*":
    ^"*";
   else
    ^ППП+"."+РП+"."+СТ+"."+ВР;
 fi;
end;

Proc ЧитатьЖурнал(k:i; kk:i; FName:S; nn:i; aБК:S; aКОСГУ:S);
var n,z,s,ss,x:i;
var tmp,Спр1,Спр2,Спр3,Спр4,Спр5:S;
var Key,tВал1,tВал2,tСчДеб,tСчКре,tКмнт,tКБК,vКБК,v1,v2,v3,v4,v5,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Призн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]));
 if not fКБК_ГЛ: ГЛ=Раб.Бюджет2005.ВзятьКодКБК(aБК,"КР","ППП",False); fi;
 if not fКБК_РП: РП=Раб.Бюджет2005.ВзятьКодКБК(aБК,"КР","РП",False);  fi;
 if not fКБК_ЦС: ЦС=Раб.Бюджет2005.ВзятьКодКБК(aБК,"КР","ЦС",False);  fi;
 if not fКБК_ВР: ВР=Раб.Бюджет2005.ВзятьКодКБК(aБК,"КР","ВР",False);  fi;
 if not fКБК_КОСГУ: КОСГУ=aКОСГУ; fi;
 ShowProgress(nn*2,"Расчет..."+Str(k)+" из "+Str(kk));
 if FlagКБК: 
    if fКБК_КОСГУ: Раб.КБК.CrdToCache("КОСГУ2006",False);
      |fКБК_ВР: Раб.КБК.CrdToCache("КВР2006",False);
      |fКБК_ЦС: Раб.КБК.CrdToCache("КЦСР2006",False);
      |fКБК_РП: Раб.КБК.CrdToCache("ФКР2006",False);
      |fКБК_ГЛ: Раб.КБК.CrdToCache("ППП2006",False);
    fi;
 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": tmp=tСчКре; else tmp=tСчДеб; fi;
	 vКБК="";
	 if fКБК_ГЛ: ГЛ=Раб.Бюджет2005.ВзятьКодСчета(tmp,"КР","ППП",False); vКБК=vКБК+"."+ГЛ; fi;
	 if fКБК_РП: РП=Раб.Бюджет2005.ВзятьКодСчета(tmp,"КР","РП",False);  vКБК=vКБК+"."+РП; fi;
	 if fКБК_ЦС: ЦС=Раб.Бюджет2005.ВзятьКодСчета(tmp,"КР","ЦС",False);  vКБК=vКБК+"."+ЦС; fi;
	 if fКБК_ВР: ВР=Раб.Бюджет2005.ВзятьКодСчета(tmp,"КР","ВР",False);  vКБК=vКБК+"."+ВР; fi;
	 if fКБК_КОСГУ: КОСГУ=Раб.Бюджет2005.ВзятьКодСчета(tmp,"КР","КОСГУ",False);  vКБК=vКБК+"."+КОСГУ; fi;
	 vКБК=SubStr(vКБК,2,255);
	 tКБК=ГЛ+"."+РП+"."+ЦС+"."+ВР+"."+КОСГУ;
      fi;
      v1=""; v2=""; v3=""; v4=""; v5=""; v1_=""; v2_=""; v3_=""; v4_=""; v5_="";
      if Справ[1]="КБК.": v1=vКБК; v1_=tКБК;
	|Справ[2]="КБК.": v2=vКБК; v2_=tКБК;
	|Справ[3]="КБК.": v3=vКБК; v3_=tКБК;
	|Справ[4]="КБК.": v4=vКБК; v4_=tКБК;
	|Справ[5]="КБК.": v5=vКБК; v5_=tКБК;
      fi;
      for s=1..ss do
       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],".")); v1_=v1; 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],".")); v2_=v2; 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],".")); v3_=v3; 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],".")); v4_=v4; 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],".")); v5_=v5; fi;
      od;
      --почемуто в свертку попадают проводки, по аналитике которых быть не должно
      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,tКБК);
	    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КБК:
	       if fКБК_КОСГУ: x=SearchInArray(Раб.КБК.cacheКОСГУ_Код,КОСГУ,True);
			      if x=-1: x=0; fi;
			      InsertInArray(BufНаимКБК,z,Раб.КБК.cacheКОСГУ_Наим[x]);
		 |fКБК_ВР:    x=SearchInArray(Раб.КБК.cacheКВР_Код,ВР,True);
			      if x=-1: x=0; fi;
			      InsertInArray(BufНаимКБК,z,Раб.КБК.cacheКВР_Наим[x]);
		 |fКБК_ЦС:    x=SearchInArray(Раб.КБК.cacheКЦСР_Код,ЦС,True);
			      if x=-1:
				 x=SearchInArray(Раб.КБК.cacheКЦСР_Код,"000"+SubStr(ЦС,4,4),True);
			      fi;
			      if x=-1: x=0; fi;
			      InsertInArray(BufНаимКБК,z,Раб.КБК.cacheКЦСР_Наим[x]);
		 |fКБК_РП:    x=SearchInArray(Раб.КБК.cacheФКР_Код,РП,True);
			      if x=-1: x=0; fi;
			      InsertInArray(BufНаимКБК,z,Раб.КБК.cacheФКР_Наим[x]);
		 |fКБК_ГЛ:    x=SearchInArray(Раб.КБК.cacheППП_Код,ГЛ,True);
			      if x=-1: x=0; fi;
			      InsertInArray(BufНаимКБК,z,Раб.КБК.cacheППП_Наим[x]);
	       fi;
	    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;
 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 МаскаСчета(aКодСч:S):S;
 if aКодСч="?.???.??": ^"*"; else  ^"*."+aКодСч+".*"; fi;
end;

Func ПолучитьУслСч (aБК:S; aКОСГУ:S; aСчКБК:I; aСчДеб:S; aСчКре:S):S;
var Res:S;
 if aСчКБК= 1: Res=aБК+"."+aСчДеб+"."+aКОСГУ+"/"+МаскаСчета(aСчКре);
   |aСчКБК=-1: Res=МаскаСчета(aСчДеб)+"/"+aБК+"."+aСчКре+"."+aКОСГУ;
   |True:      Res=aБК+"."+aСчДеб+"."+aКОСГУ+"/"+aБК+"."+aСчКре+"."+aКОСГУ;
 fi;
 ^Res;
end;

Proc РасчетСтроки (vKey:S; vПризн1:S; vПризн2:S; vПризн3:S; vПризн4:S; vПризн5:S; vНаимКБК:S; vЛБО2:N; vЛБО3:N; vЗК2:N; vЗК3:N; vПБО2:N; vПБО3: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НаимКБК;
    ЛБО2[Iter]=vЛБО2;
    ЛБО3[Iter]=vЛБО3;
    ЗК2 [Iter]=vЗК2;
    ЗК3 [Iter]=vЗК3;
    ПБО2[Iter]=vПБО2;
    ПБО3[Iter]=vПБО3;
    Итог[Iter]=vИтог;
   else
    ЛБО2[Iter]=ЛБО2[Iter]+vЛБО2;
    ЛБО3[Iter]=ЛБО3[Iter]+vЛБО3;
    ЗК2 [Iter]=ЗК2[Iter]+vЗК2;
    ЗК3 [Iter]=ЗК3[Iter]+vЗК3;
    ПБО2[Iter]=ПБО2[Iter]+vПБО2;
    ПБО3[Iter]=ПБО3[Iter]+vПБО3;
 fi;
 if vИтог=0:
    ВсегоЛБО2=ВсегоЛБО2+vЛБО2;
    ВсегоЛБО3=ВсегоЛБО3+vЛБО3;
    ВсегоЗК2 =ВсегоЗК2+vЗК2;
    ВсегоЗК3 =ВсегоЗК3+vЗК3;
    ВсегоПБО2=ВсегоПБО2+vПБО2;
    ВсегоПБО3=ВсегоПБО3+vПБО3;
 fi;
end;

Proc Расчет (k:i; kk:i; vБК:S; vКОСГУ:S);
var n,nn,v:i;
var FName,УслСчОбщ,УслАнОбщ,УслСжатияАн,ПризнДоп_,Key_,tmp:S;
var УслСчАсс2,УслСчАсс3,УслСчЛБО2,УслСчЛБО3,УслСчЗК2,УслСчЗК3,УслСчПБА2,УслСчПБА3,УслСчПБО2,УслСчПБО3:S;
var УслАнАсс2,УслАнАсс3,УслАнЛБО2,УслАнЛБО3,УслАнЗК2,УслАнЗК3,УслАнПБА2,УслАнПБА3,УслАнПБО2,УслАнПБО3:S;
var ЛБО2_,ЛБО3_,ЗК2_,ЗК3_,ПБО2_,ПБО3_,:N;
var БК,КОСГУ:S;
var Ан_ЗК2_,Ан_ЗК3_:S;
 УслСчОбщ=МаскаСч+"&("+vБК+"."+Раб.Бюджет2005.МаскаСч6+"."+vКОСГУ+")";
 ПризнДоп_=if(ПризнДоп="","","("+ПризнДоп+")");
 УслАнОбщ=ПризнДоп_;
 УслСжатияАн=Раб.Бюджет2005.СписокСправ(МаскаСч,0,"");
 if not МаскаСправ="": 
    УслАнОбщ=Раб.Бюджет2005.Объединить(УслАнОбщ,"("+МаскаСправ+")","&"); 
    УслСжатияАн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(УслСжатияАн,"|",МаскаСправ,"&");
 fi;
 Ан_ЗК2_=Раб.Бюджет2005.Объединить(Ан_ЗК,"ПЕРИОД."+Str(Year(ДН)+1)+"!","&");
 Ан_ЗК3_=Раб.Бюджет2005.Объединить(Ан_ЗК,"ПЕРИОД."+Str(Year(ДН)+2)+"!","&");
 FName=PlanVar("CACHE")+"\"+GetGUID;
 nn=TujReport(FName,ДН,ДК,УслСчОбщ,УслАнОбщ,УслСжатияАн,"","",TujRepTurnDebCre+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna,False);
 Try
  ЧитатьЖурнал(k,kk,FName,nn,vБК,vКОСГУ);
  nn=LengthOfArray(KeyСвертка);
  ShowProgress(nn*2,"Расчет..."+Str(k)+" из "+Str(kk));
  УслСчАсс2=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_Асс2,СчДеб_Асс2,СчКре_Асс2);
  УслСчАсс3=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_Асс3,СчДеб_Асс3,СчКре_Асс3);
  УслСчЛБО2=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_ЛБО2,СчДеб_ЛБО2,СчКре_ЛБО2);
  УслСчЛБО3=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_ЛБО3,СчДеб_ЛБО3,СчКре_ЛБО3);
  if fЗК:
     УслСчЗК2=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_ЗК,СчДеб_ЗК,СчКре_ЗК);
     УслСчЗК3=УслСчЗК2;
  fi;
  УслСчПБА2=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_ПБА2,СчДеб_ПБА2,СчКре_ПБА2);
  УслСчПБА3=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_ПБА3,СчДеб_ПБА3,СчКре_ПБА3);
  УслСчПБО2=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_ПБО2,СчДеб_ПБО2,СчКре_ПБО2);
  УслСчПБО3=ПолучитьУслСч(vБК,vКОСГУ,СчКБК_ПБО3,СчДеб_ПБО3,СчКре_ПБО3);
  for n=1..nn do
   ProgressPos(nn+n);
   УслАнАсс2=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_Асс2,"&");
   УслАнАсс3=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_Асс3,"&");
   УслАнЛБО2=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_ЛБО2,"&");
   УслАнЛБО3=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_ЛБО3,"&");
   if fЗК:
      УслАнЗК2=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_ЗК2_,"&");
      УслАнЗК3=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_ЗК3_,"&");
   fi;
   УслАнПБА2=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_ПБА2,"&");
   УслАнПБА3=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_ПБА3,"&");
   УслАнПБО2=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_ПБО2,"&");
   УслАнПБО3=Раб.Бюджет2005.Объединить(ПризнДоп_,Ан_ПБО3,"&");
   Key_="";
   for v=1..ЧислоСправ do
    tmp=GetVariableS("BufПризн"+Str(v)+"["+Str(n)+"]");
    if Справ[v]="КБК.":
       БК=SubStr(BufКБК[n],1,20);
       КОСГУ=SubStr(BufКБК[n],22,3);
       УслСчАсс2=ПолучитьУслСч(БК,КОСГУ,СчКБК_Асс2,СчДеб_Асс2,СчКре_Асс2);
       УслСчАсс3=ПолучитьУслСч(БК,КОСГУ,СчКБК_Асс3,СчДеб_Асс3,СчКре_Асс3);
       УслСчЛБО2=ПолучитьУслСч(БК,КОСГУ,СчКБК_ЛБО2,СчДеб_ЛБО2,СчКре_ЛБО2);
       УслСчЛБО3=ПолучитьУслСч(БК,КОСГУ,СчКБК_ЛБО3,СчДеб_ЛБО3,СчКре_ЛБО3);
       if fЗК:
	  УслСчЗК2=ПолучитьУслСч(БК,КОСГУ,СчКБК_ЗК,СчДеб_ЗК,СчКре_ЗК);
	  УслСчЗК3=ПолучитьУслСч(БК,КОСГУ,СчКБК_ЗК,СчДеб_ЗК,СчКре_ЗК);
       fi;
       УслСчПБА2=ПолучитьУслСч(БК,КОСГУ,СчКБК_ПБА2,СчДеб_ПБА2,СчКре_ПБА2);
       УслСчПБА3=ПолучитьУслСч(БК,КОСГУ,СчКБК_ПБА3,СчДеб_ПБА3,СчКре_ПБА3);
       УслСчПБО2=ПолучитьУслСч(БК,КОСГУ,СчКБК_ПБО2,СчДеб_ПБО2,СчКре_ПБО2);
       УслСчПБО3=ПолучитьУслСч(БК,КОСГУ,СчКБК_ПБО3,СчДеб_ПБО3,СчКре_ПБО3);
       Key_=Key_+" "+tmp;
      else
       Key_=Key_+" "+tmp;
       if УСС[v]>0:
	  if WordsCount(tmp,".")>УСС[v]:
	     tmp=tmp+"!";
	  fi;
       fi;
       УслАнАсс2=Раб.Бюджет2005.Объединить(УслАнАсс2,tmp,"&");
       УслАнАсс3=Раб.Бюджет2005.Объединить(УслАнАсс3,tmp,"&");
       УслАнЛБО2=Раб.Бюджет2005.Объединить(УслАнЛБО2,tmp,"&");
       УслАнЛБО3=Раб.Бюджет2005.Объединить(УслАнЛБО3,tmp,"&");
       if fЗК:
	  УслАнЗК2=Раб.Бюджет2005.Объединить(УслАнЗК2,tmp,"&");
	  УслАнЗК3=Раб.Бюджет2005.Объединить(УслАнЗК3,tmp,"&");
       fi;
       УслАнПБА2=Раб.Бюджет2005.Объединить(УслАнПБА2,tmp,"&");
       УслАнПБА3=Раб.Бюджет2005.Объединить(УслАнПБА3,tmp,"&");
       УслАнПБО2=Раб.Бюджет2005.Объединить(УслАнПБО2,tmp,"&");
       УслАнПБО3=Раб.Бюджет2005.Объединить(УслАнПБО3,tmp,"&");
    fi;
   od;
   Key_=SubStr(Key_,2,255);
   ЛБО2_=MyTurn(УслСчЛБО2,УслАнЛБО2,ДН,ДК)+MyTurn(УслСчАсс2,УслАнАсс2,ДН,ДК);
   ЛБО3_=MyTurn(УслСчЛБО3,УслАнЛБО3,ДН,ДК)+MyTurn(УслСчАсс3,УслАнАсс3,ДН,ДК);
   if fЗК:
      ЗК2_=MyTurn(УслСчЗК2,УслАнЗК2,ДН,ДК);
      ЗК3_=MyTurn(УслСчЗК2,УслАнЗК3,ДН,ДК);
     else
      ЗК2_=0;
      ЗК3_=0;
   fi;
   ПБО2_=MyTurn(УслСчПБО2,УслАнПБО2,ДН,ДК)+MyTurn(УслСчПБА2,УслАнПБА2,ДН,ДК);
   ПБО3_=MyTurn(УслСчПБО3,УслАнПБО3,ДН,ДК)+MyTurn(УслСчПБА3,УслАнПБА3,ДН,ДК);
   if not ЛБО2_=0 or not ЛБО3_=0 or not ЗК2_=0 or not ЗК3_=0 or not ПБО2_=0 or not ПБО3_=0:
      РасчетСтроки(Key_,BufПризн1[n],BufПризн2[n],BufПризн3[n],BufПризн4[n],BufПризн5[n],BufНаимКБК[n],ЛБО2_,ЛБО3_,ЗК2_,ЗК3_,ПБО2_,ПБО3_,0);
      if not СправТабл="":
	tmp=BufПризн1[n]+" я";
	РасчетСтроки(tmp,BufПризн1[n],"","","","",BufНаимКБК[n],ЛБО2_,ЛБО3_,ЗК2_,ЗК3_,ПБО2_,ПБО3_,1);
      fi;
   fi;
  od;
 Finally
  CloseProgress;
 end;
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
Func НастрПоУмолч_OnEnter(FieldName: String; Iter: Integer): logical;
 if FieldName="НастрПоУмолч":
    if EnqOkCancel("Восстановить настройку по умолчанию ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 СчДеб_Асс2=defСчДеб_Асс2;
 СчКре_Асс2=defСчКре_Асс2;
 СчДеб_Асс3=defСчДеб_Асс3;
 СчКре_Асс3=defСчКре_Асс3;
 СчДеб_ЛБО2=defСчДеб_ЛБО2;
 СчКре_ЛБО2=defСчКре_ЛБО2;
 СчДеб_ЛБО3=defСчДеб_ЛБО3;
 СчКре_ЛБО3=defСчКре_ЛБО3;
 СчДеб_ЗК  =defСчДеб_ЗК;
 СчКре_ЗК  =defСчКре_ЗК;
 СчДеб_ПБА2=defСчДеб_ПБА2;
 СчКре_ПБА2=defСчКре_ПБА2;
 СчДеб_ПБА3=defСчДеб_ПБА3;
 СчКре_ПБА3=defСчКре_ПБА3;
 СчДеб_ПБО2=defСчДеб_ПБО2;
 СчКре_ПБО2=defСчКре_ПБО2;
 СчДеб_ПБО3=defСчДеб_ПБО3;
 СчКре_ПБО3=defСчКре_ПБО3;
 --
 Ан_Асс2=defАн_Асс2;
 Ан_Асс3=defАн_Асс3;
 Ан_ЛБО2=defАн_ЛБО2;
 Ан_ЛБО3=defАн_ЛБО3;
 Ан_ЗК	=defАн_ЗК;
 Ан_ПБА2=defАн_ПБА2;
 Ан_ПБА3=defАн_ПБА3;
 Ан_ПБО2=defАн_ПБО2;
 Ан_ПБО3=defАн_ПБО3;
 --
 СчКБК_Асс2=defСчКБК_Асс2;
 СчКБК_Асс3=defСчКБК_Асс3;
 СчКБК_ЛБО2=defСчКБК_ЛБО2;
 СчКБК_ЛБО3=defСчКБК_ЛБО3;
 СчКБК_ЗК  =defСчКБК_ЗК;
 СчКБК_ПБА2=defСчКБК_ПБА2;
 СчКБК_ПБА3=defСчКБК_ПБА3;
 СчКБК_ПБО2=defСчКБК_ПБО2;
 СчКБК_ПБО3=defСчКБК_ПБО3;
 --
 if FieldName="НастрПоУмолч":
    Message("Настройка по умолчанию восстановлены");
 fi;
 Return False;
end;


Func НастрЗакр_OnEnter(FieldName: String; Iter: Integer): logical;
 if not ПроверитьНастр: ^False; fi;
 Настр(True);
 ОткрНастр(False);
 Очистить;
 СправТабл="";
 СправСтр="";
 Оформление(True);
 Return False;
end;

Func Сч_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=Раб.КБК.Список("","ФКР","СЧ6 ВД+? ИГ");
 if Match(tmp,"?."): tmp=tmp+"???.??";
   |Match(tmp,"?.???."): tmp=tmp+"??";
 fi;
 if tmp="": ^False; fi;
 PutVariableS(FieldName,tmp);
end;

Proc Сч_OnExit(FieldName: String; Iter: Integer);
var Val:s;
 Val=GetVariableS(FieldName);
 if Val="": PutVariableS(FieldName,"?.???.??"); fi;
end;


Func СчКБК_onEnter(FieldName: String; Iter: Integer): logical;
var n:I;
 ClearVariable(Buf);
 Buf[1]="По дебету счета";
 Buf[2]="По кредиту счета";
 n=Alternate("Условие отбора КБК счетов",Buf,-1,1,12);
 if n=1: n=1;
   |n=2: n=-1;
   |True: ^False;
 fi;
 FieldName=SubStr(FieldName,1,Length(FieldName)-1);
 PutVariableI(FieldName,n);
 Return False;
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;
 МаскаКБК[Iter]=Раб.КБК.ВыбратьМаскуКБК("ФКР",МаскаСч,МаскаКБК[Iter],True);
 Очистить;
 Оформление(False);
 ^False;
end;

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

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

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

Func КБК_OnEnter(FieldName: String; Iter: Integer): logical;
 FieldName="f"+FieldName;
 PutVariableL(FieldName,not GetVariableL(FieldName));
 Очистить;
 Оформление(False);
 Return False;
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 УСС_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 СчУсл_,АнУсл_,УслКБК_,СчДеб_,СчКре_,Ан_:S;
var p1,p2,v,Iter,СчКБК,СчКБК_:i;
var FieldName:S;
var fАсс,fЛБО:L;
 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;
 fАсс=False;
 if Match(FieldName,"ЛБО2*"):	 СчДеб=СчДеб_ЛБО2; СчКре=СчКре_ЛБО2; СчКБК=СчКБК_ЛБО2; Ан=Ан_ЛБО2; СчДеб_=СчДеб_Асс2; СчКре_=СчКре_Асс2; СчКБК_=СчКБК_Асс2; Ан_=Ан_Асс2; fАсс=true;
   |Match(FieldName,"ЛБО3*"):	 СчДеб=СчДеб_ЛБО3; СчКре=СчКре_ЛБО3; СчКБК=СчКБК_ЛБО3; Ан=Ан_ЛБО3; СчДеб_=СчДеб_Асс3; СчКре_=СчКре_Асс3; СчКБК_=СчКБК_Асс3; Ан_=Ан_Асс3; fАсс=true;
   |Match(FieldName,"ЗК2*"):	 СчДеб=СчДеб_ЗК;   СчКре=СчКре_ЗК;   СчКБК=СчКБК_ЗК;   Ан=Раб.Бюджет2005.Объединить(Ан_ЗК,"ПЕРИОД."+Str(Year(ДН)+1)+"!","&");
   |Match(FieldName,"ЗК3*"):	 СчДеб=СчДеб_ЗК;   СчКре=СчКре_ЗК;   СчКБК=СчКБК_ЗК;   Ан=Раб.Бюджет2005.Объединить(Ан_ЗК,"ПЕРИОД."+Str(Year(ДН)+2)+"!","&");
   |Match(FieldName,"ПБО2*"):	 СчДеб=СчДеб_ПБО2; СчКре=СчКре_ПБО2; СчКБК=СчКБК_ПБО2; Ан=Ан_ПБО2; СчДеб_=СчДеб_ПБА2; СчКре_=СчКре_ПБА2; СчКБК_=СчКБК_ПБА2; Ан_=Ан_ПБА2; fАсс=true;
   |Match(FieldName,"ПБО3*"):	 СчДеб=СчДеб_ПБО3; СчКре=СчКре_ПБО3; СчКБК=СчКБК_ПБО3; Ан=Ан_ПБО3; СчДеб_=СчДеб_ПБА3; СчКре_=СчКре_ПБА3; СчКБК_=СчКБК_ПБА3; Ан_=Ан_ПБА3; fАсс=true;
   |True: Message("Нет данных для расшифроки",mtError); ^Cur;
 fi;
 АнУсл =if(ПризнДоп="","","("+ПризнДоп+")");
 АнУсл_=АнУсл;
 АнУсл =Раб.Бюджет2005.Объединить(АнУсл,Ан,"&");
 АнУсл_=Раб.Бюджет2005.Объединить(АнУсл_,Ан,"&");
 if not МаскаКБК[1]="" and not flagКБК:
    УслКБК="";
    for v=1..УпрКБК do
     tmp=СжатиеУслБК(Раб.Бюджет2005.ВзятьКодКБК(МаскаКБК[v],"КР","КБК",False));
     УслКБК =Раб.Бюджет2005.Объединить(УслКБК ,tmp+".*."+Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[v],"КР","КОСГУ",False),"|");
     УслКБК_=Раб.Бюджет2005.Объединить(УслКБК_,tmp+".*."+Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[v],"КР","КОСГУ",False),"|");
    od;
    for v=1..ЧислоСправ do
     tmp=GetVariableS("Призн"+Str(v)+"["+Str(Iter)+"]");
     АнУсл =Раб.Бюджет2005.Объединить(АнУсл ,tmp,"&");
     АнУсл_=Раб.Бюджет2005.Объединить(АнУсл_,tmp,"&");
    od;
    if СчКБК= 1: СчУсл ="*."+СчДеб +".*"+"&("+УслКБК +")/"+МаскаСчета(СчКре);
		 СчУсл_="*."+СчДеб_+".*"+"&("+УслКБК_+")/"+МаскаСчета(СчКре_);
      |СчКБК=-1: СчУсл =МаскаСчета(СчДеб) +"/*."+СчКре +".*&("+УслКБК +")";
		 СчУсл_=МаскаСчета(СчДеб_)+"/*."+СчКре_+".*&("+УслКБК_+")";
    fi;
   else
    СчУсл =ПолучитьУслСч("*","*",СчКБК ,СчДеб ,СчКре );
    СчУсл_=ПолучитьУслСч("*","*",СчКБК_,СчДеб_,СчКре_);
    for v=1..ЧислоСправ do
     if Справ[v]="КБК.":
	tmp=GetVariableS("Призн"+Str(v)+"["+Str(Iter)+"]");
	if not fКБК_ГЛ: tmp=Insert("???.",tmp,1); fi;
	if not fКБК_РП: tmp=Insert(if(SubStr(tmp,4,1)=".","",".")+"????.",tmp,5); fi;
	if not fКБК_ЦС: tmp=Insert(if(SubStr(tmp,9,1)=".","",".")+"???????.",tmp,10); fi;
	if not fКБК_ВР: tmp=Insert(if(SubStr(tmp,17,1)=".","",".")+"???.",tmp,18); fi;
	if not fКБК_КОСГУ: tmp=Insert(if(SubStr(tmp,21,1)=".","",".")+"???",tmp,22); fi;
	БК=Раб.Бюджет2005.ВзятьКодКБК(tmp,"КР","КБК",False);
	КОСГУ=Раб.бюджет2005.ВзятьКодКБК(tmp,"КР","КОСГУ",False);
	if Pos("?",tmp)=0 or МаскаКБК[1]="":
	   СчУсл =ПолучитьУслСч(БК,КОСГУ,СчКБК ,СчДеб ,СчКре );
	   СчУсл_=ПолучитьУслСч(БК,КОСГУ,СчКБК_,СчДеб_,СчКре_);
	  else
	   УслКБК="";
	   for v=1..УпрКБК do
	    tmp=СжатиеУслБК(Раб.Бюджет2005.ВзятьКодКБК(МаскаКБК[v],"КР","КБК",False));
	    УслКБК =Раб.Бюджет2005.Объединить(УслКБК ,tmp+".*."+Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[v],"КР","КОСГУ",False),"|");
	    УслКБК_=Раб.Бюджет2005.Объединить(УслКБК_,tmp+".*."+Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[v],"КР","КОСГУ",False),"|");
	   od;
	   if СчКБК= 1: СчУсл =БК+"."+СчДеб +"."+КОСГУ+"&("+УслКБК +")/"+МаскаСчета(СчКре) +".*";
			СчУсл_=БК+"."+СчДеб_+"."+КОСГУ+"&("+УслКБК_+")/"+МаскаСчета(СчКре_)+".*";
	     |СчКБК=-1: СчУсл =МаскаСчета(СчДеб) +"/"+БК+"."+СчКре +"."+КОСГУ+"&("+УслКБК +")";
			СчУсл_=МаскаСчета(СчДеб_)+"/"+БК+"."+СчКре_+"."+КОСГУ+"&("+УслКБК_+")";
	   fi;
	fi; --if Pos("?",tmp)=0 or МаскаКБК[1]="":
       else
	tmp=GetVariableS("Призн"+Str(v)+"["+Str(Iter)+"]");
	if УСС[v]>0:
	  if WordsCount(tmp,".")>УСС[v]:
	     tmp=tmp+"!";
	  fi;
	fi;
	АнУсл =Раб.Бюджет2005.Объединить(АнУсл ,tmp,"&");
	АнУсл_=Раб.Бюджет2005.Объединить(АнУсл_,tmp,"&");
     fi;
    od;
 fi;
 if 253-Length(АнУсл)<Length(СчУсл): Message("Расшифровка невозможна. Слишком сложное условие отбора проводок^MВыполните расчет в разрезе КБК",mtError); ^Cur; fi;
 if fАсс:
    Try fЛБО=ExistsTransactions(СчУсл+"{"+АнУсл+"}",ДН,ДК); Except fЛБО=False; end;
    Try fАсс=ExistsTransactions(СчУсл_+"{"+АнУсл_+"}",ДН,ДК); Except fАсс=False; end;
    if fЛБО and fАсс:
       ClearVariable(Buf);
       Buf[1]="Вызов расшифровки поступивших ассигнований";
       Buf[2]="Вызов расшифровки поступивших ЛБО";
       v=Alternate("Выберите вариант расшифровки",Buf,-1,1,12);
       if v=1: fАсс=True; fЛБО=False;
	 |v=2: fЛБО=True; fАсс=False;
	 |True: ^Cur;
       fi;
    fi;
    if fАсс: 
       Report('"'+PlanVar("Общие")+'\Отчеты\Служебные отчеты.lst"."001"',ДН,ДК,СчУсл_,АнУсл_);
      else
       Report('"'+PlanVar("Общие")+'\Отчеты\Служебные отчеты.lst"."001"',ДН,ДК,СчУсл,АнУсл);
    fi;
   else
    Report('"'+PlanVar("Общие")+'\Отчеты\Служебные отчеты.lst"."001"',ДН,ДК,СчУсл,АнУсл);
 fi;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnРасчет_OnClick(Sender: String);
var n,err:i;
var БК_,КОСГУ_,Справ_:S;
 if not ПроверитьНастр: Exit; fi;
 Try
  Очистить;
  Оформление(True);
  if ДК=1.1.100: Message("Введите дату расчета",mtError); Template.Field="ДК"; Exit; fi;
  Справ_=Trim(Trim(СправТабл+" "+СправПодТабл)+" "+СправСтр);
  ЧислоСправ=WordsCount(Справ_," ");
  if ЧислоСправ=0: Message("Задайте разрез аналитических справочников",mtError); Template.Field="СправСтр_"; Exit; fi;
  if ЕдИзм=0: ЕдИзм=1; fi;
  Refresh;
  УдалитьПустыеМаскиКБК;
  if not ПроверитьМаскиКБК: Exit; fi;
  МаскаСправ=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Справ_," ","КБК.","");
  FlagКБК=not WordsCount(МаскаСправ," ")=ЧислоСправ;
  if FlagКБК and not fКБК_ГЛ and not fКБК_РП  and not fКБК_ЦС and not fКБК_ВР and not fКБК_КОСГУ: Message("В группировке КБК должен указан хотябы один из элементов",mtError); Template.Field="КБК_ГЛ"; Exit; fi;
  МаскаСправ=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(МаскаСправ," ","&");
  if УпрКБК=0: УпрКБК=1; fi;
  for n=1..УпрКБК do
   if МаскаКБК[n]="":
      БК_="???.????.???????.???";
      КОСГУ_="???";
     else
      БК_=Раб.Бюджет2005.ВзятьКодКБК(МаскаКБК[n],"КР","КБК",False);
      КОСГУ_=Раб.бюджет2005.ВзятьКодКБК(МаскаКБК[n],"КР","КОСГУ",False);
   fi;
   Расчет(n,УпрКБК,БК_,КОСГУ_);
  od;
  if (not СправТабл="" or not СправПодТабл="") and Упр>0: RepRow=0; РазбитьТаблицы; fi;
  err=0;
  for n=1..Упр do
   if Round(ЛБО2_Ост[n],2)<0 or Round(ЛБО3_Ост[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="ЛБО2_Ост";
       Template.Frame=err;
      else
       Template.Field="ЛБО2_Ост["+Str(err)+"]";
    fi;
 fi;
end;

Proc btnНастр_OnClick(Sender: String);
 ОткрНастр(True);
 Настр(False);
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 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(МаскаКБК);
 Очистить;
 Оформление(False);
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 ОткрНастр(not ПроверитьНастр);
 Настр(False);
 СписокСправ;
 if СправТабл="" and СправСтр="": СправСтр="КБК."; fi;
 if not fКБК_ГЛ and not fКБК_РП  and not fКБК_ЦС and not fКБК_ВР and not fКБК_КОСГУ:
    fКБК_ГЛ=True;
    fКБК_РП=True;
    fКБК_ЦС=True;
    fКБК_ВР=True;
    fКБК_КОСГУ=True;
 fi;
 if notRecoveryRep: Очистить; notRecoveryRep=False; fi;
end;

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

Конец