-- Шаблон создан мастером бланков
-- 24.12.2010 14:18:18
--
БланкСШаблоном "Начисление зарплаты", Редактор РПО_ДО_ЗП;
--Из НФА.B01
2Func0 ВзятьПериодПоДате(dd:d;ТочностьПериода:s):s; 
--ТочностьПериода: гг - год, кв - квартал, мм - месяц
--ТочностьПериода пусто => с максимальной точностью!
var ii:i;
var ss:s;
 ss='ПЕРИОД.'+str(год(dd));
 if ТочностьПериода='гг':^ss;fi;
 ii=мес(dd);
 if ii<4 :ss=ss+'.1';
  | ii<7 :ss=ss+'.2';
  | ii<10:ss=ss+'.3';
  | ii<13:ss=ss+'.4';
 fi;
 if ТочностьПериода='кв':^ss;fi;
 if ii<10:ss=ss+'.0'+str(ii);
  | true :ss=ss+'.' +str(ii);
 fi;
 if ТочностьПериода='мм':^ss;fi;
  ^ss;
2End0;
--
cbПроводить:Object;
--
var Начис:N;
var Удерж:N;
var НачУд_:S="Итого начислено: "+Str(Начис,2)+", удержано: "+Str(Удерж,2)+", к выплате: "+Str(Начис-Удерж,2);

func Операция(Код:S):S;
var Res:S;
  if Код="302.11":Res="Начисление зарплаты/пособия";
    |Код="303.01":Res="Удержание НДФЛ";
    |Код="303.09":Res="ПФР - дополнительные взносы";
    |Код="303.10":Res="ПФР - страховая часть";
    |Код="303.11":Res="ПФР - накопительная часть";
    |Код="303.08":Res="МедСтрах ТФОМС";
    |Код="303.07":Res="МедСтрах ФФОМС";
    |Код="303.02":Res="Фонд социального страхования";
    |Код="303.06":Res="ФСС (травматизм)";
    |Код="304.03":Res="Прочие удержания";
    |Код="208":Res="Удержания подотч. сумм";
    else
     --Расшифровка по удержаниям
     if ExtractWord(1,Код," ")="304.03" then
        if Match(ExtractWord(2,Код," "),"УДЕРЖ.*") then Res=Name_A(ExtractWord(2,Код," ")); fi;
     fi;

  fi;
  ^Res;
end;
var Опер_[]:S=Операция(Расшифр[$].Опер);

Func РазобратьПризн(Val:S):S;
var w,ww:i;
var v1,v2,Ret:S;
 ww=WordsCount(Val," ");
 for w=1..ww do
  v1=ExtractWord(w,val," ");
  Ret=Ret+" "+v1;
  if Match(v1,"Ф.*"):
     v2=Trim(Name_A(v1));
     if not v2="":
        Ret=Ret+"["+v2+"]";
     fi;
  fi;
 od;
 ^Trim(Ret);
end;

var DefMask:S="(*.?.401.20.*|*.?.109.??.*|*.303.02.*|*.303.06.*)";
var Период_:S=Name_A(ПЕРИОД);
var Учр_Банк_Банк:S=Учр_Банк.Банк+" "+Учр_Банк.Город;
--var ИтогСум:N=SumOfArray(Расшифр[].Сум);
--var ИтогСумРуб:N=SumOfArray(Расшифр[].СумРуб);
var ДопАнДок_:S=ДопАнДок;
var Призн_[]:S=РазобратьПризн(Расшифр[$].Призн);
var ПризнД_[]:S=РазобратьПризн(Расшифр[$].ПризнД);
var ПризнК_[]:S=РазобратьПризн(Расшифр[$].ПризнК);
var пп[]:I=$;
var ОчистРасшифр:S=if(Рег,"","Очистить");
var A:S=if(Рег,"","+");
var D:S=if(Рег,"","-");


var ОперИ[]:S;
var СумРубИ[]:N;
var СчДебИ[]:S;
var СчКреИ[]:S;
var УпрИ:I;

var ОперИ_[]:S=Операция(Итого[$].Опер);
--var ЗКРИ[]:S=if(Pos("302.",Итого[$].Опер)>0,"","Оплата ЗКР");
var ЗКРИ[]:S="";

var BUF[]:S;
var BUF2[]:S;
var hПризн:S;

var BufField[]:S;
var BufColorBg[]:I;
var BufColorFo[]:I;
var Flag:L;
var NS:I=20;

S1:Section;
S11:Section;
S12:Section;
S13:Section;
S14:Section;

Proc Инициализация;
var Obj:Object;
var s,r,rr,c,cc,n,l,bgColor:i;
var Field:S;
-- cbЗакрытьДок.Visible=Раб.Бюджет2005.Сетевая;
 ClearVariable(BufField);
 ClearVariable(BufColorBg);
 ClearVariable(BufColorFo);
 for s=1..nS do
  if FindObject("S"+Str(s),Obj):
     rr=asInteger(Obj.RowsCount);
     cc=asInteger(Obj.ColsCount);
     for r=1 ..rr  do
      for c=1 ..cc  do
       Try
        BgColor=asInteger(Obj.Cell(r,c,CellBgColor,""));
        if BgColor=coAqua or BgColor=coTeal:
           Field="S"+Str(s)+asString(Obj.Cell(r,c,CellContents,"",False));
           if SearchInArray(BufField,Field,True)=-1:
              n=InsertInArraySort(BufField,Field);
              InsertInArray(BufColorBg,n,BgColor);
           fi;
        fi;
       Except
       end;
      od;
     od;
  fi;
 od;
 l=LengthOfArray(BufField);
 for n=1..l do
  if BufColorBg[n]=coTeal: BufColorFo[n]=coWhite;
    |True: BufColorFo[n]=coBlack;
  fi;
 od;
end;

