-- Шаблон создан мастером бланков
-- 04.01.2013 17:06:47
--
БланкСШаблоном "Выбор шаблона счета";

var УпрКР:L;
var УпрКД:L;
var УпрКИФД:L;

var КР[]:S;
var КР_[]:S=КР[$];
var КД[]:S;
var КД_[]:S=КД[$];
var КИФД[]:S;
var КИФД_[]:S=КИФД[$];

var Опер[]:S;

var Buf[]:S;

var retШаблон:s;
var defШаблон:s="###.####.#######.###.#.###.##.###|###.#.##.#####.##.####.#.###.##.###|###.##.##.##.##.##.####.#.###.##.###";
--
--Процедуры и функции -------------
Func ВыбратьОпер:S;
var Ret:S;
var i:i;
 i=Alternate("Выберите режим",Опер,-1,1,12);
 if not i=0:
    Ret=SubStr(Опер[i],1,1);
 fi;
 ^Ret;
end;

Func поШаблону (aСлово:S; aШаблон:S):S;
var s,v,res:S;
var l,ll:i;
 res="";
 ll=Length(aСлово);
 for l=1..ll do
  s=SubStr(aСлово,l,1);
  v=SubStr(aШаблон,l,1);
  if v="0": res=res+v;
    |not v="x": res=res+s;
  fi;
 od;
 ^res;
end;

Func ПоШаблону2 (aСлово:S; aШаблон:S):S;
var s,v,res:S;
var l,ll:i;
 res="";
 ll=Length(aСлово);
 for l=1..ll do
  s=SubStr(aСлово,l,1);
  v=SubStr(aШаблон,l,1);
  if v="0" or v="x": 
     res=res+"?";
    else
     res=res+s;
  fi;
 od;
 ^res;
end;


Func СчетПоШаблону(aСч:S; aТип:S; aШаблон:S):S;
var w,ww:i;
var acc,mask,tmp,Res:S;
 Res="";
 if aТип="КР" or aТип="ФКР":
    if aШаблон="": aШаблон="###.####.#######.###.#.###.##.###"; fi;
    if aШаблон="###.####.#######.###.#.###.##.###": ^aСч;
      |aШаблон="XXX.XXXX.XXXXXXX.XXX.#.###.##.###": ^SubStr(aСч,22,12);
      |aШаблон="000.0000.0000000.000.#.###.##.###": ^"000.0000.0000000.000."+SubStr(aСч,22,12);
    fi;
    ww=8;
   |aТип="КД":
    if aШаблон="": aШаблон="###.#.##.#####.##.####.#.###.##.###"; fi;
    if aШаблон="###.#.##.#####.##.####.#.###.##.###": ^aСч;
      |aШаблон="XXX.X.XX.XXXXX.XX.XXXX.#.###.##.###": ^SubStr(aСч,24,12);
      |aШаблон="000.0.00.00000.00.0000.#.###.##.###": ^"000.0.00.00000.00.0000."+SubStr(aСч,24,12);
    fi;
    ww=10;
   |aТип="КИФД":
    if aШаблон="": aШаблон="###.##.##.##.##.##.####.#.###.##.###"; fi;
    if aШаблон="###.##.##.##.##.##.####.#.###.##.###": ^aСч;
      |aШаблон="XXX.XX.XX.XX.XX.XX.XXXX.#.###.##.###": ^SubStr(aСч,25,12);
      |aШаблон="000.00.00.00.00.00.0000.#.###.##.###": ^"000.00.00.00.00.00.0000."+SubStr(aСч,25,12);
    fi;
    ww=11;
   |True:
    ^aСч;
 fi;
 if not ww=WordsCount(aСч,".") or not ww=WordsCount(aШаблон,"."): ^aСч; fi;
 for w=1..ww do
  mask=ExtractWord(w,aШаблон,".");
  acc=ExtractWord(w,aСч,".");
  tmp=ПоШаблону(acc,mask);
  if not tmp="": res=res+"."+tmp; fi;
 od;
 ^SubStr(Res,2,255);
end;

