-- Шаблон создан мастером бланков
-- 27.02.2013 11:03:08
--
БланкСШаблоном "Заявление на выдачу аванса", Редактор РПО_ЗАЯВЛ_АВАНС;

var FlagEdit:L;
var FlagInit:L;

var НоваяЗапись:L=(CurrentState=crdusInserted);

var ФЗ:I=if(ДатаДок>=1.1.2014,1,0);

var НомерДок_:S=НомерДок;
var ДатаДок_:D=ДатаДок;
var ФИОМОЛ_:S="";

var verОКДП_Гр_:S="в ред. прик. № 273";
var ЗаглОКДП:S="Код "+if(ФЗ=0,"ОКДП","ОКПД");
var Валюта_:S=if(Валюта=BaseCurrency,"",Валюта);

var пп[]:i=$;
var A:s=if(Проводить,"","+");
var AA:s=if(Проводить,"","++");
var D:s=if(Проводить,"","-");

var Призн_[]:S=Позиции[$].Призн;

var ВсегоСумРуб:N=SumOfArray(Позиции[].СумРуб);
var ВсегоСумВал:N=SumOfArray(Позиции[].СумВал);

var fОКДП:I;
var ОКДП_ГР_:S;
var ОКДП_:S;

var SelfBln:S="ДОКУМЕНТЫ.ПРОЧИЕ.ЗАЯВЛ_АВАНС";
var SelfCrd:S="РПО_ЗАЯВЛ_АВАНС";

var ИсклПризн:S="МОЛ.*|ОКДП.*|ОКДП2.*|ОКПД.*|БО.*|АВ.*|СОП.*";

var hПризн:S;
var hРКО:Record;

hДолжнРук:S;
hФИОРук:S;
hДолжнБух:S;
hФИОБух:S;

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

var BufField[]:S;
var BufColorBg[]:I;
var BufColorFo[]:I;

cbПроводить: Object;
cbУчетБО   : Object;
cbУчетДО   : Object;
btnФ30	   : Object;


S1: Section;
S2: Section;
S3: Section;
S4: Section;
S5: Section;
S6: Section;
S7: Section;
S8: Section;
S9: Section;
S10:Section;
var nS:I=10;

var hРКО: Record;
var hВед: Record;
--
--Процедуры и функции -------------
Proc Инициализация;
var n,l,s,r,c,rr,cc,BgColor:i;
var Field:S;
var Obj: Object;
 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
       BgColor=asInteger(Obj.Cell(r,c,CellBgColor,""));
       if BgColor=coAqua or BgColor=coTeal or BgColor=coYellow:
	  Field=asString(Obj.Cell(r,c,CellContents,""));
	  if not Field="":
	     if SearchInArray(BufField,Field,True)=-1:
		n=InsertInArraySort(BufField,Field);
		InsertInArray(BufColorBg,n,BgColor);
	     fi;
	  fi;
       fi;
      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;
 btnФ30.Visible=BlankExist("ДОКУМЕНТЫ.ПРОЧИЕ.ЗАЯВЛ_АВАНС_6002404");
end;

Proc Оформление;
var s,c,r,cc,rr,n:i;
var Obj: Object;
 cbУчетБО.Enabled=not Проводить;
 cbУчетДО.Enabled=not Проводить;
 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
       n=SearchInArray(BufField,asString(Obj.Cell(r,c,CellContents,"")),True);
       if not n=-1:
	  if Проводить:
	     Obj.Cell(r,c,CellFontColor,coBlack);
	     Obj.Cell(r,c,CellBgColor,coTransparent);
	    else
	     Obj.Cell(r,c,CellFontColor,BufColorFo[n]);
	     Obj.Cell(r,c,CellBgColor,BufColorBg[n]);
	  fi;
	  Obj.Cell(r,c,CellReadOnly,Проводить);
       fi;
      od;
    od;
    if s=8 or s=9 or s=10:
       Obj.Column(6,ColVisible,ФЗ=0);
       Obj.Column(7,ColVisible,ФЗ=0);
    fi;
  fi;
 od;
end;

Proc НеПустаяТабл;
var I:i;
 if Позиции<1: i=InsertFrame(Позиции,1); fi;
end;

Proc УдалитьПустыеСтроки;
var n:i;
 n=1;
 While n<=Позиции do
  if Позиции[n].ВД="" and
     Позиции[n].КБК="" and
     Позиции[n].Призн="" and
     Позиции[n].Назнач="" and
     Позиции[n].ОКДП_Гр="" and
     Позиции[n].ОКДП="" and
     Позиции[n].Назнач="" and
     Позиции[n].СумРуб=0 and
     Позиции[n].СумВал=0: DeleteFrame(Позиции,n);
    else
     n=n+1;
  fi;
 od;
 НеПустаяТабл;
end;

Proc ОбработатьНомер (aНомерДок:S);
var tmp:i;
 tmp=Int(aНомерДок);
 if tmp=0:
    if ДатаДок=1.1.100:
       tmp=Раб.Обл.СледСУчетомГодаФ(SelfCrd,"Номер","ДатаДок","not UKey="+RecordToString(Current));
      else
       tmp=Раб.Обл.СледСУчетомДатыФ(SelfCrd,"Номер","ДатаДок",ДатаДок,"not UKey="+RecordToString(Current));
    fi;
 fi;
 if not Номер=tmp:
    Номер=tmp;
    if Раб.Бюджет2005.Сетевая: EditorApply; fi;
 fi;
end;

Proc ОбработатьДату (prevДата:D; newДата:D);
var prevYYYY,newYYYY:I;
 prevYYYY=Year(prevДата);
 newYYYY=Year(newДата);
 if prevYYYY=newYYYY: Exit; fi;
 if not prevYYYY=100:
    if EnqOkCancel("Изменился отчетный год ("+Str(prevYYYY)+") документа, получить номер документа соответствуещего года ("+Str(newYYYY)+") ?",mtWarning)=cmCancel: Exit; fi;
 fi;
 НомерДок=Str(Раб.Обл.СледСУчетомДатыФ(SelfCrd,"Номер","ДатаДок",ДатаДок,"not UKey="+RecordToString(Current)));
 ОбработатьНомер(НомерДок);
 Template.Field="НомерДок";
end;

Func ПолучитьМаскуСчетов(Iter:I; Val:S):S;
var БК_,КОСГУ_,ВД_,tmp:S;
 tmp="";
 БК_=Раб.Бюджет2005.ВзятьКодКБК(Позиции[Iter].КБК,"","БК",False);
 КОСГУ_=Раб.Бюджет2005.ВзятьКодКБК(Позиции[Iter].КБК,"","КОСГУ",False);
 ВД_=Позиции[Iter].ВД;
 if Val="БО" and Позиции[Iter].ВД="1": tmp=БК_+".1.501.13."+КОСГУ_+"|"+БК_+".1.502.11."+КОСГУ_;
   |Val="БО" and not Позиции[Iter].ВД="3": tmp=БК_+"."+ВД_+".506.10."+КОСГУ_+"|"+БК_+"."+ВД_+".502.11."+КОСГУ_;
   |Val="ДО": tmp=БК_+"."+ВД_+".502.11."+КОСГУ_+"|"+БК_+"."+ВД_+".502.12."+КОСГУ_;
   |True: tmp=БК_+"."+Позиции[Iter].ВД+".208."+Раб.Бюджет2005.Соотв_КОСГУ_Ан("208",КОСГУ_)+".560";
	  if УчетБО:
	     if Позиции[Iter].ВД="1": tmp=Раб.Бюджет2005.Объединить(tmp,БК_+".1.501.13."+КОСГУ_+"|"+БК_+".1.502.11."+КОСГУ_,"|");
	       |not Позиции[Iter].ВД="3": tmp=Раб.Бюджет2005.Объединить(tmp,БК_+"."+ВД_+".506.10."+КОСГУ_+"|"+БК_+"."+ВД_+".502.11."+КОСГУ_,"|");
	     fi;
	  fi;
	  if УчетДО:
	     tmp=Раб.Бюджет2005.Объединить(tmp,БК_+".1.502.11."+КОСГУ_+"|"+БК_+".1.502.12."+КОСГУ_,"|");
	  fi;
 fi;
 ^tmp;
end;


