БЛАНКСШАБЛОНОМ "Опись электронных платежных документов";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
btnСфор        :Object;
btnЗагр        :Object;
btnОчис        :Object;
СекцУслОтб     :Object;
СекцПозиции    :Object;
СекцПроп       :Object;
var Позиции    :Handle;
var crdБ       :String="БАНК_СЧЕТА";
var crdК       :String="КОНТРАГЕНТ";
var РЕКВ       :Record;
var БАНК       :Record;
var ДН         :Date=[ToDay];
var ДК         :Date=[ToDay];
var ДР         :Date; -- Дата рейса
var ДО         :Date=[ToDay]; -- Дата описи
var FlagВБанк  :Logical=[False];
var A          :String="+";
var D          :String="-";
var ЛС         :String=if(БАНК=NIL, "", GetCardFieldS(crdБ,БАНК,"РПО_ЛСЧЕТ"));
var ОФК        :String=if(БАНК=NIL, "", GetCardFieldS(crdБ,БАНК,"РПО_ОФК_ИМЯ"));
var ЛС_ОФК     :String=if(БАНК=NIL, "Выберите лицевой счет", ЛС+if(ОФК="", "", " ("+ОФК+")"));
var Банк_      :String=if(БАНК=NIL, "", GetCardFieldS(crdБ,БАНК,"БАНК"));
var Город_     :String=if(БАНК=NIL, "", GetCardFieldS(crdБ,БАНК,"ГОРОД"));
var БИК_       :String=if(БАНК=NIL, "", ", БИК "+GetCardFieldS(crdБ,БАНК,"БИК"));
var Рсчет_     :String=if(БАНК=NIL, "", " счет № "+GetCardFieldS(crdБ,БАНК,"РСЧЕТ"));
var БанкРекв   :String=if(БАНК=NIL, "Выберите лицевой счет", Банк_+Город_+БИК_+Рсчет_);
var ОРГимя     :String=if(БАНК=NIL, "Выберите лицевой счет", GetCardFieldS(crdБ,БАНК,"БАНКИМЯ"));
var ТекстОписи :String="электронных платежных документов на списание средств с лицевого счета № "+ЛС;
var НомерР     :Integer;
var НомерО     :Integer;
var BufI[]     :Integer;
var BufS[]     :String;
--
var NN[]       :String=Str($);
var НомПП[]    :String;
var ДатПП[]    :Date;
var СумПП[]    :Numeric;
var Стаплат[]  :String;
var ИННплат[]  :String;
var ИННпост[]  :String;
var БР_пост[]  :String;
var РС_пост[]  :String;
var НАЗпост[]  :String;
var Примеч_[]  :String;
--
var Msg[]      :String;
var Wrng[]     :Integer;
var Err[]      :Integer;
var UKey[]     :String;
--
var КолДок     :String=Str(Позиции)+" ("+Slo_(Позиции, "ДОКН")+")";
var СумДок     :Numeric=SumOfArray(СумПП, Позиции);
var СумДокПроп :String=Slo(СумДок);

2-- Общие процедуры и функции
Proc ОчиститьТаблицу;
 ClearVariable(Позиции);
 ClearVariable(НомПП); ClearVariable(Стаплат); ClearVariable(БР_пост); ClearVariable(Примеч_);
 ClearVariable(ДатПП); ClearVariable(ИННплат); ClearVariable(РС_пост);
 ClearVariable(СумПП); ClearVariable(ИННпост); ClearVariable(НАЗпост);
 ClearVariable(Msg); ClearVariable(Wrng);
 ClearVariable(Err); ClearVariable(UKey);
end;

Proc Очистить;
 ОчиститьТаблицу;
 ClearVariable(NN); ClearVariable(BufI); ClearVariable(BufS);
end;

Func ВыборДаты(srcDate:Date) :Date;
var dd :Date;
 if srcDate>1.1.100: dd=Calendar(srcDate); else dd=Calendar(ToDay); fi;
 if not(dd<=1.1.100): ^dd; else ^srcDate; fi;
end;