Func МаскаПоШаблону(aСч:S; aТип:S; aШаблон:S):S;
var w,ww:i;
var acc,mask,tmp,Res:S;
 Res="";
 if aТип="КР" or aТип="ФКР":
    if aШаблон="###.####.#######.###.#.###.##.###" or aШаблон="": ^aСч;
      |aШаблон="XXX.XXXX.XXXXXXX.XXX.#.###.##.###": ^"*."+SubStr(aСч,22,12);
      |aШаблон="000.0000.0000000.000.#.###.##.###": ^"*."+SubStr(aСч,22,12);
    fi;
    ww=8;
   |aТип="КД":
    if aШаблон="###.#.##.#####.##.####.#.###.##.###" or aШаблон="": ^aСч;
      |aШаблон="XXX.X.XX.XXXXX.XX.XXXX.#.###.##.###": ^"*."+SubStr(aСч,24,12);
      |aШаблон="000.0.00.00000.00.0000.#.###.##.###": ^"*."+SubStr(aСч,24,12);
    fi;
    ww=10;
   |aТип="КИФД":
    if aШаблон="###.##.##.##.##.##.####.#.###.##.###" or aШаблон="": ^aСч;
      |aШаблон="XXX.XX.XX.XX.XX.XX.XXXX.#.###.##.###": ^"*."+SubStr(aСч,25,12);
      |aШаблон="000.00.00.00.00.00.0000.#.###.##.###": ^"*."+SubStr(aСч,25,12);
    fi;
    ww=11;
   |True:
    ^aСч;
 fi;
 if not ww=WordsCount(aСч,".") or not ww=WordsCount(aШаблон,"."): ^aСч; fi;
 for w=1..ww do
  mask=ExtractWord(w,aШаблон,".");
  acc=ExtractWord(w,aСч,".");
  tmp=ПоШаблону2(acc,mask);
  if not tmp="": res=res+"."+tmp; fi;
 od;
 ^SubStr(Res,2,255);
end;

Proc РазложитьШаблон (tplКР:S; tplКД:S; tplКИФД:S);
var tmp:S;
var w,ww:i;
 ClearVariable(Раб.Вспом.ШаблонСч.КР);
 ClearVariable(Раб.Вспом.ШаблонСч.КД);
 ClearVariable(Раб.Вспом.ШаблонСч.КИФД);
 if not tplКР="":
    tmp=tplКР;
    if not Match(tmp,"???.????.???????.???.?.???.??.???"): tmp="###.####.#######.###.#.###.##.###"; fi;
    КР[ 1]=SubStr(tmp,1,3);
    КР[ 2]=SubStr(tmp,5,2);
    КР[ 3]=SubStr(tmp,7,2);
    КР[ 4]=SubStr(tmp,10,3);
    КР[ 5]=SubStr(tmp,13,2);
    КР[ 6]=SubStr(tmp,15,2);
    КР[ 7]=SubStr(tmp,18,3);
    КР[ 8]=SubStr(tmp,22,1);
    КР[ 9]=SubStr(tmp,24,3);
    КР[10]=SubStr(tmp,28,2);
    КР[11]=SubStr(tmp,31,3);
 fi;
 if not tplКД="":
    tmp=tplКД;
    if not Match(tmp,"???.?.??.?????.??.????.?.???.??.???"): tmp="###.#.##.#####.##.####.#.###.##.###"; fi;
    КД[ 1]=SubStr(tmp,1,3);
    КД[ 2]=SubStr(tmp,5,1);
    КД[ 3]=SubStr(tmp,7,2);
    КД[ 4]=SubStr(tmp,10,2);
    КД[ 5]=SubStr(tmp,12,3);
    КД[ 6]=SubStr(tmp,16,2);
    КД[ 7]=SubStr(tmp,19,4);
    КД[ 8]=SubStr(tmp,24,1);
    КД[ 9]=SubStr(tmp,26,3);
    КД[10]=SubStr(tmp,30,2);
    КД[11]=SubStr(tmp,33,3);
 fi;
 if not tplКИФД="":
    tmp=tplКИФД;
    if not Match(tmp,"???.??.??.??.??.??.????.?.???.??.???"): tmp="###.##.##.##.##.##.####.#.###.##.###"; fi;
    КИФД[ 1]=SubStr(tmp,1,3);
    КИФД[ 2]=SubStr(tmp,5,2);
    КИФД[ 3]=SubStr(tmp,8,2);
    КИФД[ 4]=SubStr(tmp,11,2);
    КИФД[ 5]=SubStr(tmp,14,2);
    КИФД[ 6]=SubStr(tmp,17,2);
    КИФД[ 7]=SubStr(tmp,20,4);
    КИФД[ 8]=SubStr(tmp,25,1);
    КИФД[ 9]=SubStr(tmp,27,3);
    КИФД[10]=SubStr(tmp,31,2);
    КИФД[11]=SubStr(tmp,34,3);
 fi;
