-- Шаблон создан мастером бланков
-- 19.10.2007 11:08:21
--
БланкСШаблоном "Реестр платежных поручений";

S1: Section;
S2: Section;
S3: Section;
Rep: Section;

ДН:D;
ДК:D;

ИсклБанк:L;
ИстКБК:I;

Орг: Record;
НаимОрг:S;
Банк: Record;
ЛСчет:S;
Дата: D;


var Упр:I;

var KeyКБК[]:S;
var BufКВР[]:S;
var BufЭКР[]:S;
var BufСум[]:N;

var KeyОтч[]:S;
var пп[]:I;
var Ном[]:S;
var Дат[]:D;
var КВР[]:S;
var ЭКР[]:S;
var Сум[]:N;
var Примеч[]:S;
var UKey[]:Record;

var ВсегоСум:N;

var A:S="+";
var D[]:S=if(UKey[$]=nil,"","-");
var T[]:S=if(UKey[$]=nil,"","Открыть ПП...");

var BufR[]:Record;

КолКопий:I=[1];
--
--Процедуры и функции -------------
Proc ClearBuf;
 ClearVariable(KeyКБК);
 ClearVariable(BufКВР);
 ClearVariable(BufЭКР);
 ClearVariable(BufСум);
end;

Proc НеПустаяТаблица;
 if Упр<1:
    InsertFrame(Упр,1);
    KeyОтч[1]="";
 fi;
end;

Proc Очистить;
 ClearVariable(KeyОтч);
 ClearVariable(Упр);
 ClearVariable(пп);
 ClearVariable(Ном);
 ClearVariable(Дат);
 ClearVariable(КВР);
 ClearVariable(ЭКР);
 ClearVariable(Сум);
 ClearVariable(Примеч);
 ClearVariable(UKey);
 ClearVariable(ВсегоСум);
 НеПустаяТаблица;
end;

Proc УдалитьСтроку (aRec:Record);
var Iter:I;
 Iter=1;
 While Iter<=Упр do
  if aRec=UKey[Iter]: 
     DeleteFrame(Упр,Iter); 
     DeleteFromArray(KeyОтч,Iter);
    else 
     Iter=Iter+1; 
  fi;
 od;
 НеПустаяТаблица;
end;

Proc ОформитьОтчет;
var Obj: Object;
var r,rr,c,cc,Iter:i;
var cb:s;
 if FindObject("Rep",Obj):
    rr=Упр+4;
    cc=9;
    Obj.RowsCount=2;
    Obj.RowsCount=rr;
    for Iter=1..Упр do
     r=Iter+2;
     if Ном[Iter]="ИТОГО":
	c=1; Obj.Cell(r,c,CellBorder,"2,2,1,2"); Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellContents,"ИТОГО"); Obj.Cell(r,c,CellFieldType,cftStaticText); Obj.Cell(r,c,CellFontStyle,fsBold);
	Obj.CellLinks(1,r,5,r);
	c=6; Obj.Cell(r,c,CellBorder,"1,2,1,2"); Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellContents,"Сум["+Str(Iter)+"]"); Obj.Cell(r,c,CellFieldType,cftNumericField); Obj.Cell(r,c,CellFormat,",##0.00;;-"); Obj.Cell(r,c,CellFontStyle,fsBold);
	c=7; Obj.Cell(r,c,CellBorder,"1,2,2,2");
	Obj.CellLinks(7,r,9,r);
       else
	c=1; Obj.Cell(r,c,CellBorder,"1,1,1,1"); Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellContents,"пп["+Str(Iter)+"]");  Obj.Cell(r,c,CellFieldType,cftCommonField);
	c=2; Obj.Cell(r,c,CellBorder,"1,1,1,1"); Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellContents,"Ном["+Str(Iter)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
	c=3; Obj.Cell(r,c,CellBorder,"1,1,1,1"); Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellContents,"Дат["+Str(Iter)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
	c=4; Obj.Cell(r,c,CellBorder,"1,1,1,1"); Obj.Cell(r,c,CellAlignment,2); Obj.Cell(r,c,CellContents,"КВР["+Str(Iter)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
	c=5; Obj.Cell(r,c,CellBorder,"1,1,1,1"); Obj.Cell(r,c,CellAlignment,2); Obj.Cell(r,c,CellContents,"ЭКР["+Str(Iter)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
	c=6; Obj.Cell(r,c,CellBorder,"1,1,1,1"); Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellContents,"Сум["+Str(Iter)+"]"); Obj.Cell(r,c,CellFieldType,cftNumericField); Obj.Cell(r,c,CellFormat,",##0.00;;-");
	c=7; Obj.Cell(r,c,CellBorder,"1,1,1,1");
	c=8; Obj.Cell(r,c,CellBorder,"1,1,1,1");
	c=9; Obj.Cell(r,c,CellBorder,"1,1,1,1"); Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellContents,"Примеч["+Str(Iter)+"]"); Obj.Cell(r,c,CellFieldType,cftCommonField);
     fi;
    od;
    r=r+1;
    c=1; Obj.Cell(r,c,CellBorder,"1,1,1,1");
    Obj.CellLinks(1,r,9,r);
    --
    r=r+1;
    c=1; Obj.Cell(r,c,CellBorder,"2,2,1,2"); Obj.Cell(r,c,CellAlignment,0); Obj.Cell(r,c,CellContents,"ВСЕГО"); Obj.Cell(r,c,CellFieldType,cftStaticText); Obj.Cell(r,c,CellFontStyle,fsBold);
    Obj.CellLinks(1,r,5,r);
    c=6; Obj.Cell(r,c,CellBorder,"1,2,1,2"); Obj.Cell(r,c,CellAlignment,1); Obj.Cell(r,c,CellContents,"ВсегоСум"); Obj.Cell(r,c,CellFieldType,cftNumericField); Obj.Cell(r,c,CellFormat,",##0.00;;-"); Obj.Cell(r,c,CellFontStyle,fsBold);
    c=7; Obj.Cell(r,c,CellBorder,"1,2,2,2");
    Obj.CellLinks(7,r,9,r);
 fi;
