-- Шаблон создан мастером бланков
-- 08.12.2007 18:38:43
--
БланкСШаблоном "Создание операций по 17, 18 забалансовому счету", Редактор РПО_ЗАБ_17_18;

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

S1: Section;
btnРасчет: Object;
btnУдалить: Object;
cbПроводить: Object;

var Упр510:I;
var пп510[]:I=$;
var Дат510[]:D;
var Сум510[]:N;
var СчБанк510[]:S;
var СчКорр510[]:S;
var ПризнВД510[]:S;
var ПризнКБК510[]:S;
var Призн510[]:S;
var Кмнт510[]:S;
var ЗабСум510[]:N;
var ЗабДеб510[]:S;
var ЗабКре510[]:S;
var t510[]:I;
var Статус510[]:I;
var Контроль510[]:S;
var Описание510[]:S=if(Статус510[$]=-1:Контроль510[$]|Статус510[$]=1:"Поступления денежных средств"|Статус510[$]=2:"Возврат денежных средств"|Статус510[$]=3:"Восстановление выбытий"|True:"");

var Упр610:I;
var пп610[]:I=$;
var Дат610[]:D;
var Сум610[]:N;
var СчБанк610[]:S;
var СчКорр610[]:S;
var ПризнВД610[]:S;
var ПризнКБК610[]:S;
var Призн610[]:S;
var Кмнт610[]:S;
var ЗабСум610[]:N;
var ЗабДеб610[]:S;
var ЗабКре610[]:S;
var t610[]:I;
var Статус610[]:I;
var Контроль610[]:S;
var Описание610[]:S=if(Статус610[$]=-1:Контроль610[$]|Статус610[$]=1:"Выбытия денежных средств"|Статус610[$]=2:"Возврат денежных средств"|True:"");

var BufD[]:D;
var BufR[]:Record;

var SelfCrd:S="РПО_ЗАБ_17_18";
var SelfCrdSub:S="РПО_ЗАБ_17_18_";
--
--Процедуры и функции -------------
Proc Очистить;
 ClearVariable(Упр510);
 ClearVariable(Дат510);
 ClearVariable(Сум510);
 ClearVariable(СчБанк510);
 ClearVariable(СчКорр510);
 ClearVariable(ПризнВД510);
 ClearVariable(ПризнКБК510);
 ClearVariable(Призн510);
 ClearVariable(Кмнт510);
 ClearVariable(ЗабСум510);
 ClearVariable(ЗабДеб510);
 ClearVariable(ЗабКре510);
 ClearVariable(t510);
 ClearVariable(Статус510);
 ClearVariable(Контроль510);
 --
 ClearVariable(Упр610);
 ClearVariable(Дат610);
 ClearVariable(Сум610);
 ClearVariable(СчБанк610);
 ClearVariable(СчКорр610);
 ClearVariable(ПризнВД610);
 ClearVariable(ПризнКБК610);
 ClearVariable(Призн610);
 ClearVariable(Кмнт610);
 ClearVariable(ЗабСум610);
 ClearVariable(ЗабДеб610);
 ClearVariable(ЗабКре610);
 ClearVariable(t610);
 ClearVariable(Статус610);
 ClearVariable(Контроль610);
end;

Proc Оформление;
var bg:I;
 btnРасчет.Enabled=not Проводить;
 btnУдалить.Enabled=not Проводить;
 bg=if(Проводить,coTransparent,coAqua);
 S1.Cell(1,2,CellBgColor,bg); S1.Cell(1,2,CellReadOnly,Проводить);
 S1.Cell(1,4,CellBgColor,bg); S1.Cell(1,4,CellReadOnly,Проводить);
end;

Func УникальностьПериода:L;
var OWA:I;
 OWA=OpenWorkArea(SelfCrd,"ДН;ДК","not UKey="+RecordToString(Current)+" and ((ДН<="+DateToString(ДН)+" and ДК>="+DateToString(ДН)+") or (ДН<="+DateToString(ДК)+" and ДК>="+DateToString(ДК)+"))");
 Try
  if Records(OWA)=0: ^True; else ^False; fi;
 Finally
  CloseWorkArea(OWA);
 end;
end;

