-- Шаблон создан мастером бланков
-- 06.02.2010 16:53:06
--
БланкСШаблоном "Зачет аванса", Редактор РПО_ДО_ЗАЧЕТ_АВАНСА;

var УпрНастр:L;
var НастрПоУмолч:S="Настройка по умолчанию";
var НастрЗакр:S="Закрыть настройку";

var fJumpOff:L;
var fJumpOff_:S=if(fJumpOff,"Да","Нет");
var blnБухСправка:S;
var extКлюч:S;

var НастрGUID:S;

Страница:I;

btnСохр    : Object;
btnОтмена  : Object;
btnНастр   : Object;
btnБухСправ: Object;
btnУдалить : Object;
btnЗакрыть : Object;
cbРег      : Object;
cbНеПровДО : Object;

btnПлат    : Object;
btnАванс   : Object;
btnЗачет   : Object;
btnГЭК2    : Object;


var ИсклПризн:S="БО.*|ПЕРИОД.*";

var nРасшифр_Аванс:I=Расшифр_Аванс;
var nРасшифр_Зачет:I=Расшифр_Зачет;

var Аванс_:S=Аванс.НаимДок.Наим+" №"+Аванс.НомерДок+" от "+DateToString(Аванс.ДатаДок);
var exАванс:S="";

var Договор_:S=Аванс.Договор.НаимДок.Наим+" №"+Аванс.Договор.НомерДок+" от "+DateToString(Аванс.Договор.ДатаДок);

var ЗаглАвОпл:S="Сумма оплат аванса на "+DateToString(ДатаРег);
var ЗаглАвЗачет:S="Сумма зачетов аванса на "+DateToString(ДатаРег);

var ОбновРасшифрАв:S=if(Рег,"","Обновить");

var ЗаглВал:S="в валюте обязательства ("+Вал+")";

var пп[]:i=$;
var АвПризн_[]:S=Trim(Расшифр_Аванс[$].Призн+" "+Расшифр_Аванс[$].ПризнДоп);
var Сум_[]:N=Расшифр_Аванс[$].Сум;
var Опл_[]:N=Расшифр_Аванс[$].Опл;
var СумЗачет_[]:N=Расшифр_Аванс[$].СумЗачет;
var ОстАв[]:N=Расшифр_Аванс[$].Опл-Расшифр_Аванс[$].СумЗачет-Расшифр_Аванс[$].ТекЗачет;
var ОстРубАв[]:N=Расшифр_Аванс[$].ОплРуб-Расшифр_Аванс[$].СумРубЗачет-Расшифр_Аванс[$].ТекРубЗачет;

var Аванс_Сум_:N=Аванс_Сум;
var Аванс_Опл_:N=Аванс_Опл;
var Аванс_СумЗачет_:N=Аванс_СумЗачет;
var Аванс_ОстАв:N=SumOfArray(ОстАв,Расшифр_Аванс);
var Аванс_ОстРубАв:N=SumOfArray(ОстРубАв,Расшифр_Аванс);

var ОчистРасшифрЗачет:S=if(Рег,"","Очистить");

var ЗаглДООпл:S="Сумма оплат на "+DateToString(ДатаРег);

var A:S=if(Рег,"","+");
var AA:S=if(Рег,"","++");
var D:S=if(Рег,"","-");

var ДО_:S;
var ЗачетПризн_[]:S=Trim(Расшифр_Зачет[$].Призн+" "+Расшифр_Зачет[$].ПризнДоп);
var КБК_Ав_[]:S=Расшифр_Зачет[$].КБК_Ав;
var ЗачетПризн_Ав_[]:S=Trim(Расшифр_Зачет[$].Призн_Ав+" "+Расшифр_Зачет[$].ПризнДоп_Ав);

var ДО_Сум_[]:N=Расшифр_Зачет[$].ДО_Сум;
var ДО_Опл_[]:N=Расшифр_Зачет[$].ДО_Опл;

var БК_ДО[]:S=if(Расшифр_Зачет[$].КБК_Ав="",SubStr(Расшифр_Зачет[$].КБК,1,20),SubStr(Расшифр_Зачет[$].КБК_Ав,1,20));
var КОСГУ_ДО[]:S=if(Расшифр_Зачет[$].КБК_Ав="",SubStr(Расшифр_Зачет[$].КБК,22,3),SubStr(Расшифр_Зачет[$].КБК_Ав,22,3));

var СчДеб_ДО[]:S=if((Расшифр_Зачет[$].ВД="1" or Расшифр_Зачет[$].ВД="2") and not Расшифр_Зачет[$].КБК="",SubStr(Расшифр_Зачет[$].КБК,1,20)+"."+Расшифр_Зачет[$].ВД+".502.11."+SubStr(Расшифр_Зачет[$].КБК,22,3),"");
var СчКре_ДО[]:S=if((Расшифр_Зачет[$].ВД="1" or Расшифр_Зачет[$].ВД="2") and not БК_ДО[$]="",БК_ДО[$]+"."+Расшифр_Зачет[$].ВД+".502.12."+КОСГУ_ДО[$],"");

var ИтогСум:N=SumOfArray(Расшифр_Зачет[].Сум);
var ИтогСумРуб:N=SumOfArray(Расшифр_Зачет[].СумРуб);

var СканГЭК2:S=if(Рег,"","Сканирование");
var ОбновГЭК2:S="Обновить";
var ГЭК2вPDF:S="Выгрузить в PDF";
    ПутьPDF:S;

var УпрГЭК2:I;
var ГЭК2Дат []:D;
var ГЭК2Лист[]:S;
var ГЭК2Кмнт[]:S;
var ГЭК2CU  []:S;
var ГЭК2MU  []:S;
var ГЭК2Rec []:Record;

var crdДоговор:S=if(Аванс.Настр.crdДоговор="",Раб.Договор.crdДоговор,Аванс.Настр.crdДоговор);
var crdДО     :S=if(Аванс.Настр.crdДО="",Раб.Договор.crdДО,Аванс.Настр.crdДО);

var blnДоговор:S=if(Аванс.Настр.blnДоговор="",Раб.Договор.blnДоговор,Аванс.Настр.blnДоговор);
var blnДО     :S=if(Аванс.Настр.blnДО="",Раб.Договор.blnДО,Аванс.Настр.blnДО);

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

var Buf[]:S;

var Ключ_Аванс []:S;
var Ключ_Аванс1[]:S;
var idАванс      :Record;

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

S0: Section;

S1: Section;
S2: Section;
S3: Section;
S4: Section;
S5: Section;
S6: Section;
S7: Section;
S8: Section;
S9: Section;
S10:Section;
S11:Section;

var nS:I=8;

hДолжнИсп:S;
hФИОИсп:S;
--
--Процедуры и функции -------------
Proc Настр_(aСохр:L);
var Flag:L;
 if НастрGUID="" or aСохр: НастрGUID=GetGUID; fi;
 if Раб.Настр.Начать("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ДО_ЗАЧЕТ_АВАНСА",0,0,"",НастрGUID):
    Раб.Настр.Добавить("fJumpOff","L");
    Раб.Настр.Добавить("blnБухСправка","S");
    Раб.Настр.Добавить("extКлюч","S");
    if aСохр: 
       Раб.Настр.Сохранить; 
      else 
       НастрGUID=Раб.Настр.Загрузить("","");
       if НастрGUID="":
          Flag=ExecuteFuncL("НастрПоУмолч_OnEnter","",1);
       fi;
    fi;
 fi;
end;

Proc ОткрНастр (Flag:L);
 btnСохр.Visible=not Flag;
 btnОтмена.Visible=not Flag;
 btnНастр.Visible=not Flag;
 btnБухСправ.Visible=not Flag;
 btnУдалить.Visible=not Flag;
 btnЗакрыть.Visible=not Flag;
 cbРег.Visible=not Flag;
 btnПлат.Visible=not Flag;
 btnАванс.Visible=not Flag;
 btnЗачет.Visible=not Flag;
 УпрНастр=Flag;
 if Flag=True: Template.Field="extКлюч"; Template.Frame=1; fi;
end;

Proc Инициализация;
var Obj:Object;
var s,r,rr,c,cc,n,l,bgColor,i:i;
var Field:S;
 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 or BgColor=coLime:
           Field=asString(Obj.Cell(r,c,CellContents,""));
           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;
