-- Шаблон создан мастером бланков
-- 22.04.2010 13:01:11
--
БланкСШаблоном "Отчет по денежным обязательствам";

fИсклЗКР:L;
fНеОпл:L;
fЗаклДоговор:L;
fБезДоговор:L;

Порядок:I;

ДН:D;
ДК:D=[ToDay+1];
ДК2:D;

Статус:i;
var Статус_:S=if(Статус=1:"Только зарегистрованные"|Статус=-1:"Только не зарегистрованные"|true:"Все обязательства");

Тип:i;
var Тип_:S=if(Тип=1:"Только авансы"|Тип=-1:"Только не авансы"|true:"Все обязательства");

Контр:Record;
Контр_:S;

Договор:Record;
Договор_:S;
ДоговорПризн:S;

ОбщСправ1:S;
НаимСправ1:S;
var ЗаглОбщСправ1:S=if(НаимСправ1="","Условие отбора общих аналит. признаков 1:","Условие отбора "+НаимСправ1);
УслОбщПризн1:S;
var УслОбщПризн1_:S=УслОбщПризн1;

ОбщСправ2:S;
НаимСправ2:S;
var ЗаглОбщСправ2:S=if(НаимСправ2="","Условие отбора общих аналит. признаков 2:","Условие отбора "+НаимСправ1);
УслОбщПризн2:S;
var УслОбщПризн2_:S=УслОбщПризн2;

УслГП:S;
var УслГП_:S=if(УслГП="","",УслГП+"("+Name_A(УслГП)+")");

УслПризн:S;

УслКБК:S;
var УслКБК_:S=УслКБК;

УслВД:S;

var Гр[]:i=if(Порядок=0:$-1|Порядок=1 and $>6:$-1|Порядок=1 and $>3:$|True:$);

var Упр:I;
var пп[]:i=$;
var Рег[]:S;
var ДатРег[]:D;
var ДатРег_[]:S;
var КонтрДок[]:Record;
var КонтрДок_[]:S;
var ДоговорДок[]:Record;
var ДоговорДок_[]:S;
var НомДок[]:S;
var ДатДок[]:D;
var АвДок[]:L;
var АвДок_[]:S=if(АвДок[$],"Аванс","");
var ГП[]:S;
var ГП_[]:S=if(Name_A(ГП[$])="",ГП[$],Name_A(ГП[$]));
var СумДок[]:N;
var СумОпл[]:N;
var СумЗачетАв[]:N;
var СумДЗ[]:N=if(АвДок[$],СумОпл[$]+СумЗачетАв[$],0);
var СумКЗ[]:N=if(АвДок[$],0,СумДок[$]-СумОпл[$]-СумЗачетАв[$]);
var Док[]:Record;
var СумДО[]:N;
var НеДО[]:L;
var НеДО_[]:s=if(НеДО[$],"V","");
var ТекГод[]:I;
var ОтклДО[]:N=if((НеДО[$] and СумДО[$]=0) or (not Year(ДатРег[$])=ТекГод[$] and СумДО[$]=0),0,if(АвДок[$],СумДО[$]-СумДЗ[$],СумДО[$]-СумДок[$]));
var repДО_Сч[]:S;
var repДО_Ан[]:S;

var ИтогоОпл:N=SumOfArray(СумОпл,Упр);
var ИтогоЗачетАв:N=SumOfArray(СумЗачетАв,Упр);
var ИтогоДЗ:N=SumOfArray(СумДЗ,Упр);
var ИтогоКЗ:N=SumOfArray(СумКЗ,Упр);

var Buf[]:S;

sОбщПризн: Section;

sТабл1: Section;
sТабл2: Section;
sТабл3: Section;

var Вход:S;
var Link:S;
var fВыгрузLink:L;
btnСвязатьГЭК  : Object;
btnСвязатьДог  : Object;
btnLink        : Object;
edLink	       : Object;
btn00	       : Object;
cbВыгрузLink   : Object;
cbЗаклДоговор  : Object;
cbБезДоговор   : Object;
btnРасчетСписок: Object;

var Run:L;

var Run2:L;
--
--Процедуры и функции -------------
Proc Оформление;
 sТабл1.Column(3,ColVisible,Порядок=1);
 sТабл2.Column(3,ColVisible,Порядок=1);
 sТабл3.Column(3,ColVisible,Порядок=1);
 sТабл1.Column(6,ColVisible,Порядок=0);
 sТабл2.Column(6,ColVisible,Порядок=0);
 sТабл3.Column(6,ColVisible,Порядок=0);
end;

Proc Очистить;
 ClearVariable(Упр);
 ClearVariable(Рег);
 ClearVariable(ДатРег);
 ClearVariable(КонтрДок);
 ClearVariable(КонтрДок_);
 ClearVariable(ДоговорДок);
 ClearVariable(ДоговорДок_);
 ClearVariable(НомДок);
 ClearVariable(ДатДок);
 ClearVariable(АвДок);
 ClearVariable(ГП);
 ClearVariable(СумДок);
 ClearVariable(СумОпл);
 ClearVariable(СумЗачетАв);
 ClearVariable(Док);
 ClearVariable(СумДО);
 ClearVariable(НеДО);
 ClearVariable(ТекГод);
 ClearVariable(repДО_Сч);
 ClearVariable(repДО_Ан);
end;

Proc ВзятьНастрОбщПризн;
var OWA,nr:I;
 if ДК=1.1.100: Exit; fi;
 OWA=OpenWorkArea(Раб.Договор.crdНастр,"Дата","ObjCrd='"+Раб.Договор.crdДоговор+"' and ТипДок=0 and Дата<="+DateToString(ДК));
 Try
  nr=Records(OWA);
  if not nr=0: 
     ОбщСправ1 =GetFieldS(OWA,nr,"Общ_Справ1");
     НаимСправ1=GetFieldS(OWA,nr,"Общ_Справ_Наим1");
     ОбщСправ2 =GetFieldS(OWA,nr,"Общ_Справ2");
     НаимСправ2=GetFieldS(OWA,nr,"Общ_Справ_Наим2");
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 sОбщПризн.Row(1,RowVisible,not ОбщСправ1="");
 if ОбщСправ1="":
    НаимСправ1="";
    УслОбщПризн1="";
    Очистить;
 fi;
 sОбщПризн.Row(2,RowVisible,not ОбщСправ2="");
 if ОбщСправ2="":
    НаимСправ2="";
    УслОбщПризн2="";
    Очистить;
 fi;
end;

Func УслПризнВФильтр(aПризн:S; Field:S):S;
var Фильтр,Слово,ch,sp:S;
var l,ll:i;
 if aПризн="" or Field="": ^""; fi;
 ll=Length(aПризн);
 Фильтр=""; Слово=""; sp="";
 for l=1..ll do
  ch=SubStr(aПризн,l,1);
  if ch="(": 
     if sp="": Фильтр=Фильтр+"("; else sp=sp+"("; fi;
    |ch="|" or ch="&" or ch=")":
     if not Слово="":
	Слово="Match("+Field+",'"+Слово+"*')";
     fi;
     Фильтр=Раб.Бюджет2005.Объединить(Фильтр,Слово+if(ch=")",")",""),sp);
     Слово="";
     if ch="|": sp=" or ";
       |ch="&": sp=" and ";
       |ch=")": sp="";
     fi;
    |True  : Слово=Слово+Ch;
  fi;
 od;
 if not Слово="":
    Слово="Match("+Field+",'"+Слово+"*')";
    Фильтр=Раб.Бюджет2005.Объединить(Фильтр,Слово,sp);
 fi;
 ^Фильтр;