Func НаличиеПроводок:L;
 if ExistsTransactions("ЗАБ.17!|ЗАБ.18!{~СЧ.201.34!}",ДН,ДК+1):
    Message("Внимание! В данном периоде обнаружены проводки по 17, 18 забалансовым счетам введенные вручную, это может привести к искажению результатов. Необходимо удалить данные проводки",mtError);
    Report('"'+PlanVar("Std_Rpo")+'\Общие\Отчеты\Служебные отчеты.lst"."001"',ДН,ДК+1,"ЗАБ.17!|ЗАБ.18!","");
    ^False;
 fi;
 ^True;
end;

Func Проверить(Val:S; Iter:I):L;
var Err,Wrn,признКОСГУ,ТипСчКорр,БКСчКорр,КОСГУСчКорр,признКР,признКД,признКИФД,признВД,ВД:S;
var vСчБанк,vСчКорр,vВД,vКБК:S;
-- if Val="510": Статус510[Iter]=0; else Статус610[Iter]=0; fi;
 vСчБанк=GetVariableS("СчБанк"+Val+"["+Str(Iter)+"]");
 vСчКорр=GetVariableS("СчКорр"+Val+"["+Str(Iter)+"]");
 vВД=GetVariableS("ПризнВД"+Val+"["+Str(Iter)+"]");
 vКБК=GetVariableS("ПризнКБК"+Val+"["+Str(Iter)+"]");
 признКР=SubStr(Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(vКБК," ","ФКР.*",""),5,255);
 признКД=SubStr(Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(vКБК," ","КД.*",""),4,255);
 признКИФД=SubStr(Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(vКБК," ","КИФД.*",""),6,255);
 признКОСГУ=SubStr(Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(vКБК," ","КОСГУ.*",""),7,255);
 признВД=SubStr(vВД,4,255);
 if признКР="" and признКД="" and признКИФД="": Err=Раб.Бюджет2005.Объединить(Err,"Отсутствует признак бюджетной классификации ФКР или КД или КИФД",Chr(13)); fi;
 if not признКР="" and not признКД="" and not признКИФД="": Err=Раб.Бюджет2005.Объединить(Err,"Введен одновременно признак ФКР и КД и КИФД",Chr(13)); fi;
 if признКОСГУ="": Err=Раб.Бюджет2005.Объединить(Err,"Отсутствует признак КОСГУ",Chr(13)); fi;
 if Err="":
    ТипСчКорр=Раб.Бюджет2005.ТипКБКСчета(vСчКорр);
    БКСчКорр=Раб.Бюджет2005.ВзятьКодСчета(vСчКорр,ТипСчКорр,"БК",False);
    КОСГУСчКорр=Раб.КБК.ВзятьКОСГУизАН(Раб.Бюджет2005.ВзятьКодСчета(vСчКорр,ТипСчКорр,"СЧ8",False),1);
    if not признКР="":
       if not Раб.Бюджет2005.MatchMask("КОСГУ."+признКОСГУ,Раб.Бюджет2005.МаскаРасхКОСГУ): Err=Раб.Бюджет2005.Объединить(Err,"Несоотвествие кода РАСХОДА коду КОСГУ ("+признКОСГУ+"). Допустимые КОСГУ ("+Раб.Бюджет2005.МаскаРасхКОСГУ+")",Chr(13)); fi;
       if ТипСчКорр="ФКР":
          if not БКСчКорр=признКР: Wrn=Раб.Бюджет2005.Объединить(Wrn,"Несоотвествие кода признака БК ("+признКР+") коду корреспондируюещего счета ("+БКСчКорр+")",Chr(13)); fi;
          if not КОСГУСчКорр=признКОСГУ: Wrn=Раб.Бюджет2005.Объединить(Wrn,"Несоотвествие кода признака КОСГУ ("+признКОСГУ+") КОСГУ корреспондируюещего счета ("+КОСГУСчКорр+")",Chr(13)); fi;
       fi;
    fi;
    if not признКД="":
       if not Раб.Бюджет2005.MatchMask("КОСГУ."+признКОСГУ,Раб.Бюджет2005.МаскаДоходКОСГУ): Err=Раб.Бюджет2005.Объединить(Err,"Несоотвествие кода ДОХОДА коду КОСГУ ("+признКОСГУ+"). Допустимые КОСГУ ("+Раб.Бюджет2005.МаскаДоходКОСГУ+")",Chr(13)); fi;
       if ТипСчКорр="КД":
          if not БКСчКорр=признКД: Wrn=Раб.Бюджет2005.Объединить(Wrn,"Несоотвествие кода признака БК ("+признКД+") коду корреспондируюещего счета ("+БКСчКорр+")",Chr(13)); fi;
          if not КОСГУСчКорр=признКОСГУ: Wrn=Раб.Бюджет2005.Объединить(Wrn,"Несоотвествие кода признака КОСГУ ("+признКОСГУ+") КОСГУ корреспондируюещего счета ("+КОСГУСчКорр+")",Chr(13)); fi;
       fi;
    fi;
    if not признКИФД="":
       if not Раб.Бюджет2005.MatchMask("КОСГУ."+признКОСГУ,Раб.Бюджет2005.МаскаДефицитКОСГУ): Err=Раб.Бюджет2005.Объединить(Err,"Несоотвествие кода ДЕФИЦИТА коду КОСГУ ("+признКОСГУ+"). Допустимые КОСГУ ("+Раб.Бюджет2005.МаскаДефицитКОСГУ+")",Chr(13)); fi;
       if ТипСчКорр="КД":
          if not БКСчКорр=признКИФД: Wrn=Раб.Бюджет2005.Объединить(Wrn,"Несоотвествие кода признака БК ("+признКИФД+") коду корреспондируюещего счета ("+БКСчКорр+")",Chr(13)); fi;
          if not КОСГУСчКорр=признКОСГУ: Wrn=Раб.Бюджет2005.Объединить(Wrn,"Несоотвествие кода признака КОСГУ ("+признКОСГУ+") КОСГУ корреспондируюещего счета ("+КОСГУСчКорр+")",Chr(13)); fi;
       fi;
    fi;
    ВД=Раб.Бюджет2005.ВзятьКодСчета(vСчБанк,"","ВД",False);
    if ВД="1" and not Match(ПризнВД,"БД!"): Wrn="Несоотвие вида деятельности (1) по счету и аналитического признака вида деятельности"+vВД;
      |ВД="2" and not (Match(ПризнВД,"ПД!") or  Match(ПризнВД,"ЦС!")): Wrn="Несоотвие вида деятельности (2) по счету и аналитического признака вида деятельности "+vВД;
      |ВД="3" and not Match(ПризнВД,"ВР!"): Wrn="Несоотвие вида деятельности (3) по счету и аналитического признака вида деятельности "+vВД;
    fi;
 fi;
 if not Err="": 
    if Val="510": 
       Контроль510[Iter]="Ошибка !"+Chr(13)+Err; Статус510[Iter]=-1; 
      else 
       Контроль610[Iter]="Ошибка !"+Chr(13)+Err; Статус610[Iter]=-1;
    fi;
 fi;
 if not Wrn="": 
    if Val="510": 
       Контроль510[Iter]=Раб.Бюджет2005.Объединить(Контроль510[Iter],"Предупреждение !"+Chr(13)+Wrn,Chr(13)); 
      else 
       Контроль610[Iter]=Раб.Бюджет2005.Объединить(Контроль610[Iter],"Предупреждение !"+Chr(13)+Wrn,Chr(13)); 
    fi;
 fi;
 ^Err="";