var Flag:L;
btnУдалить.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
      Try
       Field=asString(Obj.Cell(r,c,CellContents,""));
       n=SearchInArray(BufField,Field,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;
      Except
      end;
     od;
     if Field="@Руб": Obj.Row(r,RowVisible,not Аванс.ОКВ="643"); fi;
     if Field="@Общ_Справ1": Obj.Row(r,RowVisible,not Общ_Призн1=""); fi;
     if Field="@Общ_Справ2": Obj.Row(r,RowVisible,not Общ_Призн2=""); fi;
    od;
  fi;
 od;
 --
 cc=asInteger(S3.ColsCount);
 for c=1..cc do
  Field=asString(S3.Cell(1,c,CellContents,""));
  n=1;
  if Field="@Руб":  Flag=not Аванс.ОКВ="643";
    |True: n=0;
  fi;
  if n=1:
     S3.Column(c,ColVisible,Flag);
     S4.Column(c,ColVisible,Flag);
     S5.Column(c,ColVisible,Flag);
  fi;
 od;
 cc=asInteger(S6.ColsCount);
 for c=1..cc do
  Field=asString(S6.Cell(2,c,CellContents,""));
  n=1;
  if Field="@Руб": Flag=not Аванс.ОКВ="643";
    |True: n=0;
  fi;
  if n=1:
     S6.Column(c,ColVisible,Flag);
     S7.Column(c,ColVisible,Flag);
     S8.Column(c,ColVisible,Flag);
  fi;
 od;
end;

Proc НеПустаяТаблица;
 if Расшифр_Зачет<1:
    InsertFrame(Расшифр_Зачет,1);
 fi;
end;

Proc УдалитьПустыеСтроки;
var n:i;
 n=1; 
 While n<=Расшифр_Зачет do
  if Расшифр_Зачет[n].ДО=nil and Расшифр_Зачет[n].КБК="" and Round(Расшифр_Зачет[n].Сум,2)=0 and Round(Расшифр_Зачет[n].СумРуб,2)=0: DeleteFrame(Расшифр_Зачет,n);
    else
     n=n+1;
  fi;
 od;
end;

Proc РасчетГЭК2;
var OWA,n,nn,i1,i2:I;
var isNet:L;
var Rec: Record;
 if not Страница=4:
    Exit;
 fi;
 isNet=Раб.Бюджет2005.Сетевая;
 ClearVariable(УпрГЭК2);
 ClearVariable(ГЭК2CU);
 ClearVariable(ГЭК2MU);
 ClearVariable(ГЭК2Дат);
 ClearVariable(ГЭК2Лист);
 ClearVariable(ГЭК2Кмнт);
 ClearVariable(ГЭК2Rec);
 OWA=OpenWorkArea("РПО_СКАН_ДОК","Дата","Док='"+SelfCrd+"' and Запись="+Str(RecordToInteger(Current)));
 Try
  nn=Records(OWA);
  ShowProgress(nn,"Обработка...");
  for n=1..nn do
   ProgressPos(n);
   Rec=GetRecordKey(OWA,n);
   i1=Раб.Вспом.Сканер.ЧитатьГЭК("РПО_СКАН_ДОК",RecordToInteger(Rec),"jpg",True);
   i2=Раб.Вспом.Файлы.ПоказСписок("РПО_СКАН_ДОК",RecordToInteger(Rec),"","","","","","",0);
   if not i1=0 or not i2=0:
      InsertFrame(УпрГЭК2,УпрГЭК2+1);
      ГЭК2Дат[УпрГЭК2]=GetFieldD(OWA,n,"Дата");
      ГЭК2Лист[УпрГЭК2]=Str(i1)+" / "+Str(i2);
      ГЭК2Кмнт[УпрГЭК2]=GetFieldS(OWA,n,"Кмнт");
      ГЭК2CU[УпрГЭК2]=DateToString(GetFieldD(OWA,n,"CreateTime"))+if(isNet," "+GetFieldS(OWA,n,"CreatedUser"),"");
      ГЭК2MU[УпрГЭК2]=DateToString(GetFieldD(OWA,n,"UpdateTime"))+if(isNet," "+GetFieldS(OWA,n,"ModifiedUser"),"");
      ГЭК2Rec[УпрГЭК2]=Rec;
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
end;

Proc ВывестиСтраницу;
 if Страница=0: Страница=2; fi;
 --Покупатель
 S1.Visible=Страница=1;
 btnПлат.Enabled=not Страница=1;
 --Аванс
 S2.Visible=Страница=2;
 btnАванс.Enabled=not Страница=2;
 --Расшифровка
 S3.Visible=Страница=3;
 S4.Visible=Страница=3;
 S5.Visible=Страница=3;
 S6.Visible=Страница=3;
 S7.Visible=Страница=3;
 S8.Visible=Страница=3;
 btnЗачет.Enabled=not Страница=3;
 --ГЭК2
 if not AsLogical(S9.Visible)=(Страница=4):
    S9.Visible=Страница=4;
    S10.Visible=Страница=4;
    S11.Visible=Страница=4;
 fi;
 btnГЭК2.Enabled=not Страница=4;
 РасчетГЭК2;
end;

Func НаОшибку(Msg:LongString; mt:I; Page:i; Field:S; Iter:I):L;
 if not Msg="":
    Message(Msg,mt);
 fi;
 if not Страница=Page: Страница=Page; ВывестиСтраницу; fi;
 if not Field="": Template.Field=Field; fi;
 if not Iter=0: Template.Frame=Iter; fi;
 ^False;
end;

Proc ЗаполнитьАванс(Full:L);
 Аванс_ТекГод=Аванс.ТекГод;
 Аванс_Призн=CardFileRecSign(Раб.Договор.crdДО,"Признак","ДОГОВОР",Аванс,"");
 Аванс_GUID=Аванс.GUID;
 Аванс_БО_Призн=Аванс.БО_Призн;
 if Full:
    Учр=Аванс.Учр;
    ДолжнРук=Учр.ДолжнРук;
    ФИОРук=Учр.ФИОРук;
    ДолжнБух=Учр.ДолжнБух;
    ФИОБух=Учр.ФИОБух;
 fi;
 Контр=Аванс.Контр;
 Контр_Призн=Аванс.Контр_Призн;
 Общ_Призн1=Аванс.Общ_Призн1;
 Общ_Призн2=Аванс.Общ_Призн2;
 Вал=Аванс.Вал;
 ПровБО=Аванс.Договор=nil;
end;

Func ОбновитьТекЗачет(aErr:I):L;
var Iter,z,i:I;
var Flag:L;
 Flag=not (idАванс=Current);
 if Flag:
    ClearVariable(idАванс);
    ClearVariable(Ключ_Аванс);
    ClearVariable(Ключ_Аванс1);
 fi;
 for Iter=1..Расшифр_Аванс do
  if Flag:
     Ключ_Аванс[Iter]=Расшифр_Аванс[Iter].ВД+"#"+Расшифр_Аванс[Iter].КБК+"#"+Trim(АвПризн_[Iter]);
     Ключ_Аванс1[Iter]=Расшифр_Аванс[Iter].ВД+"#"+Расшифр_Аванс[Iter].КБК+"#"+Расшифр_Аванс[Iter].Призн;
  fi;
  Расшифр_Аванс[Iter].ТекЗачет=0;
  Расшифр_Аванс[Iter].ТекРубЗачет=0;
 od;
 idАванс=Current;
 for Iter=1..Расшифр_Зачет do
  z=SearchInArray(Ключ_Аванс,Расшифр_Зачет[Iter].ВД+"#"+Расшифр_Зачет[Iter].КБК_Ав+"#"+Trim(ЗачетПризн_Ав_[Iter]));
  if z=-1:
     if aErr= 1: ^НаОшибку("Не найдено в спецификации аванса:^MВид деятельности: "+Расшифр_Зачет[Iter].ВД+", КБК: "+Расшифр_Зачет[Iter].КБК_Ав+" {"+ЗачетПризн_Ав_[Iter]+"}",mtError,3,"КБК_Ав_",Iter);
       |aErr=-1: Расшифр_Зачет[Iter].КБК_Ав=""; Расшифр_Зачет[Iter].Призн_Ав=""; Расшифр_Зачет[Iter].ПризнДоп_Ав="";
     fi;
    else
     Расшифр_Аванс[z].ТекЗачет=Расшифр_Аванс[z].ТекЗачет+Расшифр_Зачет[Iter].Сум;
     Расшифр_Аванс[z].ТекРубЗачет=Расшифр_Аванс[z].ТекРубЗачет+Расшифр_Зачет[Iter].СумРуб;
  fi;
 od;
 ^True;
end;

Func ОбновитьСпецификацию(aErr:I):L;
var n,nn,Iter:I;
var Key,tmp:S;
var ДО_:Record;
 ClearVariable(idАванс);
 ClearVariable(Ключ_Аванс);
 ClearVariable(Ключ_Аванс1);
 ClearVariable(Расшифр_Аванс);
 --
 Раб.Договор.inclПризнОКДП=1;
 nn=Раб.Договор.ДО_КБК("Рег and UKey="+RecordToString(Аванс),"",ДатаРег,False,False);
 for n=1..nn do
  Iter=InsertFrame(Расшифр_Аванс,Расшифр_Аванс+1);
  Ключ_Аванс[Iter]=Раб.Договор.lstКлюч[n];
  Ключ_Аванс1[Iter]=Раб.Договор.lstКлюч1[n];
  Расшифр_Аванс[Iter].ВД=Раб.Договор.lstВД[n];
  Расшифр_Аванс[Iter].КБК=Раб.Договор.lstКБК[n];
  Расшифр_Аванс[Iter].Призн=Раб.Договор.lstПризн[n];
  Расшифр_Аванс[Iter].ПризнДоп=Trim(Раб.Договор.lstПризнДоп[n]+" "+Раб.Договор.lstПризнОКДП[n]);
  Расшифр_Аванс[Iter].Сум=Раб.Договор.lstСум[n];
  Расшифр_Аванс[Iter].СумРуб=Раб.Договор.lstСумРуб[n];
 od;
 Аванс_Сум=SumOfArray(Расшифр_Аванс[].Сум,Расшифр_Аванс);
 Аванс_СумРуб=SumOfArray(Расшифр_Аванс[].СумРуб,Расшифр_Аванс);
 idАванс=Current;
 Refresh(False,ДатаРег+1);
 --Оплаты аванса
 for Iter=1..Расшифр_Аванс do
  Раб.Договор.exclЗКР=True;
  Раб.Договор.ДО_Оплата(Аванс,ДатаРег,Расшифр_Аванс[Iter].ВД,Расшифр_Аванс[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Trim(АвПризн_[Iter])," ","&"),False,False,False);
  Расшифр_Аванс[Iter].Опл=Раб.Договор.lstСум[1];
  Расшифр_Аванс[Iter].ОплРуб=Раб.Договор.lstСумРуб[1];
 od;
 Раб.Договор.exclЗКР=True;
 Раб.Договор.ДО_Оплата(Аванс,ДатаРег,"?","*","",False,False,False);
 Аванс_Опл=Раб.Договор.lstСум[1];
 Аванс_ОплРуб=Раб.Договор.lstСумРуб[1];
 --Зачеты аванса
 for Iter=1..Расшифр_Аванс do
  Раб.Договор.ДО_ЗачетАванса(Аванс,ДатаРег,Расшифр_Аванс[Iter].ВД,Расшифр_Аванс[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Trim(АвПризн_[Iter])," ","&"),False,False,False);
  Расшифр_Аванс[Iter].СумЗачет=Раб.Договор.lstСум[1];
  Расшифр_Аванс[Iter].СумРубЗачет=Раб.Договор.lstСумРуб[1];
 od;
 Раб.Договор.ДО_ЗачетАванса(Аванс,ДатаРег,"?","*","",False,False,False);
 Аванс_СумЗачет=Раб.Договор.lstСум[1];
 Аванс_СумРубЗачет=Раб.Договор.lstСумРуб[1];
 --Расшифровка зачет аванса
 ShowProgress(Расшифр_Зачет*2,"Обработка...");
 Try
  ДО_=nil;
  for Iter=1..Расшифр_Зачет do
   ProgressPos(Iter);
   Расшифр_Зачет[Iter].ДО_Сум=0;
   Расшифр_Зачет[Iter].ДО_СумРуб=0;
   Расшифр_Зачет[Iter].ДО_Опл=0;
   Расшифр_Зачет[Iter].ДО_ОплРуб=0;
   if not ДО_=Расшифр_Зачет[Iter].ДО and not Расшифр_Зачет[Iter].ДО=nil:
      nn=Раб.Договор.ДО_КБК("Рег and UKey="+RecordToString(Расшифр_Зачет[Iter].ДО),"",ДатаРег,False,False);
      ДО_=Расшифр_Зачет[Iter].ДО;
   fi;
   if not Расшифр_Зачет[Iter].ДО=nil and not Расшифр_Зачет[Iter].КБК="":
      Key=Расшифр_Зачет[Iter].ВД+"#"+Расшифр_Зачет[Iter].КБК+"#"+ЗачетПризн_[Iter];
      n=SearchInArray(Раб.Договор.lstКлюч,Key,True);
      if n=-1:
         if aErr= 1: ^НаОшибку("Не найдено в спецификации обязательства:^MВид деятельности: "+Расшифр_Зачет[Iter].ВД+", КБК: "+Расшифр_Зачет[Iter].КБК+" {"+ЗачетПризн_[Iter]+"}",mtError,3,"КБК",Iter);
           |aErr=-1: Расшифр_Зачет[Iter].ВД=""; Расшифр_Зачет[Iter].КБК=""; Расшифр_Зачет[Iter].Призн=""; Расшифр_Зачет[Iter].ПризнДоп="";
         fi;
        else
         Расшифр_Зачет[Iter].ДО_Сум=Раб.Договор.lstСум[n];
         Расшифр_Зачет[Iter].ДО_СумРуб=Раб.Договор.lstСумРуб[n];
      fi;
   fi;
  od;
  ClearVariable(Buf);
  for Iter=1..Расшифр_Зачет do
   ProgressPos(Расшифр_Зачет+Iter);
   if not Расшифр_Зачет[Iter].ДО=nil and not Расшифр_Зачет[Iter].КБК="":
      Расшифр_Зачет[Iter].ДО_Призн=CardFileRecSign(Раб.Договор.crdДО,"Признак","ДОГОВОР",Расшифр_Зачет[Iter].ДО,"");
      Расшифр_Зачет[Iter].ДО_GUID=Расшифр_Зачет[Iter].ДО.GUID;
      tmp=Trim(Общ_Призн1+" "+Общ_Призн1);
      tmp=Раб.Бюджет2005.Объединить(tmp,Расшифр_Зачет[Iter].ДО_Призн," ");
      tmp=Раб.Бюджет2005.Объединить(tmp,Расшифр_Зачет[Iter].Призн," ");
      tmp=Раб.Бюджет2005.Объединить(tmp,Расшифр_Зачет[Iter].ПризнДоп," ");
      tmp=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(tmp," ","&");
      if not Раб.Договор.ДО_Оплата(Расшифр_Зачет[Iter].ДО,ДатаРег,Расшифр_Зачет[Iter].ВД,Расшифр_Зачет[Iter].КБК,tmp,False,False,False)=0:
         Расшифр_Зачет[Iter].ДО_Опл=Раб.Договор.lstСум[1];
         Расшифр_Зачет[Iter].ДО_ОплРуб=Раб.Договор.lstСумРуб[1];
      fi;
      Buf[Iter]=RecordToString(Расшифр_Зачет[Iter].ДО)+" "+Расшифр_Зачет[Iter].ВД+"#"+Расшифр_Зачет[Iter].КБК+"#"+ЗачетПризн_[Iter];
   fi;
  od;
  for Iter=1..Расшифр_Зачет do
   Key=RecordToString(Расшифр_Зачет[Iter].ДО)+" "+Расшифр_Зачет[Iter].ВД+"#"+Расшифр_Зачет[Iter].КБК+"#"+ЗачетПризн_[Iter];
   n=Iter+1;
   While not SearchInArray(Buf,Key,False,n)=-1 do
    Расшифр_Зачет[n].ДО_Опл=Расшифр_Зачет[n].ДО_Опл+Расшифр_Зачет[Iter].Сум;
    Расшифр_Зачет[n].ДО_ОплРуб=Расшифр_Зачет[n].ДО_ОплРуб+Расшифр_Зачет[Iter].СумРуб;
    n=n+1;
   od;
  od;
 --
  ^ОбновитьТекЗачет(aErr);
 Finally
  CloseProgress;
 end;
 ^True;
end;

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

Proc Переход (FieldName:S; Iter:I);
 if fJumpOff: Exit; fi;
 if FieldName="Учр.КорИмя"       :FieldName="ДолжнРук";
   |FieldName="ДолжнРук"         :FieldName="ФИОРук";
   |FieldName="ФИОРук"           :FieldName="ДолжнБух";
   |FieldName="ДолжнБух"         :FieldName="ФИОБух";
   --|FieldName="ФИОБух"         :FieldName=";
   |FieldName="ДатаРег"          :FieldName="Аванс_";
   |FieldName="Аванс_"           :FieldName="Аванс_ТекЗачет";
   |FieldName="Аванс_ТекЗачет"   :FieldName=if(not Аванс.ОКВ="643","Аванс_ТекРубЗачет","Осн");
   |FieldName="Аванс_ТекРубЗачет":FieldName="Осн";
   |FieldName="Осн"              :FieldName="ДолжнИсп";
   |FieldName="ДолжнИсп"         :FieldName="ФИОИсп";
   |FieldName="ФИОИсп"           :FieldName="Коммент";
   --|FieldName="Коммент"        :FieldName=";
   |FieldName="ДО.НаимДок.Наим"  :FieldName="КБК";
   |FieldName="КБК"              :FieldName="Сум";
   |FieldName="Сум"              :FieldName=if(not Аванс.ОКВ="643","СумРуб","ОснДоп");
   |FieldName="СумРуб"           :FieldName="ОснДоп";
   |FieldName="ОснДоп"           :FieldName=if(Расшифр_Зачет=Iter,"A","ДО.НаимДок.Наим"); Iter=Iter+if(Расшифр_Зачет=Iter,0,1);
   |True: Exit;
 fi;
 Template.Field=FieldName;
 Template.Frame=Iter;
end;

Proc РасщепитьАналит;
var w,ww,Iter:i;
var tmp1,tmp2:S;
 for Iter=1..Расшифр_Зачет do
  Расшифр_Зачет[Iter].Призн_Общ="";
  Расшифр_Зачет[Iter].Призн_Деб="";
  Расшифр_Зачет[Iter].Призн_Кре="";
  if ЗачетПризн_[Iter]="" or ЗачетПризн_Ав_[Iter]="":
     Расшифр_Зачет[Iter].Призн_Деб=ЗачетПризн_[Iter];
     Расшифр_Зачет[Iter].Призн_Кре=ЗачетПризн_Ав_[Iter];
    |ЗачетПризн_[Iter]=ЗачетПризн_Ав_[Iter]:
     Расшифр_Зачет[Iter].Призн_Общ=ЗачетПризн_[Iter];
    |True:
     Расшифр_Зачет[Iter].Призн_Кре=ЗачетПризн_Ав_[Iter];
     ww=WordsCount(ЗачетПризн_[Iter]," ");
     for w=1..ww do
      tmp1=ExtractWord(w,ЗачетПризн_[Iter]," ");
      tmp2=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Расшифр_Зачет[Iter].Призн_Кре," ",tmp1,"");
      if tmp1=tmp2: 
         Расшифр_Зачет[Iter].Призн_Общ=Trim(Расшифр_Зачет[Iter].Призн_Общ+" "+tmp1);
         Расшифр_Зачет[Iter].Призн_Кре=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр_Зачет[Iter].Призн_Кре," ",tmp1,"|");
        else
         Расшифр_Зачет[Iter].Призн_Деб=Trim(Расшифр_Зачет[Iter].Призн_Деб+" "+tmp1);
      fi;
     od;
  fi;
 od;