Proc ПолучитьДопАн(Iter:I);
var Справ,ТипБК,ПризнБК,ПризнКОСГУ,ИсклПризн_,tmp:S;
 if not Позиции[Iter].КБК="" and (not Name_S(Позиции[Iter].СчДеб)=" " or not Name_S(Позиции[Iter].СчДеб_БО)=" " or not Name_S(Позиции[Iter].СчКре_БО)=" " or not Name_S(Позиции[Iter].СчКре_ДО)=" " or not Name_S(Позиции[Iter].СчКре_ДО)=" "):
--    tmp=Раб.Бюджет2005.ПризнВСправ(Позиции[Iter].Призн," ",".*");
--    tmp=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(tmp," ","|");
--    ИсклПризн_=Раб.Бюджет2005.Объединить(ИсклПризн,tmp,"|");
    ИсклПризн_=ИсклПризн;
    tmp=ПолучитьМаскуСчетов(Iter,"");
    Справ=Раб.Бюджет2005.СписокСправ(tmp,0,ИсклПризн_);
    ТипБК=Раб.Бюджет2005.ТипКБКСчета(Позиции[Iter].КБК);
    if Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Справ,"|",ТипБК+".*","")="":
       ПризнБК="";
      else
       ПризнБК=ТипБК+".";
    fi;
    if not ПризнБК="":
       ПризнБК=ПризнБК+Раб.Бюджет2005.ВзятьКодКБК(Позиции[Iter].КБК,ТипБК,"БК",False);
       Позиции[Iter].Призн=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].Призн," ",ПризнБК,"ФКР.*|КД.*|КИФД.*","|");
    fi;
    if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Справ,"|","КОСГУ.*","")="":
       ПризнКОСГУ="КОСГУ."+Раб.Бюджет2005.ВзятьКодКБК(Позиции[Iter].КБК,"","КОСГУ",False);
       tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","КОСГУ.*","");
       if not Match(tmp,ПризнКОСГУ+"!"):
	  Позиции[Iter].Призн=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].Призн," ",ПризнКОСГУ,"КОСГУ.*","|");
       fi;
    fi;
 fi;
end;

Proc ОбновитьПризн(Iter:I);
var tmp:S;
var n1,n2:i;
 if Iter=-1: n1=1; n2=Позиции; else n1=Iter; n2=Iter; fi;
 for Iter=n1..n2 do
  if not Name_S(Позиции[Iter].СчДеб)=" " or (УчетБО and not Name_S(Позиции[Iter].СчДеб_БО)=" " and not Name_S(Позиции[Iter].СчКре_БО)=" ") or (УчетДО and not Name_S(Позиции[Iter].СчДеб_ДО)=" " and not Name_S(Позиции[Iter].СчКре_ДО)=" "):
     tmp=ПолучитьМаскуСчетов(Iter,"");
     tmp=Раб.Бюджет2005.СписокСправ(tmp,0,"");
     Позиции[Iter].Призн=Раб.Бюджет2005.ПривестиВСоотвНаборСлов(Позиции[Iter].Призн," ",tmp,"|");
     ПолучитьДопАн(Iter);
  fi;
 od;
end;

Proc ОбновитьСч (Iter:I);
var n1,n2,Iter_:i;
var БК_,КОСГУ_,Сч_:S;
 Iter_=Iter;
 if Iter=-1: n1=1; n2=Позиции; else n1=Iter; n2=Iter; fi;
 Раб.КСА.Начать;
 for Iter=n1..n2 do
  Позиции[Iter].СчДеб_БО="";
  Позиции[Iter].СчКре_БО="";
  Позиции[Iter].СчДеб_ДО="";
  Позиции[Iter].СчКре_ДО="";
  if not Позиции[Iter].КБК="":
     БК_=Раб.Бюджет2005.ВзятьКодКБК(Позиции[Iter].КБК,"КР","БК",False);
     КОСГУ_=Раб.Бюджет2005.ВзятьКодКБК(Позиции[Iter].КБК,"КР","КОСГУ",False);
     Позиции[Iter].СчДеб=БК_+"."+Позиции[Iter].ВД+".208."+Раб.Бюджет2005.Соотв_КОСГУ_Ан("208",КОСГУ_)+".560";
     Раб.КСА.Добавить(Позиции[Iter].СчДеб);
     Сч_=БК_+"."+Позиции[Iter].ВД+".208."+Раб.Бюджет2005.Соотв_КОСГУ_Ан("208",КОСГУ_)+".660";
     if УчетБО:
	if Позиции[Iter].ВД="1": Позиции[Iter].СчДеб_БО=БК_+".1.501.13."+КОСГУ_; Позиции[Iter].СчКре_БО=БК_+".1.502.11."+КОСГУ_;
	  |not Позиции[Iter].ВД="3": Позиции[Iter].СчДеб_БО=БК_+"."+Позиции[Iter].ВД+".506.10."+КОСГУ_; Позиции[Iter].СчКре_БО=БК_+".1.502.11."+КОСГУ_;
	fi;
     fi;
     if УчетДО:
	Позиции[Iter].СчДеб_ДО=БК_+"."+Позиции[Iter].ВД+".502.11."+КОСГУ_;
	Позиции[Iter].СчКре_ДО=БК_+"."+Позиции[Iter].ВД+".502.12."+КОСГУ_;
     fi;
     Раб.КСА.Добавить(Позиции[Iter].СчДеб_БО);
     Раб.КСА.Добавить(Позиции[Iter].СчКре_БО);
     Раб.КСА.Добавить(Позиции[Iter].СчДеб_ДО);
     Раб.КСА.Добавить(Позиции[Iter].СчКре_ДО);
  fi;
 od;
 if Раб.КСА.Закончить(True):
    Message("Добавление счетов завершено");
 fi;
 ОбновитьПризн(Iter_);
end;

Func Проверить:L;
var Iter:I;
var Mask,tmp:s;
 Refresh;
 УдалитьПустыеСтроки;
 if Валюта="": Валюта=BaseCurrency; fi;
 if НомерДок="": Message("Введите номер",mtError); Template.Field="НомерДок_"; ^False; fi;
 if ДатаДок=1.1.100: Message("Введите дату заявления",mtError); Template.Field="ДатаДок_"; ^False; fi;
 if Рекв=nil:  Message("Выберите учреждение",mtError); Template.Field="Рекв.КорИмя"; ^False; fi;
 if not ПризнПодр="" and Name_A(ПризнПодр)=" ": Message("Неизвестный идентификатор аналитического признака "+ПризнПодр,mtError); Template.Field="НаимПодр"; ^False; fi;
 if ПризнМОЛ="": Message("Введите подотчетное лицо",mtError); Template.Field="ФИОМОЛ"; ^False; fi;
 if Name_A(ПризнМОЛ)=" ": Message("Неизвестный идентификатор аналитического признака "+ПризнМОЛ,mtError); Template.Field="ФИОМОЛ"; ^False; fi;
 if Срок=1.1.100: Message("Введите срок погашения аванса",mtError); Template.Field="Срок"; ^False; fi;
 if НазначАванс="": Message("Введите назначение аванса",mtError); Template.Field="НазначАванс"; ^False; fi;
 if Срок<ДатаДок: Message("Срок погашения аванса, не может быть ранее даты заявления",mtError); Template.Field="Срок"; ^False; fi;
 if ДолжнРук="":  Message("Введите должность руководителя",mtError); Template.Field="ДолжнРук"; ^False; fi;
 if ФИОРук="":	Message("Введите ФИО руководителя",mtError); Template.Field="ФИОРук"; ^False; fi;
 if ДолжнБух="":  Message("Введите должность главного бухгалтера",mtError); Template.Field="ДолжнБух"; ^False; fi;
 if ФИОБух="":	Message("Введите ФИО главного бухгалтера",mtError); Template.Field="ФИОБух"; ^False; fi;