end;

Func Проверить_:L;
var Iter,I:I;
var F:S;
var Err:L;
 if Упр510=0 and Упр610=0: Message("Нет данных для формирования проводок",mtError); ^False; fi;
 if not УникальностьПериода: Message("Период расчета "+DateToString(ДН)+" - "+DateToString(ДК)+" уже содержится в картотеке или пересекается с другим периодом",mtError); ^False; fi;
 if not НаличиеПроводок: ^False; fi;
 Err=False;
 ShowProgress(Упр510+Упр610,"Проверка....");
 Try
  Раб.Бюджет.ПроверитьПризнакиНачать;
  for Iter=1..Упр510 do
   ProgressPos(Iter);
   if not Проверить("510",Iter): 
      if not Err: i=Iter; f="Описание510"; fi;
      Err=True;
   fi;
   if not Err:
      if Name_S(ЗабДеб510[Iter])=" ": Message("Неизвестный индентификатор счета "+ЗабДеб510[Iter],mtError); Template.Field="ЗабДеб510"; Template.Frame=Iter; ^False; fi;
      if Name_S(ЗабКре510[Iter])=" ": Message("Неизвестный индентификатор счета "+ЗабКре510[Iter],mtError); Template.Field="ЗабКре510"; Template.Frame=Iter; ^False; fi;
      if not Correspond(ЗабДеб510[Iter],ЗабКре510[Iter]): Message("Счета "+ЗабДеб510[Iter]+"/"+ЗабКре510[Iter]+" не могут корреспондировать",mtError); Template.Field="ЗабДеб510"; Template.Frame=Iter; ^False; fi;
      if Раб.Бюджет.ПроверитьПризнакиОбязательные(ЗабДеб510[Iter],ЗабКре510[Iter],ПризнВД510[Iter]+" "+ПризнКБК510[Iter]+" "+Призн510[Iter],"")=False : Template.Field="Призн510"; Template.Frame=Iter; ^False; fi;
      if Раб.Бюджет.ПроверитьПризнакиСвязанные(ЗабДеб510[Iter],ЗабКре510[Iter],ПризнВД510[Iter]+" "+ПризнКБК510[Iter]+" "+Призн510[Iter],"")=False : Template.Field="Призн610"; Template.Frame=Iter; ^False; fi;
   fi;
  od;
  --
  for Iter=1..Упр610 do
   ProgressPos(Упр510+Iter);
   if not Проверить("610",Iter): 
      if not Err: i=Iter; f="Описание610"; fi;
      Err=True;
   fi;
   if not Err:
      if Name_S(ЗабДеб610[Iter])=" ": Message("Неизвестный индентификатор счета "+ЗабДеб610[Iter],mtError); Template.Field="ЗабДеб610"; Template.Frame=Iter; ^False; fi;
      if Name_S(ЗабКре610[Iter])=" ": Message("Неизвестный индентификатор счета "+ЗабКре610[Iter],mtError); Template.Field="ЗабКре610"; Template.Frame=Iter; ^False; fi;
      if not Correspond(ЗабДеб610[Iter],ЗабКре610[Iter]): Message("Счета "+ЗабДеб610[Iter]+"/"+ЗабКре610[Iter]+" не могут корреспондировать",mtError); Template.Field="ЗабДеб610"; Template.Frame=Iter; ^False; fi;
      if Раб.Бюджет.ПроверитьПризнакиОбязательные(ЗабДеб610[Iter],ЗабКре610[Iter],ПризнВД610[Iter]+" "+ПризнКБК610[Iter]+" "+Призн610[Iter],"")=False : Template.Field="Призн610"; Template.Frame=Iter; ^False; fi;
      if Раб.Бюджет.ПроверитьПризнакиСвязанные(ЗабДеб610[Iter],ЗабКре610[Iter],ПризнВД510[Iter]+" "+ПризнКБК610[Iter]+" "+Призн610[Iter],"")=False : Template.Field="Призн610"; Template.Frame=Iter; ^False; fi;
   fi;
  od;
 Finally
  CloseProgress;
 end;
 if Err: Message("Обнаружены ошибки",mtError); Template.Field=f; Template.Frame=i; fi;
 ^not Err;