Proc Оформление;
var s,c,r,cc,rr,n:i;
var Obj: Object;
var Field:S;
 for s=1..nS do
  if FindObject("S"+Str(s),Obj):
     rr=asInteger(Obj.RowsCount);
     cc=asInteger(Obj.ColsCount);
     for r=1 .. rr do
      for c=1 .. cc do
       Try
        Field="S"+Str(s)+asString(Obj.Cell(r,c,CellContents,"",False));
       Except
       end;
       n=SearchInArray(BufField,Field,True);
       if not n=-1:
          Try
           if Рег:
              Obj.Cell(r,c,CellFontColor,coBlack);
              Obj.Cell(r,c,CellBgColor,coTransparent);
              Obj.Cell(r,c,CellReadOnly,True);
             else
              Obj.Cell(r,c,CellFontColor,BufColorFo[n]);
              Obj.Cell(r,c,CellBgColor,BufColorBg[n]);
              Obj.Cell(r,c,CellReadOnly,False);
           fi;
          Except
          end;
       fi;
      od;
     od;
  fi;
 od;
end;

Func КосгуОпер(Косгу:S;Опер:S):S;
if Косгу="211" and Match(Опер,"303.*") and not Match(Опер,"303.01"):^"213";
  else ^Косгу;
fi;
end;

Proc ОбновитьСч (Iter:I);
var i1,ii,i:I;
var ВД,ВрДеб,ВрКре:S;
var КБК_,КОСГУ_,КОСГУК,КОСГУА_,Аналит_:S;
var Go:L;
  if КБК="" or Счет="" then Exit; fi;
  if Iter=0 then i1=1; ii=Расшифр; else i1=Iter;ii=Iter; fi;
  РАБ.КСА.Начать;
  for i=i1 to ii do
      if Расшифр[i].Опер<>"" then
         Go=False;
         ВД=Substr(Счет,1,1);
         КБК_=Раб.Бюджет2005.ВзятьКодКБК(КБК,"","КБК",False);
         КОСГУ_=Раб.Бюджет2005.ВзятьКодКБК(КБК,"","КОСГУ",False);
         --Сначала удержания, т.к. они чуть специфичнее (для этого прописываем Go)
         if Расшифр[i].Опер="303.01" then
            ВрДеб=КБК_+"."+ВД+".302."+Раб.Бюджет2005.Соотв_КОСГУ_Ан("302",КОСГУ_)+".830";
            ВрКре=КБК_+"."+ВД+".303.01.730";
            Go=True;
         fi;
         if Расшифр[i].Опер="304.03" then
            ВрДеб=КБК_+"."+ВД+".302."+Раб.Бюджет2005.Соотв_КОСГУ_Ан("302",КОСГУ_)+".830";
            ВрКре=КБК_+"."+ВД+".304.03.730";
            Go=True;
         fi;
         if Расшифр[i].Опер="208" then
            ВрДеб=КБК_+"."+ВД+".302."+Раб.Бюджет2005.Соотв_КОСГУ_Ан("302",КОСГУ_)+".830";
            КОСГУК=Substr(Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Расшифр[i].ПризнК," ","КОСГУ.*",""),7,3);
            if КОСГУК="":
               ВрКре="<Выберите КОСГУ по дебету>";
              else
               ВрКре=КБК_+"."+ВД+".208."+Раб.Бюджет2005.Соотв_КОСГУ_Ан("208",КОСГУК)+".730";
            fi;
            Go=True;
         fi;

         if not Go then
            if Match(Счет,"*.303.02") then
               ВрДеб=КБК_+"."+Счет+".830";
              else
               if КОСГУ_="211":
                  if Расшифр[i].Опер="302.11" then ВрДеб=КБК_+"."+Счет+".211"; else ВрДеб=КБК_+"."+Счет+".213"; fi;--все кроме з/п и удержаний - налоги
                 else
                  ВрДеб=КБК_+"."+Счет+"."+КОСГУ_;
               fi;
            fi;
            if Расшифр[i].Опер="302.11" then
               ВрКре=КБК_+"."+ВД+".302."+Раб.Бюджет2005.Соотв_КОСГУ_Ан("302",КОСГУ_)+".730";
              else
               ВрКре=КБК_+"."+ВД+"."+Расшифр[i].Опер+".730";
            fi;
         fi;
         --Добавляем КОСГУ в аналитику:
         КОСГУ_=КосгуОпер(Косгу_,Расшифр[i].Опер);
         if Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Расшифр[i].ПризнК," ","КОСГУ.*","")="":
            Расшифр[i].признД=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр[i].признД," ","КОСГУ.*","");
            if not MAtch(Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Расшифр[i].Призн," ","КОСГУ.*",""),"КОСГУ."+Косгу_+"!"):
               Расшифр[i].Призн=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Расшифр[i].Призн," ","КОСГУ."+Косгу_,"КОСГУ.*","");
            fi;
           else
            if not MAtch(Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Расшифр[i].ПризнД," ","КОСГУ.*",""),"КОСГУ."+Косгу_+"!"):
               Расшифр[i].ПризнД=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Расшифр[i].ПризнД," ","КОСГУ."+Косгу_,"КОСГУ.*","");
            fi;
         fi;
         --небольшая защита от избыточного "дерганья" переменных
         if ВрДеб<>Расшифр[i].СчДеб then Расшифр[i].СчДеб=ВрДеб; fi;
         if ВрКре<>Расшифр[i].СчКре then Расшифр[i].СчКре=ВрКре; fi;
         Раб.КСА.Добавить(Расшифр[i].СчДеб);
         Раб.КСА.Добавить(if(Substr(Расшифр[i].СчКре,1,1)="<","",Расшифр[i].СчКре));
      fi;
  od;
  if Раб.КСА.Закончить(True): Message("Добавление новых счетов закончено"); fi;
end;

