-- Шаблон создан мастером бланков
-- 17.07.2009 12:47:19
--
БланкСШаблоном "Акт о списании бланков строгой отчетности ф.0504816";

fManual:L;
fДок:L;

Упр:I;

var РКО:Record;
var РКО_:S;

ФИОРук:S;
НомАкт:S;
ДатаАкт:D;
Учреждение:S;
ОКПО:S;
УЧР_ИНН:S;
УЧР_КПП:S;
ПризнМОЛ:S;
var НаимМОЛ:S=if(Name_A(ПризнМОЛ)="" or Name_A(ПризнМОЛ)=" ",ПризнМОЛ,Name_A(ПризнМОЛ));
СчДеб:S;
СчКре:S=["ЗАБ.03"];
УслАнДоп:S;
ЧК[]:S;
ДатаПриказ:D;
НомПриказ:S;
ДН:D;
ДК:D;

НаимБСО[]:S;
НомБСО[]:S;
СерияБСО[]:S;
Причина[]:S;
ДатаУничтож[]:D;
ID[]:I;
НомН[]:N;
НомК[]:N;

ДолжнЧК[]:S;
ФИОЧК[]:S;
ДатаКомис:D;

var A:S="+";
var D:S="-";

var Ключ[]:S;

var ПризнДенДок:S;

var tДт:D;
var tСум:N;
var tКол:N;
var tСерия:S;
var tНомН:N;
var tНомК:N;
var tРазм:I;
var tОсн:S;

var BufSub[]:S;

var OWAПрих:I;
var OAПрих:I;

var OWAРасх:I;
var OAРасх:I;

var SelfCfg:S="ТББ.ОТЧЕТЫ.РЕГИСТРЫ.АКТ_0504816.000.cfg";

var Run: Record;
--
--Процедуры и функции -------------
Proc Оформление;
end;

Proc Очистить;
 ClearVariable(Упр);
 ClearVariable(НаимБСО);
 ClearVariable(НомБСО);
 ClearVariable(СерияБСО);
 ClearVariable(Причина);
 ClearVariable(ДатаУничтож);
 ClearVariable(ID);
 ClearVariable(НомН);
 ClearVariable(НомК);
 ClearVariable(Ключ);
end;

Proc ЗаполнитьРекв(Rec: Record);
 if Rec=nil: Rec=Раб.Бюджет2005.НашРекв; fi;
 Учреждение=GetCardFieldS('Контрагент',Rec,"ПолнИмя");
 ОКПО=GetCardFieldS('Контрагент',Rec,"ОКПО");
 УЧР_ИНН=GetCardFieldS('Контрагент',Rec,"ИНН");
 УЧР_КПП=GetCardFieldS('Контрагент',Rec,"КПП");
 ФИОРук=GetCardFieldS('Контрагент',Rec,"ФИОРук");
end;

Func NumToStr(Value:N; Len:I):S;
var Ret:S;
 if Len=0: ^""; fi;
 Ret=Str(Value);
 Ret=RepStr("0",Len-Length(Ret))+Ret;
 ^Ret;
end;

Proc ВзятьИзКарт(OWA:I; UKey:S; OA:I; t:i);
var z,n,nn:I;
var FF,НомН_,НомК_,Призн_,ПризнДеб_,ПризнКре_,tmp:S;
var Rec: Record;
 tСерия="";
 tНомН=0;
 tНомК=0;
 tРазм=0;
 z=GetRecordNumber(OWA,StringToRecord(UKey));
 if not z=0:
    tОсн=GetFieldS(OWA,z,"Осн");
    FF="ДЕНДОКВИД_ПРИЗН='"+ПризнДенДок+"'";
    FF=FF+" and КОЛ="+Str(tКол,TransAccuracy(t));
    FF=FF+" and СУММА="+Str(tСум,Accuracy);
    SetFilter(OA,FF);
    nn=Records(OA);
    if not nn=0:
       tmp=TransSigns(t);
       if not Pos("+",tmp)=0:
          ПризнДеб_=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(tmp," ","+*","");
          ПризнДеб_=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(SubStr(ПризнДеб_,2,255),"+"," ");
         else
          ПризнДеб_="";
       fi;
       if not Pos("-",tmp)=0:
          ПризнКре_=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(tmp," ","-*","");
          ПризнКре_=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(SubStr(ПризнКре_,2,255),"-"," ");
         else
          ПризнКре_="";
       fi;
       Призн_=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(tmp," ",Trim(GetFieldS(OWA,z,"ОбщПризн")+" "+ПризнДенДок+" "+GetFieldS(OWA,z,"ПризнПодр")+" +* -*")," ");
       for n=1..nn do
        Rec=GetRecordKey(OA,n);
        if SearchInArray(BufSub,Str(OWA)+" "+UKey+" "+RecordToString(Rec),True)=-1: --проверяем былали обработана запись подтаблицы ранее при совпадении критерия поиска
           if Раб.Бюджет2005.ПроверитьНаборСлов(GetFieldS(OA,n,"ПРИЗН")," ",Призн_," ","") and
              Раб.Бюджет2005.ПроверитьНаборСлов(GetFieldS(OA,n,"ПРИЗНДЕБ")," ",ПризнДеб_," ","") and
              Раб.Бюджет2005.ПроверитьНаборСлов(GetFieldS(OA,n,"ПРИЗНКРЕ")," ",ПризнКре_," ",""):
              InsertInArraySort(BufSub,Str(OWA)+" "+UKey+" "+RecordToString(Rec));
              tСерия=GetFieldS(OA,n,"СерияБум");
              if tОсн="": tОсн=GetFieldS(OA,n,"Коммент"); fi;
              НомН_=GetFieldS(OA,n,"НомерБум_Н");
              НомК_=GetFieldS(OA,n,"НомерБум_К");
              tРазм=Max(Length(НомН_),Length(НомК_));
              tНомН=Round(НомН_);
              tНомК=Round(НомК_);
              Break;
           fi;
        fi;
       od;
    fi; --if Records(OA)>0:
   else
    tОсн=TransComment(t);
 fi; --if not z=0:
end;

Proc РасчетПров(vУслСч:S; vУслАн:S);
var t,z,p,l:i;
var UKey,Crd,YMD,Key,Разм_:S;
var n,n1,n2:n;
 ClearVariable(BufSub);
 ShowProgress(ДК-ДН,"Расчет...");
 for Transaction t=vУслСч+"{"+vУслАн+"}",ДН,ДК do
  Crd=TransCardFile(t);
  UKey=RecordToString(TransRecord(t));
  if РКО=nil or (Crd="РПО_ДенДок_Расход" and UKey=RecordToString(РКО)):
     tДт=TransDate(t);
     tСум=TransSum(t);
     tКол=TransSum(t,"Кол");
     p=tДт-ДН;
     ProgressPos(p);
     ПризнДенДок=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(TransSigns(t)," ","ДенДок.*","");
     ПризнДенДок=ExtractWord(1,ПризнДенДок,":"); --отрезаем количество
     if Crd="РПО_ДенДок_Приход" and not OAПрих=-1: ВзятьИзКарт(OWAПрих,UKey,OAПрих,t);
       |Crd="РПО_ДенДок_Расход" and not OAРасх=-1: ВзятьИзКарт(OWAРасх,UKey,OAРасх,t);
       |True: tОсн=TransComment(t); tСерия=""; tНомН=0; tНомК=0; tРазм=0;
     fi;
     YMD=DateToString(tДт);
     YMD=ExtractWord(3,YMD,".")+ExtractWord(2,YMD,".")+ExtractWord(1,YMD,".");
     if fДок:
        Key="B"+" "+YMD+" "+tСерия+" "+Str16(tРазм)+" "+NumToStr(tНомН,tРазм);
        n1=tНомН; n2=tНомК;
       else
        Key="B"+" "+YMD+" "+tСерия+" "+Str16(tРазм)+" "+NumToStr(tНомН,tРазм)+" "+NumToStr(tНомК,tРазм);
        n1=1; n2=1;
     fi;
     z=-1;
     n=n1;
     While Round(n)<=Round(n2) do
      if z=-1:
         z=InsertInArraySort(Ключ,Key);
        else
         z=z+1;
         InsertInArray(Ключ,z,Key);
      fi;
      InsertFrame(Упр,z);
      ID[z]=t;
      НомН[z]=if(fДок,n,tНомН);
      НомК[z]=if(fДок,n,tНомК);
      НаимБСО[z]=Name_A(ПризнДенДок);
      НомБСО[z]=if(Round(НомН[z])=Round(НомК[z]),NumToStr(НомН[z],tРазм),NumToStr(НомН[z],tРазм)+"-"+NumToStr(НомК[z],tРазм));
      СерияБСО[z]=tСерия;
      Причина[z]=tОсн;
      ДатаУничтож[z]=1.1.100;
      n=n+1;
     od; --While Round(n)<=Round(n2) do
  fi; --if РКО=nil or (Crd="РПО_ДенДок_Расход" and UKey=РКО):
 od; --for Transaction t=vУслСч+"{"+vУслАн+"}",ДН_,ДК_ do
end;