Func GetDate :Date;  -- считываем в заданном поле дату
 if AsString(Template.Field)="ДН": ^ДН;
 |  AsString(Template.Field)="ДК": ^ДК;
 |  AsString(Template.Field)="ДР": ^ДР;
 |  AsString(Template.Field)="ДО": ^ДО;
 fi;
 ^(1.1.100);
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
 if AsString(Template.Field)="ДН": ДН=Value;
 |  AsString(Template.Field)="ДК": ДК=Value;
 |  AsString(Template.Field)="ДР": ДР=Value;
 |  AsString(Template.Field)="ДО": ДО=Value;
 fi;
end;

Proc УдалитьПустые;
var i :Integer;
 i=1;
 while i<=Позиции do if UKey[i]="": DeleteFrame(Позиции, i); else i=i+1; fi; od;
end;

Func Проверить(Iter:Integer) :Logical;
var RO, OA, num, i, j, z1, z2 :Integer;
var Sum1, Sum2 :Numeric;
var REC :String;
 if Iter>0: REC=Ukey[Iter]; fi;
 УдалитьПустые;
 if Iter>0:  --восстанавливаем позицию Iter по UKey из-за возможного "УдалитьПустые";
   for i=1..Позиции do if REC=Ukey[i]: Break; fi; od;
   Iter=i;
 fi;
 if Позиции<1: Message("Список платежных поручений пуст!", mtError); InsertFrame(Позиции, 1); ^False; fi;
 if Iter>0: z1=Iter; z2=Iter; Msg[Iter]=""; Wrng[Iter]=0; Err[Iter]=0;
 |  True: z1=1; z2=Позиции;  ClearVariable(Msg); ClearVariable(Wrng); ClearVariable(Err);
 fi;
 RO=OpenWorkArea("ПОРУЧ","","1=0");
 if z2-z1>0: ShowProgress(z2-z1,"Проверка платежных поручений...."); fi;
 Try
   for i=z1..z2 do
     ProgressPos(i);
     SetFilter(RO,"UKey="+UKey[i]);
     if Records(RO)>0:
        if GetFieldL(RO,1,"РПО_Учитывать")=False:
          if Msg[i]="": Msg[i]="Ошибка! "; else Msg[i]=Msg[i]+" "; fi;
          Msg[i]=Msg[i]+"Флаг 'Учитывать' в платежном поручении не установлен!";
          Err[i]=Err[i]+1;
        fi;
        if GetFieldD(RO,1,"ДАТА")=1.1.100:
           if Msg[i]="": Msg[i]="Ошибка! "; else Msg[i]=Msg[i]+" "; fi;
           Msg[i]=Msg[i]+"Не указана дата платежного поручения!";
           Err[i]=Err[i]+1;
        fi;
        Sum1=Round(GetFieldN(RO,1,"СУММА"),2);
        if Sum1=0:
           if Msg[i]="": Msg[i]="Ошибка! "; else Msg[i]=Msg[i]+" "; fi;
           Msg[i]=Msg[i]+"Не указана сумма платежного поручения!";
           Err[i]=Err[i]+1;
        fi;
        if GetFieldR(RO,1,"РЕКВ")=Nil:
           if Msg[i]="": Msg[i]="Ошибка! "; else Msg[i]=Msg[i]+" "; fi;
           Msg[i]=Msg[i]+"Не указан плательщик!";
           Err[i]=Err[i]+1;
        fi;
        if GetFieldR(RO,1,"РЕКВП")=Nil:
           if Msg[i]="": Msg[i]="Ошибка! "; else Msg[i]=Msg[i]+" "; fi;
           Msg[i]=Msg[i]+"Не указан получатель!";
           Err[i]=Err[i]+1;
        fi;
        if GetFieldR(RO,1,"БАНК")=Nil:
           if Msg[i]="": Msg[i]="Ошибка! "; else Msg[i]=Msg[i]+" "; fi;
           Msg[i]=Msg[i]+"Не указан расчетный счет плательщика!";
           Err[i]=Err[i]+1;
        fi;
        if GetFieldR(RO,1,"БАНКП")=Nil:
           if Msg[i]="": Msg[i]="Ошибка! "; else Msg[i]=Msg[i]+" "; fi;
           Msg[i]=Msg[i]+"Не указан расчетный счет получателя!";
           Err[i]=Err[i]+1;
        fi;
        OA=OpenArray(RO,1,"РПО_СТРОКИ_БК","");
        Try
          num=Records(OA);
          if num>0:
            Sum2=0;
            for j=1..num do Sum2=Sum2+GetFieldN(OA,j,"СУМ"); od;
            Sum2=Round(Sum2,2);
            if Sum1<>Sum2:
               if Msg[i]="": Msg[i]="Ошибка! "; else Msg[i]=Msg[i]+" "; fi;
               Msg[i]=Msg[i]+"Сумма по строкам бюджетной классификации не совпадает с суммой платежного поручения !";
               Err[i]=Err[i]+1;
            fi;
          else
            if Msg[i]="": 
              Msg[i]="Предупреждение! ";
            else
              if Match(Msg[i],"*Предупреждение*"): Msg[i]=Msg[i]+" "; else Msg[i]=Msg[i]+" Предупреждение! "; fi;
            fi;
            Msg[i]=Msg[i]+"Отсутствует рашифровка суммы по строкам бюджетной классификации";
            Wrng[i]=Wrng[i]+1;
          fi;
        Finally
          CloseWorkArea(OA);
        end;
     else
        Msg[i]="Ошибка! Платежное поручение не найдено!";  Err[i]=Err[i]+1;
     fi;
     if Err[i]=0 and Wrng[i]=0: Msg[i]="Ok"; fi;
   od;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 ^True;