end;

Func ПроверитьУникальность:L;
var Iter1,Iter2:i;
 ClearVariable(Buf);
 for Iter1=1..Расшифр_Зачет do
  for Iter2=Iter1+1..Расшифр_Зачет do
   if Расшифр_Зачет[Iter1].ДО=Расшифр_Зачет[Iter2].ДО and
      Расшифр_Зачет[Iter1].ВД=Расшифр_Зачет[Iter2].ВД and
      Расшифр_Зачет[Iter1].КБК=Расшифр_Зачет[Iter2].КБК and
      Расшифр_Зачет[Iter1].Призн=Расшифр_Зачет[Iter2].Призн and
      Расшифр_Зачет[Iter1].ПризнДоп=Расшифр_Зачет[Iter2].ПризнДоп and
      Расшифр_Зачет[Iter1].КБК_Ав=Расшифр_Зачет[Iter2].КБК_Ав and
      Расшифр_Зачет[Iter1].Призн_Ав=Расшифр_Зачет[Iter2].Призн_Ав and
      Расшифр_Зачет[Iter1].ПризнДоп_Ав=Расшифр_Зачет[Iter2].ПризнДоп_Ав:
      ^НаОшибку("Повторный ввод (строка №"+Str(Iter1)+" = №"+Str(Iter2)+")^MВД: "+Расшифр_Зачет[Iter1].ВД+"^MКБК: "+Расшифр_Зачет[Iter1].КБК+"^MПризнаки: "+Trim(Расшифр_Зачет[Iter1].Призн+" "+Расшифр_Зачет[Iter1].ПризнДоп),mtError,3,"КБК",Iter2);
   fi;
  od;
 od;
 ^True;
end;