-- if Валюта="":Message("Укажите валюту",mtError); Template.Field="Валюта_"; ^False; fi;
 if not Валюта="" and Name_C(Валюта)=" ":Message("Неизвестный идентификатор валюты "+Валюта,mtError); Template.Field="Валюта_"; ^False; fi;
 Раб.КСА.Начать;
 for Iter=1..Позиции do
  Раб.КСА.Добавить(Позиции[Iter].СчДеб);
  Раб.КСА.Добавить(Позиции[Iter].СчДеб_БО);
  Раб.КСА.Добавить(Позиции[Iter].СчКре_БО);
  Раб.КСА.Добавить(Позиции[Iter].СчДеб_ДО);
  Раб.КСА.Добавить(Позиции[Iter].СчКре_ДО);
 od;
 if Раб.КСА.Закончить(True): Message("Добавление счетов завершено"); fi;
 if not ПризнБО="":
    if Name_A(ПризнБО)=" ": Message("Неизвестный идентификатор аналитического признака "+ПризнБО,mtError); Template.Field="ПризнБО"; ^False; fi;
 fi;
 Раб.Бюджет.ПроверитьПризнакиНачать;
 for Iter=1..Позиции do
  if Позиции[Iter].ВД="": Message("Заполните источник",mtError); Template.Field="ВД"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].КБК="": Message("Заполните КБК",mtError); Template.Field="КБК"; Template.Frame=Iter; ^False; fi;
--  if Позиции[Iter].ОКДП_Гр="": Message("Заполните номенклатурную группу",mtError); Template.Field="ОКДП_Гр"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].СумРуб=0: Message("Введите сумму в рублях",mtError); Template.Field="СумРуб"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].СумВал=0 and not Валюта_="": Message("Введите сумму в валюте",mtError); Template.Field="СумВал"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].СчДеб="": Message("Введите счет дебета",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
  if Name_S(Позиции[Iter].СчДеб)=" ": Message("Неизвестный счет дебета '"+Позиции[Iter].СчДеб+"'",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
  if УчетБО:
     if Name_S(Позиции[Iter].СчДеб_БО)=" ": Message("Неизвестный счет дебета (бюджетное обязательство)'"+Позиции[Iter].СчДеб_БО+"'",mtError); Template.Field="СчДеб_БО"; Template.Frame=Iter; ^False; fi;
     if Name_S(Позиции[Iter].СчКре_БО)=" ": Message("Неизвестный счет кредита (бюджетное обязательство)'"+Позиции[Iter].СчКре_БО+"'",mtError); Template.Field="СчКре_БО"; Template.Frame=Iter; ^False; fi;
     if Correspond(Позиции[Iter].СчДеб_БО,Позиции[Iter].СчКре_БО)=False: Message("Счета '"+Позиции[Iter].СчДеб_БО+"/"+Позиции[Iter].СчКре_БО+"' не могут корреспондировать",mtError); Template.Field="СчДеб_БО"; Template.Frame=Iter; ^False; fi;
  fi;
  if УчетДО:
     if Name_S(Позиции[Iter].СчДеб_ДО)=" ": Message("Неизвестный счет дебета (денежное обязательство)'"+Позиции[Iter].СчДеб_ДО+"'",mtError); Template.Field="СчДеб_ДО"; Template.Frame=Iter; ^False; fi;
     if Name_S(Позиции[Iter].СчКре_ДО)=" ": Message("Неизвестный счет кредита (денежное обязательство)'"+Позиции[Iter].СчКре_ДО+"'",mtError); Template.Field="СчКре_ДО"; Template.Frame=Iter; ^False; fi;
     if Correspond(Позиции[Iter].СчДеб_ДО,Позиции[Iter].СчКре_ДО)=False: Message("Счета '"+Позиции[Iter].СчДеб_ДО+"/"+Позиции[Iter].СчКре_ДО+"' не могут корреспондировать",mtError); Template.Field="СчДеб_ДО"; Template.Frame=Iter; ^False; fi;
  fi;
  if Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб,"",Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  if Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб,"",Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  if УчетБО:
     if Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб_БО,Позиции[Iter].СчКре_БО,Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
     if Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб_БО,Позиции[Iter].СчКре_БО,Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  fi;
  if УчетДО:
     if Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб_ДО,Позиции[Iter].СчКре_ДО,Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
     if Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб_ДО,Позиции[Iter].СчКре_ДО,Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  fi;
  tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Позиции[Iter].Призн," ","КОСГУ.*","");
  if not tmp="":
     if not Match(tmp,"КОСГУ."+SubStr(Позиции[Iter].КБК,22,3)+"!"): Message("Аналитический признак "+tmp+" не соответствует КБК "+Позиции[Iter].КБК,mtError); Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  fi;
  tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Позиции[Iter].Призн," ","ФКР.*","");
  if not tmp="":
     if tmp="ФКР."+SubStr(Позиции[Iter].КБК,22,3): Message("Аналитический признак "+tmp+" не соответствует КБК "+Позиции[Iter].КБК,mtError); Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  fi;
 od;
  --Проверям нужен ли признак подразделения
 for Iter=1..Позиции do
  Mask=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб,"","П.*");
  if Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб,"",Позиции[Iter].Призн+" "+ПризнПодр,Mask)=False : Template.Field="НаимПодр"; ^False; fi;
  if Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб,"",Позиции[Iter].Призн+" "+ПризнПодр,Mask)=False : Template.Field="НаимПодр"; ^False; fi;
  if УчетБО:
     Mask=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб_БО,Позиции[Iter].СчКре_БО,"П.*");
     if Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб_БО,Позиции[Iter].СчКре_БО,Позиции[Iter].Призн+" "+ПризнПодр,Mask)=False : Template.Field="НаимПодр"; ^False; fi;
     if Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб_БО,Позиции[Iter].СчКре_БО,Позиции[Iter].Призн+" "+ПризнПодр,Mask)=False : Template.Field="НаимПодр"; ^False; fi;
  fi;
  if УчетДО:
     Mask=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб_ДО,Позиции[Iter].СчКре_ДО,"П.*");
     if Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб_ДО,Позиции[Iter].СчКре_ДО,Позиции[Iter].Призн+" "+ПризнПодр,Mask)=False : Template.Field="НаимПодр"; ^False; fi;
     if Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб_ДО,Позиции[Iter].СчКре_ДО,Позиции[Iter].Призн+" "+ПризнПодр,Mask)=False : Template.Field="НаимПодр"; ^False; fi;
  fi;
 od;
 ^True;
end;

Func ПризнакИспользуется(Field:S):L;
var tmp:S;
 if not CurrentState=CrdusInserted and not Признак="":
    Refresh;
    tmp=Раб.Бюджет2005.КартПризнакИспользуется(SelfCrd,"ПРИЗНАК",Current,"*");
    if not tmp="": 
       if Field="НомерДок_": Field="номера документа";
	 |Field="ДатаДок_": Field="даты документа";
	 |True: Field="";
       fi;
       if not Field="":
	  Message("Признак документа ("+tmp+") используется в проводках"+Chr(13)+"Изменение "+Field+" невозможно",mtError);
       fi;
       ^True;
    fi;
 fi;
 ^False;
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
Func НомерДок_OnEnter(FieldName: String; Iter: Integer): logical;
 FlagEdit=not ПризнакИспользуется(FieldName);
 Return FlagEdit;
end;

Proc НомерДок_OnExit(FieldName: String; Iter: Integer);
 ОбработатьНомер(НомерДок);
end;

func НомерДок_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 if ДатаДок=1.1.100:
    НомерДок=Str(РАБ.ОБЛ.СледСУчетомГодаФ(SelfCrd,"Номер","ДатаДок","not UKey="+RecordToString(Current)));
   else
    НомерДок=Str(РАБ.ОБЛ.СледСУчетомДатыФ(SelfCrd,"Номер","ДатаДок",ДатаДок,"not UKey="+RecordToString(Current)));
 fi;
 ОбработатьНомер(НомерДок);
 ^Cur;
end;

Func ДатаДок_OnEnter(FieldName: String; Iter: Integer): logical;
 FlagEdit=not ПризнакИспользуется(FieldName);
 Return FlagEdit;
end;

Func ДатаДок_OnVerify(FieldName: String; Iter: Integer; Value: Date):Logical;
var prevД:D;
 prevД=ДатаДок;
 ДатаДок=Value;
 ОбработатьДату(prevД,ДатаДок);
 Return True;
end;

Func Дата_OnLookup(Sect:S; Row:I; Col:I; Cur:S) :S;
var tmp,prevД:d;
var Field:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 prevД=GetVariableD(Field);
 PutVariableD(Field,tmp);
 if Field="ДатаДок":
    ОбработатьДату(prevД,tmp);
 fi;
end;