end;

Proc ЗаполнитьРекв(Rec: Record);
 if Rec=nil: Rec=Раб.Бюджет2005.НашРекв; fi;
 if not Rec=nil:
    Орг=Rec;
    НаимОрг=GetCardFieldS("Контрагент",Rec,"ПолнИмя");
    Rec=Раб.Бюджет2005.БанкСчет(Орг,False);
    if not Rec=nil:
       Банк=Rec;
       ЛСчет=GetCardFieldS("Банк_Счета",Rec,"РПО_ЛСчет");
    fi;
 fi;
end;

Proc РасчетВсего;
var n,z,Iter:I;
var tmp:s;
 ВсегоСум=0;
 Iter=1;
 While Iter<=Упр do
  if Ном[Iter]="ИТОГО": DeleteFrame(Упр,Iter); DeleteFromArray(KeyОтч,Iter); else Iter=Iter+1; fi;
 od;
 Iter=1;
 n=0;
 While Iter<=Упр do
  if not UKey[Iter]=nil:
     ВсегоСум=ВсегоСум+Сум[Iter];
     if not tmp=КВР[Iter]+" "+ЭКР[Iter]: n=0; tmp=КВР[Iter]+" "+ЭКР[Iter]; fi;
     n=n+1;
     пп[Iter]=n;
     z=SearchInArray(KeyОтч,КВР[Iter]+" "+ЭКР[Iter]+" z z",True);
     if z=-1:
	z=InsertInArraySort(KeyОтч,КВР[Iter]+" "+ЭКР[Iter]+" z z");
	InsertFrame(Упр,z);
	пп[z]=0;
	Ном[z]="ИТОГО";
	Дат[z]=1.1.100;
	КВР[z]="";
	ЭКР[z]="";
	Сум[z]=Сум[Iter];
	Примеч[z]="";
	UKey[z]=nil;
       else
	Сум[z]=Сум[z]+Сум[Iter];
     fi;
  fi;
  Iter=Iter+1;
 od;
end;