proc Итоги;
var i,j:I;
var tОпер:S;
  ClearVariable(ОперИ);
  ClearVariable(СумРубИ);
  ClearVariable(СчДебИ);
  ClearVariable(СчКреИ);
  ClearVariable(УпрИ);
  for i=1 to Расшифр do
     tОпер=Расшифр[i].Опер;
     if tОпер<>"208":
      if tОпер="304.03" then
         --в итогах удержания расписываем по видам.
         tОпер=Раб.Бюджет2005.Объединить(tОпер,Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Расшифр[i].Призн," ","УДЕРЖ.*","")," ");
      fi;
      j=SearchInArray(ОперИ,tОпер);
      if j<>-1 then
         СумРубИ[j]=СумРубИ[j]+Расшифр[i].СумРуб;
        else
         if tОпер<>"" and Расшифр[i].СумРуб<>0 then
            j=УпрИ+1;
            InsertFrame(УпрИ,j);
            ОперИ[j]=tОпер;
            СчДебИ[j]=Расшифр[i].СчДеб;
            СчКреИ[j]=Расшифр[i].СчКре;
            СумРубИ[j]=Расшифр[i].СумРуб;
         fi;
      fi;
     fi;
  od;
  if Итого>УпрИ then
     for i = УпрИ+1 to Итого do
         DeleteFrame(Итого,i);
     od;
    else
     for i = Итого+1 to УпрИ do
         InsertFrame(Итого,i);
     od;
  fi;
  for i = 1 to УпрИ do
      if Итого[i].СумРуб<>СумРубИ[i] then Итого[i].СумРуб=СумРубИ[i]; fi;
      if Итого[i].Опер<>ОперИ[i]     then Итого[i].Опер=ОперИ[i];     fi;
      if Итого[i].СчДеб<>СчДебИ[i]   then 
         Итого[i].СчДеб=СчДебИ[i];   
         if Раб.Бюджет2005.ВзятьКодСчета(СчДебИ[i],"","СИНТ",False)="302" or Match(Счет,"*.303.02") then
            Итого[i].СчДебДО="";
            Итого[i].СчКреДО="";
           else
            Итого[i].СчДебДО=Раб.Бюджет2005.ВзятьКодСчета(СчДебИ[i],"","ВД",True)+".502.11."+Раб.Бюджет2005.ВзятьКодСчета(СчДебИ[i],"","КОСГУ",False);
            Итого[i].СчКреДО=Раб.Бюджет2005.ВзятьКодСчета(СчДебИ[i],"","ВД",True)+".502.12."+Раб.Бюджет2005.ВзятьКодСчета(СчДебИ[i],"","КОСГУ",False);
         fi;
      fi;
      if Итого[i].СчКре<>СчКреИ[i]   then Итого[i].СчКре=СчКреИ[i];   fi;
  od;
  --Проверка, что начисления меньше удержаний
  Начис=0;Удерж=0;
  for i=1 to Расшифр do
    if Pos(".302.",Расшифр[i].СчДеб)>0 then Удерж=Удерж+Расшифр[i].СумРуб; fi;
    if Pos(".302.",Расшифр[i].СчКре)>0 then Начис=Начис+Расшифр[i].СумРуб; fi;
  od;

end;

func Проверить:L;
var i:I;
var tmp:S;
 Итоги;
 if ДатаРег=1.1.100 then Message("Задайте дату операции",mtError); Template.Field="ДатаРег"; ^False; fi;
 if КБК="" then Message("Не выбрано КБК",mtError); Template.Field="КБК"; ^False; fi;
 if Счет="" then Message("Не выбран счет затрат",mtError); Template.Field="Счет"; ^False; fi;
 if Учр=nil then Message("Выберите учреждение",mtError); Template.Field="Учр.Коримя"; ^False; fi;
 if Учр_Банк=nil then Message("Выберите банковские реквизиты",mtError); Template.Field="Учр_Банк_Банк"; ^False; fi;
 for i=1 to Расшифр do
    if Расшифр[i].Опер="" then Message("Не выбрана операция",mtError); Template.Field="Опер_"; Template.frame=i; ^False; fi;
 od;
 ОбновитьСч(0);
 РАБ.КСА.Начать;
 for i=1 to Расшифр do
     Раб.КСА.Добавить(Расшифр[i].СчДеб);
     Раб.КСА.Добавить(if(Substr(Расшифр[i].СчКре,1,1)="<","",Расшифр[i].СчКре));
 od;
 for i=1 to Итого do
     Раб.КСА.Добавить(Итого[i].СчДебДО);
     Раб.КСА.Добавить(Итого[i].СчКреДО);
     --БО!
     if Итого[i].СчДебДО<>"":
        Раб.КСА.Добавить(Substr(Итого[i].СчДебДО,1,22)+".502.11."+Substr(Итого[i].СчДебДО,31,3));
        if Substr(Итого[i].СчДебДО,22,1)="1":
           Раб.КСА.Добавить(Substr(Итого[i].СчДебДО,1,20)+".1.501.13."+Substr(Итого[i].СчДебДО,31,3));
          else
           Раб.КСА.Добавить(Substr(Итого[i].СчДебДО,1,22)+".506.10."+Substr(Итого[i].СчДебДО,31,3));
        fi;
     fi;
 od;
 Раб.КСА.Закончить(False);
 РАБ.БЮДЖЕТ.ПроверитьПризнакиНачать;
 for i=1 to Расшифр do
     if not Correspond(Расшифр[i].СчДеб,Расшифр[i].СчКре):
         Message("Счета не могут корреспондировать "+Расшифр[i].СЧДЕБ+"/"+Расшифр[i].СЧКРЕ,mtError);
         Template.Field="СЧДЕБ";
         Template.Frame=i;
         ^False; 
     fi;
     tmp=РАБ.Бюджет2005.Объединить(Расшифр[i].ПризнД,Расшифр[i].ПризнК," ");
     tmp=РАБ.Бюджет2005.Объединить(tmp,Расшифр[i].Призн," ");
     tmp=РАБ.Бюджет2005.Объединить(tmp,ДопанДок," ");
     if РАБ.БЮДЖЕТ.ПроверитьПризнакиОбязательные(Расшифр[i].СчДеб,Расшифр[i].СчКре,tmp,"ПЕРИОД.*|КД.*|ФКР.*|КИФД.*|КОСГУ.*")=False: Template.Field="Призн_"; Template.Frame=i; ^False; fi;
