-- Шаблон создан мастером бланков
-- 19.06.2015 11:24:21
--
БланкСШаблоном "Автосанкционирование";

var BufVer     :S;
var BufKey   []:S;
var BufKey2  []:S;
var BufКОСГУ []:S;
var BufБС    []:S;
var BufШаблон[]:S;
var BufТекст []:S;

var Buf[]      :S;
var Idx[]      :I;

var КОСГУ      :S;
var БС         :S;
var ШаблонВыпл :S;
var ТекстВыпл  :S;
var Bln        :S;

var Доп_Упр     :I;
var Доп_Имя []  :S;
var Доп_Тип []  :S;
var Доп_Кмнт[]  :S;
var Доп_Знач[]  :S;
var Доп_Шаблон[]:S;

var НомДат_Упр      :I;
var НомДат_Имя  []  :S;
var НомДат_Тип  []  :S;
var НомДат_Кмнт []  :S;
var НомДат_Знач1[]  :S;
var НомДат_Знач2[]  :S;
var НомДат_Шаблон[] :S;

var Почта_Упр      :I;
var Почта_Имя  []  :S;
var Почта_Тип  []  :S;
var Почта_Кмнт []  :S;
var Почта_Знач1[]  :S;
var Почта_Знач2[]  :S;
var Почта_Шаблон[] :S;

var допЗагл    :L=not Доп_Упр=0 or not НомДат_Упр=0 or not Почта_Упр=0;
var Компенсатор:L=Доп_Упр=0 and НомДат_Упр=0 or not Почта_Упр=0;

var Доп_save:S="<";
var НомДат_save:S="<";

var State :I;
S1: Section;
--
--Процедуры и функции -------------
Proc Очистить;
 ClearVariable(Раб.Вспом.АС.BufKey);
 ClearVariable(Раб.Вспом.АС.BufKey2);
 ClearVariable(Раб.Вспом.АС.BufКОСГУ);
 ClearVariable(Раб.Вспом.АС.BufБС);
 ClearVariable(Раб.Вспом.АС.BufШаблон);
 ClearVariable(Раб.Вспом.АС.BufТекст);
end;

Proc ОчиститьДоп;
 ClearVariable(Раб.Вспом.АС.Доп_Упр);
 ClearVariable(Раб.Вспом.АС.Доп_Имя);
 ClearVariable(Раб.Вспом.АС.Доп_Тип) ;
 ClearVariable(Раб.Вспом.АС.Доп_Кмнт);
 ClearVariable(Раб.Вспом.АС.Доп_Знач);
 ClearVariable(Раб.Вспом.АС.Доп_Шаблон);
 ClearVariable(Раб.Вспом.АС.НомДат_Упр);
 ClearVariable(Раб.Вспом.АС.НомДат_Имя);
 ClearVariable(Раб.Вспом.АС.НомДат_Тип) ;
 ClearVariable(Раб.Вспом.АС.НомДат_Кмнт);
 ClearVariable(Раб.Вспом.АС.НомДат_Знач1);
 ClearVariable(Раб.Вспом.АС.НомДат_Знач2);
 ClearVariable(Раб.Вспом.АС.НомДат_Шаблон);
 ClearVariable(Раб.Вспом.АС.Почта_Упр);
 ClearVariable(Раб.Вспом.АС.Почта_Имя);
 ClearVariable(Раб.Вспом.АС.Почта_Тип) ;
 ClearVariable(Раб.Вспом.АС.Почта_Кмнт);
 ClearVariable(Раб.Вспом.АС.Почта_Знач1);
 ClearVariable(Раб.Вспом.АС.Почта_Знач2);
 ClearVariable(Раб.Вспом.АС.Почта_Шаблон);
end;

