-- Шаблон создан мастером бланков
-- 27.09.2005 17:44:42
--
БланкСШаблоном [05.09.05] "Реестр исходящих извещений";

var Упр:I;

Гр2:I;
var Гр2_:I=2;

Справ:S;

var ПризнГП[]:S;
var НаимГП_[]:S=Name_A(ПризнГП[$]);
var НаимГП[]:S=if(Гр2=0 or НаимГП_[$]="" or НаимГП_[$]=" ",ПризнГП[$],if(Гр2=1,НаимГП_[$],if(Гр2=2,НаимГП_[$]+" ("+ПризнГП[$]+")",if(Гр2=3,ПризнГП[$]+" ("+НаимГП_[$]+")"))));
var КБК[]:S;
var КБК2[]:S;
var НомИзв[]:S;
var СумКБК[]:N;
var СумКБК2[]:N;
var СумИзв[]:N;
var UKey[]:S;
var is69н[]:L;

var ИтогСумИзв:N;

var ИтогСумКБК2[]:N;

var Index[] :S;
var Index2[]:I;

FlagНИ:L;
FlagИтог:L;
FlagНеПодтв:L;

var MM:I;
var MMTxt:S=if(MM<=12,Месяц(MM),if(MM=13,"Год",if(MM=14,"I квартал",if(MM=15,"II квартал",if(MM=16,"III квартал","IV квартал")))));
var YYYY:I=[Year(ToDay)];
var ДН_:D=if(MM<13,Dat(1,MM,YYYY),if(MM=13,Dat(1,1,YYYY),if(MM=14,Dat(1,1,YYYY),if(MM=15,Dat(1,4,YYYY),if(MM=16,Dat(1,7,YYYY),Dat(1,10,YYYY))))));
var ДН:D=if(FlagНИ,Dat(1,1,YYYY),ДН_);
var ДК:D=if(MM<12,Dat(1,MM+1,YYYY),if(MM=12 or MM=13 or MM=17,Dat(1,1,YYYY+1),if(MM=14,Dat(1,4,YYYY),if(MM=15,Dat(1,7,YYYY),if(MM=16,Dat(1,10,YYYY))))));

Вал:S=[BaseCurrency];
ОКЕИ:S;

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

rbКБК      : Object;
rbФКР      : Object;
rbФКР_КОСГУ: Object;
rbКОСГУ    : Object;

var РежимКБК:I;

Отч1: Section;
Отч2: Section;
Отч3: Section;

var sКБК   []:S;
var sUkey  []:S;
var sСумИзв[]:N;
var sСумКБК[]:N;
--
--Процедуры и функции -------------                           
Func GetIndex (r:i; c:i):i;
var Ret,Value,l:I;
 Value=r+BitShl(c,16);
 Ret=SearchInArray(Index2,Value,False);
 if Ret=-1: 
    Ret=LengthOfArray(Index2)+1;
    InsertInArray(Index2,Ret,Value);
 fi;
 ^Ret;
end;

Proc Очистить;
 ClearVariable(Упр);
 ClearVariable(ПризнГП);
 ClearVariable(НаимГП);
 ClearVariable(КБК);
 ClearVariable(КБК2);
 ClearVariable(НомИзв);
 ClearVariable(СумКБК);
 ClearVariable(СумКБК2);
 ClearVariable(СумИзв);
 ClearVariable(UKey);
 ClearVariable(is69н);
 ClearVariable(ИтогСумИзв);
 ClearVariable(ИтогСумКБК2);
 ClearVariable(Index);
 ClearVariable(Index2);
 Template.Column=1;
 Template.Row=1;
 Отч1.ColsCount=5;
 Отч2.ColsCount=5; Отч2.RowsCount=1;
 Отч3.ColsCount=5;
end;

Func ВзятьПризн(Src:S; Value:S):S;
var w,nw:I;
var tmp,sp:s;
 sp=" ";
 nw=WordsCount(Src,sp);
 for w=1..nw do
  tmp=ExtractWord(w,src,sp);
  if Match(tmp,Value): ^tmp; fi;
 od;
 ^"";
end;

Func КБКtoКБК2:I;
var Iter:I;
 ClearVariable(КБК2);
 for Iter=1..Упр do
  if SearchInArray(КБК2,КБК[Iter],True)=-1:
     InsertInArraySort(КБК2,КБК[Iter]);
  fi;
 od;
 ^LengthOfArray(КБК2);
end;