Proc Расчет;
var УслСч,УслАн:S;
 Очистить;
 УслСч=Раб.Бюджет2005.Объединить("-"+СчКре,СчДеб,"/");
 УслАн=Раб.Бюджет2005.Объединить(ПризнМОЛ,if(УслАнДоп="","","("+УслАнДоп+")"),"&");
 УслАн=Раб.Бюджет2005.Объединить(УслАн,"ДенДок.*","&");
 Refresh;
 ShowProgress(0,"Расчет...");
 OWAПрих=OpenWorkArea("РПО_ДенДок_Приход","",if(РКО=nil,"","1=0"));
 Try
  if not Records(OWAПрих)=0: OAПрих=OpenArray(OWAПрих,1,"Приход","","1=0"); else OAПрих=-1; fi;
  OWAРасх=OpenWorkArea("РПО_ДенДок_Расход","",if(РКО=nil,"","UKey="+RecordToString(РКО)));
  Try
   if not Records(OWAРасх)=0: OAРасх=OpenArray(OWAРасх,1,"Расход","","1=0"); else OAРасх=-1; fi;
   РасчетПров(УслСч,УслАн);
  Finally
   CloseWorkArea(OWAРасх);
  end;
 Finally
  CloseWorkArea(OWAПрих);
  CloseProgress;
 end;
end;

Proc ЗаполнитьИзРКО(Rec: Record);
 if not Rec=nil:
    РКО=Rec;
    РКО_="№Ф"+GetCardFieldS("РПО_ДенДок_Расход",Rec,"НомерБум")+" от "+DateToString(GetCardFieldD("РПО_ДенДок_Расход",Rec,"Дата"))+" (выдать: "+GetCardFieldS("РПО_ДенДок_Расход",Rec,"ФИО")+")";
    ПризнМОЛ=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(GetCardFieldS("РПО_ДенДок_Расход",Rec,"ОбщПризн")," ","МОЛ.*","");
    СчДеб=GetCardFieldS("РПО_ДенДок_Расход",Rec,"СчДеб");
    СчКре=GetCardFieldS("РПО_ДенДок_Расход",Rec,"СчКре");
    УслАнДоп="";
    ДН=GetCardFieldD("РПО_ДенДок_Расход",Rec,"Дата");
    ДК=ДН+1;
    Очистить;
 fi;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func ФИО_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Field,v1,v2,v3,v4:S;
var Rec:Record;
var Iter,p:I;
 Field=AsString(Template.Field);
 Template.HideEditor(False);
 Rec=OpenCardFile("Сотрудники");
 if Rec=nil: ^Cur; fi;
 v1=GetCardFieldS("Сотрудники",rec,"ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники",rec,"ИНИЦИАЛЫ");
 v2=GetCardFieldS("Сотрудники",rec,"ДОЛЖНОСТЬ.Долж");
 if Field="ФИОРук":
    ФИОРук=v1;
   else
    p=Int(SubStr(Field,Pos("[",Field)+1,1));
    v3=GetCardFieldS("Сотрудники",rec,"ФКого")+" "+GetCardFieldS("Сотрудники",rec,"ИОКого");
    v4=GetCardFieldS("Сотрудники",rec,"ДОЛЖНОСТЬ.РПО_ДОЛЖ_КОГО");
    PutVariableS("ДолжнЧК["+Str(p)+"]",v2);
    PutVariableS("ФИОЧК["+Str(p)+"]",v1);
    PutVariableS("ЧК["+Str(p)+"]",if(v4="",v2,v4)+" "+if(v3="",v1,v3)+",");
 fi;
 ^Cur;
end;

Func РКО_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 Rec=OpenCardFile("РПО_ДенДок_Расход","--Проводить",РКО,crdRecordOnly);
 ЗаполнитьИзРКО(Rec);
 Return False;
end;

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

Func НомАкт_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 НомАкт=Str(Int(НомАкт)+1);
 Return Cur;
end;

Proc Дата_onExit(FieldName: String; Iter: Integer);
 if not fManual: Очистить; fi;
end;

Func Дата_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:d;
var Field:S;
var Iter:I;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 if Field="ДатаУничтож":
    Field=Field+"["+Str(AsInteger(Template.Frame))+"]";
 fi;
 PutVariableD(Field,tmp);
 if Field="ДН" or Field="ДК":
    if not fManual: Очистить; fi;
 fi;
 ^Cur;
end;

Func Учреждение_onEnter(FieldName: S; Iter: I): L;
var Rec:Record;
 Rec=OpenCardFile('Контрагент','Наше',nil,crdRecordOnly);
 if Rec=nil: ^False; fi;
 ЗаполнитьРекв(Rec);
 ^False;
end;

Func НаимМОЛ_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if not fManual:
    tmp=AnaElection("МОЛ.*");
    if tmp="": ^False; fi;
    ПризнМОЛ=tmp;
    if not fManual: Очистить; fi;
    ^False;
   else
    ^True;
 fi;
end;

Proc НаимМОЛ_OnExit(FieldName: String; Iter: Integer);
 ПризнМОЛ="";
 if not fManual:
    Очистить;
 fi;
end;