Func Шаблон2Текст (Val:S):s;
var p,:i;
var Ret:s;
 p=Pos("<",Val);
 if p=0:
    p=Pos(">",Val);
    if not p=0: 
       Trace(Val);
       Trace("Закрытие макроса, без открытия на позиции "+Str(p));
    fi;
    Ret=Val;
   else
    While not p=0 do
     Ret=Ret+SubStr(Val,1,p-1);
     Val=SubStr(Val,p,255);
     p=Pos(">",Val);
     if p=0:
        Trace(Val);
        Trace("Не найдено закрытие макроса");
       else
        Val=SubStr(Val,p+1,255);
        p=Pos("<",Val);
     fi;
    od;
    Ret=Ret+val;
 fi;
 ^Trim(Ret);
end;

Proc Шаблон2Доп (Val:S);
var p1,p2,iДоп,iНомДат,iПочта:i;
var tmp,Имя_,Тип_,Кмнт_:s;
 ОчиститьДоп;
 p1=Pos("<",Val);
 While not p1=0 do
  p2=Pos(">",Val);
  tmp=SubStr(Val,p1+1,p2-p1-1);
  Val=SubStr(Val,p2+1,255);
  Имя_ =ExtractWord(1,tmp,":");
  Тип_ =ExtractWord(2,tmp,":");
  Кмнт_=ExtractWord(3,tmp,":");
  if Имя_ ="": Trace(val); Trace("Не задано имя макроса"); fi;
  if Тип_ ="": Trace(val); Trace("Не задан тип макроса"); fi;
  if Кмнт_="": Trace(val); Trace("Не задан комментарий макроса"); fi;
  if not Имя_="" and not Тип_="" and not Кмнт_="":
     if Тип_="#НомДат":
        iНомДат=iНомДат+1;
        НомДат_Кмнт  [iНомДат]=Кмнт_;
        НомДат_Знач1 [iНомДат]="";
        НомДат_Знач2 [iНомДат]="";
        НомДат_Имя   [iНомДат]=Имя_;
        НомДат_Тип   [iНомДат]=Тип_;
        НомДат_Шаблон[iНомДат]=tmp;
       |Тип_="#Почта":
        iПочта=iПочта+1;
        Почта_Кмнт  [iПочта]=Кмнт_;
        Почта_Знач1 [iПочта]="";
        Почта_Знач2 [iПочта]="";
        Почта_Имя   [iПочта]=Имя_;
        Почта_Тип   [iПочта]=Тип_;
        Почта_Шаблон[iПочта]=tmp;
       |True:
        iДоп=iДоп+1;
        Доп_Кмнт[iДоп]=Кмнт_;
        if Match(Тип_,"@*"):
           if VariableExistS(bln+"."+SubStr(Тип_,2,25)) or 1=1:
              Доп_Знач[iДоп]=GetVariableS(bln+"."+SubStr(Тип_,2,25));
             else
              Доп_Знач[iДоп]="";
           fi;
          else
           Доп_Знач[iДоп]="";
        fi;
        Доп_Имя   [iДоп]=Имя_;
        Доп_Тип   [iДоп]=Тип_;
        Доп_Шаблон[iДоп]=tmp;
     fi;
  fi;
  p1=Pos("<",Val);
 od;
 Доп_Упр=iДоп;
 НомДат_Упр=iНомДат;
 Почта_Упр=iПочта;
end;