Func ОбработатьПП (OWA:I; n1: I):I;
var Ном_,КВР_,ЭКР_,tmp,ТипКБК,xНом:S;
var Дат_:D;
var Сум_,СумКБК_:N;
var UKey_:Record;
var OA,n2,nr2,z,p,pp:I;
 ClearBuf;
 UKey_=GetRecordKey(OWA,n1);
 Ном_=GetFieldS(OWA,n1,"НомерБум");
 xНом=Str16(GetFieldI(OWA,n1,"Номер"))+" "+Str16(RecordToInteger(UKey_));
 Дат_=GetFieldD(OWA,n1,"Дата");
 Сум_=GetFieldN(OWA,n1,"Сумма");
 if ИстКБК=0:
    OA=OpenArray(OWA,n1,"РПО_ПОЗИЦИИ","");
    nr2=Records(OA);
    for n2=1..nr2 do
     tmp=GetFieldS(OA,n2,"СЧКРЕ");
     ТипКБК=Раб.Бюджет2005.ТипКБКСчета(tmp);
     if ТипКБК="КИФД":
	tmp=GetFieldS(OA,n2,"ПРИЗНАК");
	КВР_=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(tmp," ","ФКР.*","");
	КВР_=Раб.Бюджет2005.ВзятьКодКБК(SubStr(КВР_,5,255),"","ВР",False);
	ЭКР_=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(tmp," ","КОСГУ.*","");
	ЭКР_=SubStr(ЭКР_,7,255);
       else
	КВР_=Раб.Бюджет2005.ВзятьКодСчета(tmp,"","ВР",False);
	ЭКР_=Раб.Бюджет2005.ВзятьКодСчета(tmp,"","КОСГУ",False);
     fi;
     if КВР_="000": КВР_=""; fi;
     СумКБК_=GetFieldN(OA,n2,"Сум");
     z=SearchInArray(KeyКБК,КВР_+" "+ЭКР_,True);
     if z=-1:
	z=InsertInArraySort(KeyКБК,КВР_+" "+ЭКР_);
	InsertInArray(BufКВР,z,КВР_);
	InsertInArray(BufЭКР,z,ЭКР_);
	InsertInArray(BufСум,z,СумКБК_);
       else
	BufСум[z]=BufСум[z]+СумКБК_;
     fi;
    od;
    CloseWorkArea(OA);
   |ИстКБК=1:
    OA=OpenArray(OWA,n1,"РПО_СТРОКИ_БК","");
    nr2=Records(OA);
    for n2=1..nr2 do
     КВР_=GetFieldS(OA,n2,"КОДВР");
     if КВР_="000": КВР_=""; fi;
     ЭКР_=GetFieldS(OA,n2,"КОДЭК");
     СумКБК_=GetFieldN(OA,n2,"Сум");
     z=SearchInArray(KeyКБК,КВР_+" "+ЭКР_,True);
     if z=-1:
	z=InsertInArraySort(KeyКБК,КВР_+" "+ЭКР_);
	InsertInArray(BufКВР,z,КВР_);
	InsertInArray(BufЭКР,z,ЭКР_);
	InsertInArray(BufСум,z,СумКБК_);
       else
	BufСум[z]=BufСум[z]+СумКБК_;
     fi;
    od;
    CloseWorkArea(OA);
   |ИстКБК=2:
    tmp=Trim(GetFieldS(OWA,n1,"РПО_НАЗНПЛАТ"));
    p=Pos("(",tmp);
    if not p=0:
       КВР_=SubStr(tmp,p+18,3);
       if КВР_="000": КВР_=""; fi;
       ЭКР_=SubStr(tmp,p+22,3);
    fi;
    z=SearchInArray(KeyКБК,КВР_+" "+ЭКР_,True);
    if z=-1:
       z=InsertInArraySort(KeyКБК,КВР_+" "+ЭКР_);
       InsertInArray(BufКВР,z,КВР_);
       InsertInArray(BufЭКР,z,ЭКР_);
       InsertInArray(BufСум,z,Сум_);
      else
       BufСум[z]=BufСум[z]+Сум_;
    fi;
 fi;
 pp=LengthOfArray(KeyКБК);
 if pp=0: BufСум[1]=Сум_; pp=1; fi;
 --Отрисовка данных ПП
 for p=1..pp do
  if KeyОтч[1]="": 
     z=1;
     KeyОтч[z]=KeyКБК[p]+" "+xНом;
    else
     z=SearchInArray(KeyОтч,KeyКБК[p]+" "+xНом,True);
     if z=-1:
	z=InsertInArraySort(KeyОтч,KeyКБК[p]+" "+xНом);
	InsertFrame(Упр,z);
     fi;
  fi;
  пп[z]=0;
  Ном[z]=Ном_;
  Дат[z]=Дат_;
  КВР[z]=BufКВР[p];
  ЭКР[z]=BufЭКР[p];
  Сум[z]=BufСум[p];
  Примеч[z]=if(not Сум_=SumOfArray(BufСум,pp),"Ошибка! Сумма по КБК не равна сумме документа","");
  UKey[z]=UKey_;
 od;
 ^z;