Proc ПостроитьОтчет(nStr:I);
var r,c,rr,cc,n,iter,idx,cw:i;
var Ukey_:S;
 ShowProgress(Упр*2,"Расчет....");
 Try
  Отч1.ColsCount=5;
  Отч2.ColsCount=5; Отч2.RowsCount=1;
  Отч3.ColsCount=5;
  --
  cc=4+КБКtoКБК2;
  if cc<5: Exit; fi;
  --Рисуем заголовок
  if РежимКБК=0: cw=330; else cw=250; fi;
  Отч1.ColsCount=cc;
  Отч1.CellLinks(5,1,cc,1);
  r=2; c=4; --Добавляем КБК в колонки
  for n=1..cc-4 do
   Отч1.Cell(r,c+n,CellContents,"КБК2["+Str(n)+"]");
   Отч1.Cell(r,c+n,CellFieldType,3);
   Отч1.Column(c+n,ColWidth,cw);
   if n=cc-4: Отч1.Cell(r,c+n,CellBorder,"1,1,2,1"); fi;
   --
   Отч1.Cell(r+1,c+n,CellContents,Str(c+n));
   if n=cc-4: Отч1.Cell(r+1,c+n,CellBorder,"1,2,2,2"); else Отч1.Cell(r+1,c+n,CellBorder,"1,2,1,2"); fi;
  od;
  --Рисуем таблицу
  rr=nStr;
  Отч2.RowsCount=rr;
  Отч2.ColsCount=cc;
  for c=5..cc do
   Отч2.Column(c,ColWidth,cw);
   for r=1..rr do
    if c=cc: Отч2.Cell(r,c,CellBorder,"1,1,2,1"); fi;
   od;
  od;
  --Заполняем таблицу данными
  r=0;
  Ukey_="";
  for Iter=1..Упр do
   ProgressPos(Упр+Iter);
   c=4+SearchInArray(КБК2,КБК[Iter],True);
   if c<5: Message("Ошибка ! Неизвестный КБК "+КБК[Iter]); Exit; fi;
   if not UKey_=if(FlagИтог,ПризнГП[Iter],UKey[Iter]):
      r=r+1;
      Отч2.Cell(r,1,CellContents,Str(r));
      Отч2.Cell(r,1,CellFieldType,1);
      Отч2.Cell(r,1,CellBorder,"2,1,1,1");
      if Ukey[Iter]="*" and not FlagИтог:
         Отч2.Cell(r,1,CellFontStyle,fsBold);
      fi;
      --
      Отч2.Cell(r,2,CellContents,"НаимГП["+Str(Iter)+"]");
      Отч2.Cell(r,2,CellFieldType,3);
      if Ukey[Iter]="*" and not FlagИтог: Отч2.Cell(r,2,CellFontStyle,fsBold); fi;
      --
      Отч2.Cell(r,3,CellContents,"НомИзв["+Str(Iter)+"]");
      Отч2.Cell(r,3,CellFieldType,3);
      if Ukey[Iter]="*" and not FlagИтог:
         Отч2.Cell(r,3,CellFontStyle,fsBold);
        else
         if FlagИтог:
            Отч2.Cell(r,3,CellLookup,False);
            Отч2.Cell(r,3,CellEventOnEnter,"");
           else
            Отч2.Cell(r,3,CellLookup,True);
            Отч2.Cell(r,3,CellEventOnEnter,"НомИзв_OnEnter");
         fi;
      fi;
      --
      Отч2.Cell(r,4,CellContents,"СумИзв["+Str(Iter)+"]");
      Отч2.Cell(r,4,CellFieldType,4);
      Отч2.Cell(r,4,CellFormat,",##0.00;;-");
      Отч2.Cell(r,4,CellAlignment,1);
      if Ukey[Iter]="*" and not FlagИтог:
         Отч2.Cell(r,4,CellFontStyle,fsBold);
        else
         ИтогСумИзв=ИтогСумИзв+СумИзв[Iter];
      fi;
   fi;
   if r=0: r=1; fi;
   idx=GetIndex(r,c);
   СумКБК2[idx]=СумКБК2[idx]+СумКБК[Iter];
   Отч2.Cell(r,c,CellContents,"СумКБК2["+Str(idx)+"]");
   Отч2.Cell(r,c,CellFieldType,4);
   Отч2.Cell(r,c,CellFormat,",##0.00;;-");
   Отч2.Cell(r,c,CellAlignment,1);
   if Ukey[Iter]="*" and not FlagИтог:
      Отч2.Cell(r,c,CellFontStyle,fsBold);
     else
      ИтогСумКБК2[c]=ИтогСумКБК2[c]+СумКБК[Iter];
   fi;
   UKey_=if(FlagИтог,ПризнГП[Iter],UKey[Iter]);
  od;
  --Вставка итогов по таблице
  Отч3.ColsCount=cc;
  r=1;
  for c=5..cc do
   Отч3.Column(c,ColWidth,cw);
   Отч3.Cell(r,c,CellContents,"ИтогСумКБК2["+Str(c)+"]");
   Отч3.Cell(r,c,CellFieldType,4);
   Отч3.Cell(r,c,CellFontStyle,fsBold);
   Отч3.Cell(r,c,CellBgColor,coLime);
   Отч3.Cell(r,c,CellFormat,",##0.00;;-");
   Отч3.Cell(r,c,CellAlignment,1);
   if c=cc: Отч3.Cell(r,c,CellBorder,"1,2,2,2"); else  Отч3.Cell(r,c,CellBorder,"1,2,1,2") ;fi;
  od;
 Finally
  CloseProgress;
 end;