Func Проверить:L;
var Iter,Page,nn:i;
var tmp,Призн_,ТипКБК_,БК_,КОСГУ_,СчД_,СчК_:S;
var Flag,isВал:L;
var res:N;
 isВал=not Аванс.ОКВ="643";
 Page=1;
 if Учр=nil: ^НаОшибку("Выберите покупателя",mtError,Page,"Учр.КорИмя",1); fi;
 if Учр.РПО_ППП="": ^НаОшибку("Введите код ведомства покупателя",mtError,Page,"Учр.РПО_ППП",1); fi;
 if Учр.РПО_КБП="": ^НаОшибку("Введите КБП покупателя",mtError,Page,"Учр.РПО_КБП",1); fi;
 if ДолжнРук="": ^НаОшибку("Введите должность руководителя",mtError,Page,"ДолжнРук",1); fi;
 if ФИОРук="": ^НаОшибку("Введите ФИО руководителя",mtError,Page,"ФИОРук",1); fi;
 if ДолжнБух="": ^НаОшибку("Введите должность бухгалтера",mtError,Page,"ДолжнБух",1); fi;
 if ФИОБух="": ^НаОшибку("Введите ФИО бухгалтера",mtError,Page,"ФИОБух",1); fi;
 Page=2;
 if ДатаРег=1.1.100: ^НаОшибку("Введите дату регистрации документа",mtError,Page,"ДатаРег",1); fi;
 if Аванс=nil: ^НаОшибку("Выберите аванс",mtError,2,"Аванс_",1); ^False; fi;
 if Аванс.Аннул: ^НаОшибку("Аванс аннулирован",mtError,2,"Аванс_",1); ^False; fi;
 if Аванс.ДатаРег>ДатаРег: ^НаОшибку("Дата регистрации аванса превышает дату зачета аванса",mtError,2,"Аванс_",1); ^False; fi;
 ЗаполнитьАванс(False);
 if Name_A(Аванс_Призн)=" ": ^НаОшибку("Неизвестный аналитический признак аванса '"+Аванс_Призн+"'^MПеревыберите аванс",mtError,Page,"Аванс_",1); fi;
 if Аванс_ТекГод="": ^НаОшибку("Не заполнен текущий год аванса^MПеревыберите аванс",mtError,Page,"Аванс_ТекГод",1); fi;
 if Name_A("ПЕРИОД."+Аванс_ТекГод)=" ": ^НаОшибку("Неизвестный идентификатор аналитического признака 'ПЕРИОД."+Аванс_ТекГод+"'",mtError,Page,"Аванс_ТекГод",1); fi;
 --if Аванс.Договор=nil: ^НаОшибку("Выберите договор (перевыберите аванс)",mtError,Page,"Договор_",1); ^False; fi;
 if Контр=nil: ^НаОшибку("Выберите контрагента (перевыберите аванс)",mtError,Page,"Контр.КорИмя",1); ^False; fi;
 if Name_A(Контр_Призн)=" ": ^НаОшибку("Неизвестный аналитический признак контрагента '"+Контр_Призн+"'^MПеревыберите аванс",mtError,Page,"Контр_Призн",1); fi;
 if not Аванс.Настр.Общ_Справ1="" and Общ_Призн1="": ^НаОшибку("Введите "+Аванс.Настр.Общ_Справ_Наим1+" (перевыберите аванс)",mtError,Page,"Общ_Призн1",1); fi;
 if not Аванс.Настр.Общ_Справ2="" and Общ_Призн2="": ^НаОшибку("Введите "+Аванс.Настр.Общ_Справ_Наим2+" (перевыберите аванс)",mtError,Page,"Общ_Призн2",1); fi;
 if not Аванс.Настр.Общ_Справ1="" and not Общ_Призн1="" and Name_A(Общ_Призн1)=" ": ^НаОшибку("Неизвестный аналитический признак '"+Общ_Призн1+"'",mtError,Page,"Общ_Призн1",1); fi;
 if not Аванс.Настр.Общ_Справ2="" and not Общ_Призн2="" and Name_A(Общ_Призн2)=" ": ^НаОшибку("Неизвестный аналитический признак '"+Общ_Призн2+"'",mtError,Page,"Общ_Призн2",1); fi;
 if Аванс_ТекЗачет=0: ^НаОшибку("Введите сумму текущего зачета аванса",mtError,Page,"Аванс_ТекЗачет",1); ^False; fi;
 if Аванс.ОКВ="": ^НаОшибку("В авансе не указан код валюты",mtError,Page,"Аванс.ОКВ",1); ^False; fi;
 if Вал="": ^НаОшибку("Введите валюту документа (перевыберите аванс)",mtError,Page,"Аванс_",1); fi;
 if Name_C(Вал)=" ":  ^НаОшибку("Неизвестный идентификатор  валюты '"+Вал+"' (перевыберите аванс)",mtError,Page,"Аванс_",1); fi;
 if isВал and Аванс_ТекРубЗачет=0: ^НаОшибку("Введите сумму текущего зачета аванса в рублях",mtError,Page,"Аванс_ТекРубЗачет",1); ^False; fi;
 if ДолжнИсп="": ^НаОшибку("Введите должность исполнителя",mtError,Page,"ДолжнИсп",1); fi;
 if ФИОИсп="": ^НаОшибку("Введите ФИО исполнителя",mtError,Page,"ФИОИсп",1); fi;
 Page=3;
 if not ОбновитьСпецификацию(1): ^False; fi;
 if Расшифр_Аванс=0: ^НаОшибку("Заполните расшифровку аванса",mtError,Page,"ОбновРасшифрАв",1); fi;
 res=SumOfArray(Расшифр_Аванс[].Опл,Расшифр_Аванс);
 if not Round(res,2)=Round(Аванс_Опл,2): ^НаОшибку("Сумма оплат аванса по КБК "+Format("%.2N",res)+" отличается от суммы оплат аванса в целом "+Format("%.2N",Аванс_Опл)+" на "+Format("%.2N",Аванс_Опл-res),mtError,Page,"Аванс_Опл_",1); fi;
 res=SumOfArray(Расшифр_Аванс[].СумЗачет,Расшифр_Аванс);
 if not Round(res,2)=Round(Аванс_СумЗачет,2): ^НаОшибку("Сумма зачетов аванса по КБК "+Format("%.2N",res)+" отличается от суммы зачетов аванса в целом "+Format("%.2N",Аванс_СумЗачет)+" на "+Format("%.2N",Аванс_СумЗачет-res),mtError,Page,"Аванс_СумЗачет_",1); fi;
 if isВал:
    res=SumOfArray(Расшифр_Аванс[].ОплРуб,Расшифр_Аванс);
    if not Round(res,2)=Round(Аванс_ОплРуб,2): ^НаОшибку("Сумма оплат аванса по КБК в рублях "+Format("%.2N",res)+" отличается от суммы оплат в рублях аванса в целом "+Format("%.2N",Аванс_ОплРуб)+" на "+Format("%.2N",Аванс_ОплРуб-res),mtError,Page,"Аванс_ОплРуб_",1); fi;
    res=SumOfArray(Расшифр_Аванс[].СумРубЗачет,Расшифр_Аванс);
    if not Round(res,2)=Round(Аванс_СумРубЗачет,2): ^НаОшибку("Сумма зачетов аванса в рублях по КБК "+Format("%.2N",res)+" отличается от суммы зачетов в рублях аванса в целом "+Format("%.2N",Аванс_СумРубЗачет)+" на "+Format("%.2N",Аванс_СумРубЗачет-res),mtError,Page,"Аванс_СумРубЗачет_",1); fi;
 fi;
 for Iter=1..Расшифр_Аванс do
  if Round(Расшифр_Аванс[Iter].Опл,2)>Round(Расшифр_Аванс[Iter].Сум,2): ^НаОшибку("Сумма оплат аванса "+Format("%.2N",Расшифр_Аванс[Iter].Опл)+" превышает сумму аванса "+Format("%.2N",Расшифр_Аванс[Iter].Сум)+" на "+Format("%.2N",Расшифр_Аванс[Iter].Опл-Расшифр_Аванс[Iter].Сум),mtError,Page,"Опл_",Iter); fi;
  if Round(Расшифр_Аванс[Iter].СумЗачет,2)>Round(Расшифр_Аванс[Iter].Опл,2): ^НаОшибку("Сумма зачетов аванса "+Format("%.2N",Расшифр_Аванс[Iter].СумЗачет)+" превышает сумму оплат аванса "+Format("%.2N",Расшифр_Аванс[Iter].Опл)+" на "+Format("%.2N",Расшифр_Аванс[Iter].СумЗачет-Расшифр_Аванс[Iter].Опл),mtError,Page,"СумЗачет_",Iter); fi;
  if Round(Расшифр_Аванс[Iter].СумЗачет+Расшифр_Аванс[Iter].ТекЗачет,2)>Round(Расшифр_Аванс[Iter].Опл,2): ^НаОшибку("Текущий зачета аванса "+Format("%.2N",Расшифр_Аванс[Iter].ТекЗачет)+" превышает сумму остатка аванса "+Format("%.2N",Расшифр_Аванс[Iter].Опл-Расшифр_Аванс[Iter].СумЗачет)+" на "+Format("%.2N",Расшифр_Аванс[Iter].ТекЗачет-(Расшифр_Аванс[Iter].Опл-Расшифр_Аванс[Iter].СумЗачет)),mtError,Page,"ТекЗачет",Iter); fi;
  if isВал:
     if Round(Расшифр_Аванс[Iter].ОплРуб,2)>Round(Расшифр_Аванс[Iter].СумРуб,2): ^НаОшибку("Сумма оплат аванса в рублях "+Format("%.2N",Расшифр_Аванс[Iter].ОплРуб)+" превышает сумму аванса в рублях "+Format("%.2N",Расшифр_Аванс[Iter].СумРуб)+" на "+Format("%.2N",Расшифр_Аванс[Iter].ОплРуб-Расшифр_Аванс[Iter].СумРуб),mtError,Page,"ОплРуб_",Iter); fi;
     if Round(Расшифр_Аванс[Iter].СумРубЗачет,2)>Round(Расшифр_Аванс[Iter].ОплРуб,2): ^НаОшибку("Сумма зачетов аванса в рублях "+Format("%.2N",Расшифр_Аванс[Iter].СумРубЗачет)+" превышает сумму оплат аванса в рублях "+Format("%.2N",Расшифр_Аванс[Iter].ОплРуб)+" на "+Format("%.2N",Расшифр_Аванс[Iter].СумЗачет-Расшифр_Аванс[Iter].ОплРуб),mtError,Page,"СумРубЗачет_",Iter); fi;
     if Round(Расшифр_Аванс[Iter].СумРубЗачет+Расшифр_Аванс[Iter].ТекРубЗачет,2)>Round(Расшифр_Аванс[Iter].ОплРуб,2): ^НаОшибку("Текущий зачета аванса в рублях "+Format("%.2N",Расшифр_Аванс[Iter].ТекРубЗачет)+" превышает сумму остатка аванса в рублях "+Format("%.2N",Расшифр_Аванс[Iter].ОплРуб-Расшифр_Аванс[Iter].СумРубЗачет)+" на "+Format("%.2N",Расшифр_Аванс[Iter].ТекРубЗачет-(Расшифр_Аванс[Iter].ОплРуб-Расшифр_Аванс[Iter].СумРубЗачет)),mtError,Page,"ТекРубЗачет",Iter); fi;
  fi;
 od;
 УдалитьПустыеСтроки;
 if Расшифр_Зачет=0: ^НаОшибку("Заполните зачет аванса",mtError,Page,"ДО.НаимДок.Наим",1); fi;
 Раб.КСА.Начать;
 for Iter=1..Расшифр_Зачет do
  ТипКБК_=Раб.Бюджет2005.ТипКБКСчета(Расшифр_Зачет[Iter].КБК);
  БК_=Раб.Бюджет2005.ВзятьКодКБК(Расшифр_Зачет[Iter].КБК,ТипКБК_,"БК",False);
  КОСГУ_=Раб.Бюджет2005.ВзятьКодКБК(Расшифр_Зачет[Iter].КБК,ТипКБК_,"КОСГУ",False);
  Раб.КСА.Добавить(Расшифр_Зачет[Iter].СчДеб);
  Раб.КСА.Добавить(Расшифр_Зачет[Iter].СчКре);
  СчД_=if(Расшифр_Зачет[Iter].ВД="1":БК_+"."+Расшифр_Зачет[Iter].ВД+".502.11."+КОСГУ_|Расшифр_Зачет[Iter].ВД="2":БК_+"."+Расшифр_Зачет[Iter].ВД+".502.11."+КОСГУ_|True:"");
  СчК_=if(Расшифр_Зачет[Iter].ВД="1":БК_+"."+Расшифр_Зачет[Iter].ВД+".502.12."+КОСГУ_|Расшифр_Зачет[Iter].ВД="2":БК_+"."+Расшифр_Зачет[Iter].ВД+".502.12."+КОСГУ_|True:"");
  Раб.КСА.Добавить(СчД_);
  Раб.КСА.Добавить(СчК_);
 od;
 if Раб.КСА.Закончить(True):
    Message("Добавление счетов завершено");
 fi;
 if not Round(Аванс_ТекЗачет,2)=Round(ИтогСум,2): ^НаОшибку("Сумма расшифровки зачета аванса "+Format("%.2N",ИтогСум)+" отличается от суммы текущего зачета аванса "+Format("%.2N",Аванс_ТекЗачет)+" на "+Format("%.2N",ИтогСум-Аванс_ТекЗачет),mtError,Page,"ИтогСум",1); fi;
 if isВал and not Round(Аванс_ТекРубЗачет,2)=Round(ИтогСумРуб,2): ^НаОшибку("Сумма расшифровки зачета аванса в рублях "+Format("%.2N",ИтогСумРуб)+" отличается от суммы текущего зачета аванса в рублях "+Format("%.2N",Аванс_ТекРубЗачет)+" на "+Format("%.2N",ИтогСумРуб-Аванс_ТекРубЗачет),mtError,Page,"ИтогСумРуб",1); fi;
 Раб.Бюджет.ПроверитьПризнакиНачать;
 Призн_=Trim(Общ_Призн1+" "+Общ_Призн2);
 Призн_=Раб.Бюджет2005.Объединить(Призн_,Контр_Призн," ");
 for Iter=1..Расшифр_Зачет do
  if Расшифр_Зачет[Iter].ДО=nil: ^НаОшибку("Выберите обязательство",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
  if Расшифр_Зачет[Iter].ДО.Аннул: ^НаОшибку("Денежное обязательство аннулировано",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
  if Аванс.Договор=nil:
     if not Аванс.Договор=Расшифр_Зачет[Iter].ДО.Договор: ^НаОшибку("Договор обязательства ("+Расшифр_Зачет[Iter].ДО.Договор.Признак+") отличается от договора аванса ("+Аванс.Договор.Признак+")",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
    else
     if not Pos(Up(Аванс.Договор.Признак),Up(Расшифр_Зачет[Iter].ДО.Признак))=1: ^НаОшибку("Договор обязательства ("+Расшифр_Зачет[Iter].ДО.Договор.Признак+") отличается от договора аванса ("+Аванс.Договор.Признак+")",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
  fi;
  if Name_A(Расшифр_Зачет[Iter].ДО_Призн)=" ": ^НаОшибку("Неизвестный аналитический признак обязательства '"+Расшифр_Зачет[Iter].ДО_Призн+"'^MПеревыберите обязательство",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
  if not Контр=Расшифр_Зачет[Iter].ДО.Контр: ^НаОшибку("Котрагент обязательства ("+Расшифр_Зачет[Iter].ДО.Контр_Призн+") отличается от контрагент аванса ("+Контр_Призн+")",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
  if not Контр_Призн=Расшифр_Зачет[Iter].ДО.Контр_Призн: ^НаОшибку("Признак котрагента обязательства ("+Расшифр_Зачет[Iter].ДО.Контр_Призн+") отличается от признака контрагента аванса ("+Контр_Призн+")",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
  if not Общ_Призн1=Расшифр_Зачет[Iter].ДО.Общ_Призн1: ^НаОшибку("Общий признак обязательства '"+Расшифр_Зачет[Iter].ДО.Общ_Призн1+"' отличен от общего признака аванса '"+Общ_Призн1+"'",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
  if not Общ_Призн2=Расшифр_Зачет[Iter].ДО.Общ_Призн2: ^НаОшибку("Общий признак обязательства '"+Расшифр_Зачет[Iter].ДО.Общ_Призн2+"' отличен от общего признака аванса '"+Общ_Призн2+"'",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
  if Расшифр_Зачет[Iter].ВД="": ^НаОшибку("Выберите вид деятельности",mtError,Page,"КБК",Iter); fi;
  if Расшифр_Зачет[Iter].КБК="": ^НаОшибку("Выберите КБК обязательства",mtError,Page,"КБК",Iter); fi;
  if not Расшифр_Зачет[Iter].ДО.ТекГод=Аванс_ТекГод: ^НаОшибку("Текущий год обязательства "+Расшифр_Зачет[Iter].ДО.ТекГод+" должен совпадать с годом аванса "+Аванс_ТекГод,mtError,Page,"ДО.ТекГод",Iter); fi;
  if Расшифр_Зачет[Iter].КБК_Ав="": ^НаОшибку("Выберите КБК аванса",mtError,Page,"КБК_Ав_",Iter); fi;
  if not Расшифр_Зачет[Iter].КБК=Расшифр_Зачет[Iter].КБК_Ав or not Расшифр_Зачет[Iter].Призн=Расшифр_Зачет[Iter].Призн_Ав:
     if not Расшифр_Зачет[Iter].КБК=Расшифр_Зачет[Iter].КБК_Ав:
        if not EnqOkCancel("Внимание ! Стр. №"+Str(Iter)+" КБК обязательства ("+Расшифр_Зачет[Iter].КБК+") отличается от КБК аванса ("+Расшифр_Зачет[Iter].КБК_Ав+"), игнорировать ?",mtWarning)=cmOk: ^НаОшибку("",mtError,Page,"КБК_Ав_",Iter); fi;
       else
        if not EnqOkCancel("Внимание ! Стр. №"+Str(Iter)+" Аналит. признаки обязательства ("+Расшифр_Зачет[Iter].Призн+") отличается от КБК аванса ("+Расшифр_Зачет[Iter].Призн_Ав+"), игнорировать ?",mtWarning)=cmOk: ^НаОшибку("",mtError,Page,"ЗачетПризн_Ав_",Iter); fi;
     fi;
  fi;
  if Расшифр_Зачет[Iter].СчДеб="": ^НаОшибку("Введите счет дебета",mtError,Page,"СчДеб",Iter); fi;
  if Name_S(Расшифр_Зачет[Iter].СчДеб)=" ": ^НаОшибку("Неизвестный счет дебета '"+Расшифр_Зачет[Iter].СчДеб+"'",mtError,Page,"СчДеб",Iter); fi;
  if Расшифр_Зачет[Iter].СчКре="": ^НаОшибку("Введите счет кредита",mtError,Page,"СчКре",Iter); fi;
  if Name_S(Расшифр_Зачет[Iter].СчКре)=" ": ^НаОшибку("Неизвестный счет кредита '"+Расшифр_Зачет[Iter].СчКре+"'",mtError,Page,"СчКре",Iter); fi;
  if not Correspond(Расшифр_Зачет[Iter].СчДеб,Расшифр_Зачет[Iter].СчКре): ^НаОшибку("Счета не могут корреспондировать "+Расшифр_Зачет[Iter].СчДеб+"/"+Расшифр_Зачет[Iter].СчКре,mtError,Page,"СчДеб",Iter); fi;
  СчД_=СчДеб_ДО[Iter];
  СчК_=СчКре_ДО[Iter];
  if not СчД_="" and not СчК_="":
     if Name_S(СчД_)=" ": ^НаОшибку("Неизвестный счет дебета (денежное обязательство)'"+СчД_+"'",mtError,Page,"СчДеб_ДО",Iter); fi;
     if Name_S(СчК_)=" ": ^НаОшибку("Неизвестный счет кредита (денежное обязательство)'"+СчК_+"'",mtError,Page,"СчКре_ДО",Iter); fi;
     if not Correspond(СчД_,СчК_): ^НаОшибку("Счета не могут корреспондировать (денежное обязательство)"+СчД_+"/"+СчК_,mtError,Page,"СчДеб_ДО",Iter); fi;
  fi;
  tmp=Trim(Расшифр_Зачет[Iter].Призн+" "+Расшифр_Зачет[Iter].ПризнДоп);
  tmp=Раб.Бюджет2005.Объединить(tmp,Расшифр_Зачет[Iter].ДО_Призн," ");
  tmp=Раб.Бюджет2005.Объединить(tmp,Призн_," ");
  if not Раб.Бюджет.ПроверитьПризнакиОбязательные(Расшифр_Зачет[Iter].СчДеб,"",tmp,ИсклПризн): ^НаОшибку("",mtError,Page,"ЗачетПризн_",Iter); fi;
  if not Раб.Бюджет.ПроверитьПризнакиСвязанные(Расшифр_Зачет[Iter].СчДеб,"",tmp,ИсклПризн): ^НаОшибку("",mtError,Page,"ЗачетПризн_",Iter); fi;
  tmp=Trim(Расшифр_Зачет[Iter].Призн_Ав+" "+Расшифр_Зачет[Iter].ПризнДоп_Ав);
  tmp=Раб.Бюджет2005.Объединить(tmp,Аванс_Призн," ");
  tmp=Раб.Бюджет2005.Объединить(tmp,Призн_," ");
  if not Раб.Бюджет.ПроверитьПризнакиОбязательные("",Расшифр_Зачет[Iter].СчКре,tmp,ИсклПризн): Template.Field="ЗачетПризн_"; Template.Frame=Iter; ^False; fi;
  if not Раб.Бюджет.ПроверитьПризнакиСвязанные("",Расшифр_Зачет[Iter].СчКре,tmp,ИсклПризн): Template.Field="ЗачетПризн_"; Template.Frame=Iter; ^False; fi;
  if not СчД_="" and not СчК_="":
     if not Раб.Бюджет.ПроверитьПризнакиОбязательные(СчД_,СчК_,tmp,ИсклПризн): Template.Field="ЗачетПризн_"; Template.Frame=Iter; ^False; fi;
  fi;
  if Расшифр_Зачет[Iter].Сум=0: ^НаОшибку("Введите сумму зачета",mtError,Page,"Сум",Iter); fi;
  if Round(Расшифр_Зачет[Iter].ДО_Опл,2)>Round(Расшифр_Зачет[Iter].ДО_Сум,2): ^НаОшибку("Сумма оплат обязательства "+Format("%.2N",Расшифр_Зачет[Iter].ДО_Опл)+" превышает сумму обязательства "+Format("%.2N",Расшифр_Зачет[Iter].ДО_Сум)+" на "+Format("%.2N",Расшифр_Зачет[Iter].ДО_Сум-Расшифр_Зачет[Iter].ДО_Опл),mtError,Page,"ДО_Опл_",Iter); fi;
  if Round(Расшифр_Зачет[Iter].ДО_Опл+Расшифр_Зачет[Iter].Сум,2)>Round(Расшифр_Зачет[Iter].ДО_Сум,2): ^НаОшибку("Сумма зачета "+Format("%.2N",Расшифр_Зачет[Iter].Сум)+" превышает сумму неоплаченного остатка обязательства "+Format("%.2N",Расшифр_Зачет[Iter].ДО_Сум-Расшифр_Зачет[Iter].ДО_Опл)+" на "+Format("%.2N",Расшифр_Зачет[Iter].Сум-(Расшифр_Зачет[Iter].ДО_Сум-Расшифр_Зачет[Iter].ДО_Опл)),mtError,Page,"Сум",Iter); fi;
  if isВал:
     if Round(Расшифр_Зачет[Iter].ДО_ОплРуб,2)>Round(Расшифр_Зачет[Iter].ДО_СумРуб,2): ^НаОшибку("Сумма оплат обязательства в рублях "+Format("%.2N",Расшифр_Зачет[Iter].ДО_ОплРуб)+" превышает сумму обязательства в рублях "+Format("%.2N",Расшифр_Зачет[Iter].ДО_СумРуб)+" на "+Format("%.2N",Расшифр_Зачет[Iter].ДО_СумРуб-Расшифр_Зачет[Iter].ДО_ОплРуб),mtError,Page,"ДО_ОплРуб_",Iter); fi;
     if Round(Расшифр_Зачет[Iter].ДО_ОплРуб+Расшифр_Зачет[Iter].СумРуб,2)>Round(Расшифр_Зачет[Iter].ДО_СумРуб,2): ^НаОшибку("Сумма зачета аванса в рублях "+Format("%.2N",Расшифр_Зачет[Iter].СумРуб)+" превышает сумму неоплаченного остатка обязательства в рублях "+Format("%.2N",Расшифр_Зачет[Iter].ДО_СумРуб-Расшифр_Зачет[Iter].ДО_ОплРуб)+" на "+Format("%.2N",Расшифр_Зачет[Iter].СумРуб-(Расшифр_Зачет[Iter].ДО_СумРуб-Расшифр_Зачет[Iter].ДО_ОплРуб)),mtError,Page,"СумРуб",Iter); fi;
  fi;
  if Осн="" and Расшифр_Зачет[Iter].ОснДоп="": ^НаОшибку("Введите основание",mtError,Page,"ОснДоп",Iter); fi;
  if Year(ДатаРег)=Year(Аванс.ДатаРег): --Уменьшаем ДО аванса
     Расшифр_Зачет[Iter].ПровДОПоДеб=Аванс.НеПровДО;
    else
     Расшифр_Зачет[Iter].ПровДОПоДеб=not Расшифр_Зачет[Iter].ДО.НеПровДО;
  fi;
  if НеПровДО:
     Аванс_БО_Призн="";
     Расшифр_Зачет[Iter].ДО_БО_Призн="";
    else
     if Расшифр_Зачет[Iter].ПровДОПоДеб:
        Аванс_БО_Призн="";
        Расшифр_Зачет[Iter].ДО_БО_Призн=Расшифр_Зачет[Iter].ДО.БО_Призн;
        if Расшифр_Зачет[Iter].ДО_БО_Призн="":  ^НаОшибку("Не заполнен аналитический признак бюджетного обязательства^MПеревыберите денежное обязательство",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
        if Name_A(Расшифр_Зачет[Iter].ДО_БО_Призн)=" " or Расшифр_Зачет[Iter].ДО_БО_Призн="БО.": ^НаОшибку("Неизвестный аналитический признак бюджетного обязательства '"+Расшифр_Зачет[Iter].ДО_БО_Призн+"'^M денежное обязательство",mtError,Page,"ДО.НаимДок.Наим",Iter); fi;
       else
        Расшифр_Зачет[Iter].ДО_БО_Призн="";
        Аванс_БО_Призн=Аванс.БО_Призн;
        if Аванс_БО_Призн="":  ^НаОшибку("Не заполнен аналитический признак бюджетного обязательства^MПеревыберите аванс",mtError,Page,"Аванс_",1); fi;
        if Name_A(Аванс_БО_Призн)=" " or Аванс_БО_Призн="БО.": ^НаОшибку("Неизвестный аналитический признак бюджетного обязательства '"+Аванс_БО_Призн+"'^MПеревыберите аванс",mtError,Page,"Аванс_",1); fi;
     fi;
  fi;
 od;
 if not ПроверитьУникальность: ^False; fi;
 ^True;
end;

Proc УдалитьЗаписи(vCrd:String);
var F :String;
var OWA:Integer;
 if vCrd="РПО_БУХСПРАВКА":
    F="CRD='"+SelfCrd+"' and RECCRD="+Str(RecordToInteger(Current));
   else
    F=if(vCrd=SelfCrd,"UKey=","ДО_ЗАЧЕТ_АВАНСА=")+RecordToString(Current);
 fi;
 OWA=OpenWorkArea(vCrd,"",F);
 try
  if Records(OWA)=0: Exit; fi;
  BeginChanging(OWA);
  try
   DeleteAllRecords(OWA);
   EndChanging(OWA);
  except
   CancelChanging(OWA);
   Raise;
  end;
 finally
  CloseWorkArea(OWA);
 end;
end;

Proc БухСправка (Sender:S);
var Crd,tmp:S;
var OWA,n,nr,OA,i,Iter:I;
var Rec: Record;
 Crd="РПО_БУХСПРАВКА";
 if not ExistsCardFile(Crd):
    if Sender="btnБухСправ": Message("Картотека '"+Crd+"' не найдена",mtError); fi;
    Exit;
 fi;
 if ДатаРег=1.1.100:
    if Sender="btnБухСправ": НаОшибку("Введите дату регистрации документа",mtError,2,"ДатаРег",1); fi;
    Exit;
 fi;
 OWA=OpenWorkArea(Crd,"","CRD='"+SelfCrd+"' and RECCRD="+Str(RecordToInteger(Current)));
 Try
  nr=Records(OWA);
  if not Sender="btnБухСправ" and nr=0: Exit; fi;
  BeginChanging(OWA,False);
  Try
   if nr=0:
      n=InsertRecord(OWA);
      n=PutFieldI(OWA,n,"RECCRD",RecordToInteger(Current));
      n=PutFieldS(OWA,n,"CRD",SelfCrd);
      n=PutFieldS(OWA,n,"BLNCRD",SelfBln);
      n=PutFieldI(OWA,n,"НОМЕР",Раб.Обл.СледСУчетомДаты(Crd,"Номер","ДатаСпр",ДатаРег));
     else
      n=1;
   fi;
   Rec=GetRecordKey(OWA,n);
   n=PutFieldD(OWA,n,"ДАТАСПР",ДатаРег);
   n=PutFieldR(OWA,n,"РЕКВ",Учр);
   if Аванс.Настр.Общ_Справ1="П.*": n=PutFieldS(OWA,n,"ПРИЗНПОДР",Общ_Призн1); n=PutFieldS(OWA,n,"НАИМПОДР",Name_A(Общ_Призн1)); fi;
   if Аванс.Настр.Общ_Справ2="П.*": n=PutFieldS(OWA,n,"ПРИЗНПОДР",Общ_Призн2); n=PutFieldS(OWA,n,"НАИМПОДР",Name_A(Общ_Призн2)); fi;
   OA=OpenArray(OWA,n,"ПОЗИЦИИ","");
   DeleteAllRecords(OA);
    for Iter=1..Расшифр_Зачет do
     i=InsertRecord(OA);
     i=PutFieldS(OA,i,"СОДЕРЖ","Зачет аванса ("+Аванс.НаимДок.НаимК+" №"+Аванс.НомерДок+" от "+DateToString(Аванс.ДатаДок)+") "+Раб.Бюджет2005.Объединить(Осн,Расшифр_Зачет[Iter].ОснДоп," "));
     i=PutFieldS(OA,i,"НОМДОК",Расшифр_Зачет[Iter].ДО.НаимДок.НаимК+" №"+Расшифр_Зачет[Iter].ДО.НомерДок);
     i=PutFieldD(OA,i,"ДАТАДОК",Расшифр_Зачет[Iter].ДО.ДатаДок);
     i=PutFieldS(OA,i,"СЧДЕБ",Расшифр_Зачет[Iter].СчДеб);
     i=PutFieldS(OA,i,"СЧКРЕ",Расшифр_Зачет[Iter].СчКре);
     i=PutFieldN(OA,i,"СУММА",Расшифр_Зачет[Iter].Сум);
     tmp=Trim(Общ_Призн1+" "+Общ_Призн2);
     tmp=Trim(Контр_Призн+" "+tmp);
     tmp=Trim(tmp+" "+Расшифр_Зачет[Iter].Призн);
     tmp=Trim(tmp+" "+Расшифр_Зачет[Iter].Призн_Общ);
     i=PutFieldS(OA,i,"ПРИЗН",tmp);
     i=PutFieldS(OA,i,"ПРИЗНДЕБ",Раб.Бюджет2005.Объединить(Расшифр_Зачет[Iter].ДО_Призн,Расшифр_Зачет[Iter].Призн_Деб," "));
     i=PutFieldS(OA,i,"ПРИЗНКРЕ",Раб.Бюджет2005.Объединить(Аванс_Призн,Расшифр_Зачет[Iter].Призн_Кре," "));
    od;
   CloseWorkArea(OA);
   n=PutFieldS(OWA,n,"ФИОРУК",ФИОРук);
   n=PutFieldS(OWA,n,"ФИОБУХ",ФИОБух);
   n=PutFieldS(OWA,n,"ДОЛЖНИСП",ДолжнИсп);
   n=PutFieldS(OWA,n,"ФИОИСП",ФИОИсп);
   n=PutFieldD(OWA,n,"ДАТАИСП",ДатаРег);
   n=PutFieldN(OWA,n,"ИТОГСУММА",ИтогСум);
   n=PutFieldL(OWA,n,"ПРОВОДИТЬ",Рег);
   n=PutFieldS(OWA,n,"РПО_КЛЮЧ",РПО_Ключ);
   n=PutFieldL(OWA,n,"CLOSEDMODFOB",ClosedModFob);
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 if Sender="btnБухСправ": 
    if blnБухСправка="": OpenBlank("ДОКУМЕНТЫ.ПРОЧИЕ.БУХСПРАВКА",True,Rec); else OpenBlank(blnБухСправка,True,Rec); fi;
 fi;
end;

Func ТекЗапись:Record;
 ^Current;
end;

Func ЗаполнитьКлючДок:L;
var Flag:L;
 Flag=True;
 if FuncExists(extКлюч): 
    Flag=ExecuteFuncL(extКлюч);
    if not Flag and Рег:
       Рег=Flag;
       cbРег.State=Рег;
       Оформление;
    fi;
 fi;
 ^Flag;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func НастрПоУмолч_OnEnter(FieldName: String; Iter: Integer): logical;
 if FieldName="НастрПоУмолч":
    if EnqOkCancel("Восстановить значения по умолчанию ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 fJumpOff=False;
 if FieldName="НастрПоУмолч":
    Message("Значения по умолчанию восстановлены");
 fi;
 Return False;
end;

Func НастрЗакр_OnEnter(FieldName: String; Iter: Integer): logical;
 ОткрНастр(False);
 Настр_(True);
 Return False;
end;

Func Flags_OnEnter(FieldName: String; Iter: Integer): logical;
 FieldName=SubStr(FieldName,1,Length(FieldName)-1);
 PutVariableL(FieldName,not GetVariableL(FieldName));
 Return False;
end;

Func blnБухСправка_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if not BlankExist(Value): Message("Бланк '"+Value+"' не найден",mtError); ^False; fi;
 Return True;
end;

Func extFunc_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if not Value="":
    if not FuncExists(Value): Message("Функция '"+Value+"' не найдена",mtError); ^False; fi;
 fi;
 Return True;
end;

Proc Field_OnExit (FieldName: String; Iter: Integer);
 Переход(FieldName,Iter);
end;

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

Proc Контр_OnClick(Row: Integer; Col: Integer; Double: Logical);
var Field,Bln,msg,ff:S;
var Rec: Record;
var p:i;
 Field=AsString(Template.Field);
 if Match(Field,"Учр*"): Rec=Учр; msg="покупателя"; ff="Учр.КорИмя"; p=5;
   |Match(Field,"Контр*"): Rec=Контр; msg="поставщика, исполнителя..."; ff="Контр.КорИмя"; p=7;
 fi;
 if Rec=nil: Message("Выберите "+msg,mtError); Template.Field=ff; Exit; fi;
 if Field="Учр.КорИмя":    Страница=2; ВывестиСтраницу; Template.Field="Договор_";
   |Field="Контр.КорИмя":  OpenBlank("Инфо.Контрагент",True,Контр);
   |Field="Контр_Призн" :  Template.Field="Контр.КорИмя";
   |True: if Double:
             Field=SubStr(Field,p,255);
             ExecuteProc("Инфо.Контрагент.Вызвать",Rec,Bln,Field,0);
          fi;
 fi;
end;

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

Proc ДатаРег_OnExit(FieldName: String; Iter: Integer);
 ОбновитьСпецификацию(-1);
 Переход(FieldName,Iter);
end;

Func Дата_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp :Date;
var Field:s;
var Iter:I;
 Template.HideEditor(False);
 tmp=Calendar(ToDay);
 if not tmp=1.1.100:
    Field=AsString(Template.Field);
    Iter=AsInteger(Template.Frame);
    PutVariableD(Field,tmp);
    if Field="ДатаРег": ОбновитьСпецификацию(-1); fi;
    Переход(Field,1);
 fi;
 ^Cur;
end;

Func Аванс_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
var tmp:S;
 if Аванс=nil:
    Rec=Раб.Поиск.ВыборИзКартотеки("Выбор аванса",crdДО,"НомерДок","Номер документа","Рег and Аванс");
   else
    Rec=OpenCardFile(crdДО,"Рег and Аванс",Аванс);
 fi;
 if not Rec=nil:
    if Аванс=Rec or (Аванс.Договор.Признак_Ref=GetCardFieldR(crdДО,Rec,"Договор.Признак_Ref") and not Аванс.Договор=nil):
       ОбновитьСпецификацию(-1); 
      else 
       ClearVariable(Расшифр_Аванс); 
       ClearVariable(Расшифр_Зачет); 
    fi;
    Аванс=Rec;
    ЗаполнитьАванс(True);
    ОбновитьСпецификацию(-1);
    Оформление;
    Переход(FieldName,Iter);
    if Аванс.Аннул: ^НаОшибку("Аванс аннулирован",mtError,2,"Аванс_",1); ^False; fi;
 fi;
 Return False;
end;

Proc Аванс_OnExit(FieldName: String; Iter: Integer);
 Аванс=nil;
 Аванс_GUID="";
 Контр=nil;
 Контр_Призн="";
 Общ_Призн1="";
 Общ_Призн2="";
end;

Proc Аванс_OnClick(Row: Integer; Col: Integer; Double: Logical);
 if Аванс=nil and not Рег:
    Аванс_OnEnter("Аванс",1);
 fi;
 if not Аванс=nil:
    OpenBlank(blnДО,True,Аванс);
 fi;
end;

Proc Договор_OnClick(Row: Integer; Col: Integer; Double: Logical);
 if Аванс=nil: Message("Выберите аванс",mtError); Template.Field="Аванс_"; Exit; fi;
 if not Аванс.Договор=nil:
    OpenBlank(blnДоговор,True,Аванс.Договор);
 fi;
end;

Proc Общ_Призн_OnClick(Row: Integer; Col: Integer; Double: Logical);
 Template.Field="Договор_";
end;

Func ЗачетПризн_Ав_OnEnter(FieldName: String; Iter: Integer): logical;
var i,n:i;
 if Расшифр_Аванс=0: Message("Обновите расшифровку аванса",mtError); Template.Field="ОбновРасшифрАв"; ^False; fi;
 if Расшифр_Зачет[Iter].КБК="": Message("Выберите КБК",mtError); Template.Field="КБК"; Template.Frame=Iter; ^False; fi;
 ClearVariable(Buf);
 n=0;
 for i=1..Расшифр_Аванс do
  --if Расшифр_Зачет[Iter].ВД=Расшифр_Аванс[i].ВД and Расшифр_Зачет[Iter].КБК=Расшифр_Аванс[i].КБК and Расшифр_Зачет[Iter].Призн=Расшифр_Аванс[i].Призн:
  if Расшифр_Зачет[Iter].ВД=Расшифр_Аванс[i].ВД:
     n=n+1;
     Buf[n]="№ "+Str(i)+" >>> "+Расшифр_Аванс[i].КБК+" {"+Trim(Расшифр_Аванс[i].Призн+" "+Расшифр_Аванс[i].ПризнДоп+"} ="+Format("%.2N",Расшифр_Аванс[i].Сум));
  fi;
 od;
 if n=0: Message("В расшифровке аванса не найдено ВД="+Расшифр_Зачет[Iter].ВД+" КБК="+Расшифр_Зачет[Iter].КБК+" {"+ЗачетПризн_[Iter]+"}",mtError); ^False; fi;
 i=Alternate("Уточните аналитику аванса",Buf,-1,1,12);
 if not i=0:
    n=Int(SubStr(ExtractWord(1,Buf[i],">>>"),2,255));
    Расшифр_Зачет[Iter].КБК_Ав=Расшифр_Аванс[n].КБК;
    Расшифр_Зачет[Iter].Призн_Ав=Расшифр_Аванс[n].Призн;
    Расшифр_Зачет[Iter].ПризнДоп_Ав=Расшифр_Аванс[n].ПризнДоп;
    if FieldName="КБК_Ав_": ОбновитьСч(Iter); fi;
    ОбновитьТекЗачет(-1);
 fi;
 Return False;
end;

Func Осн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp,Field,Field_:s;
var Iter:I;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 Field_=Field;
 Iter=AsInteger(Template.Frame);
 if Field="ОснДоп": Field_="Осн"; Field="Расшифр_Зачет["+Str(Iter)+"]."+Field; fi;
 tmp=Раб.Вспом.Основание.Выполнить(SelfCrd+"."+Field_);
 if not tmp="":
    PutVariableS(Field,tmp);
 fi;
 Return Cur;
end;

Proc Исп_OnExit(FieldName: String; Iter: Integer);
 hДолжнИсп=ДолжнИсп;
 hФИОИсп=ФИОИсп;
 Переход(FieldName,Iter);
end;

Func ОбновРасшифрАв_OnEnter(FieldName: String; Iter: Integer): logical;
 if not Рег:
    if ДатаРег=1.1.100: ^НаОшибку("Введите дату регистрации документа",mtError,2,"ДатаРег",1); ^False; fi;
    if Аванс=nil: ^НаОшибку("Выберите аванс",mtError,2,"Аванс_",1); ^False; fi;
    ОбновитьСпецификацию(0);
 fi;
 Return False;
end;

Func Сум_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Field:S;
var Iter,n,nn:I;
var ПризнДоп_,ПризнОКДП_:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if Field="Сум_":
    Раб.Договор.altЗагл="Зарегистрированные авансы (ВД "+Расшифр_Аванс[Iter].ВД+" КБК "+Расшифр_Аванс[Iter].КБК+" {"+Trim(Расшифр_Аванс[Iter].Призн+" "+Расшифр_Аванс[Iter].ПризнДоп)+"})";
    ПризнДоп_=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Расшифр_Аванс[Iter].ПризнДоп," ","ОКДП.*","");
    n=Раб.Договор.ДО_СумКол("Рег and UKey="+RecordToString(Аванс),"ВД='"+Расшифр_Аванс[Iter].ВД+"' and КБК='"+Расшифр_Аванс[Iter].КБК+"' and Призн='"+Расшифр_Аванс[Iter].Призн+"' and ПризнНорм='"+ПризнДоп_+"'",ДатаРег,"Сум",True);
   |Field="Аванс_Сум_": 
    Раб.Договор.altЗагл="Зарегистрированные авансы";
    n=Раб.Договор.ДО_СумКол("Рег and UKey="+RecordToString(Аванс),"",ДатаРег,"Сум",True);
   |Field="Опл_":       
    Раб.Договор.altЗагл="Зарегистрированные оплаты (ВД "+Расшифр_Аванс[Iter].ВД+" КБК "+Расшифр_Аванс[Iter].КБК+" {"+Trim(Расшифр_Аванс[Iter].Призн+" "+Расшифр_Аванс[Iter].ПризнДоп)+"})";
    Раб.Договор.exclЗКР=True;
    n=Раб.Договор.ДО_Оплата(Аванс,ДатаРег,Расшифр_Аванс[Iter].ВД,Расшифр_Аванс[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Trim(Расшифр_Аванс[Iter].Призн+" "+Расшифр_Аванс[Iter].ПризнДоп)," ","&"),True,True,True);
    if n=-1:
       Раб.Договор.exclЗКР=True;
       n=Раб.Договор.ДО_Оплата(Аванс,ДатаРег,Расшифр_Аванс[Iter].ВД,Расшифр_Аванс[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Расшифр_Аванс[Iter].Призн," ","&"),False,False,False);
       if n>0:
          Message("Внимание ! Найдены оплаты по документу с аналитикой отличной от {"+Trim(Расшифр_Аванс[Iter].Призн+" "+Расшифр_Аванс[Iter].ПризнДоп)+"}, уточните аналитку оплаты",mtWarning);
          Раб.Договор.exclЗКР=True;
          n=Раб.Договор.ДО_Оплата(Аванс,ДатаРег,Расшифр_Аванс[Iter].ВД,Расшифр_Аванс[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Расшифр_Аванс[Iter].Призн," ","&"),True,True,False);
       fi;
    fi;
   |Field="Аванс_Опл_": 
    Раб.Договор.altЗагл="Зарегистрированные оплаты"; 
    Раб.Договор.exclЗКР=True;
    n=Раб.Договор.ДО_Оплата(Аванс,ДатаРег,"","","",True,True,True);
   |Field="СумЗачет_":
    Раб.Договор.exclОплКарт=SelfCrd;
    Раб.Договор.exclОплДок=Current;
    Раб.Договор.altЗагл="Зачеты аванса (ВД "+Расшифр_Аванс[Iter].ВД+" КБК "+Расшифр_Аванс[Iter].КБК+" {"+Trim(Расшифр_Аванс[Iter].Призн+" "+Расшифр_Аванс[Iter].ПризнДоп)+"})";
    n=Раб.Договор.ДО_ЗачетАванса(Аванс,ДатаРег,Расшифр_Аванс[Iter].ВД,Расшифр_Аванс[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Trim(Расшифр_Аванс[Iter].Призн+" "+Расшифр_Аванс[Iter].ПризнДоп)," ","&"),True,True,True);
   |Field="Аванс_СумЗачет_":
    Раб.Договор.altЗагл="Зачеты аванса";
    n=Раб.Договор.ДО_ЗачетАванса(Аванс,ДатаРег,"","","",True,True,True);
   |Field="ДО_Сум_":
    Раб.Договор.altЗагл="Зарегистрированные обязательства (ВД "+Расшифр_Зачет[Iter].ВД+" КБК "+Расшифр_Зачет[Iter].КБК+" {"+Trim(Расшифр_Зачет[Iter].Призн+" "+Расшифр_Зачет[Iter].ПризнДоп)+"})";
    n=Раб.Договор.ДО_СумКол("Рег and UKey="+RecordToString(Расшифр_Зачет[Iter].ДО),"ВД='"+Расшифр_Зачет[Iter].ВД+"' and КБК='"+Расшифр_Зачет[Iter].КБК+"' and Призн='"+Расшифр_Зачет[Iter].Призн+"' and ПризнНорм='"+Расшифр_Зачет[Iter].ПризнДоп+"'",ДатаРег,"Сум",True);
   |Field="ДО_Опл_":
    Раб.Договор.exclОплКарт=SelfCrd;
    Раб.Договор.exclОплДок=Current;
    Раб.Договор.altЗагл="Зарегистрированные оплаты (ВД "+Расшифр_Зачет[Iter].ВД+" КБК "+Расшифр_Зачет[Iter].КБК+" {"+Trim(Расшифр_Зачет[Iter].Призн+" "+Расшифр_Зачет[Iter].ПризнДоп)+"})";
    nn=Раб.Договор.ДО_Оплата(Расшифр_Зачет[Iter].ДО,ДатаРег,Расшифр_Зачет[Iter].ВД,Расшифр_Зачет[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Trim(Расшифр_Зачет[Iter].Призн+" "+Расшифр_Зачет[Iter].ПризнДоп)," ","&"),True,False,True);
    for n=1..Iter-1 do
     if Расшифр_Зачет[Iter].ДО=Расшифр_Зачет[n].ДО and
        Расшифр_Зачет[Iter].ВД=Расшифр_Зачет[n].ВД and
        Расшифр_Зачет[Iter].КБК=Расшифр_Зачет[n].КБК and
        ЗачетПризн_[Iter]=ЗачетПризн_[n]:
        nn=nn+1;
        Раб.Договор.lstТекст[nn]="+ Текущий зачет, строка";
        Раб.Договор.lstСум[nn]=Расшифр_Зачет[n].Сум;
        Раб.Договор.lstКарт[nn]="current";
        Раб.Договор.lstНомДок[nn]=Str(n);
     fi;
    od;
    if nn=0:
       Message("Зарегистрованных оплат на дату "+DateToString(ДатаРег)+" не найдено");
       ^Cur;
    fi;
    ClearVariable(Buf);
    for n=1..nn do
     Buf[n]=Раб.Договор.LstТекст[n]+" №"+Раб.Договор.lstНомДок[n]+if(Раб.Договор.lstДатДок[n]=1.1.100,""," от "+DateToString(Раб.Договор.lstДатДок[n]))+" =";
     Buf[n]=Buf[n]+Format("%.2N",Раб.Договор.lstСум[n])+" "+Вал;
    od;
    n=Alternate("Зарегистрированные оплаты (ВД "+Расшифр_Зачет[Iter].ВД+" КБК "+Расшифр_Зачет[Iter].КБК+" {"+Trim(Расшифр_Зачет[Iter].Призн+" "+Расшифр_Зачет[Iter].ПризнДоп)+"})",Buf,-1,1,12);
    if not n=0:
       if Раб.Договор.lstКарт[n]="current":
          Template.Field="Сум";
          Template.Frame=Int(Раб.Договор.lstНомДок[n]);
          ^cur;
       fi;
    fi;
   |Field="Сум":
    Расшифр_Зачет[Iter].Сум=Min(Расшифр_Зачет[Iter].ДО_Сум-Расшифр_Зачет[Iter].ДО_Опл,Аванс_ТекЗачет);
    Расшифр_Зачет[Iter].СумРуб=Min(Расшифр_Зачет[Iter].ДО_СумРуб-Расшифр_Зачет[Iter].ДО_ОплРуб,Аванс_ТекРубЗачет);
   |True:
 fi;
 if n>0:
    if Раб.Договор.lstКарт[n]="":
       TransOpenJur(RecordToInteger(Раб.Договор.lstДок[n]));
      else
       OpenCardFile(Раб.Договор.lstКарт[n],"",Раб.Договор.lstДок[n]);
    fi;
 fi;
 Return Cur;
end;

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

Func A_onEnter (Field:S; Iter:I):L;
var i:i;
 if not Рег:
    i=Iter;
    Iter=InsertFrame(Расшифр_Зачет,Iter+1);
    if Field="AA" and Расшифр_Зачет>1:
       Расшифр_Зачет[Iter].ДО=Расшифр_Зачет[i].ДО;
       Расшифр_Зачет[Iter].ДО_ТекГод=Расшифр_Зачет[Iter].ДО.ТекГод;
       Расшифр_Зачет[Iter].ДО_Призн=CardFileRecSign(Раб.Договор.crdДО,"Признак","ДОГОВОР",Расшифр_Зачет[Iter].ДО,"");
       Расшифр_Зачет[Iter].ДО_GUID=Расшифр_Зачет[Iter].ДО.GUID;
    fi;
 fi;
 ^False;
end;

Func D_onEnter (Field:S; Iter:I):L;
 if not Рег:
    DeleteFrame(Расшифр_Зачет,Iter);
    ОбновитьТекЗачет(-1);
 fi;
 ^False;
end;

Func ДО_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
var FF:S;
 if ДатаРег=1.1.100: ^НаОшибку("Введите дату регистрации документа",mtError,2,"ДатаРег",1); ^False; fi;
 if Аванс=nil: ^НаОшибку("Выберите аванс",mtError,2,"Аванс_",1); ^False; fi;
 if Расшифр_Аванс=0: ^НаОшибку("Заполните расшифровку аванса",mtError,2,"ОбновРасшифрАв",1); ^False; fi;
 if Аванс.Договор=nil:
    FF="Рег and not Аванс and Контр="+RecordToString(Аванс.Контр)+" and ДатаРег<="+DateToString(ДатаРег);
   else
    FF="Рег and not Аванс and Pos('"+Up(Аванс.Договор.Признак)+".',Up(Признак))=1 and ДатаРег<="+DateToString(ДатаРег);
 fi;
 if Расшифр_Зачет[Iter].ДО=nil:
    Rec=Раб.Поиск.ВыборИзКартотеки("Выбор обязательства",crdДО,"НомерДок","Номер документа",FF);
   else
    Rec=OpenCardFile(crdДО,FF,Расшифр_Зачет[Iter].ДО);
 fi;
 if not Rec=nil:
    НеПустаяТаблица;
    Расшифр_Зачет[Iter].ДО=Rec;
    Расшифр_Зачет[Iter].ДО_ТекГод=Расшифр_Зачет[Iter].ДО.ТекГод;
    Расшифр_Зачет[Iter].ДО_Призн=CardFileRecSign(Раб.Договор.crdДО,"Признак","ДОГОВОР",Расшифр_Зачет[Iter].ДО,"");
    Расшифр_Зачет[Iter].ДО_GUID=Расшифр_Зачет[Iter].ДО.GUID;
    Расшифр_Зачет[Iter].КБК="";
    Переход(FieldName,Iter);
    if Расшифр_Зачет[Iter].ДО.Аннул: ^НаОшибку("Денежное обязательство аннулировано",mtError,3,"ДО.НаимДок.Наим",Iter); fi;
 fi;
 Return False ;
end;

Proc ДО_OnClick(Row: Integer; Col: Integer; Double: Logical);
var Iter:I;
 Iter=AsInteger(Template.Frame);
 if Double and not Расшифр_Зачет[Iter].ДО=nil:
    OpenBlank(blnДО,True,Расшифр_Зачет[Iter].ДО);
 fi;
end;

Func КБК_OnEnter(FieldName: String; Iter: Integer): logical;
var n,n1,nn,Iter_,z:i;
var tmp:S;
 if Расшифр_Зачет[Iter].ДО=nil: ^НаОшибку("Выберите обязательство",mtError,3,"ДО.НаимДок.Наим",Iter); ^False; fi;
 if Расшифр_Аванс=0: ^НаОшибку("Заполните расшифровку аванса",mtError,2,"ОбновРасшифрАв",1); ^False; fi;
 if not idАванс=Current: ОбновитьСпецификацию(0); fi;
 Iter_=Iter;
 if FieldName="ДО_":
    nn=Раб.Договор.ДО_КБК("Рег and UKey="+RecordToString(Расшифр_Зачет[Iter].ДО),"",ДатаРег,False,False);
   else
    Раб.Договор.altЗагл="Список КБК ("+Расшифр_Зачет[Iter].ДО.НаимДок.Наим+" №"+Расшифр_Зачет[Iter].ДО.НомерДок+" от "+DateToString(Расшифр_Зачет[Iter].ДО.ДатаДок)+")";
    Раб.Договор.altВсе=1;
    nn=Раб.Договор.ДО_КБК("Рег and UKey="+RecordToString(Расшифр_Зачет[Iter].ДО),"",ДатаРег,False,True);
 fi;
 if not nn=0:
    if Раб.Договор.AltВсе=-1 or FieldName="ДО_":
       n1=1;
      else
       if Раб.Договор.AltВсе=0 and nn>1: nn=nn-1; fi;
       n1=nn;
    fi;
    for n=n1..nn do
     z=SearchInArray(Ключ_Аванс,Раб.Договор.lstКлюч[n]);
     if z=-1: z=SearchInArray(Ключ_Аванс1,Раб.Договор.lstКлюч1[n]); fi;
     if z=-1 and Раб.Договор.AltВсе=-1:
        if not FieldName="ДО_":
           Trace("Пропущено по причине отсутствия данных в авансе: "+Раб.Договор.LstТекст[n+1]);
        fi;
       else
        if n>n1:
           Iter=InsertFrame(Расшифр_Зачет,Iter+1);
           Расшифр_Зачет[Iter].ДО=Расшифр_Зачет[Iter-1].ДО;
           Расшифр_Зачет[Iter].ДО_ТекГод=Расшифр_Зачет[Iter-1].ДО.ТекГод;
           Расшифр_Зачет[Iter].ДО_Призн=Расшифр_Зачет[Iter-1].ДО_Призн;
           Расшифр_Зачет[Iter].ДО_GUID=Расшифр_Зачет[Iter-1].ДО_GUID;
        fi;
        Расшифр_Зачет[Iter].ВД=Раб.Договор.lstВД[n];
        Расшифр_Зачет[Iter].КБК=Раб.Договор.lstКБК[n];
        Расшифр_Зачет[Iter].Призн=Раб.Договор.lstПризн[n];
        Расшифр_Зачет[Iter].ПризнДоп=Раб.Договор.lstПризнДоп[n];
        Расшифр_Зачет[Iter].ДО_Сум=Раб.Договор.lstСум[n];
        Расшифр_Зачет[Iter].ДО_СумРуб=Раб.Договор.lstСумРуб[n];
        if z>0:
           Расшифр_Зачет[Iter].КБК_Ав=Расшифр_Аванс[z].КБК;
           Расшифр_Зачет[Iter].Призн_Ав=Расшифр_Аванс[z].Призн;
           Расшифр_Зачет[Iter].ПризнДоп_Ав=Расшифр_Аванс[z].ПризнДоп;
        fi;
     fi;
    od;
    if Раб.Договор.AltВсе=-1 or FieldName="ДО_":
       n1=Iter_;
       nn=Iter;
       ОбновитьСч(-1);
      else
       n1=Iter;
       nn=Iter;
       ОбновитьСч(Iter);
    fi;
    if not FieldName="ДО_": Refresh(False,ДатаРег+1); fi;
    for Iter=n1..nn do
     tmp=Trim(Общ_Призн1+" "+Общ_Призн1);
     tmp=Раб.Бюджет2005.Объединить(tmp,Расшифр_Зачет[Iter].ДО_Призн," ");
     tmp=Раб.Бюджет2005.Объединить(tmp,Расшифр_Зачет[Iter].Призн," ");
     tmp=Раб.Бюджет2005.Объединить(tmp,Расшифр_Зачет[Iter].ПризнДоп," ");
     Раб.Договор.ДО_Оплата(Расшифр_Зачет[Iter].ДО,ДатаРег,Расшифр_Зачет[Iter].ВД,Расшифр_Зачет[Iter].КБК,Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(tmp," ","&"),False,False,False);
     Расшифр_Зачет[Iter].ДО_Опл=Раб.Договор.lstСум[1];
     Расшифр_Зачет[Iter].ДО_ОплРуб=Раб.Договор.lstСумРуб[1];
     Расшифр_Зачет[Iter].Сум=Min(Расшифр_Зачет[Iter].ДО_Сум-Расшифр_Зачет[Iter].ДО_Опл,Аванс_ТекЗачет);
     Расшифр_Зачет[Iter].СумРуб=Min(Расшифр_Зачет[Iter].ДО_СумРуб-Расшифр_Зачет[Iter].ДО_ОплРуб,Аванс_ТекРубЗачет);
    od;
    if not FieldName="ДО_": Переход(FieldName,Iter_); fi;
 fi;
 Return False;
end;

Func ДО_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var FF:S;
var Rec: Record;
var Iter,n,nn,i:I;
 Template.HideEditor(False);
 if ДатаРег=1.1.100: НаОшибку("Введите дату регистрации документа",mtError,2,"ДатаРег",1); ^Cur; fi;
 if Аванс=nil: НаОшибку("Выберите аванс",mtError,2,"Аванс_",1); ^Cur; fi;
 if Расшифр_Аванс=0: НаОшибку("Заполните расшифровку аванса",mtError,2,"ОбновРасшифрАв",1); ^Cur; fi;
 if not idАванс=Current: ОбновитьСпецификацию(0); fi;
 Iter=AsInteger(Template.Frame);
 if Аванс.Договор=nil:
    FF="Рег and not Аванс and Контр="+RecordToString(Аванс.Контр)+" and ДатаРег<="+DateToString(ДатаРег);
   else
    FF="Рег and not Аванс and Pos('"+Up(Аванс.Договор.Признак)+".',Up(Признак))=1 and ДатаРег<="+DateToString(ДатаРег);
 fi;
 Раб.Вспом.Выбор_ДО.Начать(ДатаРег,FF,Расшифр_Зачет[Iter].ДО);
 for n=1..Расшифр_Зачет do
  if not Расшифр_Зачет[n].ДО=nil:
     AddInArray(Раб.Вспом.Выбор_ДО.inДО,True,False,Расшифр_Зачет[n].ДО);
  fi;
 od;
 nn=Раб.Вспом.Выбор_ДО.Выбрать;
 Refresh;
 ShowProgress(nn,"Заполнение таблицы...");
 Try
  for n=1..nn do
   ProgressPos(n);
   if SearchInArray(Расшифр_Зачет[].ДО,Раб.Вспом.Выбор_ДО.outДО[n],False)=-1:
      if n>1 or Расшифр_Зачет=0: Iter=InsertFrame(Расшифр_Зачет,Iter+1); fi;
      Расшифр_Зачет[Iter].ДО=Раб.Вспом.Выбор_ДО.outДО[n];
      Расшифр_Зачет[Iter].ДО_ТекГод=Расшифр_Зачет[Iter].ДО.ТекГод;
      Расшифр_Зачет[Iter].ДО_Призн=CardFileRecSign(Раб.Договор.crdДО,"Признак","ДОГОВОР",Расшифр_Зачет[Iter].ДО,"");
      Расшифр_Зачет[Iter].ДО_GUID=Расшифр_Зачет[Iter].ДО.GUID;
      Расшифр_Зачет[Iter].КБК="";
      i=Iter;
      КБК_OnEnter("ДО_",Iter);
      While Расшифр_Зачет[i].ДО=Раб.Вспом.Выбор_ДО.outДО[n] do
       if Расшифр_Зачет[i].КБК="" or Round(Расшифр_Зачет[i].ДО_Сум-Расшифр_Зачет[i].ДО_Опл,2)=0:
          DeleteFrame(Расшифр_Зачет,i);
         else
          i=i+1;
       fi;
      od;
   fi;
  od;
 Finally
  CloseProgress;
 end;
 Return Cur;
end;

Proc Сум_OnExit(FieldName: String; Iter: Integer);
 ОбновитьТекЗачет(-1);
 Переход(FieldName,Iter);
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].СчДеб);
 Раб.КСА.Добавить(Расшифр_Зачет[Iter].СчКре);
 if Раб.КСА.Закончить(True):
    Message("Добавление счетов завершено");
 fi;
end;

Func СканГЭК2_OnEnter(FieldName: String; Iter: Integer): logical;
var bln:S;
 if Рег and FieldName="СканГЭК2": ^False; fi;
 if FieldName="СканГЭК2": EditorApply; fi;
 bln="Раб.Вспом.Скан_Док";
 if ModalMode and isBlankOpen(bln): Message("Бланк электронной копии уже открыт. Для возврата закройте текущий бланк",mtWarning); ^False; fi;
 if isBlankOpen(bln): Close(bln); fi;
 ExecuteProc(bln+".Вызвать",Рег,ToDay,SelfCrd,Current,"Зачет аванса","",ДатаРег,"",True,if(FieldName="СканГЭК2",nil,ГЭК2Rec[Iter]));
 РасчетГЭК2;
 Return False;
end;

Func ОбновГЭК2_OnEnter(FieldName: String; Iter: Integer): logical;
 РасчетГЭК2;
 Return False;
end;

Func ГЭК2вPDF_OnEnter(FieldName: String; Iter: Integer): logical;
var i:i;
var File:S;
 РасчетГЭК2;
 if УпрГЭК2=0: Message("Нет данных для формирования PDF"); ^False; fi;
 for Iter=1..УпрГЭК2 do
  i=Раб.Вспом.Сканер.ЧитатьГЭК("РПО_СКАН_ДОК",RecordToInteger(ГЭК2Rec[Iter]),"jpg",Iter=1);
 od;
 if i=0: Message("Нет данных для формирования PDF"); ^False; fi;
 if ПутьPDF="":
    if ChooseFolder(ПутьPDF,"Выберите папку для хранения PDF")=cmCancel: ^False; fi;
    File=ПутьPDF;
    ПутьPDF="";
   else
    File=ПутьPDF;
 fi;
 File=Раб.Бюджет2005.Контроль2Слэш(File+"\Зачет аванса от "+Раб.Договор.ConvertStr(DateToString(ДатаРег))+" ("+Аванс.НаимДок.Наим+" №"+Раб.Договор.ConvertStr(Аванс.НомерДок)+" от "+Раб.Договор.ConvertStr(DateToString(Аванс.ДатаДок))+").pdf");
 if ExistFile(File):
    if EnqOkCancel("Файл "+File+" уже существет. Перезаписать ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 i=Раб.Вспом.Сканер.JpegToPdf(File,False);
 if i=1: 
    ExecuteProgram('"'+File+'"'); 
   else
    Message("Ошибка создания PDF файла ("+Str(i)+")");
 fi;
 Return False;
end;

Func ПутьPDF_OnEnter(FieldName: String; Iter: Integer): logical;
var i:I;
 if AsLogical(S1.Cell(5,3,CellReadOnly,"")):
    i=ChooseFolder(ПутьPDF,"Выберите папку для хранения PDF");
    ^False;
 fi;
 Return True;
end;

Func ПутьPDF_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var i:i;
 Template.HideEditor(False);
 i=ChooseFolder(ПутьPDF,"Выберите папку для хранения PDF");
 Return Cur;
end;

Func ГЭК2_onEnter(FieldName: String; Iter: Integer): logical;
 СканГЭК2_OnEnter(FieldName,Iter);
 Return False;
end;

Proc ГЭК2_onClick(Row: Integer; Col: Integer; Double: Logical);
 СканГЭК2_OnEnter(AsString(Template.Field),AsInteger(Template.Frame));
end;

Proc Field_OnClick(Row: Integer; Col: Integer; Double: Logical);
var Field:S;
var Iter:I;
var Flag:L;
 Field=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if Double:
    Flag=ExecuteFuncL(Field+"_onEnter",Field,Iter);
 fi;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnНастр_OnClick(Sender: String);
 ОткрНастр(True);
end;

Proc btnСохр_onEnter (Obj:S);
 EditorApply;
end;

Proc btnОтмена_onEnter (Obj:S);
 Рег=Рег;
 EditorCancel;
end;

Proc btnБухСправ_OnClick(Sender: String);
 if CurrentState=CrdusInserted: EditorApply; fi;
 БухСправка(Sender);
end;

Proc btnУдалить_OnClick(Sender: String);
 if EnqOkCancel("Удалить зачет аванса ?",mtWarning)=cmCancel: Exit; fi;
 УдалитьЗаписи("РПО_БУХСПРАВКА");
 УдалитьЗаписи(SelfCrd);
end;

Proc btnЗакрыть_onEnter (Obj:S);
 Close;
end;

Proc Страница_onClick(Sender: String);
 if Sender="btnПлат":  Страница=1;
   |Sender="btnАванс": Страница=2;
   |Sender="btnЗачет": Страница=3;
   |Sender="btnГЭК2":  Страница=4;
 fi;
 ВывестиСтраницу;
end;

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

Proc cbНеПровДО_OnChange(Sender: String);
 if НеПровДО:
    НеПровДО=Проверить;
 fi;
 cbНеПровДО.State=НеПровДО;
 EditorApply;
end;

Func Зачет_OnInsert(SectName: String): Logical;
 Return not Рег;
end;

Func Зачет_OnDelete(SectName: String; Iter: Integer): Logical;
 Return not Рег;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen (Create:L);
 FlagInit=True;
end;

Proc AfterOpen(Destroy: Logical);
 --S0.Visible=Раб.Бюджет2005.Сетевая;
 Инициализация; 
 Оформление; 
 ВывестиСтраницу;
 FlagInit=False;
end;

Proc onRead;
var n:i;
 ОткрНастр(False);
 Настр_(False);
 if CurrentState=CrdusInserted:
    ДатаРег=ToDay;
    Рег=False;
    ClosedModFob=False;
    if ДолжнИсп="": ДолжнИсп=hДолжнИсп; fi;
    if ФИОИсп="": ФИОИсп=hФИОИсп; fi;
    НеПустаяТаблица;
    Страница=2;
 fi;
 if not FlagInit: Оформление; ВывестиСтраницу; fi;
end;

Func OnVerify: Logical;
 if Аванс_ТекГод="" and not Аванс=nil:
    Аванс_ТекГод=Аванс.ТекГод;
 fi;

 РасщепитьАналит;
 БухСправка("OnVerify");
 Return ЗаполнитьКлючДок;
end;

Proc OnCancel;
 Оформление;
end;
--Обработчики событий шаблона -----
--

Конец