Func Рекв_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
 Rec=OpenCardFile("Контрагент","Наше",Рекв,crdRecordOnly);
 if rec=nil: ^False; fi;
 Рекв=Rec;
 ДолжнРук=Рекв.ДолжнРук;
 ФИОРук=Рекв.ФИОРук;
 ДолжнБух=Рекв.ДолжнБух;
 ФИОБух=Рекв.ФИОБух;
 ^False;
end;

Func НаимПодр_onEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("П.*");
 if tmp="": ^False; fi;
 ПризнПодр=tmp;
 НаимПодр=Name_A(ПризнПодр);
 if НаимПодр="" or НаимПодр=" ": 
    НаимПодр=ПризнПодр;
 fi;
 for Iter=1..Позиции do
  Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","П.*","");
 od;
 ^False;
end;

Proc НаимПодр_OnExit(FieldName: String; Iter: Integer);
 ПризнПодр=НаимПодр;
end;

Func ФИОМОЛ_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
var Rec: Record;
 if Iter=-1:
    ПризнМОЛ=FieldName;
   else
    tmp=AnaElection("МОЛ.*",False,False,ПризнМОЛ);
    if tmp="": ^False; fi;
    ПризнМОЛ=tmp;
 fi;
 ФИОМОЛ=Name_A(ПризнМОЛ);
 if ФИОМОЛ="" or ФИОМОЛ=" ": ФИОМОЛ=ПризнМОЛ; fi;
 Rec=SignToRecord(ПризнМОЛ);
 if Rec<>nil:
    ДолжнМОЛ=GetCardFieldS("Сотрудники",rec,"ДОЛЖНОСТЬ.ДолжЗвание");
    if ДолжнМОЛ="":
       ДолжнМОЛ=GetCardFieldS("Сотрудники",rec,"ДОЛЖНОСТЬ.Долж");
    fi;
    ФИОРукПодр=GetCardFieldS("Сотрудники",rec,"ПОДРАЗДЕЛЕНИЕ.ОТВ.ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники",rec,"ПОДРАЗДЕЛЕНИЕ.ОТВ.ИНИЦИАЛЫ");
    if ПризнПодр="":
       Rec=GetCardFieldR("Сотрудники",rec,"ПОДРАЗДЕЛЕНИЕ");
       if Rec<>nil: 
	  ПризнПодр=CardFileRecSign("ПОДРАЗДЕЛЕНИЯ","КОД","П",Rec);
	  НаимПодр=Name_A(ПризнПодр);
	  if НаимПодр="" or НаимПодр=" ": НаимПодр=ПризнПодр; fi;
       fi;
    fi;
 fi;
 ^False;
end;

Func ФИОМОЛ_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Mask,tmp:S;
var n:I;
 Template.HideEditor(False);
 if Input(Mask,"Поиск. Введите фамилию или код признака...")=cmOk:
    if Mask="" or Mask="*":
       ФИОМОЛ_OnEnter("ФИОМОЛ",1);
      else
       ClearVariable(Buf);
       Mask="*"+Mask+"*";
       for Sign tmp="МОЛ.*", sort do
	if Match(Name_A(tmp),Mask) or Match(tmp,Mask):
	   AddInArray(Buf,True,False,tmp+"  --"+Name_A(tmp));
	fi;
       od;
       if LengthOfArray(Buf)=0:
	  Message("Не найдено ни одно вхождение по критерию поиска: "+Mask);
	 else
	  n=Alternate("Выберите подотчетное лицо",Buf,-1,1,12);
	  if not n=0:
	     ФИОМОЛ_OnEnter(Trim(ExtractWord(1,Buf[n],"--")),-1);
	  fi;
       fi;
    fi;
 fi;
 Return Cur;
end;

Func НазначАванс_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:i;
var tmp,Field:s;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 Field=AsString(Template.Field);
 tmp=Раб.Вспом.Основание.Выполнить(SelfCrd+"."+Field);
 if not tmp="" then 
    if Field="Назнач": Field="Позиции["+Str(Iter)+"]."+Field; fi;
    PutVariableS(Field,tmp);
 fi;
 Return Cur;
end;

Func ФИО_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Field:S;
var Rec:Record;
var v1,v2:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 Template.HideEditor(False);
 Rec=OpenCardFile("Сотрудники");
 if not Rec=nil:
    v1=GetCardFieldS("Сотрудники",rec,"ДОЛЖНОСТЬ.Долж");
    v2=GetCardFieldS("Сотрудники",rec,"ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники",rec,"ИНИЦИАЛЫ");
    if Field="ДолжнРук" or Field="ФИОРук": ДолжнРук=v1; ФИОРук=v2; hДолжнРук=ДолжнРук; hФИОРук=ФИОРук;
      |Field="ДолжнБух" or Field="ФИОБух": ДолжнБух=v1; ФИОБух=v2; hДолжнБух=ДолжнБух; hФИОБух=ФИОБух;
      |Field="ДолжнРукПодр" or Field="ФИОРукПодр": ДолжнРукПодр=v1; ФИОРукПодр=v2;
    fi;
 fi;
 Return Cur;
end;

Func verОКДП_Гр_OnEnter(FieldName: String; Iter: Integer): logical;
var i,v:i;
 if ДатаДок=1.1.100: Message("Введите дату",mtError); Template.Field="Датадок"; ^False; fi;
 ClearVariable(Buf);
 Buf[1]="Приказ Минэкономразвития РФ от 7 июня 2011 г. N 273";
 i=Alternate("Выберите редакцию номеклатуры",Buf,-1,if(verОКДП_Гр=273,2,1),12);
 if i=1: v=273;
   |true: ^False;
 fi;
 Return False;
end;

Func Валюта_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var Cur:S;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 n=0;
 for Currencies Cur="*&~"+BaseCurrency do
  n=n+1;
  Buf[n]=Up(Cur);
  Buf2[n]=Buf[n]+" --"+Name_C(Cur);
 od;
 if n=0: Message("Список валют пуст",mtWarning); ^False; fi;
 n=Alternate("Валюта",Buf2,-1,SearchInArray(Buf,Валюта),12);
 if n=0: ^False; fi;
 Валюта=Buf[n];
 Return False;
end;

Proc Валюта_OnExit(FieldName: String; Iter: Integer);
 Валюта=BaseCurrency;
end;

Func A_onEnter (Field:S; Iter:I):L;
var i:i;
 if Проводить: ^False; fi;
 i=Iter;
 Iter=InsertFrame(Позиции,Iter+1);
 if Field="AA":
    Позиции[Iter].ВД=Позиции[i].ВД;
    Позиции[Iter].КБК=Позиции[i].КБК;
    Позиции[Iter].ОКДП_Гр=Позиции[i].ОКДП_Гр;
    Позиции[Iter].ОКДП=Позиции[i].ОКДП;
    Позиции[Iter].ОКДП_Призн=Позиции[i].ОКДП_Призн;
    Позиции[Iter].Призн=Позиции[i].Призн;
    Позиции[Iter].Назнач=Позиции[i].Назнач;
    Позиции[Iter].СумРуб=Позиции[i].СумРуб;
    Позиции[Iter].СумВал=Позиции[i].СумВал;
    Позиции[Iter].СчДеб_БО=Позиции[i].СчДеб_БО;
    Позиции[Iter].СчКре_БО=Позиции[i].СчКре_БО;
    Позиции[Iter].СчДеб_ДО=Позиции[i].СчДеб_ДО;
    Позиции[Iter].СчКре_ДО=Позиции[i].СчКре_ДО;
    Позиции[Iter].Кмнт=Позиции[i].Кмнт;
 fi;
 ^False;
end;

Func D_onEnter (Field:S; Iter:I):L;
 if Проводить: ^False; fi;
 DeleteFrame(Позиции,Iter);
 ^False;
end;

Func ВД_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,Store,БК_,КОСГУ_:S;
 НеПустаяТабл;
 Store=Позиции[Iter].ВД;
 tmp=Раб.КБК.Список("*.?.208.??.*","","ВД");
 if tmp="": ^False; fi;
 Позиции[Iter].ВД=tmp;
 if not Store=tmp and not Позиции[Iter].КБК="":
    БК_=Раб.Бюджет2005.ВзятьКодКБК(Позиции[Iter].КБК,"","КБК",False);
    КОСГУ_=Раб.Бюджет2005.ВзятьКодКБК(Позиции[Iter].КБК,"","КОСГУ",False);
    if not Раб.Бюджет2005.ЕстьСчетПоМаске(БК_+"."+Позиции[Iter].ВД+".208.??."+КОСГУ_): Позиции[Iter].КБК=""; fi;
 fi;
 ОбновитьСч(Iter);
 Return False;