end;

Func УслПризнВСубФильтр(aПризн:S):S;
var Фильтр,Слово,ch,sp:S;
var l,ll:i;
 if aПризн="": ^""; fi;
 ll=Length(aПризн);
 Фильтр=""; Слово=""; sp="";
 for l=1..ll do
  ch=SubStr(aПризн,l,1);
  if ch="(": 
     if sp="": Фильтр=Фильтр+"("; else sp=sp+"("; fi;
    |ch="|" or ch="&" or ch=")":
     if not Слово="":
	Слово="(Match(Призн,'*"+Слово+"*')or Match(ПризнДоп,'*"+Слово+"*'))";
     fi;
     Фильтр=Раб.Бюджет2005.Объединить(Фильтр,Слово+if(ch=")",")",""),sp);
     Слово="";
     if ch="|": sp=" or ";
       |ch="&": sp=" and ";
       |ch=")": sp="";
     fi;
    |True  : Слово=Слово+Ch;
  fi;
 od;
 if not Слово="":
    Слово="(Match(Призн,'*"+Слово+"*')or Match(ПризнДоп,'*"+Слово+"*'))";
    Фильтр=Раб.Бюджет2005.Объединить(Фильтр,Слово,sp);
 fi;
 ^Фильтр;
end;

--var Test:S=УслПризнВСубФильтр(УслПризн);

Func УслКБКВФильтр(aУслКБК:S):S;
var Фильтр:S;
var w,ww:i;
 if aУслКБК="": ^""; fi;
 ww=WordsCount(aУслКБК,"|");
 for w=1..ww do
  Фильтр=Раб.Бюджет2005.Объединить(Фильтр,"Match(КБК,'"+ExtractWord(w,aУслКБК,"|")+"')"," or ");
 od;
 ^Фильтр;
end;

var СписокДО[]:S;

Func ЗагрузСписокДО(fileДО:S):L;
var F:I;
var Buf:S;
 ClearVariable(СписокДО);
 if not fileДО="":
    F=TextFileOpenRead(fileДО);
    Try
     While not TextFileEndOfFile(F) do
      buf=Trim(TextFileReadLn(F));
      if not Pos("--",buf)=1:
	 AddInArray(СписокДО,True,False,Buf);
      fi;
     od;
    Finally
     TextFileClose(F);
    end;
 fi;
 ^True;
end;