end;

Func СобратьШаблон:S;
var Res:S;
 if УпрКР:
    Res=КР[1]+"."+КР[2]+КР[3]+"."+КР[4]+КР[5]+КР[6]+"."+КР[7]+"."+КР[8]+"."+КР[9]+"."+КР[10]+"."+КР[11];
   else
    Res=" ";
 fi;
 if УпрКД:
    Res=Res+"|"+КД[1]+"."+КД[2]+"."+КД[3]+"."+КД[4]+КД[5]+"."+КД[6]+"."+КД[7]+"."+КД[8]+"."+КД[9]+"."+КД[10]+"."+КД[11];
   else
    Res=Res+"| ";
 fi;
 if УпрКИФД:
    Res=Res+"|"+КИФД[1]+"."+КИФД[2]+"."+КИФД[3]+"."+КИФД[4]+"."+КИФД[5]+"."+КИФД[6]+"."+КИФД[7]+"."+КД[8]+"."+КД[9]+"."+КД[10]+"."+КД[11];
   else
    Res=Res+"| ";
 fi;
 ^Res;
end;

Func Вызвать (tplКР:S; tplКД:S; tplКИФД:S; aОпер:S):S;
var tmp:S;
var w,ww,n:i;
 retШаблон="";
 РазложитьШаблон(tplКР,tplКД,tplКИФД);
 УпрКР=not tplКР="";
 УпрКД=not tplКД="";
 УпрКИФД=not tplКИФД="";
 ClearVariable(Раб.Вспом.ШаблонСч.Опер);
 if aОпер="": aОпер="#|X|0"; fi;
 ww=WordsCount(aОпер,"|");
 for w=1..ww do
  tmp=ExtractWord(w,aОпер,"|");
  tmp=if(tmp="#":"# -- Отображать"|tmp="X":"X -- Не отображать"|tmp="0":"0 -- Заменить на ноль"|true:"");
  if not tmp="":
     n=n+1;
     Опер[n]=tmp;
  fi;
 od;
 OpenBlank("Раб.Вспом.ШаблонСч",True);
 if retШаблон="": 
    if tplКР="" and tplКД="" and tplКИФД="": 
       ^defШаблон;
      else 
       ^if(tplКР=""," ",tplКР)+"|"+if(tplКД=""," ",tplКД)+"|"+if(tplКИФД=""," ",tplКИФД); 
    fi;
 fi;
 ^retШаблон;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func КР_OnEnter(FieldName: String; Iter: Integer): logical;
var ch:S;
var n,z:i;
 ch=ВыбратьОпер;
 if not ch="":
    if ch="X" or ch="0":
       z=0;
       for n=1..11 do
        if Pos("#",КР[n])=0: z=z+1; fi;
       od;
       if z>10: Message("Хотя бы одно из значений в шаблоне должно содержать '#'",mtError); ^False; fi;
    fi;
    if FieldName="КР_[1]" : КР[ 1]=RepStr(Ch,3); --Гл
      |FieldName="КР_[2]" : КР[ 2]=RepStr(Ch,2); --Раздел
      |FieldName="КР_[3]" : КР[ 3]=RepStr(Ch,2); --Подраздел
      |FieldName="КР_[4]" : КР[ 4]=RepStr(Ch,3); --Целевая статья
      |FieldName="КР_[5]" : КР[ 5]=RepStr(Ch,2); --Программа
      |FieldName="КР_[6]" : КР[ 6]=RepStr(Ch,2); --Подпрограмма
      |FieldName="КР_[7]" : КР[ 7]=RepStr(Ch,3); --Вид
      |FieldName="КР_[8]" : КР[ 8]=RepStr(Ch,1); --ВД
      |FieldName="КР_[9]" : КР[ 9]=RepStr(Ch,3); --Синт
      |FieldName="КР_[10]": КР[10]=RepStr(Ch,2); --Ан
      |FieldName="КР_[11]": КР[11]=RepStr(Ch,3); --КОСГУ
    fi;
 fi;
 Return False;