end;

Proc ЗагрузитьСписокПлатежекПоФильтру(F:String);
var RO, num, i, j :Integer;
var tmp1, tmp2, t1, t2, t3 :String;
var REC :Record;
 ОчиститьТаблицу;
 RO=OpenWorkArea("ПОРУЧ","ДАТА;НОМЕР",F);
 Try
   num=Records(RO);
   ShowProgress(num,"Загрузка платежных поручений....");
   for i=1..num do
     ProgressPos(i);
     InsertFrame(Позиции, Позиции+1);
     НомПП[Позиции]  =GetFieldS(RO,i,"НОМЕРБУМ");
     ДатПП[Позиции]  =GetFieldD(RO,i,"ДАТА");
     СумПП[Позиции]  =GetFieldN(RO,i,"СУММА");
     Стаплат[Позиции]=GetFieldS(RO,i,"П1");
     --
     REC=GetFieldR(RO,i,"РЕКВ");
     if i=1: if ModalMode and РЕКВ=NIL: РЕКВ=REC; fi; fi;
     if REC<>NIL: t1=GetCardFieldS(crdК,REC,"ИНН"); t2=GetCardFieldS(crdК,REC,"КПП"); fi;
     REC=GetFieldR(RO,i,"БАНК");
     if i=1: if ModalMode and БАНК=NIL: БАНК=REC; fi; fi;
     if REC<>NIL: t3=GetCardFieldS(crdБ,REC,"БАНКИМЯ"); fi;
     tmp1=""; tmp2="";
     if t1<>"": tmp1=tmp1+"ИНН "+t1; fi;  if tmp1<>"": tmp1=tmp1+Chr(13); fi;
     if t2<>"": tmp2=tmp2+"КПП "+t2; fi;  if tmp2<>"": tmp2=tmp2+Chr(13); fi;
     ИННплат[Позиции]=tmp1+tmp2+t3;
     --
     REC=GetFieldR(RO,i,"РЕКВП");
     if REC<>NIL: t1=GetCardFieldS(crdК,REC,"ИНН"); t2=GetCardFieldS(crdК,REC,"КПП"); fi;
     REC=GetFieldR(RO,i,"БАНКП");
     if REC<>NIL: t3=GetCardFieldS(crdБ,REC,"БАНКИМЯ"); fi;
     tmp1=""; tmp2="";
     if t1<>"": tmp1=tmp1+"ИНН "+t1; fi;  if tmp1<>"": tmp1=tmp1+Chr(13); fi;
     if t2<>"": tmp2=tmp2+"КПП "+t2; fi;  if tmp2<>"": tmp2=tmp2+Chr(13); fi;
     ИННпост[Позиции]=tmp1+tmp2+t3;
     --
     if REC<>NIL:  
       tmp1=GetCardFieldS(crdБ,REC,"БАНК"); tmp2=GetCardFieldS(crdБ,REC,"ГОРОД");
       t1=if(tmp2="", tmp1, tmp1+" "+tmp2);
       t2=GetCardFieldS(crdБ,REC,"БИК");
       t3=GetCardFieldS(crdБ,REC,"КСЧЕТ");
     fi;
     tmp1=""; tmp2="";
     if t1<>"": t1=t1+Chr(13); fi;
     if t2<>"": tmp2=tmp2+"БИК "+t2; fi;  if tmp2<>"": tmp2=tmp2+Chr(13); fi;
     if t3<>"": tmp1=t1+tmp2+"К/С "+t3; else tmp1=t1+tmp2; fi;
     БР_пост[Позиции]=tmp1;
     --
     РС_пост[Позиции]=GetCardFieldS(crdБ,REC,"РСЧЕТ");
     tmp1="";
     for j=2..8 do
       tmp2=Trim(GetFieldS(RO,i,"П"+Str(j)));
       if j=8: t1="п.110: "; else t1="п.10"+Str(j+2)+": "; fi;
       if tmp2<>"": tmp1=tmp1+t1+tmp2+Chr(13); fi;
     od;
     НАЗпост[Позиции]=tmp1+GetFieldS(RO,i,"РПО_НАЗНПЛАТ");
     UKey[Позиции]=RecordToString(GetRecordKey(RO, i));
   od;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