Proc Расчет(Sender:S);
var OWA,i,n,nr,n2,nr2,w,ww,OA,Iter:i;
var ff,ffs,tmp,УслПризн_,ПризнДО_,Призн_,БК_,КОСГУ_,ВД_,Ан_,fileДО:S;
var Flag,Аннул:L;
var АннулДата,ДК2_,ДН_ДО,ДК_ДО:D;
var Rec: Record;
 Refresh;
 if ДК2=1.1.100: ДК2_=ДК+1; else ДК2_=ДК2; fi;
 if not fЗаклДоговор and not fБезДоговор: 
    fЗаклДоговор=True; 
    fБезДоговор=True; 
    cbЗаклДоговор.State=fЗаклДоговор;
    cbБезДоговор.State=fБезДоговор;
 fi;
 Очистить;
 if Sender="СписокДО":
    if ChooseFile(fileДО,"Загрузить список признаков ДО...","Признаки (*.sig)|*.sig")=cmCancel: Exit; fi;
    if not ЗагрузСписокДО(fileДО): Message("Ошибка загрузки списка ДО",mtError); Exit; fi;
    ff="";
    ffs="";
   else
    ff=if(Статус=1:"Рег"|Статус=-1:"not Рег"|True:"");
    ff=Раб.Бюджет2005.Объединить(ff,if(Тип=1:"Аванс"|Тип=-1:"not Аванс"|True:"")," and ");
    ff=Раб.Бюджет2005.Объединить(ff,if(ДН=1.1.100,"","ДатаРег>="+DateToString(ДН))," and ");
    ff=Раб.Бюджет2005.Объединить(ff,if(ДК=1.1.100,"","ДатаРег<="+DateToString(ДК))," and ");
    ff=Раб.Бюджет2005.Объединить(ff,if(Контр=nil,"","Контр="+RecordToString(Контр))," and ");
    ff=Раб.Бюджет2005.Объединить(ff,if(Договор=nil,"","Pos('"+ДоговорПризн+".',Up(Признак))=1")," and ");
    if fЗаклДоговор and not fБезДоговор: ff=Раб.Бюджет2005.Объединить(ff,"not УчетБО"," and ");
      |fБезДоговор and not fЗаклДоговор: ff=Раб.Бюджет2005.Объединить(ff,"УчетБО"," and ");
    fi;
    --
    tmp=УслПризнВФильтр(УслОбщПризн1,"Общ_Призн1");
    if not tmp="": tmp="("+tmp+")"; fi;
    if Length(ff)+Length(tmp)+5>255: Message("Слишком длинное условие отбора",mtError); Template.Field="УслОбщПризн1_"; Exit; fi;
    ff=Раб.Бюджет2005.Объединить(ff,tmp," and ");
    --
    tmp=УслПризнВФильтр(УслОбщПризн2,"Общ_Призн2");
    if not tmp="": tmp="("+tmp+")"; fi;
    if Length(ff)+Length(tmp)+5>255: Message("Слишком длинное условие отбора",mtError); Template.Field="УслОбщПризн2_"; Exit; fi;
    ff=Раб.Бюджет2005.Объединить(ff,tmp," and ");
    --
    tmp=УслПризнВФильтр(УслГП,"ГП_Призн");
    if not tmp="": tmp="("+tmp+")"; fi;
    if Length(ff)+Length(tmp)+5>255: Message("Слишком длинное условие отбора",mtError); Template.Field="УслГП_"; Exit; fi;
    ff=Раб.Бюджет2005.Объединить(ff,tmp," and ");
    --
    ffs=УслПризнВСубФильтр(УслПризн);
    tmp=УслКБКВФильтр(УслКБК);
    if Length(ffs)+Length(tmp)+5>255: Message("Слишком длинное условие отбора",mtError); Template.Field=if(УслКБК="","УслПризн","УслКБК_"); Exit; fi;
    ffs=Раб.Бюджет2005.Объединить(ffs,tmp," and ");
    --
    if УслВД="":
       ВД_="?";
      else
       tmp="ВД='"+УслВД+"'";
       if Length(ffs)+Length(tmp)+5>255: Message("Слишком длинное условие отбора",mtError); Template.Field="УслВД"; Exit; fi;
       ВД_=УслВД;
    fi;
    ffs=Раб.Бюджет2005.Объединить(ffs,tmp," and ");
    --
    УслПризн_=if(УслОбщПризн1="","","("+УслОбщПризн1+")");
    tmp=if(УслОбщПризн2="","","("+УслОбщПризн2+")");
    --
    УслПризн_=Раб.Бюджет2005.Объединить(УслПризн_,tmp,"&");
    tmp=if(УслПризн="","","("+УслПризн+")");
    --
    УслПризн_=Раб.Бюджет2005.Объединить(УслПризн_,tmp,"&");
 fi; --if Sender="СписокДО":
 OWA=OpenWorkArea("РПО_ДО",if(Порядок=0,"КОНТР;ДОГОВОР;ДАТАРЕГ;","ДАТАРЕГ;КОНТР;ДОГОВОР;")+"НОМЕРДОК",ff);
 Try
  if Sender="СписокДО":
     nr=LengthOfArray(СписокДО);
    else
     nr=Records(OWA);
  fi;
  ShowProgress(nr,"Расчет...");
  for i=1..nr do
   ProgressPos(i);
   Hint(Str(i)+" из "+Str(nr));
   if Sender="СписокДО":
      Rec=SignToRecord(СписокДО[i],False);
      if Rec=nil: Message("Ошибка преобразования признака в запись ("+СписокДО[i]+")",mtError); Exit; fi;
      if not SignCardFile(СписокДО[i],False)="РПО_ДО": Message("Кривая картотека признака ("+СписокДО[i]+") "+СписокДО[i],mtError); Exit; fi;
      n=GetRecordNumber(OWA,Rec);
      if n=0: Message("Запись не найдена ("+СписокДО[i]+")",mtError); Exit; fi;
     else
      n=i;
   fi;
   if n=1 and not ffs="":
      OA=OpenArray(OWA,n,"РАСШИФР","",ffs);
   fi;
   Rec=GetRecordKey(OWA,n);
   if ffs="": flag=true; else flag=not Records(OA)=0; fi;
   if flag:
      InsertFrame(Упр,Упр+1);
      НеДО[Упр]=GetFieldL(OWA,n,"НеПровДО");
      ТекГод[Упр]=Int(GetFieldS(OWA,n,"ТекГод"));
      Док[Упр]=Rec;
      Аннул=GetFieldL(OWA,n,"Аннул");
      АннулДата=GetFieldD(OWA,n,"Аннул_Дата");
      if Аннул and АннулДата>ДК: Аннул=False; fi;
      Рег[Упр]=if(GetFieldL(OWA,n,"Рег"),"Рег","");
      ДатРег[Упр]=GetFieldD(OWA,n,"ДатаРег");
      ДатРег_[Упр]=DateToString(ДатРег[Упр])+if(Аннул,"Аннулир. "+DateToString(АннулДата),"");	    
      КонтрДок[Упр]=GetFieldR(OWA,n,"Контр");
      if not GetFieldR(OWA,n,"Контр")=nil:
	 КонтрДок_[Упр]=GetFieldS(OWA,n,"Контр.КорИмя");
      fi;
      ДоговорДок[Упр]=GetFieldR(OWA,n,"Договор");
      if not ДоговорДок[Упр]=nil:
	 ДоговорДок_[Упр]=GetFieldS(OWA,n,"Договор.НаимДок.Наим")+" №"+GetFieldS(OWA,n,"Договор.НомерДок")+" от "+DateToString(GetFieldD(OWA,n,"Договор.ДатаДок"));
      fi;
      НомДок[Упр]=GetFieldS(OWA,n,"НомерДок");
      if not GetFieldR(OWA,n,"НаимДок")=nil:
	 НомДок[Упр]=GetFieldS(OWA,n,"НаимДок.Наим")+" №"+НомДок[Упр];
      fi;
      ДатДок[Упр]=GetFieldD(OWA,n,"ДатаДок");
      АвДок[Упр]=GetFieldL(OWA,n,"Аванс");
      if GetFieldL(OWA,n,"ЦЗ"):
	 ГП[Упр]=GetFieldS(OWA,n,"ГП_Призн");
	else
	 ГП[Упр]=CardFileRecSign("Контрагент","Признак","ПБС",GetFieldR(OWA,n,"Учр"));
      fi;
      if Аннул:
	 СумДок[Упр]=0;
	else
	 if ffs="":
	    СумДок[Упр]=GetFieldN(OWA,n,"СумДок");
	   else
	    nr2=Records(OA);
	    for n2=1..nr2 do
	     СумДок[Упр]=СумДок[Упр]+GetFieldN(OA,n2,"СумСНДС");
	    od;
	 fi;
      fi;
      ДН_ДО=Dat(1,1,Year(GetFieldD(OWA,n,"ДатаДО")));
      ДК_ДО=Dat(1,1,Year(GetFieldD(OWA,n,"ДатаДО"))+1);
      ПризнДО_=CardFileRecSign("РПО_ДО","Признак","ДОГОВОР",Док[Упр]);
      Призн_=Раб.Бюджет2005.Объединить(ПризнДО_,УслПризн_,"&");
      if УслКБК="":
--	   Раб.Договор.exclЗКР=fИсклЗКР;
--	   Раб.Договор.exclЗачетАв=True;
--	   Раб.Договор.ДО_Оплата(Док[Упр],ДК2_,"","",УслПризн_,False,False,False);
--	   СумОпл[Упр]=Раб.Договор.lstСум[1];
--	   Раб.Договор.ДО_ЗачетАванса(Док[Упр],ДК2_,"","",УслПризн_,False,False,False);
--	   СумЗачетАв[Упр]=Раб.Договор.lstСум[1]*if(АвДок[Упр],-1,1);
	 if АвДок[Упр]:
	    СумОпл[Упр]=Turn("*."+ВД_+".206.??.560{"+Призн_+"}",ДН,ДК2_);
	    if not fИсклЗКР:
	       СумОпл[Упр]=СумОпл[Упр]+Turn("*."+ВД_+".ЗАБ.00.560/*."+ВД_+".ЗАБ.КР.*{"+Призн_+"}",ДН,ДК2_);
	    fi;
	    СумЗачетАв[Упр]=Turn("*."+ВД_+".206.??.660{"+Призн_+"}",ДН,ДК2_);
	   else
	    СумОпл[Упр]=Turn("*."+ВД_+".302.??.830/~*.206.??.*{"+Призн_+"}",ДН,ДК2_);
	    if not fИсклЗКР:
	       СумОпл[Упр]=СумОпл[Упр]+Turn("*."+ВД_+".ЗАБ.00.830/*."+ВД_+".ЗАБ.КР.*{"+Призн_+"}",ДН,ДК2_);
	    fi;
	    СумЗачетАв[Упр]=Turn("*."+ВД_+".302.??.830/*."+ВД_+".206.??.660{"+Призн_+"}",ДН,ДК2_);

	 fi;
	 if not ПризнДО_="ДОГОВОР.":
	    СумДО[Упр]=Turn("*."+ВД_+".502.11.*/*."+ВД_+".502.12.*{"+Призн_+"}",ДН_ДО,ДК_ДО);
	    repДО_Сч[Упр]="*."+ВД_+".502.11.*/*."+ВД_+".502.12.*";
	    repДО_Ан[Упр]=Призн_;
	 fi;
	else
	 ww=WordsCount(УслКБК,"|");
	 for w=1..ww do
	  БК_=ExtractWord(w,УслКБК,"|");
	  БК_=SubStr(БК_,1,Length(БК_)-4);
	  КОСГУ_=ExtractWord(w,УслКБК,"|");
	  КОСГУ_=SubStr(КОСГУ_,Length(КОСГУ_)-2,3);
	  Ан_=Раб.Бюджет2005.Соотв_КОСГУ_Ан("302",КОСГУ_);