--     if РАБ.БЮДЖЕТ.ПроверитьПризнакиСвязанные(Расшифр[i].СчДеб,Расшифр[i].СчКре,РАБ.Бюджет2005.Объединить(Расшифр[i].Призн,ДопанДок," "),"ПЕРИОД.*")=False: Template.Field="Призн_"; Template.Frame=i; ^False; fi;
 od;
 if Начис<Удерж then if EnqOkCancel("Сумма удержаний ("+Str(Удерж,2)+") превышает сумму начислений ("+Str(Начис,2)+"), продолжить?", mtWarning)=cmCancel: ^False; fi; fi;
 ^True;
end;

Func ЗКР_ТипКБК(aКБК:S):S;
 if Match(aКБК,"???.????.*"): ^"10";
   |Match(aКБК,"???.?.*"):    ^"20";
   |Match(aКБК,"???.01.*"):   ^"31";
   |Match(aКБК,"???.02.*"):   ^"32";
 fi;
 ^"";
end;


Proc ОплатитьЗКР(Sender:S;КБК_:S;Призн:S;СумРуб:N; Сч:S);
var OWA,OA,n,i,ii,Iter,verЗКР:I;
var Rec: Record;
var ПДИ:I;
var tmp,Key:S;
var New:L;
var ДокОпл_,ДокОплРуб_:N;
var Контр,Контр_Банк:Record;
 ДокОпл_=Раб.Договор.lstСум[1];
 ДокОплРуб_=Раб.Договор.lstСумРуб[1];
 ПДИ=0;
 if Раб.Настр.Начать("ДОКУМЕНТЫ.БАНК.ЗАЯВКА_КР",0,0,"",GetGUID):
    ПДИ=Int(Раб.Настр.ВзятьЗначение("ПДИ"));
 fi;
 if Раб.Настр.Начать("УПРАВЛЕНИЕ.БАНК",0,0,"",GetGUID):
    if Int(Раб.Настр.ВзятьЗначение("Ver"))>=7: verЗКР=7; else verЗКР=6; fi;
 fi;
 tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Призн," ","К.*","");
 Контр_Банк=nil;
 if tmp<>"" then
    Контр=SignToRecord(tmp);

    OWA=OpenWorkArea("БАНК_СЧЕТА","","Контрагент="+RecordToString(Rec));
    try
    if Records(OWA)=1 then
       Контр_Банк=GetRecordKey(OWA,1);
    fi;
    finally
      CloseWorkArea(OWA);
    end;

 fi;
 Rec=nil;
 New=False;
 i=Раб.Обл.СледСУчетомДаты("РПО_Заявка_КР","Номер","ДатаДок",toDay);
 OWA=OpenWorkArea("РПО_Заявка_КР","",if(Rec=nil,"1=0","UKey="+RecordToString(Rec)));
 Try
  BeginChanging(OWA,False);
  Try
   n=1;
   if Rec=nil:
      New=True;
      n=InsertRecord(OWA);
      Rec=GetRecordKey(OWA,n);
      n=PutFieldI(OWA,n,"Номер",i);
      n=PutFieldS(OWA,n,"НомерДок",Str(i));
      n=PutFieldD(OWA,n,"ДатаДок",toDay);
      n=PutFieldR(OWA,n,"Рекв",Учр);
      n=PutFieldR(OWA,n,"Банк",Учр_Банк);
      n=PutFieldS(OWA,n,"ГРБС",Раб.Бюджет.НаимКБК("ППП2006",Учр.РПО_ППП));
      n=PutFieldS(OWA,n,"Глава",Учр.РПО_ППП);
      n=PutFieldD(OWA,n,"ДатаИспол",if(ПДИ>0,toDay+ПДИ,1.1.100));
      n=PutFieldS(OWA,n,"НомерБО","");
      n=PutFieldS(OWA,n,"ДолжнРук","");
      n=PutFieldS(OWA,n,"ДолжнБух","");
      n=PutFieldS(OWA,n,"ФИОРук","");
      n=PutFieldS(OWA,n,"ФИОБух","");
      n=PutFieldD(OWA,n,"ДатаПодписи",today);
      n=PutFieldN(OWA,n,"Док_Сум",СумРуб);
      n=PutFieldS(OWA,n,"Док_Окв","643");
      n=PutFieldN(OWA,n,"Док_СумРуб",СумРуб);
      n=PutFieldL(OWA,n,"Док_Аванс",False);
      n=PutFieldN(OWA,n,"Док_СумНДС",0);
      n=PutFieldS(OWA,n,"Док_СтавкаНДС","0");
      n=PutFieldS(OWA,n,"Док_ОчрПл","6");
      n=PutFieldS(OWA,n,"Док_ВидПл","3");
      n=PutFieldR(OWA,n,"РеквП",Контр);
      n=PutFieldR(OWA,n,"БанкП",Контр_Банк);
--      n=PutFieldR(OWA,n,"БО",if(УчетБО,БО,ДОГОВОР.БО));
      if not Учр_Банк.РПО_ЛСчет="":
         n=PutFieldS(OWA,n,"Призн_ЛС",Раб.Бюджет2005.БанкВПризн(Учр_Банк));
      fi;
--      if УчетБО:
--         tmp=if(БО=nil,"","БО."+БО.Признак);
--        else
--         tmp=if(ДОГОВОР.БО=nil,"","БО."+ДОГОВОР.БО.Признак);
--      fi;
--      n=PutFieldS(OWA,n,"Призн_БО",tmp);
--      n=PutFieldS(OWA,n,"Призн_К",Контр_Призн);
--      n=PutFieldS(OWA,n,"Вал",Вал);
   fi; --if Rec=nil:
   OA=OpenArray(OWA,n,"РАСШИФР","");
   i=InsertRecord(OA,ii+i);
   i=PutFieldS(OA,i,"Ист",ExtractWord(1,Счет,"."));
   i=PutFieldS(OA,i,"ТипКБК",ЗКР_ТипКБК(КБК_));
   i=PutFieldS(OA,i,"КБК",Раб.Формат.ReplaceSubStr(КБК_,".",""));
   i=PutFieldS(OA,i,"Призн",Призн);
   i=PutFieldS(OA,i,"СчДеб",Сч);