end;

Proc ЗагрузитьРейс(ДР_:Date; НР_:Integer);
var F :String;
 ОчиститьТаблицу;
 F="РПО_НомРейс="+Str(НР_)+" and РПО_ДатаРейс>="+DateToString(ДР_)+" and РПО_ДатаРейс<="+DateToString(ДР_);
 ЗагрузитьСписокПлатежекПоФильтру(F);
 Проверить(0);
 if Позиции<1: InsertFrame(Позиции, 1); fi;
end;

2-- События полей
Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var dd :Date;
 Template.HideEditor(False);
 dd=ВыборДаты(GetDate);
 SetDate(dd);
 ^"";
end;

Func FlagВБанк_onEnter(FieldName:String; Iter:Integer): Logical;
 FlagВБанк=not(FlagВБанк);
 ^False;
end;

Func ЛС_ОФК_OnEnter(FieldName:String; Iter:Integer): Logical;
var REC1, REC2 :Record;
 REC1=OpenCardFile(crdК, "Наше", РЕКВ, crdRecordOnly);
 if REC1=NIL: ^False; fi;
 REC2=OpenCardFile(crdБ, "КОНТРАГЕНТ="+RecordToString(REC1), БАНК, crdRecordOnly);
 if REC2=NIL: ^False; fi;
 РЕКВ=REC1;
 БАНК=REC2;
 ^False;
end;

Proc ЛС_ОФК_OnExit(FieldName:String; Iter:Integer);
 РЕКВ=NIL; БАНК=NIL;
end; 