Func ЧитатьФайл:I;
var fTxt,z,p:I;
var FName,Head,tmp,КОСГУ_,БС_,Шаблон_,Текст_:S;
 FName=PlanVar("Std_Rpo")+"\DBF\Автосанкционирование.txt";
 if not ExistFile(FName): Message("Файл шаблонов не найден ("+FName+")",mtError); ^-1; fi;
 fTxt=TextFileOpenRead(FName);
 Try
  While not TextFileEndOfFile(fTxt) do
   if Head="":
      Head=Trim(TextFileReadLn(fTxt));
      if not ExtractWord(1,Head,"|")="АС" or Int(ExtractWord(2,Head,"|"))=0:
         Message("Неизвестный формат файла",mtError);
         ^-2;
      fi;
      if ExtractWord(3,Head,"|")=Раб.Вспом.АС.BufVer:
         ^LengthOfArray(Раб.Вспом.АС.BufКОСГУ);
        else
         Очистить;
         Раб.Вспом.АС.BufVer=ExtractWord(3,Head,"|");
      fi;
     else
      p=p+1;
      tmp=Trim(TextFileReadLn(fTxt));
      КОСГУ_ =Trim(ExtractWord(1,tmp,"|"));
      БС_    =Trim(ExtractWord(2,tmp,"|"));
      Шаблон_=Trim(ExtractWord(3,tmp,"|"));
      Текст_=Шаблон2Текст(Шаблон_);
      z=InsertInArraySort(Раб.Вспом.АС.BufKey,КОСГУ_+"#"+Str16(p));
      InsertInArray(Раб.Вспом.АС.BufKey2,z,КОСГУ_+"#"+БС_);
      InsertInArray(Раб.Вспом.АС.BufКОСГУ,z,КОСГУ_);
      InsertInArray(Раб.Вспом.АС.BufБС,z,БС_);
      InsertInArray(Раб.Вспом.АС.BufШаблон,z,Шаблон_);
      InsertInArray(Раб.Вспом.АС.BufТекст,z,Текст_);
   fi;
  od;
 Finally
  TextFileClose(fTxt);
 end;
 if LengthOfArray(Раб.Вспом.АС.BufКОСГУ)=Int(ExtractWord(2,Head,"|")):
    ^LengthOfArray(Раб.Вспом.АС.BufКОСГУ);
   else
    ^-Int(ExtractWord(3,Head,"|"));
 fi;
end;

Func Собрать:S;
var Iter:I;
var Ret:s;
 Ret=ШаблонВыпл;
 for Iter=1..Доп_Упр do
  Ret=Раб.Формат.ReplaceSubStr(Ret,"<"+Доп_Шаблон[Iter]+">",Доп_Знач[Iter]);
 od;
 for Iter=1..НомДат_Упр do
  Ret=Раб.Формат.ReplaceSubStr(Ret,"<"+НомДат_Шаблон[Iter]+">",НомДат_Знач1[Iter]+" от "+НомДат_Знач2[Iter]);
 od;
 for Iter=1..Почта_Упр do
  Ret=Раб.Формат.ReplaceSubStr(Ret,"<"+Почта_Шаблон[Iter]+">",Почта_Знач1[Iter]+"; почтовый сбор-"+Почта_Знач2[Iter]);
 od;
 ^Ret;
end;

Func Вызвать (aКОСГУ:S; aБС:S; aBln:S):S;
 if ЧитатьФайл>0:
    aБС=SubStr(aБС,1,5);
    if not aБС="40101": aБС=""; fi;
    if SearchInArray(Раб.Вспом.АС.BufKey2,aКОСГУ+"#"+aБС,True)=-1: ^" "; fi;
    if not Раб.Вспом.АС.КОСГУ=aКОСГУ or not Раб.Вспом.АС.БС=aБС:
       Раб.Вспом.АС.КОСГУ=aКОСГУ;
       Раб.Вспом.АС.БС=aБС;
       Раб.Вспом.АС.bln=aBln;
       Раб.Вспом.АС.ШаблонВыпл="";
       Раб.Вспом.АС.ТекстВыпл="";
       ОчиститьДоп;
    fi;
    OpenBlank("Раб.Вспом.АС",True);
    if Раб.Вспом.АС.State=1: ^Раб.Вспом.АС.ТекстВыпл; fi;
 fi;
 ^"";
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func ТекстВыпл_OnEnter(FieldName: String; Iter: Integer): logical;
var n,nn,z,i:i;
 if КОСГУ="": Message("Не задан КОСГУ",mtError); Template.Field="КОСГУ"; ^False; fi;
 nn=ЧитатьФайл;
 if nn=0: Message("Список направлений выплат пуст",mtError); ^False; fi;
 if nn<0: Message("Ошибка формирования списка направлений выплат",mtError); ^False; fi;
 ClearVariable(Buf);
 ClearVariable(Idx);
 z=SearchInArray(BufKey2,КОСГУ+"#"+БС,True);
 if z=-1: Message("Для КОСГУ "+КОСГУ+if(БС="",""," (банковский счет "+БС+")")+" списка направлений выплат не найдено",mtError); ^False; fi;
 for n=z..nn do
  if BufКОСГУ[n]=КОСГУ and BufБС[n]=БС:
     i=i+1;
     Buf[i]=BufТекст[n];
     Idx[i]=n;
  fi;
 od;
 n=Alternate("Выберите направление выплат для КОСГУ "+КОСГУ,Buf,-1,1,12);
 if not n=0:
    ТекстВыпл=Buf[n];
    ШаблонВыпл=BufШаблон[Idx[n]];
    Шаблон2Доп(ШаблонВыпл);
    ТекстВыпл=Собрать;
 fi;
 Return False;