--        i=PutFieldR(OA,i,"ДО",Current);--321
--        i=PutFieldN(OA,i,"ДокСум",GetFieldN(OA,i,"ДокСум")+Расшифр[Iter].СумСНДС);
--        i=PutFieldN(OA,i,"ДокСумРуб",GetFieldN(OA,i,"ДокСумРуб")+Расшифр[Iter].СумРубСНДС);
--        i=PutFieldN(OA,i,"ДокОпл",GetFieldN(OA,i,"ДокОпл")+Раб.Договор.lstСум[1]);
--        i=PutFieldN(OA,i,"ДокОплРуб",GetFieldN(OA,i,"ДокОплРуб")+Раб.Договор.lstСумРуб[1]);
   i=PutFieldN(OA,i,"Сум",СумРуб);
   i=PutFieldN(OA,i,"СумРуб",СумРуб);
   CloseWorkArea(OA);
   n=PutFieldI(OWA,n,"ver",verЗКР);
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;

 PutVariableS("ДОКУМЕНТЫ.БАНК.ЗАЯВКА_КР.Call","Вызов_Из_ДО");
 Message("Заявка на кассовый расход успешно сформирована");
 OpenBlank("ДОКУМЕНТЫ.БАНК.ЗАЯВКА_КР",False,Rec);
end;