end;

Func КБК_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 НеПустаяТабл;
 if Позиции[Iter].ВД="": Message("Выберите вид деятельности",mtError); Template.Field="ВД"; Template.Frame=Iter; ^False; fi;
 tmp=Раб.Бюджет2005.Объединить(Раб.Договор.МаскаСчКБК,"*."+Позиции[Iter].ВД+"."+Раб.Бюджет2005.МаскаСч8,"&");
 Раб.КБК.Список_КБК_РазрДобав=True;
 Раб.КБК.Список_КБК_КодСч=Позиции[Iter].ВД+".???.??";
 Раб.КБК.Список_КБК_РазрКОСГУ=true;
 tmp=Раб.КБК.Список(tmp,"","КБК+КОСГУ И");
 if not tmp="":
    Позиции[Iter].КБК=tmp;
    ОбновитьСч(Iter);
    ПолучитьДопАн(Iter);
 fi;
 ^False;
end;

Func Призн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,ИсклПризн_,voc:S;
 НеПустаяТабл;
 if Позиции[Iter].КБК="": Message("Выберите КБК",mtError); Template.Field="КБК"; Template.Frame=Iter; ^False; fi;
 ОбновитьСч(Iter);
 if Позиции[Iter].СчДеб="": Message("Выберите счет дебета",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
 if УчетБО:
    if Позиции[Iter].СчДеб_БО="": Message("Выберите счет дебета БО",mtError); Template.Field="СчДеб_БО"; Template.Frame=Iter; ^False; fi;
    if Позиции[Iter].СчКре_БО="": Message("Выберите счет кредита БО",mtError); Template.Field="СчКре_БО"; Template.Frame=Iter; ^False; fi;
 fi;
 if УчетДО:
    if Позиции[Iter].СчДеб_ДО="": Message("Выберите счет дебета ДО",mtError); Template.Field="СчДеб_ДО"; Template.Frame=Iter; ^False; fi;
    if Позиции[Iter].СчКре_ДО="": Message("Выберите счет кредита ДО",mtError); Template.Field="СчКре_ДО"; Template.Frame=Iter; ^False; fi;
 fi;
-- tmp=Раб.Бюджет2005.ПризнВСправ(Позиции[Iter].Призн," ",".*");
-- tmp=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(tmp," ","|");
-- ИсклПризн_=Раб.Бюджет2005.Объединить(ИсклПризн,tmp,"|");
 ИсклПризн_=ИсклПризн;
 tmp=ПолучитьМаскуСчетов(Iter,"");
 tmp=Раб.Бюджет2005.СписокСправ(tmp,0,ИсклПризн_);
 if tmp="": Message("Аналитические признаки не требуются"); ^False; fi;
 ПолучитьДопАн(Iter);
 tmp=AnaElection(tmp+"|*&~*.*",False,False,hПризн);
 if not tmp="":
    Voc=SubStr(tmp,1,Pos(".",tmp));
    if Voc="": Voc=tmp; else Voc=Voc+"*"; fi;
    hПризн=tmp;
    tmp=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].Призн," ",tmp,voc,"");
    Позиции[Iter].Призн=tmp;
    if Voc="П.*":
       ПризнПодр="";
       НаимПодр="";
    fi;
 fi;
 Return False;
end;

Proc Призн_OnExit(FieldName: String; Iter: Integer);
 НеПустаяТабл;
 Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(Позиции[Iter].Призн," ","Name_A");
end;

Func ОКДП_Гр_OnEnter(FieldName: String; Iter: Integer): logical;
 if ДатаДок=1.1.1: Message("Введите дату",mtError); Template.Field="ДатаДок"; ^False; fi;
 НеПустаяТабл;
 Return True;
end;

Func ОКДП_Гр_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
 ОКДП_=Позиции[Iter].ОКДП;
 Return Раб.Договор.ОКДП_Гр_Verify(selfbln+".ОКДП_",Value,verОКДП_Гр);
end;

Proc ОКДП_Гр_OnExit(FieldName: String; Iter: Integer);
 НеПустаяТабл;
 ОКДП_Гр_=Позиции[Iter].ОКДП_Гр;
 Раб.Договор.ОКДП_Гр_Exit(selfbln+".ОКДП_Гр_");
 Позиции[Iter].ОКДП_Гр=ОКДП_Гр_;
end;

Func ОКДП_Гр_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var rec: Record;
 НеПустаяТабл;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 ОКДП_Гр_=Позиции[Iter].ОКДП_Гр;
 ОКДП_=Позиции[Iter].ОКДП;
 rec=Раб.Договор.ОКДП_Гр_Lookup(selfbln+".ОКДП_Гр_",selfbln+".ОКДП_",verОКДП_Гр);
 if not rec=nil:
    Позиции[Iter].ОКДП_Гр=ОКДП_Гр_;
    Позиции[Iter].ОКДП=ОКДП_;
 fi;
 Return Cur;
end;


Func ОКДП_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var rec: Record;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if not ФЗ=0:
    ОКДП_=Позиции[Iter].ОКДП;
    rec=Раб.Договор.ОКПД_Lookup(selfbln+".ОКДП_",selfbln+".fОКДП","");
    if not rec=nil:
       if not Length(ОКДП_)=12:
	  Message("Уточните значение категории и подкатегории");
	  rec=OpenCardFile("РПО_ОКПД","(Length(Код)=12 and Match(Код,'"+ОКДП_+"*')) or Код='"+ОКДП_+"'",Rec);
	  if not Rec=nil:
	     ОКДП_=GetCardFieldS("РПО_ОКПД",Rec,"Код");
	     if not Length(ОКДП_)=12:
		Message("Допустимо выбирать код XX.XX.XX.XXX");
		^Cur;
	       else
		Позиции[Iter].ОКДП=ОКДП_;
	     fi;
	  fi;
       fi;
    fi;
   else
    ОКДП_Гр_=Позиции[Iter].ОКДП_Гр;
    ОКДП_=Позиции[Iter].ОКДП;
    rec=Раб.Договор.ОКДП_Lookup(selfbln+".ОКДП_Гр_",selfbln+".ОКДП_",selfbln+".fОКДП",verОКДП_Гр);
    if not rec=nil:
       Позиции[Iter].ОКДП_Гр=ОКДП_Гр_;
       Позиции[Iter].ОКДП=ОКДП_;
    fi;
 fi;
 Return Cur;
end;

Func ОКДП_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
 if not ФЗ=0:
    ^Раб.Договор.ОКПД_Verify(Value,"Length(Код)=12");
   else
    ОКДП_Гр_=Позиции[Iter].ОКДП_Гр;
    if Раб.Договор.ОКДП_Verify(selfbln+".ОКДП_Гр_",Value,verОКДП_Гр):
       Позиции[Iter].ОКДП_Гр=ОКДП_Гр_;
       ^True;
      else
       ^False;
    fi;
 fi;
end;

Proc ОКДП_OnClick(Row: Integer; Col: Integer; Double: Logical);
var Field,Name,tmp:s;
var Iter:I;
var Obj: Object;
 Iter=AsInteger(Template.Frame);
 Name=AsString(Template.Name);
 if FindObject(Name,Obj):
    Field=AsString(Obj.Cell(Row,Col-1,CellContents,"",False));
    tmp=GetVariableS(Trim("Позиции["+Str(Iter)+"]."+Field));
    if tmp="": Message("Введите код "+if(Field="ОКДП":"ОКПД"|Field="ОКДП":"ОКДП"|True:"номенклатурной группы"),mtError); Template.Field=Field; Template.Frame=Iter; Exit; fi;
    if Field="ОКДП" and not ФЗ=0: tmp=Раб.Договор.ВзятьЗначОКПД(tmp,"Наим");
      |Field="ОКДП" and ФЗ=0: tmp=Раб.Договор.ВзятьЗначОКДП(tmp,"Наим");
      |Field="ОКДП_Гр": tmp=Раб.Бюджет.НаимКБК(if(verОКДП_Гр=273,"ОКДП_ГР273","ОКДП_ГР"),tmp);
      |true: tmp="";
    fi;
    if not tmp="":
       Message(tmp);
    fi;
 fi;