end;

Proc ТекстВыпл_OnExit(FieldName: String; Iter: Integer);
 ОчиститьДоп;
end;

Func Знач_OnEnter(FieldName: String; Iter: Integer): logical;
var i:i;
 if Доп_Тип[iter]="#период":
    ClearVariable(Buf);
    for i=1..12 do 
     Buf[i]=Месяц(i); 
    od;
    i=Alternate('Выбор периода',Buf,30,Mon(ToDay),12);
    if not i=0:
       Доп_Знач[iter]=Buf[i]+" "+Str(Year(ToDay));
    fi;
 fi;
 Return True;
end;

Func Знач_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var p:i;
var dd:d;
 if Доп_Тип[Iter]="N" or FieldName="Почта_Знач1" or FieldName="Почта_Знач2":
    p=Pos(".",Value); 
    p=Length(Value)-p; 
    if not Value=Str(Round(Value,p),p): 
       Message("Введенное значение не является числом",mtError); 
       ^False; 
    fi;
   |Доп_Тип[Iter]="I": 
    if not Value=Str(Int(Value)): 
       Message("Введенное значение не является числом",mtError); 
       ^False; 
    fi;
   |Доп_Тип[Iter]="D" or FieldName="НомДат_Знач2":
    Try 
     dd=StringToDate(Value); 
     Except 
      Message("Введенное значение не является датой",mtError);
      ^False; 
   end;
 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 Iter:I;
var vs:S;
var vd:d;
var vn:N;
 Iter=AsInteger(Template.Frame);
 Field=AsString(Template.Field);
 if Field="НомДат_Знач2":
    vd=Calendar;
    if not vd=1.1.100:
       Cur=DateToString(vd);
    fi;
   |Match(Field,"НомДат_*"):
    Template.HideEditor(False);
    vs=ExecuteFuncS("Раб.Вспом.Основание.Выполнить","Раб.Вспом.АС."+НомДат_Имя[Iter]);
    if not vs="":
       if Match(vs,"* от *"):
          НомДат_Знач1[Iter]=Trim(ExtractWord(1,vs,"от"));
          НомДат_Знач2[Iter]=Trim(ExtractWord(2,vs,"от"));
         else
          Message("Сохраненное значение должно соответствовать шаблону: <номер> от <дата>",mtError);
       fi;
    fi;
    ТекстВыпл=Собрать;
   |Match(Field,"Почта_*"):
    vn=Calculator;
    if not vn=0:
       Cur=Str(vn,2);
    fi;
   |True:
    if Доп_Тип[Iter]="S":
       vs=ExecuteFuncS("Раб.Вспом.Основание.Выполнить","Раб.Вспом.АС."+Доп_Имя[Iter]);
       if not vs="":
          Cur=vs;
       fi;
      |Доп_Тип[Iter]="D":
       vd=Calendar;
       if not vd=1.1.100:
          Cur=DateToString(vd);
       fi;
      |Доп_Тип[Iter]="N":
       vn=Calculator;
       if not vn=0:
          Cur=Str(vn,2);
       fi;
    fi;
 fi;
 Return Cur;
end;