end;

Func ВставкаИтогов(Nr:I):I;
var Iter,z,zz,nГП:I;
var ПризнГП_,КБК_:S;
var СумИзв_,СумКБК_:N;
 ShowProgress(2,"Расчет....");
 Try
  ProgressPos(1);
  nГП=0;
  ClearVariable(sКБК);
  ClearVariable(sUkey);
  ClearVariable(sСумИзв);
  ClearVariable(sСумКБК);
  Iter=1;
  ПризнГП_=ПризнГП[Iter];
  While Iter<=Упр+1 do
   if ПризнГП_="ПБС.ОУ.ЦОВБ":
      Hint("");
   fi;
   if ПризнГП_=ПризнГП[Iter]:
      --Считаем в разрезе КБК
      z=SearchInArray(sКБК,КБК[Iter],True);
      if z=-1:
         z=InsertInArraySort(sКБК,КБК[Iter]);
         InsertInArray(sСумКБК,z,0);
      fi;
      sСумКБК[z]=sСумКБК[z]+СумКБК[Iter];
      --Считаем в разрезе Извещений
      z=SearchInArray(sUkey,Ukey[Iter],True);
      if z=-1:
         z=InsertInArraySort(sUkey,Ukey[Iter]);
         InsertInArray(sСумИзв,z,СумИзв[Iter]);
      fi;
      Iter=Iter+1;
     else
      nГП=nГП+1;
      zz=LengthOfArray(sКБК);
      for z=1..zz do
       InsertFrame(Упр,Iter);
       ПризнГП[Iter]=ПризнГП_;
       НомИзв[Iter]="Итого";
       КБК[Iter]=sКБК[z];
       Ukey[Iter]="*";
       СумИзв[Iter]=SumOfArray(sСумИзв);
       СумКБК[Iter]=sСумКБК[z];
       Iter=Iter+1;
      od;
      ПризнГП_=ПризнГП[Iter];
      ClearVariable(sКБК);
      ClearVariable(sUkey);
      ClearVariable(sСумИзв);
      ClearVariable(sСумКБК);
   fi;
  od;
  if FlagИтог:
     Iter=1;
     While Iter<=Упр do
      if Ukey[Iter]="*": Iter=Iter+1; else DeleteFrame(Упр,Iter); fi;
     od;
     nr=0;
  fi;
 Finally
  CloseProgress;
 end;
 ^Nr+nГП;
end;

Func DateToStr(Value:D):S;
var Y,M,D:S;
var Ret:S;
 Y=Str(Year(Value));
 M=Str(Mon(Value)); if Length(M)=1: M="0"+M; fi;
 D=Str(Day(Value)); if Length(D)=1: D="0"+D; fi;
 Ret=Y+"."+M+"."+D;
 ^Ret;
end;