--	    Раб.Договор.exclЗКР=fИсклЗКР;
--	    Раб.Договор.exclЗачетАв=True;
--	    Раб.Договор.ДО_Оплата(Док[Упр],ДК2_,"",БК_+"."+КОСГУ_,УслПризн_,False,False,False);
--	    СумОпл[Упр]=СумОпл[Упр]+Раб.Договор.lstСум[1];
--	    Раб.Договор.ДО_ЗачетАванса(Док[Упр],ДК2_,"",БК_+"."+КОСГУ_,УслПризн_,False,False,False);
--	    СумЗачетАв[Упр]=СумЗачетАв[Упр]+(Раб.Договор.lstСум[1]*if(АвДок[Упр],-1,1));
	  if АвДок[Упр]:
	     СумОпл[Упр]=СумОпл[Упр]+Turn(БК_+"."+ВД_+".206."+Ан_+".560{"+Призн_+"}",ДН,ДК2_);
	     if not fИсклЗКР:
		СумОпл[Упр]=СумОпл[Упр]+Turn(БК_+"."+ВД_+".ЗАБ.00.560/"+БК_+"."+ВД_+".ЗАБ.КР."+КОСГУ_+"{"+Призн_+"}",ДН,ДК2_);
	     fi;
	     СумЗачетАв[Упр]=СумЗачетАв[Упр]+Turn(БК_+"."+ВД_+".206."+Ан_+".660{"+Призн_+"}",ДН,ДК2_);
	    else
	     СумОпл[Упр]=СумОпл[Упр]+Turn(БК_+"."+ВД_+".302."+Ан_+".830/~*.206.??.*{"+Призн_+"}",ДН,ДК2_);
	     if not fИсклЗКР:
		СумОпл[Упр]=СумОпл[Упр]+Turn(БК_+"."+ВД_+".ЗАБ.00.830/"+БК_+"."+ВД_+".ЗАБ.КР."+КОСГУ_+"{"+Призн_+"}",ДН,ДК2_);
	     fi;
	     СумЗачетАв[Упр]=СумЗачетАв[Упр]+Turn(БК_+"."+ВД_+".302."+Ан_+".830/"+БК_+"."+ВД_+".206."+Ан_+".660{"+Призн_+"}",ДН,ДК2_);
	  fi;
	  if not ПризнДО_="ДОГОВОР.":
	     СумДО[Упр]=СумДО[Упр]+Turn(БК_+"."+ВД_+".502.11."+КОСГУ_+"/"+БК_+"."+ВД_+".502.12."+КОСГУ_+"{"+Раб.Бюджет2005.Объединить(ПризнДО_,УслПризн_,"&")+"}",ДН_ДО,ДК_ДО);
	     if repДО_Сч[Упр]="":
		repДО_Сч[Упр]="(*.502.11.*/*."+ВД_+".502.12.*)|"+БК_+".*."+КОСГУ_;
		repДО_Ан[Упр]=Раб.Бюджет2005.Объединить(ПризнДО_,УслПризн_,"&");
	       else
		repДО_Сч[Упр]=repДО_Сч[Упр]+"(*.502.11.*/*."+ВД_+".502.12.*)|"+БК_+".*."+КОСГУ_;
	     fi;
	  fi;
	 od;
      fi;
      if fНеОпл:
	 --if (АвДок[Упр] and Round(СумДЗ[Упр],2)=0 and not Round(СумОпл[Упр],2)=0) or (not АвДок[Упр] and Round(СумКЗ[Упр],2)=0): DeleteFrame(Упр,Упр); fi;
	 if (АвДок[Упр] and Round(СумДЗ[Упр],2)=0) or (not АвДок[Упр] and Round(СумКЗ[Упр],2)=0): DeleteFrame(Упр,Упр); fi;
      fi;
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 if Sender="btnРасчет": Message("Расчет завершен"); fi;
end;

Func ЭкспортКартотекиПоФильтру(vКарт :String; vФильтр :String; vCRD_Файл :String; fUKey:L) :Logical;
var file :String;
var num :Integer;
 if (vКарт='' or not ExistsCardFile(vКарт)) and vCRD_Файл='': return false; fi;
 file=PlanVar('CACHE')+'\'+GetGUID+'.bro';
 num=TextFileCreate(file,false);
 try
   TextFileWriteLn(num,'[Header]',false);
   TextFileWriteLn(num,'_EnabledFltr=1',false);
   TextFileWriteLn(num,'_Fltr='+vФильтр,false);
   TextFileWriteLn(num,'TableName='+vКарт,false);
 finally
   TextFileClose(num);
 end;
 ExportCard( ieCRD,    --  Формат CRD
	     file,     --  Картотека (браузер)
	     vCRD_Файл,--  Файл (путь)
	     true,     --  Учитывать фильтр браузера
	     false,    --  Выгружать только видимые поля
	     false,    --  Выгружать разыменованные поля
	     fUKey,    --  Выгружать c UKEY
	     false,    --  Указать столбец для EXCEL
	     True,     --  Выгружать служебные поля
	     false,    --  Выгружать в DOS-кодировке
	     false);   --  Выгружать таблицы по ссылкам
 if ExistFile(file): DeleteFile(file); fi;
 return true;
end;

Func КоррекцияCRD(FName:S):L;
var FS,FT,p,b,sz,z:I;
var Buf,UKey_:S;
 p=0;
 FS=TextFileOpenRead(FName);
 Try
  FT=TextFileCreate(FName+".new");
  Try
   ShowProgress(Упр,"Корректировка записей...");
   b=Time;
   While not TextFileEndOfFile(FS) do
    Buf=TextFileRead(FS,255);
    sz=sz+Length(Buf);
    if Buf="":
       if not TextFileEndOfFile(FS):
	  Buf=TextFileReadLn(FS);
	  TextFileWriteLn(FT,Buf);
	  if not UKey_="":
	     TextFileWriteLn(FT,UKey_);
	     UKey_="";
	  fi;
	  sz=sz+Length(Buf);
	  Hint(Str(sz/(time-b)/1024)+" kb/sec");
       fi;
      else
       if Pos("ПРИЗНАК=",Up(Buf))=1:
	  z=Pos("._UkeY_",Buf);
	  if not z=0:
	     UKey_="UKEY="+SubStr(Buf,z+7,255);
	     Buf=SubStr(Buf,1,z-1);
	  fi;
       fi;
       TextFileAppendLn(FT,Buf);
    fi;
    if Pos("CREATETIME=",Up(Buf))=1: p=p+1; fi;
    ProgressPos(p);
   od;
  Finally
   TextFileClose(FT);
  end;
 Finally
  TextFileClose(FS);
  CloseProgress;
 end;
 RenameFile(FName,FName+".bak");
 RenameFile(FName+".new",SubStr(FName,1,Length(FName+".new")-4));
 ^True;
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
Proc Д_OnExit(FieldName: String; Iter: Integer);
 Очистить;
 ВзятьНастрОбщПризн;
end;

Func Д_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:D;
 Template.HideEditor(False);
 tmp=Calendar;
 if not tmp=1.1.100:
    PutVariableD(AsString(Template.Field),tmp);
    Очистить;
    ВзятьНастрОбщПризн;
 fi;
 Return Cur;