end;

Proc ПолучитьЗаб510 (Iter:I);
var ВД:S;
 ВД=Раб.Бюджет2005.ВзятьКодСчета(СчБанк510[Iter],"","ВД",False);
 if Раб.Бюджет2005.ПроверитьНаборСлов(ПризнКБК510[Iter]," ","ФКР.*","",""):
    if ВД="1" and (Match(СчКорр510[Iter],"*.1.201.?3.610") or Match(СчКорр510[Iter],"*.1.304.04.???")):
       ЗабСум510[Iter]=Сум510[Iter];
       ЗабДеб510[Iter]="ЗАБ.17";
       ЗабКре510[Iter]="ЗАБАЛАНС";
       if ЗабСум510[Iter]>=0: Статус510[Iter]=1; else  Статус510[Iter]=2; fi;
      else
       ЗабСум510[Iter]=-Сум510[Iter];
       ЗабДеб510[Iter]="ЗАБ.18";
       ЗабКре510[Iter]="ЗАБАЛАНС";
       Статус510[Iter]=3;
    fi;
 fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(ПризнКБК510[Iter]," ","КД.*","","") or Раб.Бюджет2005.ПроверитьНаборСлов(ПризнКБК510[Iter]," ","КИФД.*","",""):
    ЗабСум510[Iter]=Сум510[Iter];
    ЗабДеб510[Iter]="ЗАБ.17";
    ЗабКре510[Iter]="ЗАБАЛАНС";
    if ЗабСум510[Iter]>=0: Статус510[Iter]=1; else  Статус510[Iter]=2; fi;
 fi;