Proc Расчет;
var OWA,OA,n1,n2,nr1,nr2,Iter:I;
var ПризнПБС_,КБК_,Index_,НомИзв_,ДатИзв_,UKey_,ПризнДоп_,F:S;
var ДИзв:D;
var СумИзв_:N;
var StoreПризнПБС:S;
var ErrПБС:L;
var f69н:L;
 Очистить;
 if AsLogical(rbКБК.State):       РежимКБК=0;
   |AsLogical(rbФКР.State):       РежимКБК=1;
   |AsLogical(rbФКР_КОСГУ.State): РежимКБК=2;
   |AsLogical(rbКОСГУ.State):     РежимКБК=3;
 fi;
 ClearTrace(True);
 if FlagНеподтв:
    F="ПРОВОДИТЬ and ДАТАОРД>="+DateToString(ДН)+" and ДАТАОРД<"+DateToString(ДК)+" and not ВОЗВРАТ2";
   else
    F="ПРОВОДИТЬ and ДАТАОРД>="+DateToString(ДН)+" and ДАТАОРД<"+DateToString(ДК);
 fi;
 OWA=OpenWorkArea("РПО_ИЗВЕЩЕНИЯ_ИСХ","",F+" and Валюта='"+Вал+"'");
 Try
  Nr1=Records(OWA);
  ShowProgress(Nr1*2,"Расчет....");
  for n1=1..nr1 do
   ProgressPos(n1);
   UKey_=RecordToString(GetRecordKey(OWA,n1));
   НомИзв_=GetFieldS(OWA,n1,"НомерБум");
   ДИзв=GetFieldD(OWA,n1,"ДАТАИЗВ");
   ДатИзв_=DateToString(ДИзв);
   СумИзв_=GetFieldN(OWA,n1,"СУММА");
   f69н=GetFieldL(OWA,n1,"is69н");
   ErrПБС=False;
   if n1=1: OA=OpenArray(OWA,n1,"ПОЗИЦИИ","СЧДЕБ"); fi;
   Nr2=Records(OA);
   if f69н:
      ПризнПБС_=GetFieldS(OWA,n1,"ПОЛУЧПРИЗНАК");
   fi;
   for n2=1..nr2 do
    if not f69н:
       ПризнПБС_=ВзятьПризн(GetFieldS(OA,n2,"ПРИЗН"),"ПБС.*");
       if ПризнПБС_="":
          ПризнПБС_=ВзятьПризн(GetFieldS(OA,n2,"ПРИЗНДЕБ"),"ПБС.*");
       fi;
    fi;
    if not Справ="":
       ПризнДоп_=ВзятьПризн(GetFieldS(OA,n2,"ПРИЗН"),Справ);
       if ПризнДоп_="":
          ПризнДоп_=ВзятьПризн(GetFieldS(OA,n2,"ПРИЗНДЕБ"),Справ);
       fi;
      else
       ПризнДоп_="";
    fi;
    if not ПризнПБС_="":
       if n2=1: StoreПризнПБС=ПризнПБС_; fi;
       if not StoreПризнПБС=ПризнПБС_: ErrПБС=True; fi;
       КБК_=GetFieldS(OA,n2,"СчДеб");
       if РежимКБК=0: КБК_=Раб.Бюджет2005.ВзятьКодСчета(КБК_,"","КБК",False)+"."+Раб.Бюджет2005.ВзятьКодСчета(КБК_,"","КОСГУ",False);
         |РежимКБК=1: КБК_=Раб.Бюджет2005.ВзятьКодСчета(КБК_,"ФКР","РП",True);
         |РежимКБК=2: КБК_=Раб.Бюджет2005.ВзятьКодСчета(КБК_,"ФКР","РП",True)+"."+Раб.Бюджет2005.ВзятьКодСчета(КБК_,"ФКР","КОСГУ",False);
         |РежимКБК=3: КБК_=Раб.Бюджет2005.ВзятьКодСчета(КБК_,"ФКР","КОСГУ",False);
       fi;
       КБК_=Раб.Бюджет2005.Объединить(КБК_,ПризнДоп_,Chr(13));
       Index_=ПризнПБС_+" "+DateToStr(ДИзв)+" "+RepStr("0",10-Length(НомИзв_))+НомИзв_+" "+КБК_+" "+UKey_;
       Iter=SearchInArray(Index,Index_,True);
       if Iter=-1:
          Iter=InsertInArraySort(Index,Index_);
          InsertFrame(Упр,Iter);
          ПризнГП[Iter]=ПризнПБС_;
          КБК[Iter]=КБК_;
          НомИзв[Iter]="№"+НомИзв_+" от "+ДатИзв_;
          СумИзв[Iter]=СумИзв_;
          UKey[Iter]=UKey_;
          is69н[Iter]=f69н;
       fi; --if Iter=-1:
       СумКБК[Iter]=СумКБК[Iter]+GetFieldN(OA,n2,"СУМ");
      else
       Trace("Ошибка! Ненайден аналитический признак получателя (ПБС) в извещении №"+НомИзв_+" от "+ДатИзв_+" данное извещение НЕ участвует в расчете");
    fi;  --if not ПризнПБС="":
    if ErrПБС: Trace("Ошибка! Обнаружено несколько различных аналитических признаков (ПБС) в одном извещении №"+НомИзв_+" от "+ДатИзв_); fi;
   od; --for n1=1..nr1 do
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 --
 Nr1=ВставкаИтогов(Nr1);
 --
 ПостроитьОтчет(Nr1);
 Message("Расчет завершен");