end;

Proc Сч_OnClick(Row: Integer; Col: Integer; Double: Logical);
var Iter:I;
 Iter=AsInteger(Template.Frame);
 if Позиции[Iter].КБК="": Message("Выберите КБК",mtError); Template.Field="КБК"; Template.Frame=Iter; Exit; fi;
 ОбновитьСч(Iter);
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc cbПроводить_OnChange(Sender: String);
 if not Проводить:
    if EnqOkCancel("Вы уверены, что хотите исключить данный документ из обработки ?",mtWarning)=cmCancel: EditorCancel; Exit; fi;
   else
    Проводить=Проверить;
 fi;
 cbПроводить.State=Проводить;
 if Проводить: EditorApply; fi;
 Оформление;
end;

Proc cbУчетБОДО_OnChange(Sender: String);
 ОбновитьСч(-1);
end;

Proc btnРКО_OnClick(Sender: String);
var OWA,OA,n1,n2,nn2,Iter,Номер,i,ii:I;
var Ист,Тип,tmp,Подр,Призн_,Цель_,Гл,Бюдж,s1,s2:S;
var Rec:Record;
var Flag:L;
 if not Проводить: Message("Заявление на выдачу аванса должно быть проведено",mtError); Template.Object="cbПроводить"; Exit; fi;
 tmp=Позиции[1].ВД;
 for Iter=2..Позиции do
  if not tmp=Позиции[Iter].ВД: Message("Формирование РКО возможно, только по одному источнику"); Template.Field="ВД"; Template.Frame=Iter; Exit; fi;
 od;
 ClearVariable(Buf);
 Номер=Раб.Обл.СледСУчетомГода("РАСХОРД","Номер","Д");
 OWA=OpenWorkArea("РАСХОРД","","Match(Призн,'*АВ."+Признак+"*') or Match(Цель,'*АВ."+Признак+"*') or РПО_PacketMode");
 Try
  ii=Records(OWA);
  if not ii=0:
     OA=OpenArray(OWA,1,"РПО_Позиции","","Match(ТПризн,'*АВ."+Признак+"*')");
     ClearTrace(True);
  fi;
  Flag=True;
  for i=1..ii do
   Rec=GetRecordKey(OWA,i);
   if not GetFieldL(OWA,i,"РПО_PacketMode") or not Records(OA)=0:
      if Flag:
	 if EnqOkCancel("РКО №"+GetFieldS(OWA,i,"НомерБум")+" от "+DateToString(GetFieldD(OWA,i,"Д"))+" уже сформирован по текущему заявлению^MВы уверены, что хотите, "+if(Sender="btnДобРКО","выбрать другой","создать новый")+" РКО ?",mtWarning)=cmCancel:
	    OpenBlank("ДОКУМЕНТЫ.КАССА.РАСХОРД",True,Rec);
	    Exit;
	   else
	    Flag=False;
	 fi;
      fi;
      Trace("РКО №"+GetFieldS(OWA,i,"НомерБум")+" от "+DateToString(GetFieldD(OWA,i,"Д"))+" уже сформирован по текущему заявлению");
   fi;
  od;
  if Sender="btnДобРКО":
     Rec=OpenCardFile("РАСХОРД","-- not Проводить and Валюта='"+Валюта+"' and ПО='"+ПризнПодр+"' and Рекв="+RecordToString(Рекв),hРКО);
     if Rec=nil: Exit; fi;
     hРКО=Rec;
     SetFilter(OWA,"Ukey="+RecordToString(Rec));
     Rec=GetRecordKey(OWA,1);
     if not GetFieldL(OWA,1,"РПО_PacketMode") or not Records(OA)=0:
	Message("РКО №"+GetFieldS(OWA,1,"НомерБум")+" от "+DateToString(GetFieldD(OWA,1,"Д"))+" уже сформирован по текущему заявлению",mtError);
	OpenBlank("ДОКУМЕНТЫ.КАССА.РАСХОРД",True,Rec);
	Exit;
     fi;
    else
     SetFilter(OWA,"1=0");
  fi;
  BeginChanging(OWA,False);
  Try
   if Sender="btnДобРКО":
      SetFilter(OA,"");
      n1=1;
      n1=PutFieldS(OWA,n1,"Осн","");
      n1=PutFieldS(OWA,n1,"ФИО","");
      n1=PutFieldS(OWA,n1,"Паспорт","");
      n1=PutFieldN(OWA,n1,"Сумма",GetFieldN(OWA,n1,"Сумма")+if(Валюта=BaseCurrency,ВсегоСумРуб,ВсегоСумВал));
     else
      n1=InsertRecord(OWA);
      OA=OpenArray(OWA,1,"РПО_Позиции","");
      n1=PutFieldI(OWA,n1,"Номер",Номер);
      n1=PutFieldS(OWA,n1,"НомерБум",Str(Номер));
      n1=PutFieldS(OWA,n1,"ПО",ПризнПодр);
      n1=PutFieldN(OWA,n1,"Сумма",if(Валюта=BaseCurrency,ВсегоСумРуб,ВсегоСумВал));
      n1=PutFieldS(OWA,n1,"Валюта",Валюта);
      Тип=Раб.Бюджет2005.ТипКБКСчета(Позиции[1].СчДеб);
      Ист=Позиции[1].ВД;
      Гл=Раб.Бюджет2005.ВзятьКодСчета(Позиции[1].СчДеб,Тип,"ППП",False);
      Бюдж="01";
      n1=PutFieldS(OWA,n1,"Кр",Гл+".01.05.02.01."+Бюдж+".0000."+Ист+".201.34.610");
      n1=PutFieldS(OWA,n1,"Счет",Позиции[1].СчДеб);
      n1=PutFieldS(OWA,n1,"Осн",Раб.Бюджет2005.Объединить(Осн,НазначАванс," "));
      n1=PutFieldR(OWA,n1,"Рекв",Рекв);
      n1=PutFieldS(OWA,n1,"РПО_ДолжнРук",ДолжнРук);
      n1=PutFieldS(OWA,n1,"РПО_ФиоРук",ФиоРук);
      n1=PutFieldS(OWA,n1,"РПО_ДолжнБух",ДолжнБух);
      n1=PutFieldS(OWA,n1,"РПО_ФиоБух",ФиоБух);
      n1=PutFieldS(OWA,n1,"РПО_ФиоКасс",Рекв.ФиоКасс);
      Rec=SignToRecord(ПризнМол);
      if Rec=nil:
	 n1=PutFieldS(OWA,n1,"ФИО",ФИОМОЛ);
	else
	 s1=GetCardFieldS("Сотрудники",Rec,"ФКОМУ");
	 s2=GetCardFieldS("Сотрудники",Rec,"ИОКОМУ");
	 if s1="" or s2="":
	    n1=PutFieldS(OWA,n1,"ФИО",ФИОМОЛ);
	   else
	    n1=PutFieldS(OWA,n1,"ФИО",s1+" "+s2);
	    n1=PutFieldS(OWA,n1,"Паспорт",GetCardFieldS("Сотрудники",Rec,"Паспорт"));
	 fi;
      fi;
   fi;
   if Позиции>1 or Sender="btnДобРКО":
      if Sender="btnДобРКО":
	 nn2=Records(OA);
	else
	 nn2=0;
      fi;
      n1=PutFieldL(OWA,n1,"РПО_PacketMode",True);
      for Iter=1..Позиции do
       n2=InsertRecord(OA,nn2+Iter);
       Тип=Раб.Бюджет2005.ТипКБКСчета(Позиции[Iter].СчДеб);
       Ист=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчДеб,Тип,"Ист",False);
       Гл=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчДеб,Тип,"ППП",False);
       Бюдж="01";
       Призн_=Раб.Бюджет2005.Объединить(Позиции[Iter].Призн,"АВ."+Признак," ");
       Призн_=Раб.Бюджет2005.Объединить(Призн_,ПризнМол," ");
       n2=PutFieldS(OA,n2,"ТКСчет",Гл+".01.05.02.01."+Бюдж+".0000."+Ист+".201.34.610");
       n2=PutFieldS(OA,n2,"ТСчет",Позиции[Iter].СчДеб);
       if not Match(Призн_,"*ФКР.*"): Призн_=Раб.Бюджет.ДобавитьПризнак(Призн_,"ФКР."+Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчДеб,Тип,"КБК",False)); fi;
       if not Match(Призн_,"*КОСГУ.*"): Призн_=Раб.Бюджет.ДобавитьПризнак(Призн_,"КОСГУ."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчДеб,Тип,"АН",False))); fi;
       Призн_=Раб.Бюджет.МухиОтКотлет(Призн_,Раб.Бюджет.НаборПризнаков(GetFieldS(OA,n2,"ТСчет"),GetFieldS(OA,n2,"ТКСчет"),""));
       n2=PutFieldS(OA,n2,"ТПризн",Призн_);
       n2=PutFieldN(OA,n2,"ТСумма",if(Валюта=BaseCurrency,Позиции[Iter].СумРуб,Позиции[Iter].СумВал));
       n2=PutFieldS(OA,n2,"ТПримеч",Позиции[Iter].Назнач);
      od;
      nn2=Records(OA);
      tmp=GetFieldS(OA,1,"ТСчет");
      Flag=True;
      for n2=1..nn2 do
       AddInArray(Buf,True,False,Раб.Бюджет2005.ВзятьКодСчета(GetFieldS(OA,n2,"ТСчет"),Тип,"СЧ9",False));
       if not tmp=GetFieldS(OA,n2,"ТСчет"): Flag=False; fi;
      od;
      if not Flag:
	 tmp="";
	 ii=LengthOfArray(Buf);
	 for i=1..ii do
	  tmp=Раб.Бюджет2005.Объединить(tmp,Buf[i],"; ");
	 od;
	 n1=PutFieldS(OWA,n1,"Счет",tmp);
      fi;
     else
      Призн_=Раб.Бюджет.ДобавитьПризнак(Позиции[1].Призн,"АВ."+Признак+" "+ПризнМол);
      if not Match(Призн_,"*ФКР.*"): Призн_=Раб.Бюджет.ДобавитьПризнак(Призн_,"ФКР."+Раб.Бюджет2005.ВзятьКодСчета(Позиции[1].СчДеб,Тип,"КБК",False)); fi;
      if not Match(Призн_,"*КОСГУ.*"): Призн_=Раб.Бюджет.ДобавитьПризнак(Призн_,"КОСГУ."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Позиции[1].СчДеб,Тип,"АН",False))); fi;
      Призн_=Раб.Бюджет.МухиОтКотлет(Призн_,Раб.Бюджет.НаборПризнаков(GetFieldS(OWA,n1,"Счет"),GetFieldS(OWA,n1,"Кр"),""));
      Цель_=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Призн_," ","ФКР.*|КОСГУ.*","|");
      Призн_=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Призн_," ","ФКР.*|КОСГУ.*","|");
      n1=PutFieldS(OWA,n1,"Призн",Призн_);
      n1=PutFieldS(OWA,n1,"Цель",Цель_);
   fi;
   Rec=GetRecordKey(OWA,n1);
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 Message("Расходный ордер успешно сформирован");
 OpenBlank("ДОКУМЕНТЫ.КАССА.РАСХОРД",True,Rec);