end;

Proc ПолучитьЗаб610 (Iter:I);
 if Раб.Бюджет2005.ПроверитьНаборСлов(ПризнКБК610[Iter]," ","ФКР.*","",""):
    ЗабСум610[Iter]=Сум610[Iter];
    ЗабДеб610[Iter]="ЗАБ.18";
    ЗабКре610[Iter]="ЗАБАЛАНС";
    Статус610[Iter]=1;
 fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(ПризнКБК610[Iter]," ","КД.*","","") or Раб.Бюджет2005.ПроверитьНаборСлов(ПризнКБК610[Iter]," ","КИФД.*","",""):
    ЗабСум610[Iter]=-Сум610[Iter];
    ЗабДеб610[Iter]="ЗАБ.17";
    ЗабКре610[Iter]="ЗАБАЛАНС";
    Статус610[Iter]=2;
 fi;
end;

Proc Расчет;
var t,dd:i;
var tДата:D;
var tДеб,tКре,tПризн,tКмнт,ВД_:S;
var tСум:N;
 Очистить;
 dd=ДК-ДН;
 ShowProgress(dd*2,"Расчет....");
 Try
  for Transaction t="(*.?.201.?1.510|*.?.201.?3.510|*.?.201.?7.510)&~*.3.???.??.*",ДН,ДК+1 do
   tДата=TransDate(t);
   tСум=TransSum(t);
   tДеб=TransDeb(t);
   tКре=TransCre(t);
   tПризн=TransSigns(t);
   tКмнт=TransComment(t);
   ProgressPos(dd-(ДК-tДата));
   InsertFrame(Упр510,Упр510+1);
   Дат510[Упр510]=tДата;
   Сум510[Упр510]=tСум;
   СчБанк510[Упр510]=tДеб;
   СчКорр510[Упр510]=tКре;
   ПризнВД510[Упр510]=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(tПризн," ","ВД.*","");
   if ПризнВД510[Упр510]="":
      ВД_=Раб.Бюджет2005.ВзятьКодСчета(СчБанк510[Упр510],"","ВД",False);
      if ВД_="1": ПризнВД510[Упр510]="ВД.1";
        |ВД_="2": ПризнВД510[Упр510]="ВД.2";
        |ВД_="3": ПризнВД510[Упр510]="ВД.3";
        |ВД_="4": ПризнВД510[Упр510]="ВД.4";
        |ВД_="5": ПризнВД510[Упр510]="ВД.5";
        |ВД_="6": ПризнВД510[Упр510]="ВД.6";
        |ВД_="7": ПризнВД510[Упр510]="ВД.7";
      fi;
   fi;
   ПризнКБК510[Упр510]=Trim(Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(tПризн," ","ФКР.*|КД.*|КИФД.*","|")+" "+Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(tПризн," ","КОСГУ.*",""));
   Призн510[Упр510]=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(tПризн," ","ВД.*|ФКР.*|КД.*|КИФД.*|КОСГУ.*","|");
   Кмнт510[Упр510]=tКмнт;
   t510[Упр510]=t;
   Проверить("510",Упр510);
   if Статус510[Упр510]>=0: ПолучитьЗаб510(Упр510); fi;
  od;
  --
  for Transaction t="(*.?.201.?1.610|*.?.201.?3.610|*.?.201.?7.610)&~*.3.???.??.*",ДН,ДК+1 do
   tДата=TransDate(t);
   tСум=TransSum(t);
   tДеб=TransDeb(t);
   tКре=TransCre(t);
   tПризн=TransSigns(t);
   tКмнт=TransComment(t);
   ProgressPos(dd+dd-(ДК-tДата));
   InsertFrame(Упр610,Упр610+1);
   Дат610[Упр610]=tДата;
   Сум610[Упр610]=tСум;
   СчБанк610[Упр610]=tКре;
   СчКорр610[Упр610]=tДеб;
   ПризнВД610[Упр610]=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(tПризн," ","ВД.*","");
   if ПризнВД610[Упр610]="":
      ВД_=Раб.Бюджет2005.ВзятьКодСчета(СчБанк610[Упр610],"","ВД",False);
      if ВД_="1": ПризнВД610[Упр610]="ВД.1";
        |ВД_="2": ПризнВД610[Упр610]="ВД.2";
        |ВД_="3": ПризнВД610[Упр610]="ВД.3";
        |ВД_="4": ПризнВД610[Упр610]="ВД.4";
        |ВД_="5": ПризнВД610[Упр610]="ВД.5";
        |ВД_="6": ПризнВД610[Упр610]="ВД.6";
        |ВД_="7": ПризнВД610[Упр610]="ВД.7";
      fi;
   fi;
   ПризнКБК610[Упр610]=Trim(Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(tПризн," ","ФКР.*|КД.*|КИФД.*","|")+" "+Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(tПризн," ","КОСГУ.*",""));
   Призн610[Упр610]=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(tПризн," ","ВД.*|ФКР.*|КД.*|КИФД.*|КОСГУ.*","|");
   Кмнт610[Упр610]=tКмнт;
   t610[Упр610]=t;
   Проверить("610",Упр610);
   if Статус610[Упр610]>=0: ПолучитьЗаб610(Упр610); fi;
  od;
 Finally
  CloseProgress;
 end;
 Message("Расчет завершен");