--Proc ОплатитьПП(Sender:S; ВД_:S; НДС_:S);
--var OWA,OA1,n,n1,Iter:I;
--var Rec: Record;
--var tmp,Key,ПризнОбщ_,Призн_,НазнПл_:S;
-- НазнПл_="";
-- if not УчетБО:
--    НазнПл_=Договор.НаимДок.НаимК;
--    if НазнПл_="": НазнПл_=Договор.НаимДок.Наим; fi;
--    НазнПл_=НазнПл_+" "+Договор.НомерДок+" от "+DateToString(Договор.ДатаДок);
-- fi;
-- tmp="";
-- if not НаимСчет=nil:
--    tmp=НаимСчет.НаимК;
--    if tmp="": tmp=НаимСчет.Наим; fi;
--    tmp=tmp+" "+НомерСчет+" от "+DateToString(ДатаСчет);
--    НазнПл_=Trim(НазнПл_+" "+tmp);
-- fi;
-- tmp=НаимДок.НаимК;
-- if tmp="": tmp=НаимДок.Наим; fi;
-- tmp=tmp+" "+НомерДок+" от "+DateToString(ДатаДок);
-- НазнПл_=Trim(НазнПл_+" "+tmp)+" ("+Содерж+")";
-- OWA=OpenWorkArea("ПОРУЧ","","1=0");
-- Try
--  BeginChanging(OWA,False);
--  Try
--   n=InsertRecord(OWA);
--   Rec=GetRecordKey(OWA,n);
--   n=PutFieldI(OWA,n,"НОМЕР",Раб.Обл.СледСУчетомДаты("ПОРУЧ","Номер","Дата",ЗКР_ДатаДок));
--   n=PutFieldS(OWA,n,"НОМЕРБУМ",Str(GetFieldI(OWA,n,"НОМЕР")));
--   n=PutFieldR(OWA,n,"РЕКВ",Учр);
--   n=PutFieldR(OWA,n,"РЕКВП",Контр);
--   n=PutFieldR(OWA,n,"БАНК",Учр_Банк);
--   n=PutFieldR(OWA,n,"БАНКП",Контр_Банк);
--   n=PutFieldL(OWA,n,"БЮДЖЕТ",False);
--   n=PutFieldD(OWA,n,"ДАТА",ЗКР_ДатаДок);
--   n=PutFieldN(OWA,n,"СУММА",Round(СумДок-Раб.Договор.lstСум[1],2));
--   n=PutFieldN(OWA,n,"НДС",Round(НДС_,2));
--   n=PutFieldS(OWA,n,"Т",НазнПл_);
--   n=PutFieldS(OWA,n,"ДАТАО","6");
--   n=PutFieldS(OWA,n,"ВИДПЛ","электронно");
--   n=PutFieldS(OWA,n,"ВИДОП","01");
--   n=PutFieldS(OWA,n,"РПО_НАЗНПЛАТ",НазнПл_);
--   n=PutFieldL(OWA,n,"РПО_MULTISTR",False);
--   OA1=OpenArray(OWA,n,"РПО_ПОЗИЦИИ","");
--   Key="";
--   ClearVariable(Buf);
--   ПризнОбщ_=Раб.Бюджет2005.Объединить(Контр_Призн,Раб.Бюджет2005.БанкВПризн(Учр_Банк)," ");
--   if УчетБО: tmp=if(БО=nil,"","БО."+БО.Признак); else tmp=if(ДОГОВОР.БО=nil,"","БО."+ДОГОВОР.БО.Признак); fi;
--   ПризнОбщ_=Раб.Бюджет2005.Объединить(ПризнОбщ_,tmp," ");
--   ПризнОбщ_=Раб.Бюджет2005.Объединить(ПризнОбщ_,CardFileRecSign(Раб.Договор.crdДО,"Признак","ДОГОВОР",Current,"")," ");
--   ПризнОбщ_=Раб.Бюджет2005.Объединить(ПризнОбщ_,Trim(Общ_Призн1+" "+Общ_Призн2)," ");
--   for Iter=1..Расшифр do
--    if Расшифр[Iter].ВД=ВД_ and Str(Max(Расшифр[Iter].НДС,0))=НДС_:
--       Призн_=Trim(Расшифр[Iter].Призн+" "+Расшифр[Iter].ПризнНорм);
--       if not Key=Расшифр[Iter].ВД+"#"+Расшифр[Iter].КБК+"#"+Призн_:
--          Раб.Договор.ДО_Оплата(Current,ЗКР_ДатаДок,ВД_,Расшифр[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(ПризнОбщ_+" "+Призн_," ","&"),False,False,False);
--          Key=Расшифр[Iter].ВД+"#"+Расшифр[Iter].КБК+"#"+Призн_;
--       fi;
--       if Round(Расшифр[Iter].СумСНДС-Раб.Договор.lstСум[1],2)>0:
--          n1=SearchInArray(Buf,Key,True);
--          if n1=-1:
--             n1=InsertInArraySort(Buf,Key);
--             n1=InsertRecord(OA1,n1);
--             n1=PutFieldN(OA1,n1,"СУМ",Round(Расшифр[Iter].СумСНДС-Раб.Договор.lstСум[1],2));
--             n1=PutFieldS(OA1,n1,"СЧДЕБ",Раб.Бюджет2005.ВзятьКодСчета(Расшифр[Iter].СчКре,"","АН",True)+if(Аванс,".560",".830"));
--             n1=PutFieldS(OA1,n1,"СЧКРЕ",Раб.Бюджет2005.ВзятьКодСчета(Расшифр[Iter].СчКре,"","ППП",False)+".01.05.02.01.01.0000."+Расшифр[Iter].ВД+".201.11.610");
--             n1=PutFieldS(OA1,n1,"ПРИЗНАК",Up(Trim(ПризнОбщ_+" "+Призн_)));
--             n1=PutFieldS(OA1,n1,"КМНТ","ПП №"+GetFieldS(OWA,n,"НОМЕРБУМ")+" от "+DateToString(GetFieldD(OWA,n,"ДАТА")));
--          fi;
--         else
--          Trace("Документ оплачен полностью по ВД "+Расшифр[Iter].ВД+" КБК "+Расшифр[Iter].КБК+" {"+Trim(Расшифр[Iter].Призн+" "+Расшифр[Iter].ПризнНорм)+"} "+if(Расшифр[Iter].НДС=-1,"Без НДС","НДС "+Str(Расшифр[Iter].НДС)+" %")+", оплата не требуется");
--       fi;
--    fi;
--   od;
--   EndChanging(OWA);
--  Except
--   CancelChanging(OWA);
--   Raise;
--  end;
-- Finally
--  CloseWorkArea(OWA);
-- end;
-- PutVariableS("ДОКУМЕНТЫ.БАНК.ПОРУЧ.Call","Вызов_Из_ДО");
-- Message("Платежное поручение успешно сформировано");
-- OpenBlank("ДОКУМЕНТЫ.БАНК.ПОРУЧ",False,Rec);
--end;

proc НеПусто;
  if Расшифр=0 then InsertFrame(Расшифр,1); fi;
end;

Proc ДатаРег_OnExit(FieldName: String; Iter: Integer);
 ПЕРИОД=ВзятьПериодПоДате(ДатаРег,'');
end;

Func Период_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
  tmp=AnaElection("Период.*",false,false,Период);
  if tmp<>"" then Период=tmp; fi;
  Return False;
end;


Func ОбщСчет_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,mode,val,mask,maskk:S;
var ask:I;
var typ:S;
  mask=DefMask;mode='';
  if FieldName="КБК":
     Val="КБК+КОСГУ";
     if Счет<>"" then
        if Match(Счет, "*.303.02") then 
           mask=Раб.Бюджет2005.Объединить(mask,"*.213","&");
          else
           mask=Раб.Бюджет2005.Объединить(mask,"*."+Счет+".2??","&");
        fi;
     fi;
    |FieldName="СЧЕТ":
     Val="СЧ6";
     if КБК<>"" then 
        maskk = Раб.Бюджет2005.ВзятьКодКБК(КБК, "", "КБК", False) + ".?.???.??.2??";
        if Substr(КБК, 22, 3) = "213":
           maskk = Раб.Бюджет2005.Объединить(maskk, "*.?.303.02.???", "|");
        fi;
        if maskk <> "":
           maskk = "(" + maskk + ")";
        fi;
        mask = Раб.Бюджет2005.Объединить(mask,maskk,"&");
     fi;
  fi;
  tmp=Раб.КБК.Список(mask,mode,Val);
  if tmp='' then ^False; fi;
  PutVariableS(FieldName,tmp);
  if FieldName="КБК":
     КБКАн=Раб.Бюджет2005.ТипКБКСчета(КБК)+"."+Раб.Бюджет2005.ВзятьКодКБК(КБК,"","КБК",True);
     --      +" КОСГУ."+Раб.Бюджет2005.ВзятьКодКБК(КБК,"","КОСГУ",False);
  fi;
  ОбновитьСч(0);
  Итоги;
  Return False;
end;


Func ДОПАНДОК_OnEnter(FieldName: String; Iter: Integer): logical;
var Mask,tmp:S;
var i:I;
 --Формирование маски счетов
 Mask="*."+Счет+".*";--Счет списания - всегда
 for i=1..Итого do
     Mask=Mask+"|*."+Раб.Бюджет2005.ВзятьКодСчета(Итого[Iter].СчКре,"","СЧ6",False)+".*";
 od;
 Mask=Раб.Бюджет2005.СписокСправ(Mask,0,'ПЕРИОД.*|КД.*|ФКР.*|КИФД.*|КОСГУ.*');
 if Mask="": Message("Аналитические признаки не требуются"); ^False; fi;
 tmp=ВыборПризнака(Mask);
 if tmp="": ^False; fi;
 ДОПАНДОК=Раб.Бюджет.ДобавитьПризнак(ДОПАНДОК,tmp);
 --Чистка позиций!
 tmp=ExtractWord(1,tmp,".")+".*";
 for i=1 to Расшифр do
     Расшифр[i].призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр[i].призн," ",tmp,"");
     Расшифр[I].признД=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр[i].признД," ",tmp,"");
     Расшифр[I].признК=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр[i].признК," ",tmp,"");

 od;
 Return False;
end;


Proc ДОПАНДОК_OnExit(FieldName: String; Iter: Integer);
  ДОПАНДОК=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(ДОПАНДОК," ","Name_A");
end;

Func Учр_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
 Rec=OpenCardFile("Контрагент","--Наше",Учр,crdRecordOnly);
 if not Rec=nil:
    Учр=Rec;
--    ДолжнРук=Учр.ДолжнРук;
--    ФИОРук=Учр.ФИОРук;
    Учр_Банк=Раб.Бюджет2005.БанкСчет(Учр,False);
 fi;
 Return False ;