end;

Func Статус_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="Все обязательства";
 Buf[2]="Только зарегистрованные";
 Buf[3]="Только не зарегистрованные";
 n=Alternate("Выберите статус обязательства",Buf,-1,1,12);
 if not n=0:
    Статус=if(n=2:1|n=3:-1|True:0);
    Очистить;
 fi;
 Return False;
end;

Func Тип_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="Все обязательства";
 Buf[2]="Только авансы";
 Buf[3]="Только не авансы";
 n=Alternate("Выберите тип обязательства",Buf,-1,1,12);
 if not n=0:
    Тип=if(n=2:1|n=3:-1|True:0);
    Очистить;
 fi;
 Return False;
end;

Func Контр_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 if Контр=nil:
    rec=Раб.Поиск.ВыборИзКартотеки("Выбор контрагента","КОНТРАГЕНТ","ПРИЗНАК|ПОЛНИМЯ|КОРИМЯ|ИНН","Код|Полное имя|Краткое имя|ИНН","");
   else
    rec=OpenCardFile("Контрагент","",Контр,crdRecordOnly);
 fi;
 if not Rec=nil:
    Контр=Rec;
    Контр_=GetCardFieldS("Контрагент",Контр,"КорИмя");
    ClearVariable(Договор);
    ClearVariable(Договор_);
    ClearVariable(ДоговорПризн);
    Очистить;
 fi;
 Return False;
end;

Proc Контр_OnExit(FieldName: String; Iter: Integer);
 ClearVariable(Контр);
 ClearVariable(Контр_);
 Очистить;
end;

Func Договор_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 if Договор=nil:
    Rec=Раб.Поиск.ВыборИзКартотеки("Выбор договора, контракта...",Раб.Договор.crdДоговор,"НомерДок","Номер документа","Рег and not Недейств"+if(Контр=nil,""," and Контр="+RecordToString(Контр)));
   else
    Rec=OpenCardFile(Раб.Договор.crdДоговор,"Рег and not Недейств"+if(Контр=nil,""," and Контр="+RecordToString(Контр)),Договор);
 fi;
 if not Rec=nil:
    Договор=Rec;
    Договор_=GetCardFieldS(Раб.Договор.crdДоговор,Rec,"НаимДок.Наим")+" №"+GetCardFieldS(Раб.Договор.crdДоговор,Rec,"НомерДок")+" от "+DateToString(GetCardFieldD(Раб.Договор.crdДоговор,Rec,"ДатаДок"));
    ДоговорПризн=GetCardFieldS(Раб.Договор.crdДоговор,Rec,"ПРИЗНАК");
    Очистить;
 fi;
 Return False;
end;

Proc Договор_OnExit(FieldName: String; Iter: Integer);
 ClearVariable(Договор);
 ClearVariable(Договор_);
 ClearVariable(ДоговорПризн);
 Очистить;
end;

Func ДоговорДок_OnEnter(FieldName: String; Iter: Integer): logical;
 OpenBlank(Раб.Договор.blnДоговор,True,ДоговорДок[Iter]);
 Return False;
end;

Func УслОбщПризн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 FieldName=SubStr(FieldName,1,Length(FieldName)-1);
 tmp=SubStr(FieldName,Length(FieldName),1);
 tmp=AnaElection(GetVariableS("ОбщСправ"+tmp),False,True);
 if not tmp="":
    if SubStr(tmp,Length(tmp),1)=".": tmp=SubStr(tmp,1,Length(tmp)-1)+"!"; fi;
    PutVariableS(FieldName,Раб.Бюджет2005.Объединить(GetVariableS(FieldName),tmp,"|"));
    Очистить;
 fi;
 Return  False;
end;

Func УслГП_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 rec=Раб.Поиск.ВыборИзКартотеки("Выбор грузополучателя","КОНТРАГЕНТ","ПРИЗНАК|ПОЛНИМЯ|КОРИМЯ|РПО_КБП","Признак|Полное имя|Краткое имя|КБП","РПО_ПБС");
 if not Rec=nil:
    УслГП=CardFileRecSign("Контрагент","Признак","ПБС",Rec);
    Очистить;
 fi;
 Return False;
end;

Proc УслГП_OnExit(FieldName: String; Iter: Integer);
 ClearVariable(УслГП);
 Очистить;
end;

Proc УслОбщПризн_OnExit(FieldName: String; Iter: Integer);
var tmp:S;
 FieldName=SubStr(FieldName,1,Length(FieldName)-1);
 tmp=GetVariableS(FieldName);
 PutVariableS(FieldName,Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(GetVariableS(FieldName),"|","Name_A"));
 if not tmp=GetVariableS(FieldName):
    Очистить;
 fi;
end;

Func Призн_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var z:n;
 z=Saldo("{"+Value+"}",1.1.100);
 if not Pos("~",Value)=0: Message("Недопустимо использовать символ '~' в данном условие отбора",mtError); ^False; fi;
 Return True;
end;

Proc Призн_OnExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func Призн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Field:S;
var tmp:S;
 Field=AsString(Template.Field);
 tmp=Раб.Бюджет2005.Объединить(ОбщСправ1,ОбщСправ2,"|");
 tmp=Раб.Бюджет2005.СписокСправ("*.?.206.??.*|*.?.302.??.*|*.?.502.??.*",0,tmp);
 Cur=AnaElection(tmp);
 if Cur="": Template.HideEditor(False); ^Cur; fi;
 Cur=Раб.Бюджет2005.Объединить_Диалог(GetVariableS(Field),Cur,"&=И;()&=(...) И;|=ИЛИ;()|=(...) ИЛИ;_=ЗАМЕНИТЬ","_");
 if Раб.Бюджет2005.HideEditor: 
    Template.HideEditor(False); 
    PutVariableS(Field,Cur);
 fi;
 Return Cur;
end;

Func УслКБК_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=Раб.КБК.ВыбратьМаскуКБК("ФКР",Раб.Договор.МаскаСчКБК,"",True);
 if not tmp="":
    УслКБК=Раб.Бюджет2005.Объединить(УслКБК,tmp,"|");
    Очистить;
 fi;
 Return False;
end;

Proc УслКБК_OnExit(FieldName: String; Iter: Integer);
var tmp:S;
 tmp=УслКБК;
 УслКБК=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(УслКБК,"|");
 if not tmp=УслКБК: Очистить; fi;
end;

Func УслВД_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=Раб.КБК.Список(Раб.Договор.МаскаСчКБК,"","ВД");
 if not tmp="":
    УслВД=tmp;
 fi;
 Return False;
end;

Proc УслВД_OnExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func Док_OnEnter(FieldName: String; Iter: Integer): logical;
 OpenBlank(Раб.Договор.blnДО,True,Док[Iter]);
 Return False;
end;