end;

Proc УдалитьЗаписи(vCrd:String);
var F :String;
var OWA:Integer;
 F=if(vCrd=SelfCrd,"UKey=","ПЕРИОД=")+RecordToString(Current);
 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;

Func ОбновитьТабл:L;
var OWA,n,nr:I;
 OWA=OpenWorkArea(SelfCrdSub,"","ПЕРИОД="+RecordToString(Current));
 Try
  nr=Records(OWA);
  BeginChanging(OWA,False);
  Try
   for n=1..nr do
    if not GetFieldL(OWA,n,"ПРОВОДИТЬ")=Проводить: n=PutFieldL(OWA,n,"ПРОВОДИТЬ",ПРОВОДИТЬ); fi;
    if not GetFieldL(OWA,n,"CLOSEDMODFOB")=CLOSEDMODFOB: n=PutFieldL(OWA,n,"CLOSEDMODFOB",CLOSEDMODFOB); fi;
   od;
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 ^True;
end;

Func ЗаписатьТабл:L;
var OWA,OA,n,n2,Iter,z:I;
 ClearTrace(True);
 ClearVariable(BufD);
 ClearVariable(BufR);
 OWA=OpenWorkArea(SelfCrdSub,"","ПЕРИОД="+RecordToString(Current));
 ShowProgress(Упр510+Упр610,"Запись проводок...");
 Try
  BeginChanging(OWA,True);
  Try
   DeleteAllRecords(OWA);
   EndChanging(OWA);
   BeginChanging(OWA,True);
   for Iter=1..Упр510 do
    ProgressPos(Iter);
    z=SearchInArray(BufD,Дат510[Iter],True);
    if z=-1:
       z=InsertInArraySort(BufD,Дат510[Iter]);
       n=InsertRecord(OWA);
       InsertInArray(BufR,z,GetRecordKey(OWA,n));
       n=PutFieldR(OWA,n,"ПЕРИОД",Current);
       n=PutFieldD(OWA,n,"ДАТА",Дат510[Iter]);
       n=PutFieldL(OWA,n,"ПРОВОДИТЬ",ПРОВОДИТЬ);
       n=PutFieldL(OWA,n,"CLOSEDMODFOB",CLOSEDMODFOB);
      else
       n=GetRecordNumber(OWA,BufR[z]);
    fi;
    if not n=0: OA=OpenArray(OWA,n,"ПОЗИЦИИ",""); fi;
    n2=InsertRecord(OA);
    n2=PutFieldN(OA,n2,"СУМ",Сум510[Iter]);
    n2=PutFieldS(OA,n2,"СЧБАНК",СчБанк510[Iter]);
    n2=PutFieldS(OA,n2,"СЧКОРР",СчКорр510[Iter]);
    n2=PutFieldS(OA,n2,"ПРИЗНВД",ПризнВД510[Iter]);
    n2=PutFieldS(OA,n2,"ПРИЗНКБК",ПризнКБК510[Iter]);
    n2=PutFieldS(OA,n2,"ПРИЗН",Призн510[Iter]);
    n2=PutFieldS(OA,n2,"КМНТ",Кмнт510[Iter]);
    n2=PutFieldN(OA,n2,"ЗАБСУМ",ЗабСум510[Iter]);
    n2=PutFieldS(OA,n2,"ЗАБДЕБ",ЗабДеб510[Iter]);
    n2=PutFieldS(OA,n2,"ЗАБКРЕ",ЗабКре510[Iter]);
    n2=PutFieldI(OA,n2,"Статус",Статус510[Iter]);
    n2=PutFieldS(OA,n2,"ОПЕР","510");
   od;
   --
   for Iter=1..Упр610 do
    ProgressPos(Упр510+Iter);
    z=SearchInArray(BufD,Дат610[Iter],True);
    if z=-1:
       z=InsertInArraySort(BufD,Дат610[Iter]);
       n=InsertRecord(OWA);
       InsertInArray(BufR,z,GetRecordKey(OWA,n));
       n=PutFieldR(OWA,n,"ПЕРИОД",Current);
       n=PutFieldD(OWA,n,"ДАТА",Дат610[Iter]);
       n=PutFieldL(OWA,n,"ПРОВОДИТЬ",ПРОВОДИТЬ);
       n=PutFieldL(OWA,n,"CLOSEDMODFOB",CLOSEDMODFOB);
      else
       n=GetRecordNumber(OWA,BufR[z]);
    fi;
    if not n=0: OA=OpenArray(OWA,n,"ПОЗИЦИИ",""); fi;
    n2=InsertRecord(OA);
    n2=PutFieldN(OA,n2,"СУМ",Сум610[Iter]);
    n2=PutFieldS(OA,n2,"СЧБАНК",СчБанк610[Iter]);
    n2=PutFieldS(OA,n2,"СЧКОРР",СчКорр610[Iter]);
    n2=PutFieldS(OA,n2,"ПРИЗНВД",ПризнВД610[Iter]);
    n2=PutFieldS(OA,n2,"ПРИЗНКБК",ПризнКБК610[Iter]);
    n2=PutFieldS(OA,n2,"ПРИЗН",Призн610[Iter]);
    n2=PutFieldS(OA,n2,"КМНТ",Кмнт610[Iter]);
    n2=PutFieldN(OA,n2,"ЗАБСУМ",ЗабСум610[Iter]);
    n2=PutFieldS(OA,n2,"ЗАБДЕБ",ЗабДеб610[Iter]);
    n2=PutFieldS(OA,n2,"ЗАБКРЕ",ЗабКре610[Iter]);
    n2=PutFieldI(OA,n2,"Статус",Статус610[Iter]);
    n2=PutFieldS(OA,n2,"ОПЕР","610");
   od;
   Hint("Фиксация....");
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 ^True;
end;