end;



Proc OnRead;
var i:I;
  if CurrentState=CrdusInserted:
     if Учр=nil then
        Учр=Раб.Бюджет2005.НашРекв;
     fi;
     if Учр<>nil and Учр_Банк=nil then
        Учр_Банк=Раб.Бюджет2005.БанкСчет(Учр,False);
     fi;
     УчетБО=True;
  fi;
  Непусто;
  if not Flag: Оформление; fi;
  Начис=0;Удерж=0;
  for i=1 to Расшифр do
    if Pos(".302.",Расшифр[i].СчДеб)>0 then Удерж=Удерж+Расшифр[i].СумРуб; fi;
    if Pos(".302.",Расшифр[i].СчКре)>0 then Начис=Начис+Расшифр[i].СумРуб; fi;
  od;

end;




Func Учр_Банк_onEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
  if Учр=nil: Message("Выберите собственные реквизиты",mtError); Template.Field="Учр.КорИмя"; ^False; fi;
  Rec=OpenCardFile("Банк_Счета","Контрагент="+RecordToString(Учр),Учр_Банк,crdRecordOnly);
  if not Rec=nil:
     Учр_Банк=Rec;
  fi;
  Return False ;
end;

Func ОчистРасшифр_OnEnter(FieldName: String; Iter: Integer): logical;
 if not Рег:
    if EnqOkCancel("Очистить таблицу расшифровки ?",mtWarning)=cmOk:
       ClearVariable(Расшифр);
    fi;
 fi;
 Return False;
end;


Func Вал_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var Cur:S;
-- if ОКВ="": Message("Заполните код валюты по ОКВ",mtError); Template.Field="ОКВ"; ^False; fi;

 ClearVariable(Buf);
 n=0;
 for Currencies Cur="*" do
  n=n+1;
  Buf[n]=Up(Cur)+" --"+Name_C(Cur);
 od;
 n=Alternate("Валюта",Buf,-1,1,12);
 if not n=0:
    Вал=SubStr(Buf[n],1,3);
 fi;
 Return False;
end;

Func Призн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,tmp1,ИсклПризн_,VarN:S;
 if КБК="": Message("Выберите КБК",mtError); Template.Field="КБК"; ^False; fi;
 ОбновитьСч(Iter);
-- if Расшифр[Iter].СчДеб="": Message("Выберите счет дебета",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
-- if not Аванс:
--    if Расшифр[Iter].СчКре="": Message("Выберите счет кредита",mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
-- fi;
 tmp=Раб.Бюджет2005.ПризнВСправ(ДОПАНДОК," ",".*");
 tmp=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(tmp," ","|");
 ИсклПризн_=Раб.Бюджет2005.Объединить("ПЕРИОД.*|КД.*|ФКР.*|КИФД.*|КОСГУ.*",tmp,"|");
 --tmp=ПолучитьМаскуСчетов(Iter,"");
 if FieldNAme<>"Призн_" then 
    tmp=Раб.Бюджет2005.ПризнВСправ(Расшифр[Iter].Призн," ",".*");
    tmp=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(tmp," ","|");
    ИсклПризн_=Раб.Бюджет2005.Объединить(ИсклПризн_,tmp,"|");
 fi;
 varN="Расшифр["+Str(Iter)+"].";
 if FieldNAme="Призн_":  tmp=Раб.Бюджет2005.Объединить(Расшифр[Iter].СчДеб,if(Substr(Расшифр[Iter].СчКре,1,1)="<","",Расшифр[Iter].СчКре),"|"); varN=varN+"Призн";
   |FieldNAme="ПризнД_": tmp=Расшифр[Iter].СчДеб;varN=varN+"ПризнД";
   |FieldNAme="ПризнК_": tmp=if(Substr(Расшифр[Iter].СчКре,1,1)="<","",Расшифр[Iter].СчКре);varN=varN+"ПризнК";
 fi;
 if FieldNAme="ПризнК_":
    ИсклПризн_=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(ИсклПризн_,"|","КОСГУ.*","");
 fi;
 tmp=Раб.Бюджет2005.СписокСправ(tmp,0,ИсклПризн_);
 if FieldNAme<>"ПризнК_":
    tmp=Раб.Бюджет2005.Объединить("КОСГУ."+КОСГУОПЕР(Раб.Бюджет2005.ВзятьКодКБК(КБК,"","КОСГУ",False),Расшифр[Iter].ОПЕР)+"!",tmp,"|");
 fi;
 if tmp="": Message("Аналитические признаки не требуются"); ^False; fi;
 tmp=AnaElection(tmp,False,False,hПризн);
 if not tmp="":
    hПризн=tmp;
    tmp=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(GetVariableS(varN)," ",tmp,SubStr(tmp,1,Pos(".",tmp))+"*","");
    tmp1=ExtractWord(1,tmp,".")+".*";
    if FieldNAme="Призн_" then
       Расшифр[Iter].признД=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр[iter].признД," ",tmp1,"");
       Расшифр[Iter].признК=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр[iter].признК," ",tmp1,"");
      else
       Расшифр[Iter].призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр[iter].призн," ",tmp1,"");
    fi;
    PutvariableS(varN,tmp);

    ОбновитьСч(Iter);
--    Расшифр[Iter].Призн=tmp;
    Итоги;
--    Переход(FieldName,Iter);
 fi;

 Return False;
end;

Proc Призн_OnExit(FieldName: String; Iter: Integer);
var tmp,varN:S;
 varN="Расшифр["+Str(Iter)+"].";
 if FieldNAme="Призн_":  varN=varN+"Призн";
   |FieldNAme="ПризнД_": varN=varN+"ПризнД";
   |FieldNAme="ПризнК_": varN=varN+"ПризнК";
 fi;
 tmp=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(GetVariableS(varN)," ","Name_A");
 PutVariableS(varN,tmp);
 ОбновитьСч(Iter);
 Итоги;
end;