Func НомерР_OnEnter(FieldName:String; Iter:Integer): Logical;
var RO, num, i, k, val :Integer;
var ДРтекст :String;
 if ДР=1.1.100: Message("Не задана дата рейса!", mtWarning); Template.Field="ДР"; ^False; fi;
 ДРтекст=DateToString(ДР);
 RO=OpenWorkArea("ПОРУЧ", "РПО_НОМРЕЙС", "РПО_ДАТАРЕЙС>="+ДРтекст+" and РПО_ДАТАРЕЙС<="+ДРтекст);
 Try
   num=Records(RO);
   if num=0: Message("На заданную дату не найдено ни одного рейса!", mtWarning); Template.Field="ДР"; ^False; fi;
   ClearVariable(BufS); ClearVariable(BufI); k=2;
   val=GetFieldI(RO, 1, "РПО_НОМРЕЙС");
   BufI[1]=val; BufS[1]="Рейс №"+Str(val)+" от "+ДРтекст; val=0;
   if num>1:
     for i=2 .. num do
       val=GetFieldI(RO, i, "РПО_НОМРЕЙС");
       if SearchInArray(BufI, val, True, 1)=-1:
         BufI[k]=val;
         BufS[k]="Рейс №"+Str(val)+" от "+ДРтекст;
         k=k+1;
       fi;
     od;
   fi;
   num=Alternate("Выберите номер рейса", BufS, -1, 1, 12);
   if num<>0: НомерР=BufI[num]; fi;
 Finally
   ClearVariable(BufS); ClearVariable(BufI);
   НомерО=НомерР;
   if НомерР>0: btnЗагр.Enabled=True; else btnЗагр.Enabled=False; fi;
   CloseWorkArea(RO);
 end;
 ^False;
end;

Proc НомерР_OnExit(FieldName:String; Iter:Integer);
 НомерО=НомерР;
 if НомерР>0: btnЗагр.Enabled=True; else btnЗагр.Enabled=False; fi;
end; 

Func Add_Iter(FieldName:String; Iter:Integer): Logical;
 InsertFrame(Позиции,Iter+1);
 ^False;
end;

Func Del_Iter(FieldName:String; Iter:Integer): Logical;
 if Позиции>1: DeleteFrame(Позиции,Iter); else DeleteFrame(Позиции,Iter); InsertFrame(Позиции,Iter); fi;
 ^False;
end;

Func ПП_onEnter(FieldName:String; Iter:Integer): Logical;
var j :Integer;
var REC, rrr: Record;
var tmp1, tmp2, t1, t2, t3 :String;
 if UKey[Iter]="": REC=NIL; else REC=StringToRecord(UKey[Iter]); fi;
 REC=OpenCardFile("ПОРУЧ","РПО_Учитывать",REC);
 if REC=NIL: ^False; fi;
 НомПП[Iter]  =GetCardFieldS("ПОРУЧ",REC,"НОМЕРБУМ");
 ДатПП[Iter]  =GetCardFieldD("ПОРУЧ",REC,"ДАТА");
 СумПП[Iter]  =GetCardFieldN("ПОРУЧ",REC,"СУММА");
 Стаплат[Iter]=GetCardFieldS("ПОРУЧ",REC,"П1");
 --
 rrr=GetCardFieldR("ПОРУЧ",REC,"РЕКВ");
 if rrr<>NIL: t1=GetCardFieldS(crdК,rrr,"ИНН"); t2=GetCardFieldS(crdК,rrr,"КПП"); fi;
 rrr=GetCardFieldR("ПОРУЧ",REC,"БАНК");
 if rrr<>NIL: t3=GetCardFieldS(crdБ,rrr,"БАНКИМЯ"); fi;
 tmp1=""; tmp2="";
 if t1<>"": tmp1=tmp1+"ИНН "+t1; fi;  if tmp1<>"": tmp1=tmp1+Chr(13); fi;
 if t2<>"": tmp2=tmp2+"КПП "+t2; fi;  if tmp2<>"": tmp2=tmp2+Chr(13); fi;
 ИННплат[Iter]=tmp1+tmp2+t3;
 --
 rrr=GetCardFieldR("ПОРУЧ",REC,"РЕКВП");
 if rrr<>NIL: t1=GetCardFieldS(crdК,rrr,"ИНН"); t2=GetCardFieldS(crdК,rrr,"КПП"); fi;
 rrr=GetCardFieldR("ПОРУЧ",REC,"БАНКП");
 if rrr<>NIL: t3=GetCardFieldS(crdБ,rrr,"БАНКИМЯ"); fi;
 tmp1=""; tmp2="";
 if t1<>"": tmp1=tmp1+"ИНН "+t1; fi;  if tmp1<>"": tmp1=tmp1+Chr(13); fi;
 if t2<>"": tmp2=tmp2+"КПП "+t2; fi;  if tmp2<>"": tmp2=tmp2+Chr(13); fi;
 ИННпост[Iter]=tmp1+tmp2+t3;
 --
 if rrr<>NIL:
   tmp1=GetCardFieldS(crdБ,rrr,"БАНК"); tmp2=GetCardFieldS(crdБ,rrr,"ГОРОД");
   t1=if(tmp2="", tmp1, tmp1+" "+tmp2);
   t2=GetCardFieldS(crdБ,rrr,"БИК");
   t3=GetCardFieldS(crdБ,rrr,"КСЧЕТ");
 fi;
 tmp1=""; tmp2="";
 if t1<>"": t1=t1+Chr(13); fi;
 if t2<>"": tmp2=tmp2+"БИК "+t2; fi;  if tmp2<>"": tmp2=tmp2+Chr(13); fi;
 if t3<>"": tmp1=t1+tmp2+"К/С "+t3; else tmp1=t1+tmp2; fi;
 БР_пост[Iter]=tmp1;
 --
 РС_пост[Iter]=GetCardFieldS(crdБ,rrr,"РСЧЕТ");
 tmp1="";
 for j=2..8 do
   tmp2=Trim(GetCardFieldS("ПОРУЧ",REC,"П"+Str(j)));
   if j=8: t1="п.110: "; else t1="п.10"+Str(j+2)+": "; fi;
   if tmp2<>"": tmp1=tmp1+t1+tmp2+Chr(13); fi;
 od;
 НАЗпост[Iter]=tmp1+GetCardFieldS("ПОРУЧ",REC,"РПО_НАЗНПЛАТ");
 UKey[Iter]=RecordToString(REC);
 Проверить(Iter);
 ^False;