end;

Proc ДобавитьПП(Iter:I);
var Rec: Record;
var OWA:I;
 Rec=OpenCardFile("Поруч","РПО_Учитывать and РЕКВ="+RecordToString(Орг)+" and Банк="+RecordToString(Банк),UKey[Iter]);
 if Rec=nil: Exit; fi;
 OWA=OpenWorkArea("Поруч","","UKey="+RecordToString(Rec));
 Try
  Iter=ОбработатьПП(OWA,1);
 Finally
  CloseWorkArea(OWA);
 end;
 РасчетВсего;
 Template.Frame=Iter;
end;

Proc Расчет;
var OWA,n,nr:I;
var F:S;
 Очистить;
 if ДН= 1.1.100 and ДК= 1.1.100: F="";
   |ДН<>1.1.100 and ДК= 1.1.100: F="Дата>="+DateToString(ДН);
   |ДН= 1.1.100 and ДК<>1.1.100: F="Дата<="+DateToString(ДК);
   |ДН<>1.1.100 and ДК<>1.1.100: F="Дата>="+DateToString(ДН)+" and Дата<="+DateToString(ДК);
 fi;
 F=Раб.Бюджет2005.Объединить(F,if(ИсклБанк,"not РПО_ВБанк","")," and ");
 F=Раб.Бюджет2005.Объединить(F,"РПО_Учитывать and РЕКВ="+RecordToString(Орг)+" and "+"Банк="+RecordToString(Банк)," and ");
 OWA=OpenWorkArea("Поруч","НОМЕР",F);
 Try
  nr=Records(OWA);
  ShowProgress(nr,"Расчет....");
  for n=1..nr do
   ProgressPos(n);
   ОбработатьПП(OWA,n);
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 РасчетВсего;
 Message("Расчет завершен");
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
Func НаимОрг_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
 Rec=OpenCardFile("Контрагент","Наше",Орг,crdRecordOnly);
 if rec=nil: ^False; fi;
 ЗаполнитьРекв(Rec);
 Очистить;
 Return False;
end;

Func ЛСчет_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
 if Орг=nil or НаимОрг="": Message("Выберите организацию",mtError); Template.Field="НаимОрг"; ^False; fi;
 Rec=OpenCardFile("Банк_Счета","Контрагент="+RecordToString(Орг),Банк,crdRecordOnly);
 if not Rec=nil:
    Банк=Rec;
    ЛСчет=GetCardFieldS("Банк_Счета",Rec,"РПО_ЛСчет");
 fi;
 Очистить;
 Return False;
end;

Func Дата_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:D;
 Template.HideEditor(False);
 tmp=Calendar;
 if not tmp=1.1.100:
    Дата=tmp;
    Очистить;
 fi;
 Return Cur;
end;

Func A_OnEnter(FieldName: String; Iter: Integer): logical;
var z:I;
 if Орг=nil or НаимОрг="": НаимОрг=""; Message("Выберите организацию",mtError); Template.Field="НаимОрг"; ^False; fi;
 if Банк=nil or ЛСчет="": ЛСчет=""; Message("Выберите лицевой счет",mtError); Template.Field="ЛСчет"; ^False; fi;
 if UKey[Iter]=nil:
    z=Iter;
   else
    z=Iter+1;  --Исчем начало следующего ПП перед котором мы вставим
    While UKey[z]=Ukey[Iter] do
     z=z+1;
    od;
 fi;
 ДобавитьПП(z);
 Return False;