Func save_OnEnter(FieldName: String; Iter: Integer): logical;
var ID,Val:S;
var OWA,n:I;
var Rec:Record;
 if FieldName="Доп_Save":
    if Match(доп_Тип[Iter],"#*"):
       Message("Данное значение сохранить невозможно");
       ^False;
    fi;
    if доп_Знач[Iter]="": Message("Заполните значение "+доп_Кмнт[Iter],mtError); Template.Field="доп_Знач"; ^False; fi;
    ID="Раб.Вспом.АС."+доп_Имя[Iter];
    Val=доп_Знач[Iter];
   |FieldName="НомДат_Save":
    if НомДат_Знач1[Iter]="": Message("Заполните значение "+НомДат_Кмнт[Iter],mtError); Template.Field="НомДат_Знач1"; ^False; fi;
    if НомДат_Знач2[Iter]="": Message("Заполните дату",mtError); Template.Field="НомДат_Знач2"; ^False; fi;
    ID="Раб.Вспом.АС."+НомДат_Имя[Iter];
    Val=НомДат_Знач1[Iter]+" от "+НомДат_Знач2[Iter];
   |True:
    ^False;
 fi;
 OWA=OpenWorkArea("РПО_ОСНОВАНИЕ2","","Owner='"+id+"' and Осн='"+Val+"'");
 Try
  if not Records(OWA)=0: Message("Справочник уже содержит текущее значение",mtError); ^False; fi;
  BeginChanging(OWA);
  Try
   n=InsertRecord(OWA);
   n=PutFieldS(OWA,n,"owner",id);
   n=PutFieldS(OWA,n,"осн",val);
   Rec=GetRecordKey(OWA,n);
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 if not Rec=nil:
    Rec=OpenCardFile("РПО_ОСНОВАНИЕ2","Owner='"+id+"'",Rec);
 fi;
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnПринять_OnClick(Sender: String);
var Iter:I;
 if ТекстВыпл="": Message("Заполните направление выплаты",mtError); Template.Field="ТекстВыпл"; Exit; fi;
 for Iter=1..Доп_Упр do
  if Доп_Знач[Iter]="":
     if EnqOkCancel("Дополнительные параметры выплаты не заполнены, Игнорировать ?",mtWarning)=cmCancel:
        Template.Field="Доп_Знач";
        Template.Frame=Iter;
        Exit;
       else
        Break;
     fi;
  fi;
 od;
 if Iter>Доп_Упр:
    for Iter=1..НомДат_Упр do
     if НомДат_Знач1[Iter]="" or НомДат_Знач2[Iter]="":
        if EnqOkCancel("Дополнительные параметры выплаты не заполнены, Игнорировать ?",mtWarning)=cmCancel:
           Template.Field=if(НомДат_Знач1[Iter]="","НомДат_Знач1","НомДат_Знач2");
           Template.Frame=Iter;
           Exit;
          else
           Break;
        fi;
     fi;
    od;
    if Iter>НомДат_Упр:
       for Iter=1..Почта_Упр do
        if Почта_Знач1[Iter]="" or Почта_Знач2[Iter]="":
           if EnqOkCancel("Дополнительные параметры выплаты не заполнены, Игнорировать ?",mtWarning)=cmCancel:
              Template.Field=if(Почта_Знач1[Iter]="","Почта_Знач1","Почта_Знач2");
              Template.Frame=Iter;
              Exit;
             else
              Break;
           fi;
        fi;
       od;
    fi;
 fi;
 State=1;
 Close;
end;

Proc btnШаблон_OnClick(Sender: String);
var FName:S;
 FName=PlanVar("Std_Rpo")+"\DBF\Автосанкционирование.txt";
 if not ExistFile(FName): Message("Файл шаблонов не найден ("+FName+")",mtError); Exit; fi;
 OpenEditor(FName);
 BufVer="";
end;

Proc btnОтмена_OnClick(Sender: String);
 Close;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 ClearVariable(State);
end;
--Обработчики событий шаблона -----
--





Конец