end; 

2-- События объектов
Proc btnСфор_onClick(Sender:String);
var RO, num, i, j :Integer;
var F, tmp1, tmp2, t1, t2, t3 :String;
var REC :Record;
 if ДК<ДН: Message("Начальная дата превышает конечную!", mtWarning); Template.Field="ДН"; Exit; fi;
 F="РПО_Учитывать";
 if FlagВБанк: F=F+" and РПО_ВБанк=False"; fi;
 if ДН>1.1.100 and ДК>1.1.100: F=F+" and ДАТА>="+DateToString(ДН)+" and ДАТА<="+DateToString(ДК);
 |  ДН=1.1.100 and ДК>1.1.100: F=F+" and ДАТА<="+DateToString(ДК);
 |  ДН>1.1.100 and ДК=1.1.100: F=F+" and ДАТА>="+DateToString(ДН);
 fi;
 if Банк<>NIL: F=F+" and БАНК="+RecordToString(БАНК); fi;
 ЗагрузитьСписокПлатежекПоФильтру(F);
 Проверить(0);
 if Позиции<1: InsertFrame(Позиции, 1); fi;
end;

Proc btnЗагр_onClick(Sender:String);
 ЗагрузитьРейс(ДР, НомерР);
end;

Proc btnОчис_onClick(Sender:String);
 ОчиститьТаблицу;
 if Позиции<1: InsertFrame(Позиции, 1); fi;
end;

Proc btnПечать_onClick(Sender:String);
 РАБ.НАСТР_ПЕЧАТЬ.Prn("","","RPO_ВЫГРУЗКА_ОПИСЬ_000.cfg","",1);
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 Очистить;
 if ModalMode: 
   СекцУслОтб.Visible=False; 
   btnСфор.Enabled=False;
   ЗагрузитьРейс(ДР, НомерР);
 else 
   СекцУслОтб.Visible=True;
 fi;
 РАБ.НАСТР_ПЕЧАТЬ.Cfg("","RPO_ВЫГРУЗКА_ОПИСЬ_000.cfg"); -- настройка печати
 if НомерР>0: btnЗагр.Enabled=True; else btnЗагр.Enabled=False; fi;
 if Позиции<1: InsertFrame(Позиции, 1); fi;
 СекцПроп.Cell(3, 4, CellFontStyle, fsUnderline+fsBold);
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 Очистить;
end;

КОНЕЦ -- конец бланка