end;

Func КД_OnEnter(FieldName: String; Iter: Integer): logical;
var ch:S;
var n,z:i;
 ch=ВыбратьОпер;
 if not ch="":
    if ch="X" or ch="0":
       for n=1..11 do
        if Pos("#",КР[n])=0: z=z+1; fi;
       od;
       if z>10: Message("Хотя бы одно из значений в шаблоне должно содержать '#'",mtError); ^False; fi;
    fi;
    if FieldName="КД_[1]" : КД[ 1]=RepStr(Ch,3); --Гл
      |FieldName="КД_[2]" : КД[ 2]=RepStr(Ch,1); --Группа
      |FieldName="КД_[3]" : КД[ 3]=RepStr(Ch,2); --Подгруппа
      |FieldName="КД_[4]" : КД[ 4]=RepStr(Ch,2); --Статья
      |FieldName="КД_[5]" : КД[ 5]=RepStr(Ch,3); --Подстатья
      |FieldName="КД_[6]" : КД[ 6]=RepStr(Ch,2); --Элемент
      |FieldName="КД_[7]" : КД[ 7]=RepStr(Ch,4); --Подвид
      |FieldName="КД_[8]" : КД[ 8]=RepStr(Ch,1); --ВД
      |FieldName="КД_[9]" : КД[ 9]=RepStr(Ch,3); --Синт
      |FieldName="КД_[10]": КД[10]=RepStr(Ch,2); --Ан
      |FieldName="КД_[11]": КД[11]=RepStr(Ch,3); --КОСГУ
    fi;
 fi;
 Return False;
end;

Func КИФД_OnEnter(FieldName: String; Iter: Integer): logical;
var ch:S;
var n,z:i;
 ch=ВыбратьОпер;
 if not ch="":
    if ch="X" or ch="0":
       for n=1..11 do
        if Pos("#",КР[n])=0: z=z+1; fi;
       od;
       if z>10: Message("Хотя бы одно из значений в шаблоне должно содержать '#'",mtError); ^False; fi;
    fi;
    if FieldName="КИФД_[1]" : КИФД[ 1]=RepStr(Ch,3); --Гл
      |FieldName="КИФД_[2]" : КИФД[ 2]=RepStr(Ch,2); --Группа
      |FieldName="КИФД_[3]" : КИФД[ 3]=RepStr(Ch,2); --Подгруппа
      |FieldName="КИФД_[4]" : КИФД[ 4]=RepStr(Ch,2); --Статья
      |FieldName="КИФД_[5]" : КИФД[ 5]=RepStr(Ch,2); --Подстатья
      |FieldName="КИФД_[6]" : КИФД[ 6]=RepStr(Ch,2); --Элемент
      |FieldName="КИФД_[7]" : КИФД[ 7]=RepStr(Ch,4); --Вид
      |FieldName="КИФД_[8]" : КИФД[ 8]=RepStr(Ch,1); --ВД
      |FieldName="КИФД_[9]" : КИФД[ 9]=RepStr(Ch,3); --Синт
      |FieldName="КИФД_[10]": КИФД[10]=RepStr(Ch,2); --Ан
      |FieldName="КИФД_[11]": КИФД[11]=RepStr(Ch,3); --КОСГУ
    fi;
 fi;
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnВыбрать_OnClick(Sender: String);
 retШаблон=СобратьШаблон;
 Close;
end;

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


Конец