end;

Proc btnВед_OnClick(Sender: String);
var OWA,OA,n1,n2,nn2,Iter,Н1,Н2,i,ii,Номер:I;
var Ист,Тип,tmp,Подр,Призн_,Цель_,Гл,Бюдж,s1,s2:S;
var Rec:Record;
var Flag:L;
 if not Проводить: Message("Заявление на выдачу аванса должно быть проведено",mtError); Template.Object="cbПроводить"; Exit; fi;
 tmp=Позиции[1].ВД;
 for Iter=2..Позиции do
  if not tmp=Позиции[Iter].ВД: Message("Формирование ведомости возможно, только по одному источнику"); Template.Field="ВД"; Template.Frame=Iter; Exit; fi;
 od;
 ClearVariable(Buf);
 OWA=OpenWorkArea("РасхОрд","","Match(Призн,'*АВ."+Признак+"*') or Match(Цель,'*АВ."+Признак+"*') or РПО_PacketMode");
 Try
  ii=Records(OWA);
  if not ii=0:
     OA=OpenArray(OWA,1,"РПО_Позиции","","Match(ТПризн,'*АВ."+Признак+"*')");
     ClearTrace(True);
  fi;
  Flag=True;
  for i=1..ii do
   Rec=GetRecordKey(OWA,i);
   if not GetFieldL(OWA,i,"РПО_PacketMode") or not Records(OA)=0:
      if Flag:
	 if EnqOkCancel("РКО №"+GetFieldS(OWA,i,"НомерБум")+" от "+DateToString(GetFieldD(OWA,i,"Д"))+" уже сформирован по текущему заявлению^MВы уверены, что хотите, "+if(Sender="btnДобВед","выбрать другую","создать новую")+" ведомость ?",mtWarning)=cmCancel:
	    OpenBlank("ДОКУМЕНТЫ.КАССА.РАСХОРД",True,Rec);
	    Exit;
	   else
	    Flag=False;
	 fi;
      fi;
      Trace("РКО №"+GetFieldS(OWA,i,"НомерБум")+" от "+DateToString(GetFieldD(OWA,i,"Д"))+" уже сформирован по текущему заявлению");
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 Н1=Раб.Обл.СледСУчетомДаты("РасхОрд","Номер","Д",ToDay);
 Н2=Раб.Обл.СледСУчетомДаты("РПО_ВедПодОтчет","Номер","ДатаРКО",ToDay);
 Номер=Max(Н1,Н2);
 OWA=OpenWorkArea("РПО_ВЕДПОДОТЧЕТ","");
 Try
  ii=Records(OWA);
  if not ii=0:
     OA=OpenArray(OWA,1,"Позиции","","Match(Призн,'*АВ."+Признак+"*')");
     ClearTrace(True);
  fi;
  Flag=True;
  for i=1..ii do
   Rec=GetRecordKey(OWA,i);
   if not Records(OA)=0:
      if Flag:
	 if EnqOkCancel("Ведомость №"+GetFieldS(OWA,i,"НомерРКО")+" от "+DateToString(GetFieldD(OWA,i,"ДатаРКО"))+" уже сформирована по текущему заявлению^MВы уверены, что хотите, "+if(Sender="btnДобВед","выбрать другую","создать новую")+" ведомость ?",mtWarning)=cmCancel:
	    OpenBlank("ДОКУМЕНТЫ.КАССА.ВЕДПОДОТЧЕТ",True,Rec);
	    Exit;
	   else
	    Flag=False;
	 fi;
      fi;
      Trace("Ведомость №"+GetFieldS(OWA,i,"НомерРКО")+" от "+DateToString(GetFieldD(OWA,i,"ДатаРКО"))+" уже сформирована по текущему заявлению");
   fi;
  od;
  if Sender="btnДобВед":
     Rec=OpenCardFile("РПО_ВЕДПОДОТЧЕТ","-- not Проводить and ПО='"+ПризнПодр+"' and Рекв="+RecordToString(Рекв),hВед);
     if Rec=nil: Exit; fi;
     hВед=Rec;
     SetFilter(OWA,"Ukey="+RecordToString(Rec));
     Rec=GetRecordKey(OWA,1);
     if not Records(OA)=0:
	Message("Ведомость №"+GetFieldS(OWA,1,"НомерРКО")+" от "+DateToString(GetFieldD(OWA,1,"ДатаРКО"))+" уже сформирована по текущему заявлению",mtError);
	OpenBlank("ДОКУМЕНТЫ.КАССА.ВЕДПОДОТЧЕТ",True,Rec);
	Exit;
     fi;
    else
     SetFilter(OWA,"1=0");
  fi;
  BeginChanging(OWA,False);
  Try
   if Sender="btnДобВед":
      SetFilter(OA,"");
      n1=1;
      n1=PutFieldN(OWA,n1,"СумВедом",GetFieldN(OWA,n1,"СумВедом")+if(Валюта=BaseCurrency,ВсегоСумРуб,ВсегоСумВал));
     else
      n1=InsertRecord(OWA);
      OA=OpenArray(OWA,n1,"Позиции","");
      n1=PutFieldI(OWA,n1,"Номер",Номер);
      n1=PutFieldS(OWA,n1,"НомерРКО",Str(Номер));