Func ПрочитатьТабл:L;
var OWA,n,nr,n2,nr2,OA:i;
var Rec: Record;
 Очистить;
 OWA=OpenWorkArea(SelfCrdSub,"","ПЕРИОД="+RecordToString(Current));
 Try
  nr=Records(OWA);
  ShowProgress(nr,"Чтение проводок...");
  for n=1..nr do
   if n=1: OA=OpenArray(OWA,n,"ПОЗИЦИИ",""); fi;
   ProgressPos(n);
   Rec=GetRecordKey(OWA,n);
   nr2=Records(OA);
   for n2=1..nr2 do
    if GetFieldS(OA,n2,"ОПЕР")="510":
       InsertFrame(Упр510,Упр510+1);
       Дат510[Упр510]=GetFieldD(OWA,n,"ДАТА");
       Сум510[Упр510]=GetFieldN(OA,n2,"СУМ");
       СчБанк510[Упр510]=GetFieldS(OA,n2,"СЧБАНК");
       СчКорр510[Упр510]=GetFieldS(OA,n2,"СЧКОРР");
       ПризнВД510[Упр510]=GetFieldS(OA,n2,"ПризнВД");
       ПризнКБК510[Упр510]=GetFieldS(OA,n2,"ПризнКБК");
       Призн510[Упр510]=GetFieldS(OA,n2,"ПРИЗН");
       Кмнт510[Упр510]=GetFieldS(OA,n2,"КМНТ");
       ЗабСум510[Упр510]=GetFieldN(OA,n2,"ЗАБСУМ");
       ЗабДеб510[Упр510]=GetFieldS(OA,n2,"ЗАБДЕБ");
       ЗабКре510[Упр510]=GetFieldS(OA,n2,"ЗАБКРЕ");
       Статус510[Упр510]=GetFieldI(OA,n2,"Статус");
       t510[Упр510]=-1;
      else
       InsertFrame(Упр610,Упр610+1);
       Дат610[Упр610]=GetFieldD(OWA,n,"ДАТА");
       Сум610[Упр610]=GetFieldN(OA,n2,"СУМ");
       СчБанк610[Упр610]=GetFieldS(OA,n2,"СЧБАНК");
       СчКорр610[Упр610]=GetFieldS(OA,n2,"СЧКОРР");
       ПризнВД610[Упр610]=GetFieldS(OA,n2,"ПризнВД");
       ПризнКБК610[Упр610]=GetFieldS(OA,n2,"ПризнКБК");
       Призн610[Упр610]=GetFieldS(OA,n2,"ПРИЗН");
       Кмнт610[Упр610]=GetFieldS(OA,n2,"КМНТ");
       ЗабСум610[Упр610]=GetFieldN(OA,n2,"ЗАБСУМ");
       ЗабДеб610[Упр610]=GetFieldS(OA,n2,"ЗАБДЕБ");
       ЗабКре610[Упр610]=GetFieldS(OA,n2,"ЗАБКРЕ");
       Статус610[Упр610]=GetFieldI(OA,n2,"Статус");
       t610[Упр610]=-1;
    fi;
   od;
  od;
  if not nr=0: CloseWorkArea(OA); fi;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 ^True;