end;
--Процедуры и функции -------------                           
--
--Обработчики событий полей шаблона-----
Func MMTxt_onEnter (Field:S; Iter:I):L;
var i:I;
 ClearVariable(Buf);
 for i=1..12 do Buf[i]=Месяц(i); od;
 Buf[13]="Год";
 Buf[14]="I квартал";
 Buf[15]="II квартал";
 Buf[16]="III квартал";
 Buf[17]="IV квартал";
 I=Alternate("Выбор периода расчета",Buf,30,Mon(ToDay),12);
 if I=0: ^False; fi;
 MM=I;
 ClearVariable(Buf);
 Очистить;
 ^False;
end;

Func YYYY_onEnter (Field:S; Iter:I):L;
var i:i;
 ClearVariable(Buf);
 for i=1..5 do  Buf[i]=Str(Year(ToDay)+I-4); od;
 i=Alternate("Выбор года расчета",Buf,30,4,12);
 if I=0: ^False; fi; 
 YYYY=Int(Buf[i]);
 ClearVariable(Buf);
 Очистить;
 ^False;
end;

Func Вал_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var Cur:S;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 n=0;
 for Currencies Cur="*" do
  n=n+1;
  Buf[n]=Up(Cur);
  Buf2[n]=Buf[n]+" --"+Name_C(Cur);
 od;
 n=Alternate("Валюта",Buf2,-1,SearchInArray(Buf,Вал),12);
 if n=0: ^False; fi;
 Вал=Buf[n];
 Очистить;
 Return False;
end;

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

Func НомИзв_OnEnter(Field:S; Iter:I):L;
var p1,p2:I;
 p1=Pos("[",Field);
 p2=Pos("]",Field);
 Iter=Int(SubStr(Field,p1+1,p2-p1-1));
 if not Ukey[Iter]="" and not Ukey[Iter]="*":
    if is69н[Iter]:
       OpenBlank("ДОКУМЕНТЫ.ЦЕНТРСНАБ.ИЗВЕЩ_ИСХ_69Н",True,StringToRecord(Ukey[Iter]));
      else
       OpenBlank("ДОКУМЕНТЫ.ЦЕНТРСНАБ.ИЗВЕЩ_ИСХ",True,StringToRecord(Ukey[Iter]));
    fi;
 fi;
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnСправ_OnClick(Sender: String);
var tmp:S;
 tmp=AnaElection("~ПБС.*",True);
 if tmp="": Exit; fi;
 Справ=tmp+".*";
end;

Proc cbFlagНИ_onChange  (Obj:S);
 Очистить;
end;

Proc btnРасчет_OnClick(Sender: String);
var p:I;
 if MM=0: Message("Введите месяц расчета",mtError); Template.Field="MMTxt"; Exit; fi;
 if YYYY=0: Message("Введите год расчета",mtError); Template.Field="YYYY"; Exit; fi;
 if not Справ="":
    p=Pos(".*",Справ);
    if p=0 or not p+1=Length(Справ) or Name_A(SubStr(Справ,1,p))=" ": Message("Неизвестный индентификатор справочника "+Справ,mtError); Template.Object="edСправ"; Exit; fi;
 fi;
 Расчет;
end;

Proc cbИтог_OnChange(Sender: String);
 Message("Для вступления измений в силу необходмио выполнить расчет");
end;

Proc cbНеПодтв_OnChange(Sender: String);
 Message("Для вступления измений в силу необходмио выполнить расчет");
end;


Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;
--Обработчики событий объектов шаблона-----
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 if РежимКБК=0: rbКБК.State=True;  rbФКР.State=False; rbФКР_КОСГУ.State=False; rbКОСГУ.State=False;
   |РежимКБК=1: rbКБК.State=False; rbФКР.State=True;  rbФКР_КОСГУ.State=False; rbКОСГУ.State=False;
   |РежимКБК=2: rbКБК.State=False; rbФКР.State=False; rbФКР_КОСГУ.State=True;  rbКОСГУ.State=False;
   |РежимКБК=3: rbКБК.State=False; rbФКР.State=False; rbФКР_КОСГУ.State=False; rbКОСГУ.State=True;
 fi;
end;
--Обработчики событий шаблона -----
--



Конец