Func СумОпл_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var ДК2_:D;
 if ДК2=1.1.100: ДК2_=ДК; else ДК2_=ДК2; fi;
 Раб.Договор.exclЗКР=fИсклЗКР;
 Раб.Договор.exclЗачетАв=True;
 Раб.Договор.altЗагл="Список зарегистрированных оплат";
 n=Раб.Договор.ДО_Оплата(Док[Iter],ДК2_,"","","",True,True,True);
 if n=-1:
    Message("Зарегистрированных оплат не найдено");
   else
    if not n=0:
       if Раб.Договор.lstКарт[n]="":
	  TransOpenJur(RecordToInteger(Раб.Договор.lstДок[n]));
	 else
	  OpenCardFile(Раб.Договор.lstКарт[n],"",Раб.Договор.lstДок[n]);
       fi;
    fi;
 fi;
 Return False;
end;

Func СумЗачетАв_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var ДК2_:D;
 if ДК2=1.1.100: ДК2_=ДК; else ДК2_=ДК2; fi;
 Раб.Договор.altЗагл="Список зачетов аванса";
 n=Раб.Договор.ДО_ЗачетАванса(Док[Iter],ДК2_,"","","",True,True,True);
 if n=-1:
    Message("Зачетов аванса не найдено");
   else
    if not n=0:
       if Раб.Договор.lstКарт[n]="":
	  TransOpenJur(RecordToInteger(Раб.Договор.lstДок[n]));
	 else
	  OpenCardFile(Раб.Договор.lstКарт[n],"",Раб.Договор.lstДок[n]);
       fi;
    fi;
 fi;
 Return False;
end;

Func СумДО_OnEnter(FieldName: String; Iter: Integer): logical;
 Report('"'+PlanVar("Общие")+'\Отчеты\Служебные отчеты.lst"."001"',ДН,ДК+1,repДО_Сч[Iter],repДО_Ан[Iter]);
 Return False;
end;

Proc Вход_OnExit(FieldName: String; Iter: Integer);
 if Вход="ТББ":
    btnСвязатьГЭК.Visible=True;
    btnСвязатьДог.Visible=True;
    btnLink.Visible=True;
    edLink.Visible=True;
    btn00.Visible=True;
    cbВыгрузLink.Visible=True;
    btnРасчетСписок.Visible=True;
 fi;
 Вход="";
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnРасчет_OnClick(Sender: String);
 if ДН>ДК: Message("Начальная дата превышает конечную",mtError); Template.Field="ДН"; Exit; fi;
 if Sender="btnРасчетСписок": Sender="СписокДО"; fi;
 Расчет(Sender);
end;

Proc btnПечать_OnClick(Sender: String);
 Раб.Настр_Печать.Prn("","","ТББ.ДОКУМЕНТЫ.ДОГОВОРПОСТ.ДО_ОТЧЕТ.000.cfg","",1);
end;

Proc cbИсклЗКР_OnChange(Sender: String);
 Очистить;
end;

Proc cbНеОпл_OnChange(Sender: String);
 Очистить;
end;

Proc rbПорядок_OnChange(Sender: String);
 Очистить;
 Оформление;
end;

Proc cbДоговор_OnChange(Sender: String);
 if Sender="cbИсклДоговор": Договор=nil; fi;
 Очистить;
end;


Proc btnСвязатьГЭК_OnClick(Sender: String);
var OWA4,n4,nr4:i;
var OWA5,n5,nr5:i;
var n1,z,p4,p5:I;
var Rec: Record;
var FName:S;
 if fВыгрузLink:
    if ChooseFolder(FName,"Выберите папку для экспорта")=cmCancel: Message("Отказ от операции"); Exit; fi;
 fi;
 OWA4=OpenWorkArea("РПО_ГЭК","Запись","ДОК='РПО_ДО'");
 OWA5=OpenWorkArea("РПО_СВЕД_БО","ДО","not ДО=nil");
 Try
  ShowProgress(Упр,"Обработано...");
  nr4=Records(OWA4);
  nr5=Records(OWA5);
  for n1=1..Упр do
   ProgressPos(n1);
   Rec=Док[n1];
   z=Search(OWA4,1,RecordToInteger(Rec));
   if not z=0:
      BeginChanging(OWA4,False);
      Try
       While GetFieldI(OWA4,z,"Запись")=RecordToInteger(Rec) do
	p4=p4+1;
	if not GetFieldS(OWA4,z,"Link")=Link: z=PutFieldS(OWA4,z,"Link",Link); fi;
	n4=z;
	z=z+1;
	if z>nr4: Break; fi;
       od;
       EndChanging(OWA4);
      Except
       CancelChanging(OWA4);
       Message("Ошибка! ДО="+RecordToString(Rec)+Chr(13)+"Обработано ГЭК "+Str(p4)+" из "+Str(nr4)+", БО "+Str(p5)+" из "+Str(nr5),mtError);
       Raise;
      end;
   fi;
   --
   z=Search(OWA5,1,Rec);
   if not z=0:
      BeginChanging(OWA5,False);
      Try
       While GetFieldR(OWA5,z,"ДО")=Rec do
	p5=p5+1;
	if not GetFieldS(OWA5,z,"Link")=Link: z=PutFieldS(OWA5,z,"Link",Link); fi;
	n5=z;
	z=z+1;
	if z>nr5: Break; fi;
       od;
       EndChanging(OWA5);
      Except
       CancelChanging(OWA5);
       Message("Ошибка! ДО="+RecordToString(Rec)+Chr(13)+"Обработано ГЭК "+Str(p4)+" из "+Str(nr4)+", БО "+Str(p5)+" из "+Str(nr5),mtError);
       Raise;
      end;
   fi;
  od; --for n1=1..nr1 do
 Finally
  CloseWorkArea(OWA4);
  CloseWorkArea(OWA5);
  CloseProgress;
 end;
 if fВыгрузLink:
    ЭкспортКартотекиПоФильтру("РПО_ГЭК","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_ГЭК"),True);
    ЭкспортКартотекиПоФильтру("РПО_СВЕД_БО","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_СВЕД_БО"),True);
 fi;
 if Sender="btnСвязатьДог": Message("Операция завершена, обработано ГЭК "+Str(p4)+" из "+Str(nr4)+", БО "+Str(p5)+" из "+Str(nr5)); fi;
end;