end;

--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func Д_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:D;
 Template.HideEditor(False);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 PutVariableD(AsString(Template.Field),tmp);
 Return Cur;
end;

Func пп_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var t:i;
 Template.HideEditor(False);
 if AsString(Template.Field)="пп510": t=t510[AsInteger(Template.Frame)]; else t=t610[AsInteger(Template.Frame)]; fi;
 if t=-1: 
    Message("Для вызова проводки необходимо выполнить расчет",mtWarning);
   else
    TransOpenJur(t);
 fi;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc cbПроводить_OnChange(Sender: String);
 if Проводить:
    Проводить=Проверить_;
   else
    if EnqOkCancel("Вы уверены, что хотите исключить документ из обработки ?",mtWarning)=cmCancel: Проводить=True;  fi;
 fi;
 cbПроводить.State=Проводить;
 Оформление;
 EditorApply;
end;

Proc btnРасчет_OnClick(Sender: String);
 if ДН=1.1.100: Message("Введите начальную дату",mtError); Template.Field="ДН"; Exit; fi;
 if ДК=1.1.100: Message("Введите конечную дату",mtError); Template.Field="ДК"; Exit; fi;
 if ДН>ДК: Message("Начальная дата превышает конечную",mtError); Template.Field="ДН"; Exit; fi;
 if not УникальностьПериода: Message("Период расчета "+DateToString(ДН)+" - "+DateToString(ДК)+" уже содержится в картотеке или пересекается с другим периодом",mtError); Exit; fi;
 Refresh;
 if not НаличиеПроводок: Exit; fi;
 GUID=GetGUID;
 Расчет;
end;

Proc btnУдалить_OnClick(Sender: String);
 if EnqOkCancel("Удалить текущию запись ?",mtWarning)=cmCancel: Exit; fi;
 Очистить;
 УдалитьЗаписи(SelfCrdSub);
 УдалитьЗаписи(SelfCrd);
end;

Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnRead;
 if НоваяЗапись: 
    Проводить=False;
 fi;
 ПрочитатьТабл;
 Оформление;
end;

Func OnVerify: Logical;
var Flag:L;
 if ДН=1.1.100: Message("Введите начальную дату",mtError); Template.Field="ДН"; ^False; fi;
 if ДК=1.1.100: Message("Введите конечную дату",mtError); Template.Field="ДК"; ^False; fi;
 if ДН>ДК: Message("Начальная дата превышает конечную",mtError); Template.Field="ДН"; ^False; fi;
 if not УникальностьПериода: Message("Период расчета "+DateToString(ДН)+" - "+DateToString(ДК)+" уже содержится в картотеке или пересекается с другим периодом",mtError); ^False; fi;
 if НоваяЗапись:
    Flag=ЗаписатьТабл;
   else
    if GetCardFieldS(SelfCrd,Current,"GUID")=GUID: Flag=ОбновитьТабл; else Flag=ЗаписатьТабл; fi;
 fi;
 Return Flag;
end;

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

Конец