Func СчДеб_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:s;
 tmp=PickCorrAccount(СчКре,True,СчДеб);
 if not tmp="":
    СчДеб=tmp;
    if not fManual: Очистить; fi;
    УслАнДоп="";
 fi;
 Return False;
end;


Func СчКре_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:s;
 tmp=AccountElection("ЗАБ.03!|ЗАБ.08!",False,СчКре);
 if not tmp="":
    СчКре=tmp;
    if not Correspond(СчДеб,СчКре): СчДеб=""; fi;
    if not fManual: Очистить; fi;
    УслАнДоп="";
 fi;
 Return False;
end;

Func УслАнДоп_OnEnter(FieldName: String; Iter: Integer): logical;
 if СчКре="": Message("Выберите счет кредита",mtError); Template.Field="СчКре"; ^False; fi;
 --if СчДеб="": Message("Выберите счет дебета",mtError); Template.Field="СчДеб"; ^False; fi;
 Return True;
end;

Func УслАнДоп_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var z:n;
 Try
  z=Saldo("{"+Value+"}",1.1.100);
 Except
  Raise;
 end;
 ^True;
end;

Proc УслАнДоп_OnExit(FieldName: String; Iter: Integer);
 if not fManual: Очистить; fi;
end;

Func УслАнДоп_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var FieldName,tmp:S;
 FieldName=AsString(Template.Field);
 tmp=Раб.Бюджет2005.Объединить(СчДеб,СчКре,"|");
 Cur=Раб.Бюджет2005.СписокСправ(tmp,0,"");
 Cur=Раб.Бюджет2005.Объединить(Cur,"*&~*.*","|");
 Cur=AnaElection(Cur);
 if Cur="": Template.HideEditor(False); ^Cur; fi;
 Cur=Раб.Бюджет2005.Объединить_Диалог(GetVariableS(FieldName),Cur,"&=И;|=ИЛИ;&~=И ИСКЛЮЧИТЬ;_=ЗАМЕНИТЬ","_");
 if Раб.Бюджет2005.HideEditor: 
    Template.HideEditor(False);
    PutVariableS(FieldName,Cur);
 fi;
 if not fManual: Очистить; fi;
 ^Cur;
end;

Func A_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(Упр,Iter+1);
 Return False;
end;

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
 DeleteFrame(Упр,Iter);
 Return False;
end;

Proc OnExit(FieldName: String; Iter: Integer);
 ID[Iter]=-1;
end;

Func НомБСО_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if ID[Iter]=-1:
    Message("Не данных для расшифровки");
   else
    TransOpenJur(ID[Iter]);
 fi;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnРасчет_OnClick(Sender: String);
 if not ПризнМОЛ="" and Name_A(ПризнМОЛ)=" ": Message("Неизвестный аналитический признак '"+ПризнМОЛ+"'",mtError); Template.Field="НаимМОЛ"; Exit; fi;
 if СчКре="": Message("Выберите счет кредита",mtError); Template.Field="СчКре"; Exit; fi;
 --if СчДеб="": Message("Выберите счет дебета",mtError); Template.Field="СчДеб"; Exit; fi;
 if not СчДеб="" and Name_S(СчДеб)=" ": Message("Неизвестный идентификатор счета "+СчДеб,mtError); Template.Field="СчДеб"; Exit; fi;
 if Name_S(СчКре)=" ": Message("Неизвестный идентификатор счета "+СчКре,mtError); Template.Field="СчДеб"; Exit; fi;
 if not СчДеб="" and not Correspond(СчДеб,СчКре): Message("Счета не могут корреспондировать "+СчДеб+"/"+СчКре,mtError);  Template.Field="СчДеб"; Exit; fi;
 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;
 Расчет;
 Message("Расчет завершен");
end;

Proc btnОчистить_OnClick(Sender: String);
 if EnqOkCancel("Таблица будет очищена, продолжить ?",mtWarning)=cmOk: Очистить; fi;
end;

Proc btnПечать_OnClick(Sender: String);
 Раб.Настр_Печать.Prn("","",SelfCfg,"",1);
end;

Proc cbДок_OnChange(Sender: String);
 if not fManual:
    Очистить;
    Message("Для вступления изменений в силу необходимо выполнить расчет");
 fi;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
var Rec: Record;
 Раб.Настр_Печать.Cfg("",SelfCfg);
 if Учреждение="":
    ЗаполнитьРекв(nil);
 fi;
 if ДатаАкт=1.1.100:
    ДатаАкт=ToDay;
 fi;
 if not Run=nil:
    ЗаполнитьИзРКО(Run);
    btnРасчет_OnClick("Run");
 fi;
end;

Proc OnClose(Destroy: Logical);
 if not Run=nil:
    Run=nil;
    РКО_OnExit("Run",1);
 fi;
end;
--Обработчики событий шаблона -----
--

Конец