Func Опер_OnEnter(FieldName: String; Iter: Integer): logical;
var i:I;
 Buf[1]="302.11";
 Buf[2]="303.01";
 Buf[3]="303.02";
 Buf[4]="303.06";
 Buf[5]="303.07";
 Buf[6]="303.08";
 Buf[7]="303.09";
 Buf[8]="303.10";
 Buf[9]="303.11";
 Buf[10]="304.03";
 Buf[11]="208";
 for i=1 to LengthOfArray(Buf) do
   Buf2[i]=Операция(Buf[i])+" ("+Buf[i]+")";
 od;
 i=SearchInArray(Buf,Расшифр[Iter].ОПЕР);
 i=Alternate("Виды операций:",Buf2,30,i,12);
 if i<>0 then
   Расшифр[Iter].ОПЕР=Buf[i];
   ОбновитьСч(Iter);
   Итоги;
 fi;
 Return False ;
end;


Proc cbПроводить_OnChange(Sender: String);
 if Рег:
    Рег=Проверить;
--    if УчетБО:
--       Рег=СведБО(Рег);
--    fi;
   else
    if EnqOkCancel("Вы уверены, что хотите исключить документ из обработки ?",mtWarning)=cmCancel:
       EditorCancel;
       cbПроводить.State=Рег;
       Exit;
      else
--       Рег=not СведБО(Рег);
    fi;
 fi;
 cbПроводить.State=Рег;
 EditorApply;
 Оформление;
end;


Proc OnOpen(Create: Logical);
  Flag=True;
end;


Func A_OnEnter(FieldName: String; Iter: Integer): logical;
  InsertFrame(Расшифр,Iter+1);
  Return False;
end;


Func D_OnEnter(FieldName: String; Iter: Integer): logical;
  DeleteFrame(Расшифр,Iter);
  НеПусто;
  Return False ;
end;


Proc Сум_OnExit(FieldName: String; Iter: Integer);
 Итоги;
end;

Func ЗКРИ_OnEnter(FieldName: String; Iter: Integer): logical;
var ТБК,КБК_,КОСГУ:S;
var Сч_,Ан_,АнУсл,АнКБКУсл:S;
var i:I;
var Нач,Опл,Зкр,КОпл:N;
var ДН,КонГ:D;
  --if ЗКРИ[Iter]="" then
     ^False; 
  --fi;
  ClearVariable(Buf);
  ДН=1.1.100;
  КонГ=Dat(31,12,Year(ДатаРег));
  ТБК=Раб.Бюджет2005.ТипКБКСчета(КБК);
  КБК_=Раб.Бюджет2005.ВзятьКодКБК(КБК,ТБК,"КБК",True);
  КОСГУ=Раб.Бюджет2005.ВзятьКодКБК(КБК,ТБК,"КОСГУ",False);
  КОСГУ=КосгуОпер(КОСГУ,Итого[Iter].Опер);
  АнКБКУсл="КОСГУ."+КОСГУ;
  --Выделяем аналитику, приклееную к операции
  i=Pos(" ",Итого[Iter].Опер);
  if i>0 then Ан_=Substr(Итого[Iter].Опер,i+1,255); fi;
  Ан_=Раб.Бюджет2005.Объединить(Ан_,ДопАнДок," ");
  --меняем хвост у счета для подстановки в дебет
  Сч_=Раб.Бюджет2005.ВзятьКодСчета(Итого[Iter].СчКре,"","АН",True)+".830";
  АнУсл=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Ан_," ","|");
  --Прочие удержания без аналитики
  if Итого[Iter].Опер="304.03" then 
     --Добавить проверку что используется сортировка удержаний.
     if АнУсл="" then
        АнУсл="~Удерж.*";
       else
        АнУсл="("+АнУсл+")&~Удерж.*";
     fi;
  fi;
  i=1;
  while i=1 do
    --Расчет начислено/оплачено/в банке
    Refresh;
    Нач=-1*Saldo(Итого[Iter].СчКре+"{"+АнУсл+"}",КонГ);
    Опл=Saldo(Сч_+"{"+АнУсл+"}",КонГ);
    Зкр=-1*Saldo("*."+Раб.Бюджет2005.ВзятьКодСчета(Итого[Iter].СчДеб,"","ВД",False)+".ЗАБ.КР.*"+"{"+if(АнУсл="","*","("+АнУсл+")")+"&"+АнКБКУсл+"}",КонГ);
    КОпл=Min(Нач-Опл-Зкр,Расшифр[iter].СумРуб);
    КОпл=Max(КОпл,0);
    Buf[1]="Обновить";
    Buf[2]="Начислено: "+Str(Нач,2);
    Buf[3]="Оплачено:  "+Str(Опл,2);
    Buf[4]="На оплате: "+Str(Зкр,2);
    Buf[5]="Сформировать ЗКР (на "+Str(КОпл,2)+")";
    i=Alternate("Оплата по ЗКР",Buf,-1,1,12);
  od;
  if i=2 then Report('"'+PlanVar("Std_Rpo")+'\Общие\Отчеты\Служебные отчеты.lst"."001"',ДН,КонГ,Итого[Iter].СчКре,АнУсл);
    |i=3 then Report('"'+PlanVar("Std_Rpo")+'\Общие\Отчеты\Служебные отчеты.lst"."001"',ДН,КонГ,Сч_,АнУсл);
    |i=4 then Report('"'+PlanVar("Std_Rpo")+'\Общие\Отчеты\Служебные отчеты.lst"."001"',ДН,КонГ,"*."+Раб.Бюджет2005.ВзятьКодСчета(Итого[Iter].СчДеб,"","ВД",False)+".ЗАБ.КР.*","("+АнУсл+")&"+АнКБКУсл);
    |i=5 then ОплатитьЗКР("",КБК_+"."+КОСГУ,Ан_,КОпл,Сч_);
  fi;
  Return False;
end;


Proc УчрКорИмя_OnExit(FieldName: String; Iter: Integer);
   Учр_Банк=nil;
end;


Proc Сч_OnClick(Row: Integer; Col: Integer; Double: Logical);

end;


Proc AfterOpen(Destroy: Logical);
  Инициализация;
  Оформление;
  Flag=False;
end;


Конец