--	n1=PutFieldS(OWA,n1,"ОбщПризнПодр",ПризнПодр);
--	n1=PutFieldS(OWA,n1,"ОбщНаимПодр",Name_A(ПризнПодр));
      n1=PutFieldN(OWA,n1,"СумВедом",if(Валюта=BaseCurrency,ВсегоСумРуб,ВсегоСумВал));
      n1=PutFieldS(OWA,n1,"Валюта",Валюта);
      Тип=Раб.Бюджет2005.ТипКБКСчета(Позиции[1].СчДеб);
      Ист=Позиции[1].ВД;
      Гл=Раб.Бюджет2005.ВзятьКодСчета(Позиции[1].СчДеб,Тип,"ППП",False);
      Бюдж="01";
      n1=PutFieldS(OWA,n1,"ОбщСчКре",Гл+".01.05.02.01."+Бюдж+".0000."+Ист+".201.34.610");
      n1=PutFieldS(OWA,n1,"ОбщСчДеб",Позиции[1].СчДеб);
      n1=PutFieldR(OWA,n1,"Рекв",Рекв);
      n1=PutFieldS(OWA,n1,"ФиоРук",ФиоРук);
      n1=PutFieldS(OWA,n1,"ФиоБух",ФиоБух);
      n1=PutFieldS(OWA,n1,"ФиоКасс",Рекв.ФиоКасс);
   fi;
   if Sender="btnДобВед":
      nn2=Records(OA);
     else
      nn2=0;
   fi;
   for Iter=1..Позиции do
    n2=InsertRecord(OA,nn2+Iter);
    n2=PutFieldS(OA,n2,"ПризнМОЛ",ПризнМОЛ);
    n2=PutFieldS(OA,n2,"ФИО",if(Name_A(ПризнМОЛ)="" or Name_A(ПризнМОЛ)=" ",ПризнМОЛ,Name_A(ПризнМОЛ)));
    n2=PutFieldS(OA,n2,"ПризнПодр",ПризнПодр);
    n2=PutFieldS(OA,n2,"НаимПодр",if(Name_A(ПризнПодр)="" or Name_A(ПризнПодр)=" ",ПризнПодр,Name_A(ПризнПодр)));
    n2=PutFieldS(OA,n2,"СчДеб",Позиции[Iter].СчДеб);
    n2=PutFieldN(OA,n2,"Сумма",if(Валюта=BaseCurrency,Позиции[Iter].СумРуб,Позиции[Iter].СумВал));
    Призн_=Раб.Бюджет2005.Объединить(Позиции[Iter].Призн,"АВ."+Признак," ");
    if not Match(Призн_,"*ФКР.*"): Призн_=Раб.Бюджет.ДобавитьПризнак(Призн_,"ФКР."+Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчДеб,Тип,"КБК",False)); fi;
    if not Match(Призн_,"*КОСГУ.*"): Призн_=Раб.Бюджет.ДобавитьПризнак(Призн_,"КОСГУ."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчДеб,Тип,"АН",False))); fi;
    Призн_=Раб.Бюджет.МухиОтКотлет(Призн_,Раб.Бюджет.НаборПризнаков(GetFieldS(OA,n2,"СчДеб"),GetFieldS(OWA,n1,"ОбщСчКре"),""));
    n2=PutFieldS(OA,n2,"Призн",Призн_);
    n2=PutFieldS(OA,n2,"Примеч",Позиции[Iter].Назнач);
   od;
   nn2=Records(OA);
   tmp=GetFieldS(OA,1,"СчДеб");
   Flag=True;
   for n2=1..nn2 do
    AddInArray(Buf,True,False,Раб.Бюджет2005.ВзятьКодСчета(GetFieldS(OA,n2,"СчДеб"),Тип,"СЧ9",False));
    if not tmp=GetFieldS(OA,n2,"СчДеб"): Flag=False; fi;
   od;
   if not Flag:
      tmp="";
      ii=LengthOfArray(Buf);
      for i=1..ii do
       tmp=Раб.Бюджет2005.Объединить(tmp,Buf[i],"; ");
      od;
      n1=PutFieldS(OWA,n1,"ОбщСчДеб",tmp);
   fi;
   Rec=GetRecordKey(OWA,n1);
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 Message("Ведомость успешно сформирована");
 OpenBlank("ДОКУМЕНТЫ.КАССА.ВЕДПОДОТЧЕТ",True,Rec);
end;

Func Позиции_OnInsert(SectName: String): Logical;
 Return not Проводить;
end;

Func Позиции_OnDelete(SectName: String; Iter: Integer): Logical;
 Return not Проводить;
end;

Proc btnОтчет_OnClick(Sender: String);
 if ПризнМОЛ="": Message("Заполните подотчетное лицо",mtError); Template.Field="ФИОМОЛ"; Exit; fi;
 Refresh;
 if Sender="btnОтчетПров" or Sender="btnОтчетПровАв":
    Report('"'+PlanVar("Std_Rpo")+'\Общие\Отчеты\Служебные отчеты.lst"."001_АВ"',1.1.2000,ToDay+1,"*.208.??.*",ПризнМОЛ+if(Sender="btnОтчетПровАв","&АВ."+Признак,""));
   else
    Report('"'+PlanVar("Std_Rpo")+'\Общие\Отчеты\Служебные отчеты.lst"."010_АВ"',Dat(1,1,Year(ToDay)),ToDay+1,"*.208.??.*",ПризнМОЛ+if(Sender="btnОтчетСчетаАв","&АВ."+Признак,""));
 fi;
end;

Proc btnФ30_OnClick(Sender: String);
 OpenBlank("ДОКУМЕНТЫ.ПРОЧИЕ.ЗАЯВЛ_АВАНС_6002404",True,Current);
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 FlagInit=True;
 Инициализация;
end;

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

Proc OnRead;
 if НоваяЗапись:
    if Рекв=nil:
       Рекв=Раб.Бюджет2005.НашРекв;
       if not Рекв=nil:  
	  ДолжнРук=Рекв.ДолжнРук;
	  ФИОРук=Рекв.ФИОРук;
	  ДолжнБух=Рекв.ДолжнБух;
	  ФИОБух=Рекв.ФИОБух;
       fi;
    fi;
    if not hДолжнРук="" and not hФИОРук="": ДолжнРук=hДолжнРук; ФИОРук=hФИОРук; fi;
    if not hДолжнБух="" and not hФИОБух="": ДолжнБух=hДолжнБух; ФИОБух=hФИОБух; fi;
    ДатаДок=ToDay;
    Номер=Раб.Обл.СледСУчетомДаты(SelfCrd,"Номер","ДатаДок",ДатаДок);
    НомерДок=Str(Номер);
    verОКДП_Гр=273;
    Проводить=False;
    ClosedModFob=False;
 fi;
 if not FlagInit: Оформление; fi;
end;

Func OnVerify: Logical;
var Iter:I;
var tmp:s;
 if not verОКДП_Гр=273: verОКДП_Гр=273; fi;
 if Валюта="": Валюта=BaseCurrency; fi;
 if Проводить: RefreshAna; fi;
 for Iter=1..Позиции do
  if ФЗ=0:
     if Позиции[Iter].ОКДП_Гр="" and Позиции[Iter].ОКДП="":
	Позиции[Iter].ОКДП_Призн="";
       else
	Позиции[Iter].ОКДП_Призн=Раб.Договор.ОКДП_В_Признак(Позиции[Iter].ОКДП_Гр,Позиции[Iter].ОКДП,False,verОКДП_Гр);
     fi;
    else
     if Позиции[Iter].ОКДП="":
	Позиции[Iter].ОКДП_Призн="";
       else
	Позиции[Iter].ОКДП_Призн=Раб.Договор.ОКДП_В_Признак("",Позиции[Iter].ОКДП,False,1);
     fi;
     Позиции[Iter].ОКДП_Гр="";
  fi;
 od;
 if not НомерДок="" and not ДатаДок=1.1.100:
    tmp=Раб.Договор.ConvertStr(НомерДок);
    Признак=Str(Year(ДатаДок))+"."+RepStr("0",Max(0,5-Length(tmp)))+tmp;
    Признак_Кмнт="Заяв. на выдачу аванса №"+НомерДок+" от "+DateToString(ДатаДок)+" "+ФИОМОЛ+" ("+НазначАванс+")";
 fi;
 Return True;
end;
--Обработчики событий шаблона -----
--


Конец