Proc btnСвязатьДог_OnClick(Sender: String);
var Iter:I;
var FName:S;
 if fВыгрузLink:
    if ChooseFolder(FName,"Выберите папку для экспорта")=cmCancel: Message("Отказ от операции"); Exit; fi;
 fi;
 ShowProgress(Упр,"Обработано...");
 Try
  for Iter=1..Упр do
   ProgressPos(Iter);
   if not ДоговорДок[Iter]=nil:
      Раб.Вспом.Договор_Связать_Табл.Вызвать(Link,"UKey="+RecordToString(ДоговорДок[Iter]),False,False,"");
   fi;
  od;
 Finally
  CloseProgress;
 end;
 if fВыгрузLink:
    ЭкспортКартотекиПоФильтру("РПО_ДОГОВОР","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_ДОГОВОР"),True);
    ЭкспортКартотекиПоФильтру("РПО_ДОГОВОР_ПОЗИЦИИ","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_ДОГОВОР_ПОЗИЦИИ"),True);
    ЭкспортКартотекиПоФильтру("РПО_ДОГОВОР_ПОЗИЦИИ_ТМЦ","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_ДОГОВОР_ПОЗИЦИИ_ТМЦ"),True);
    ЭкспортКартотекиПоФильтру("РПО_ГЭК","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_ГЭК"),True);
    ЭкспортКартотекиПоФильтру("РПО_СВЕД_БО","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_СВЕД_БО"),True);
    ЭкспортКартотекиПоФильтру("РПО_ДОГОВОР_ПРИЗНАК","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_ДОГОВОР_ПРИЗНАК"),True);
    ЭкспортКартотекиПоФильтру("РПО_СКАН_ДОК","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_СКАН_ДОК"),True);
    ЭкспортКартотекиПоФильтру("РПО_СПИСОК_ФАЙЛОВ","Link='"+Link+"'",Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_СПИСОК_ФАЙЛОВ"),True);
 fi;
 if Sender="btnСвязатьГЭК": Message("Операция завершена"); fi;
end;

var BufВД[]:S;
var BufКБК[]:S;
var BufПризн[]:S;
var BufПризнДоп[]:S;
var BufСум[]:N;
var FName:S;

Proc MyTrace(aFile:S; aTxt:S);
 if not ExistFile(aFile): CreateFile(aFile); fi;
 WriteLn(aFile,aTxt);
end;

Proc btn00_OnClick(Sender: String);
var Iter,OWAs,OWAt,s,t,OAs1,OAt1,OAt2,OAt3,s1,t1,ss1,tt1,z:I;
var GUID_,БК_,КОСГУ_,Ан_,УслПризн_:S;
var Sum,SumDoc:N;
var Flag:L;
var FLog,FSig:S;
var НДС_:N;
 if Упр=0 or Док[1]=NIL: Exit; fi;
 if not CanUpdate("РПО_ДО") or not CanInsert("РПО_ДО") or not CanDelete("РПО_ДО") or IsReadOnly("РПО_ДО"): Message("Вы не обладаете достаточными правами на выполнение данной операции",mtError); Exit; fi;
 if Раб.Бюджет2005.Сетевая:
    if EnqOkCancel("Внимание! Перед операцией НАСТОЯТЕЛЬНО рекомендуется отключить ведение логов на сервере (логирование сильно замедляет процедуру)^MПродолжить ?",mtWarning)=cmCancel: Exit; fi;
 fi;
 Refresh;
 if Sender="btn00":
    if ChooseFolder(FName,"Выберите папку для экспорта")=cmCancel: Message("Отказ от операции"); Exit; fi;
 fi;
 FLog=Раб.Бюджет2005.Контроль2Слэш(FName+"\"+GetGUID+".log");
 FSig=Раб.Бюджет2005.Контроль2Слэш(FName+"\ДО.sig");
 CreateFile(FSig);
 WriteLn(FSig,"--Из остатков 206,302 счетов следует исключить следующие признаки");
 FName=Раб.Бюджет2005.Контроль2Слэш(FName+"\РПО_ДО(остатки)");
 ClearVariable(BufВД);
 ClearVariable(BufКБК);
 ClearVariable(BufПризн);
 ClearVariable(BufПризнДоп);
 ClearVariable(BufСум);
 GUID_=GetGUID;
 ShowProgress(Упр,"В процессе...");
 OWAs=OpenWorkArea("РПО_ДО","");
 Try
  OWAt=OpenWorkArea("РПО_ДО","","Link='"+GUID_+"'");
  Try
   BeginChanging(OWAt,False);
   Try
    for Iter=1..Упр do
     ProgressPos(Iter);
     s=GetRecordNumber(OWAs,Док[Iter]);
     WriteLn(FSig,"ДОГОВОР."+GetFieldS(OWAs,s,"Признак"));
     t=InsertRecord(OWAt);
     CopyRecord(OWAs,OWAt,s,t);
     t=PutFieldD(OWAt,t,"ДатаРег",Dat(31,12,Year(ДК)));
     t=PutFieldD(OWAt,t,"ДатаДО",Dat(01,01,Year(ДК)+1));
     t=PutFieldS(OWAt,t,"Признак",GetFieldS(OWAt,t,"Признак")+"._UkeY_"+Str(RecordToInteger(Док[Iter])));
     t=PutFieldS(OWAt,t,"Link",GUID_);
     t=PutFieldN(OWAt,t,"СумДок",Abs(if(АвДок[Iter],СумДЗ[Iter],СумКЗ[Iter])));
     t=PutFieldL(OWAt,t,"ЦЗ",False);
     t=PutFieldL(OWAt,t,"УчетНДС",False);
     t=PutFieldL(OWAt,t,"УчетТМЦ",False);
     t=PutFieldL(OWAt,t,"Аннул_Часть",False);
     t=PutFieldL(OWAt,t,"CLOSEDMODFOB",False);
     if GetFieldL(OWAt,t,"Аванс"):
	t=PutFieldL(OWAt,t,"НеПровДО",True);
     fi;
     if Iter=1: 
	OAs1=OpenArray(OWAs,s,"Расшифр","ВД;КБК;Призн;ПризнНорм");
	OAt1=OpenArray(OWAt,t,"Расшифр","");
	OAt2=OpenArray(OWAt,t,"Позиции_НДС","");
	OAt3=OpenArray(OWAt,t,"Свертка","");
     fi;
     tt1=Records(OAt1);
     for t1=1..tt1 do
      DeleteRecord(OAt1,tt1-(t1-1)); --удаляем с хвоста
     od;
     DeleteAllRecords(OAt2);
     DeleteAllRecords(OAt3);
     SumDoc=0;
     t1=0;
     ss1=Раб.Договор.ДО_КБК("Ukey="+RecordToString(Док[Iter]),"",ДК,False,False);
     if not ss1=0:
	CopyArray(Раб.Договор.LstВД,BufВД);
	CopyArray(Раб.Договор.LstКБК,BufКБК);
	CopyArray(Раб.Договор.LstПризн,BufПризн);
	CopyArray(Раб.Договор.LstПризнДоп,BufПризнДоп);
	CopyArray(Раб.Договор.LstСум,BufСум);
	for s1=1..ss1 do
	 УслПризн_=Раб.Бюджет2005.Объединить(GetFieldS(OWAt,t,"Общ_Призн1"),GetFieldS(OWAt,t,"Общ_Призн2"),"&");
	 УслПризн_=Раб.Бюджет2005.Объединить(УслПризн_,BufПризн[s1],"&");
	 УслПризн_=Раб.Бюджет2005.Объединить(УслПризн_,BufПризнДоп[s1],"&");
	 УслПризн_=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(УслПризн_," " ,"&");
	 Раб.Договор.ДО_Оплата(Док[Iter],ДК,BufВД[s1],BufКБК[s1],УслПризн_,False,False,False);
	 if АвДок[Iter]: --для аванса сумму документа считаем от оплаты
	    Sum=Раб.Договор.LstСум[1];
	    Раб.Договор.ДО_ЗачетАванса(Док[Iter],ДК,BufВД[s1],BufКБК[s1],УслПризн_,False,False,False);
	    Sum=Round(Sum-Раб.Договор.LstСум[1],2);
	   else
	    Sum=Round(BufСум[s1]-Раб.Договор.LstСум[1],2);
	 fi;
	 if not Round(Sum,2)=0:
--	      SumDoc=SumDoc+Abs(Sum);
	    SumDoc=SumDoc+if(BufСум[s1]<0,Sum,Abs(Sum));
	    t1=t1+1;
	    t1=InsertRecord(OAt1,t1);
	    t1=PutFieldS(OAt1,t1,"ВД",BufВД[s1]);
	    t1=PutFieldS(OAt1,t1,"КБК",BufКБК[s1]);
	    t1=PutFieldS(OAt1,t1,"Призн",BufПризн[s1]);
	    t1=PutFieldS(OAt1,t1,"ПризнДоп",BufПризнДоп[s1]);
	    t1=PutFieldS(OAt1,t1,"ПризнНорм",BufПризнДоп[s1]);
	    t1=PutFieldN(OAt1,t1,"СумСНДС",Sum);
	    t1=PutFieldS(OAt1,t1,"ВидОпер","00");
	    z=Search(OAs1,1,BufВД[s1],BufКБК[s1],BufПризн[s1],BufПризнДоп[s1]);
	    if z=0:
	       t1=PutFieldN(OAt1,t1,"НДС",-1);
	       t1=PutFieldN(OAt1,t1,"Сум",Sum);
	       MyTrace(FLog,"Iter="+Str(Iter)+" Не найдена ставка НДС по КБК ("+BufВД[s1]+" "+BufКБК[s1]+" {"+Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(УслПризн_,"&" ," ")+"} для ДО="+RecordToString(Док[Iter]));
	      else
	       НДС_=GetFieldN(OAs1,z,"НДС");
	       t1=PutFieldN(OAt1,t1,"НДС",НДС_);
	       t1=PutFieldN(OAt1,t1,"Сум",GetFieldN(OAt1,t1,"СумСНДС")-Round(GetFieldN(OAt1,t1,"СумСНДС")*НДС_/(100+НДС_),2));
	       z=Search(OAs1,z+1,BufВД[s1],BufКБК[s1],BufПризн[s1],BufПризнДоп[s1]);
	       While not z=0 do
		if not НДС_=GetFieldN(OAs1,z,"НДС"):
		   MyTrace(FLog,"Iter="+Str(Iter)+" Несколько ставок НДС по КБК ("+BufВД[s1]+" "+BufКБК[s1]+" {"+Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(УслПризн_,"&" ," ")+"} для ДО="+RecordToString(Док[Iter])+", взята первая");
		   Break;
		fi;
		z=Search(OAs1,z+1,BufВД[s1],BufКБК[s1],BufПризн[s1],BufПризнДоп[s1]);
	       od;
	    fi;
	    БК_=SubStr(BufКБК[s1],1,20);
	    КОСГУ_=SubStr(BufКБК[s1],22,3);
	    АН_=Раб.Бюджет2005.Соотв_КОСГУ_Ан("",КОСГУ_);
--	      if Sum>0:
--		 t1=PutFieldS(OAt1,t1,"СчДеб",if(АвДок[Iter],БК_+"."+BufВД[s1]+".206."+АН_+".560","00"));
--		 t1=PutFieldS(OAt1,t1,"СчКре",if(АвДок[Iter],"00",БК_+"."+BufВД[s1]+".302."+АН_+".730"));
--		else
--		 t1=PutFieldS(OAt1,t1,"СчДеб",if(АвДок[Iter],"00",БК_+"."+BufВД[s1]+".302."+АН_+".830"));
--		 t1=PutFieldS(OAt1,t1,"СчКре",if(АвДок[Iter],БК_+"."+BufВД[s1]+".206."+АН_+".660","00"));
--		 MyTrace(FLog,"Iter="+Str(Iter)+" Сумма оплаты по КБК ("+BufВД[s1]+" "+BufКБК[s1]+" {"+Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(УслПризн_,"&" ," ")+"} для ДО="+RecordToString(Док[Iter])+" превышает сумму ДО на "+Str(-Sum,2));
--	      fi;
	    if Round(BufСум[s1],2)<0 or Round(Sum,2)>0:
	       t1=PutFieldS(OAt1,t1,"СчДеб",if(АвДок[Iter],БК_+"."+BufВД[s1]+".206."+АН_+".560","00"));
	       t1=PutFieldS(OAt1,t1,"СчКре",if(АвДок[Iter],"00",БК_+"."+BufВД[s1]+".302."+АН_+".730"));
	      else
	       t1=PutFieldS(OAt1,t1,"СчДеб",if(АвДок[Iter],"00",БК_+"."+BufВД[s1]+".302."+АН_+".830"));
	       t1=PutFieldS(OAt1,t1,"СчКре",if(АвДок[Iter],БК_+"."+BufВД[s1]+".206."+АН_+".660","00"));
	       t1=PutFieldN(OAt1,t1,"СумСНДС",-GetFieldN(OAt1,t1,"СумСНДС"));
	       t1=PutFieldN(OAt1,t1,"Сум",-GetFieldN(OAt1,t1,"Сум"));
	       MyTrace(FLog,"Iter="+Str(Iter)+if(АвДок[Iter]," Сумма зачета по КБК"," Сумма оплаты по КБК")+" ("+BufВД[s1]+" "+BufКБК[s1]+" {"+Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(УслПризн_,"&" ," ")+"} для ДО="+RecordToString(Док[Iter])+" превышает сумму ДО на "+Str(-Sum,2));
	    fi;
	 fi; --if Sum>0:
	od; --for s1=1..ss1 do
	if not Round(GetFieldN(OWAt,t,"СумДок")-SumDoc,2)=0: MyTrace(FLog,"Iter="+Str(Iter)+" Сумма расшифровки по КБК для ДО="+RecordToString(Док[Iter])+" не равна сумме документа "+Str(GetFieldN(OWAt,t,"СумДок")-SumDoc,2)); fi;
       else
	MyTrace(Flog,"Iter="+Str(Iter)+" Не найдены КБК для ДО="+RecordToString(Док[Упр]));
     fi; --if not ss1=0:
    od;
    Hint("Фиксация изменений...");
    EndChanging(OWAt);
    Try
     Flag=ЭкспортКартотекиПоФильтру("РПО_ДО","Link='"+GUID_+"'",FName,False);
    Finally
     BeginChanging(OWAt,False);
     DeleteAllRecords(OWAt);
     Hint("Удаление...");
     EndChanging(OWAt);
    end;
   Except
    CancelChanging(OWAt);
    Raise;
   end;
  Finally
   CloseWorkArea(OWAt);
  end;
 Finally
  CloseWorkArea(OWAs);
  CloseProgress;
 end;
 if Flag:
    if КоррекцияCRD(FName+".crd"): 
       if Sender="btn00": Message("Остатки успешно сформированы в файле "+FName+".crd"); fi;
    fi;
 fi;
 if ExistFile(FLog): OpenEditor(FLog); fi;
 if ExistFile(FSig): OpenEditor(FSig); fi;
end;

Proc btnLink_OnClick(Sender: String);
 Link=GetGUID;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc AfterOpen(Destroy: Logical);
var Flag:L;
 Раб.Настр_Печать.Cfg("","ТББ.ДОКУМЕНТЫ.ДОГОВОРПОСТ.ДО_ОТЧЕТ.000.cfg");
 Оформление;
 ВзятьНастрОбщПризн;
 if Run or Run2:
    Flag=Run;
    Run=False; Run2=False;
    btnРасчет_onClick(if(Flag,"","btnРасчет"));
    if Flag: Close; fi;
 fi;
end;
--Обработчики событий шаблона -----
--

Конец