end;

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
 if not UKey[Iter]=nil:
    УдалитьСтроку(UKey[Iter]);
 fi;
 РасчетВсего;
 НеПустаяТаблица;
 Return False;
end;

Func Ном_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 ДобавитьПП(asInteger(Template.Frame));
 Return Cur;
end;

Func ПП_onEnter(FieldName: String; Iter: Integer): logical;
 if not UKey[Iter]=nil:
    OpenBlank("ДОКУМЕНТЫ.БАНК.ПОРУЧ",True,UKey[Iter]);
 fi;
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnРасчет_OnClick(Sender: String);
 if Орг=nil or НаимОрг="": НаимОрг=""; Message("Выберите организацию",mtError); Template.Field="НаимОрг"; Exit; fi;
 if Банк=nil or ЛСчет="": ЛСчет=""; Message("Выберите лицевой счет",mtError); Template.Field="ЛСчет"; Exit; fi;
 if Дата=1.1.100: Message("Выберите дату",mtError); Template.Field="Дата"; Exit; fi;
 if ДН>ДК: Message("Начальная дата превышает конечную",mtError); Template.Object="edДН"; Exit; fi;
 if ДК>Дата: Message("Конечная дата превышает дату реестра",mtError); Template.Object="edДК"; Exit; fi;
 Расчет;
end;

Proc btnД_OnClick(Sender: String);
var tmp:D;
 tmp=Calendar;
 if tmp=1.1.100: Exit; fi;
 if Sender="btnДН": ДН=tmp;
   |Sender="btnДК": ДК=tmp;
 fi;
 Очистить;
end;

Proc edД_OnChange(Sender: String);
 Очистить;
end;

Proc cbИсклБанк_OnChange(Sender: String);
 Очистить;
end;

Proc rbИстКБК_OnChange(Sender: String);
 Очистить;
end;

Proc btnОчистить_OnClick(Sender: String);
 if EnqOkCancel("Очистить реестр ?",mtWarning)=cmCancel: Exit; fi;
 Очистить;
end;

Proc btnПечать_OnClick(Sender: String);
 Try
  S1.Visible=False;
  S2.Visible=False;
  S3.Visible=False;
  ОформитьОтчет;
  Rep.Visible=True;
  if КолКопий<1: КолКопий=1; fi;
  Раб.Настр_Печать.Prn("","","РПО.ДОКУМЕНТЫ.БАНК.РЕЕСТР_ПОРУЧ.000.cfg","",КолКопий);
 Finally
  Rep.Visible=False;
  S1.Visible=True;
  S2.Visible=True;
  S3.Visible=True;
 end;
end;

Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;

Proc btnВБанк_OnClick(Sender: String);
var OWA,Iter,n,z,zz:I;
 if not CanUpdate("Поруч"): Message("Вы не обладаете достаточными правами для выполнения данной операции",mtError); Exit; fi;
 ClearVariable(BufR);
 for Iter=1..Упр do
  if not UKey[Iter]=nil:
     AddInArray(BufR,True,False,UKey[Iter]);
  fi;
 od;
 zz=LengthOfArray(BufR);
 if zz=0: Message("Нет данных для выполнения операции",mtWarning); Exit; fi;
 OWA=OpenWorkArea("ПОРУЧ","","РПО_Учитывать");
 Try
  ShowProgress(zz,"Выполнение...");
  BeginChanging(OWA,False);
  Try
   for z=1..zz do
    ProgressPos(z);
    n=GetRecordNumber(OWA,BufR[z]);
    if not n=0:
       n=PutFieldL(OWA,n,"РПО_ВБанк",True);
    fi;
   od;
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 Message("Операция успешно завершена");
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 Раб.Настр_Печать.Cfg("","РПО.ДОКУМЕНТЫ.БАНК.РЕЕСТР_ПОРУЧ.000.cfg");
 if Орг=nil or НаимОрг="":
    ЗаполнитьРекв(nil);
 fi;
 if Дата=1.1.100: Дата=ToDay; fi;
 НеПустаяТаблица;
end;

Proc AfterOpen(Destroy: Logical);
 S1.Visible=True;
 S2.Visible=True;
 S3.Visible=True;
 Rep.Visible=False;
end;
--Обработчики событий шаблона -----
--




Конец
