-- Шаблон создан мастером бланков
-- 24.04.2001 10:12:37
--
БланкСШаблоном "Вспомогательный бланк";

var HandleSort: Упр;
var RunSort:S;
var SortS[]:S;

var FormatБК:S="СТ.????.???.???.??????!";
var FormatБК2005:S="СТ.????.???????.???.???!";
var NumAllБК:I; --число эелементов справочника СТ
var NumБК   :I; --чисо отобранных справочников
var NumРП   :I; --чисо отобранных разделов подразделов
var NumСТ   :I; --чисо отобранных статей
var NumВР   :I; --чисо отобранных статей
var ListБК[]:S; --Все разделы подразделы, виды статей, виды расходов в формате СТ.1234.123.123
var ListРП[]:S; --Список разделов подразделов
var ListСТ[]:S; --Список статей
var ListВР[]:S; --Список видов расходов

var StoreLvl:L;
var StoreРП :S;
var StoreСТ :S;
var ListAРП[]:S;
var ListAСТ[]:S;
var ListAВР[]:S;

var Buf[]:S;
var Buf1[]:S;
var Buf2[]:S;

var ExclAdd:S;

var FlagБК2005:L;
var StoreFlagБК2005:L;

var OWAКБК:I;
var pКБК:I;
------------
Proc Начать_НаимКБК;
 OWAКБК=OpenWorkArea("РПО_Бюдж_Класс","Name_Voc; Code");
 pКБК=1;
 Раб.КБК.CrdToCache("ППП2006",False);
 Раб.КБК.CrdToCache("ФКР2006",False);
 Раб.КБК.CrdToCache("КЦСР2006",False);
 Раб.КБК.CrdToCache("КВР2006",False);
 Раб.КБК.CrdToCache("КОСГУ2006",False);
 Раб.КБК.CrdToCache("СЧ",False);
 Раб.КБК.CrdToCache("КД2006",False);
 Раб.КБК.CrdToCache("КИФД2006",False);
end;

Proc Начать_НаимКБК2(F:S);
 OWAКБК=OpenWorkArea("РПО_Бюдж_Класс","Name_Voc; Code","Name_Voc='"+F+"'");
 pКБК=1;
 Раб.КБК.CrdToCache(F,False);
end;

Func Взять_НаимКБК(Name_Voc:S; Code:S):S;
var Txt:s;
var n,x:i;
 if Name_Voc="ППП": Name_Voc="ППП2006"; fi;
 if  Name_Voc="ППП2006":   x=SearchInArray(Раб.КБК.cacheППП_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheППП_Наим[x];
    |Name_Voc="ФКР2006":   x=SearchInArray(Раб.КБК.cacheФКР_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheФКР_Наим[x];
    |Name_Voc="КЦСР2006":  x=SearchInArray(Раб.КБК.cacheКЦСР_Код,Code,True,pКБК);
                           if x=-1: x=SearchInArray(Раб.КБК.cacheКЦСР_Код,"000"+SubStr(Code,4,4),True); fi;
                           x=Max(x,0);
                           ^Раб.КБК.cacheКЦСР_Наим[x];
    |Name_Voc="КВР2006":   x=SearchInArray(Раб.КБК.cacheКВР_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheКВР_Наим[x];
    |Name_Voc="КОСГУ2006": x=SearchInArray(Раб.КБК.cacheКОСГУ_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheКОСГУ_Наим[x];
    |Name_Voc="СЧ":        x=SearchInArray(Раб.КБК.cacheСЧЕТА_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheСЧЕТА_Наим[x];
    |Name_Voc="СЧЕТА2006": x=SearchInArray(Раб.КБК.cacheСЧЕТА_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheСЧЕТА_Наим[x];
    |Name_Voc="КД2006":    x=SearchInArray(Раб.КБК.cacheКД_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheКД_Наим[x];
    |Name_Voc="КИФД2006":  x=SearchInArray(Раб.КБК.cacheКИФД_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheКИФД_Наим[x];
 fi;
 n=Search(OWAКБК,pКБК,Name_Voc,Code);
 if n=0: 
    pКБК=1; 
    n=Search(OWAКБК,pКБК,Name_Voc,Code); 
 fi;
 if n>0: 
    pКБК=n; 
    Txt=GetFieldS(OWAКБК,n,"Txt");
   else 
    if Name_Voc="КЦСР2006": --для 2009 года
       Code="000"+SubStr(Code,4,4);
       n=Search(OWAКБК,1,Name_Voc,Code);
       if n=0: 
          Txt=""; 
         else 
          Txt=GetFieldS(OWAКБК,n,"Txt");
       fi;
      else
       Txt="";
    fi;
 fi;
 ^Txt;
end;

Proc Закончить_НаимКБК;
 CloseWorkArea(OWAКБК);
 pКБК=1;
end;

Func НаимКБК(Name_Voc:S; Code:S):S;
var Rec,OWA,x:I;
var Txt:S;
 if Name_Voc="ППП": Name_Voc="ППП2006"; fi;
 Раб.КБК.CrdToCache(Name_Voc,False);
 if  Name_Voc="ППП2006":   x=SearchInArray(Раб.КБК.cacheППП_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheППП_Наим[x];
    |Name_Voc="ФКР2006":   x=SearchInArray(Раб.КБК.cacheФКР_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheФКР_Наим[x];
    |Name_Voc="КЦСР2006":  x=SearchInArray(Раб.КБК.cacheКЦСР_Код,Code,True);
                           if x=-1: x=SearchInArray(Раб.КБК.cacheКЦСР_Код,"000"+SubStr(Code,4,4),True); fi;
                           x=Max(x,0);
                           ^Раб.КБК.cacheКЦСР_Наим[x];
    |Name_Voc="КВР2006":   x=SearchInArray(Раб.КБК.cacheКВР_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheКВР_Наим[x];
    |Name_Voc="КОСГУ2006": x=SearchInArray(Раб.КБК.cacheКОСГУ_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheКОСГУ_Наим[x];
    |Name_Voc="СЧ":        x=SearchInArray(Раб.КБК.cacheСЧЕТА_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheСЧЕТА_Наим[x];
    |Name_Voc="СЧЕТА2006": x=SearchInArray(Раб.КБК.cacheСЧЕТА_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheСЧЕТА_Наим[x];
    |Name_Voc="КД2006":    x=SearchInArray(Раб.КБК.cacheКД_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheКД_Наим[x];
    |Name_Voc="КИФД2006":  x=SearchInArray(Раб.КБК.cacheКИФД_Код,Code,True);
                           x=Max(x,0);
                           ^Раб.КБК.cacheКИФД_Наим[x];
 fi;
 OWA=OpenWorkArea("РПО_Бюдж_Класс","Name_Voc;Code");
 Try
  Rec=Search(OWA,1,Name_Voc,Code);
  if Rec>0:
     Txt=GetFieldS(OWA,Rec,"Txt");
    else
     if Name_Voc="КЦСР2006": --для 2009 года
        Code="000"+SubStr(Code,4,4);
        Rec=Search(OWA,1,Name_Voc,Code);
        if Rec=0:
           Txt="";
          else
           Txt=GetFieldS(OWA,Rec,"Txt");
        fi;
       else
        Txt="";
     fi;
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^Txt;
end;

Func РазделПодраздел (Code:S):S;
 ^НаимКБК("ФКР",Code);
end;

func ЦелеваяСтатья(Code:s):s;
 ^НаимКБК("КЦСР",Code);
end;

func ВидРасходов(Code:s):s;
 ^НаимКБК("КВР",Code);
end;

Func БюджКласс(Code:S):S;
 ^НаимКБК("ЭК",Code);
end;


Func GetРП (БК:S):S;
 ^SubStr(БК,4,4);
end;

Func GetСТ (БК:S):S;
 if Match(БК,"СТ.????.???!"): ^SubStr(БК,9,3);
   |Match(БК,"СТ.????.???????!"): ^SubStr(БК,9,7);
 fi;
 ^"";
end;

Func GetВР (БК:S):S;
 if Match(БК,"СТ.????.???.???!"): ^SubStr(БК,13,3);
   |Match(БК,"СТ.????.???????.???!"): ^SubStr(БК,17,3);
 fi;
 ^"";
end;

Func GetЭК (БК:S):S;
 if Match(БК,"СТ.????.???.???.??????!"): ^SubStr(БК,17,6);
   |Match(БК,"СТ.????.???????.???.???!"): ^SubStr(БК,21,3);
 fi;
 ^"";
end;

Func GetUserЭК (БК:S):S; --забирает ЭК и что дальше его
 if Match(БК,"СТ.????.???.???.??????!"): ^SubStr(БК,17,255);
   |Match(БК,"СТ.????.???????.???.???!"): ^SubStr(БК,21,255);
 fi;
end;

Func РПtoMask (РП:S):S;
var tmp:s;
 if РП="": ^"????"; fi;
 if Match(РП,"??00"): ^SubStr(РП,1,2)+"??"; fi;
 ^РП;
end;

Func ЭКToMask(St:S):S;
var R1,R2,R3,R4,R5:s;
var Tmp:S;
 if Length(St)=6:
    R1=SubStr(St,1,1);
    R2=SubStr(St,2,1);
    R3=SubStr(St,3,2);
    R4=SubStr(St,5,1);
    R5=SubStr(St,6,1);
    if R1="0": ^"*"; fi;
    if R2="0": ^R1+"*"; fi;
    if R3="00":^R1+R2+"*"; fi;
    if R4="0": ^R1+R2+R3+"*"; fi;
    if R5="0": ^R1+R2+R3+R4+"*"; fi;
   |Length(St)=3:
    R1=SubStr(St,1,1);
    R2=SubStr(St,2,1);
    R3=SubStr(St,3,1);
    if R1="0": ^"*"; fi;
    if R2="0": ^R1+"*"; fi;
    if R3="0": ^R1+R2+"*"; fi;
   |True: ^St;
 fi;
 ^St+"*";
end;

Func GetItemБК(Item:I):S;
 ^ListБК[Item];
end;

Func ExistБК (S: S; Count: I): L;
var n   : I;
 if Count=0: ^True; fi;
 for n=1..count do if ListБК[n]=S: ^False; fi; od;
 ^True;
end;

Func ExistРП (S: S; Count: I): L;
var n   : I;
 if Count=0: ^True; fi;
 for n=1..count do if ListРП[n]=S: ^False; fi; od;
 ^True;
end;

Func ExistСТ (S: S; Count: I): L;
var n   : I;
 if Count=0: ^True; fi;
 for n=1..count do if ListСТ[n]=S: ^False; fi; od;
 ^True;
end;

Func ExistВР (S: S; Count: I): L;
var n   : I;
 if Count=0: ^True; fi;
 for n=1..count do if ListВР[n]=S: ^False; fi; od;
 ^True;
end;

Proc CreateListБК(z:i);
var tmp: s;
var n,p: i;
var Flag: L;
 ClearVariable(Раб.Бюджет.ListБК); NumAllБК=0; NumБК=0;
 ClearVariable(Раб.Бюджет.ListРП); NumРП=0;
 ClearVariable(Раб.Бюджет.ListСТ); NumСТ=0;
 ClearVariable(Раб.Бюджет.ListВР); NumВР=0;
 if z=0:
    for Sign tmp="СТ.*" do 
     NumAllБК=NumAllБК+1; 
    od; --считаем число элементов справочника
   else
    NumAllБК=z;
 fi;
 n=0;
 for Sign tmp="СТ.*", Sort do
  if FlagБК2005: 
     Flag=Match(tmp,FormatБК2005); 
     tmp=SubStr(tmp,1,19);
    else 
     Flag=Match(tmp,FormatБК); 
     tmp=SubStr(tmp,1,15);
  fi;
  if Flag and ExistБК(tmp,NumБК):NumБК=NumБК+1; ListБК[NumБК]=tmp; fi; --формируем список разделов, подразделов, статей и видов расходов, отрезаем БК
  --------
   n=n+1;
   p=Int(n*100/NumAllБК);
   Hint("Анализ бюджетной классификации, выполенно: "+Str(P)+"%");
  -------
 od; --for Sing t="СТ.*", Sort do
end;

Proc InitListБК;
var t:s;
var n:i;
 n=0;
 for Sign t="СТ.*" do
  Hint(t+"...");
  n=n+1; 
 od; --считаем число элементов справочника
 if n<>NumAllБК or FlagБК2005<>StoreFlagБК2005: CreateListБК(n); fi;
 StoreFlagБК2005=FlagБК2005;
end;

Proc CreateListРП(ShowLevel:L; Progress:L);
var n,p:i;
var tmp:s;
var Разд:s;
 if NumБК=0: CreateListБК(0); fi;
 ClearVariable(Раб.Бюджет.ListРП); NumРП=0;
 ClearVariable(Раб.Бюджет.ListСТ); NumСТ=0;
 ClearVariable(Раб.Бюджет.ListВР); NumВР=0;
 Разд="qwerty";
 for n=1..NumБК do
  tmp=GetРП(ListБК[n]);
  if ShowLevel=True:
   if SubStr(tmp,3,2)="00": Разд=SubStr(tmp,1,2); fi; --если в списке есть уже раздел то запоминаем этот раздел
   if Match(tmp,Разд+"??")=False: --если раздела нету в списке подразделов то создаем его
      Разд=SubStr(tmp,1,2);
      NumРП=NumРП+1;
      ListРП[NumРП]=Разд+"00"; --добавляем раздел
   fi;
  fi;
  if ExistРП(tmp,NumРП): NumРП=NumРП+1; ListРП[NumРП]=tmp; fi;
  --------------------
  if Progress:
   p=Int(n*100/NumБК);
   Hint("Обработка разделов/подразделов, выполенно: "+Str(P)+"%");
  fi;
  --------------------
 od;
end;

Proc CreateListСТ(РП:S; Progress:L);
var n,p:i;
var tmp:s;
var Mask:s;
 if NumБК=0: CreateListБК(0); fi;
 ClearVariable(Раб.Бюджет.ListСТ); NumСТ=0;
 ClearVariable(Раб.Бюджет.ListВР); NumВР=0;
 Mask="СТ."+РПtoMask(РП)+".*";
 for n=1..NumБК do
  if Match(ListБК[n],Mask):
   tmp=GetСТ(ListБК[n]);
   if ExistСТ(tmp,NumСТ): NumСТ=NumСТ+1; ListСТ[NumСТ]=tmp; fi;
   --------------------
   if Progress:
    p=Int(n*100/NumБК);
    Hint("Обработка целевых статей, выполенно: "+Str(P)+"%");
   fi;
   --------------------
  fi;
 od;
end;

Proc CreateListВР(РП:S; СТ:S; Progress:L);
var n,p:i;
var tmp:s;
var Mask:s;
 if NumБК=0: CreateListБК(0); fi;
 ClearVariable(Раб.Бюджет.ListВР); 
 NumВР=0;
 if СТ="": СТ="???"; fi;
 Mask="СТ."+РПtoMask(РП)+"."+СТ+".*";
 for n=1..NumБК do
  if Match(ListБК[n],Mask):
     tmp=GetВР(ListБК[n]);
     if ExistВР(tmp,NumВР): NumВР=NumВР+1; ListВР[NumВР]=tmp; fi;
     --------------------
   if Progress:
      p=Int(n*100/NumБК);
      Hint("Обработка видов расходов, выполенно: "+Str(P)+"%");
   fi;
   --------------------
  fi;
 od;
end;

Proc SortList(Value:S);
var SMin:S;
var n1,n2,nn,z:i;
 ClearVariable(Раб.Бюджет.HandleSort);
 ClearVariable(Раб.Бюджет.SortS);
 if Value="РП":  z=NumРП;
   |Value="СТ":  z=NumСТ;
   |Value="ВР":  z=NumВР;
 fi;
 for n1=1..Z do
  Hint("Сортировка...");
  InsertFrame(HandleSort,HandleSort+1);
  if Value="РП":  SortS[n1]=ListРП[n1];
    |Value="СТ":  SortS[n1]=ListСТ[n1];
    |Value="ВР":  SortS[n1]=ListВР[n1];
  fi;
 od;
 n1=1;
 While n1<=HandleSort do
  Hint("Сортировка...");
  n2=n1;
  SMin=SortS[n1];
  While n2<=HandleSort do
   if SortS[n2]<=SMin: SMin=SortS[n2]; nn=n2; fi;
   n2=n2+1;
  od;
  DeleteFrame(HandleSort,nn);
  InsertFrame(HandleSort,n1);
  SortS[n1]=SMin;
  n1=n1+1;
 od;
 for n1=1..Z do
  Hint("Сортировка...");
  if Value="РП":  ListРП[n1]=SortS[n1];
    |Value="СТ":  ListСТ[n1]=SortS[n1];
    |Value="ВР":  ListВР[n1]=SortS[n1];
  fi;
 od;
 ClearVariable(Раб.Бюджет.SortS);
 ClearVariable(Раб.Бюджет.HandleSort);
end;

Func AlternateРП (ShowLevel:L):S;
var z,n:i;
 z=0;
 While z=1 or z=0 do
  if StoreLvl<>ShowLevel or NumРП=0 or z=1:
     CreateListРП(ShowLevel,True);
     RunSort="РП";
     OpenBlank("Раб.Бюджет",True);
     StoreLvl=ShowLevel;
     ClearVariable(Раб.Бюджет.ListAРП);
     ListAРП[1]="         --Обновить список БК";
     ListAРП[2]="    *    --Все разделы/подразделы";
     for n=3..NumРП+2 do ListAРП[n]=ListРП[n-2]+"  --"+РазделПодраздел(ListРП[n-2]); od;
  fi;
  z=Alternate("Раздел/подраздел",ListAРП);
  if z=0: ^"";
    |z=1: CreateListБК(0);
    |z=2: ^"";
    |True: ^ListРП[z-2];
  fi;
 od;
end;

Func AlternateСТ (РП:S):S;
var z,n:i;
 z=0;
 While z=1 or z=0 do
  if РП<>StoreРП or NumСТ=0 or z=1:
     CreateListСТ(РП,True);
     RunSort="СТ";
     OpenBlank("Раб.Бюджет",True);
     StoreРП=РП;
     ClearVariable(Раб.Бюджет.ListAСТ);
     ListAСТ[1]="  *    --Обновить список БК";
     ListAСТ[2]="  *    --Все целевые статьи";
     for n=3..NumСТ+2 do ListAСТ[n]=ListСТ[n-2]+"  --"+ЦелеваяСтатья(ListСТ[n-2]); od;
  fi;
  z=Alternate("Целевая статья",ListAСТ);
  if z=0: ^"";
    |z=1: CreateListБК(0);
    |z=2: ^"";
    |True: ^ListСТ[z-2];
  fi;
 od;
end;

Func AlternateВР (РП:S; СТ:S):S;
var z,n:i;
 z=0;
 While z=1 or z=0 do
  if РП<>StoreРП or СТ<>StoreСТ or NumВР=0 or z=1:
     CreateListВР(РП,СТ,True);
     RunSort="ВР";
     OpenBlank("Раб.Бюджет",True);
     StoreРП=РП; StoreСТ=СТ;
     ClearVariable(Раб.Бюджет.ListAВР);
     ListAВР[1]="  *    --Обновить список БК";
     ListAВР[2]="  *    --Все виды расходов";
     for n=3..NumВР+2 do ListAВР[n]=ListВР[n-2]+"  --"+ВидРасходов(ListВР[n-2]); od;
  fi;
  z=Alternate("Вид Расходов",ListAВР);
  if z=0: ^"";
    |z=1: CreateListБК(0);
    |z=2: ^"";
    |True: ^ListВР[z-2];
  fi;
 od;
end;

Proc btnRefresh_onClick (Obj:S);
 CreateListБК(0);
end;

func ReplaceSubstr(ss :String; badSym :String; wellSym :String) :String;
  -- Заменяет плохую подстроку на хорошую
  var num, cnt :Integer;
  var wrk, out :String;
    if (ss = '')or (badSym = '') : Return(ss); fi;
    out = '';
    cnt = 1;
    while (cnt <= Length(ss)) do
      wrk = Substr(ss, cnt, Length(ss)-(cnt-1));
      num = pos(badSym, wrk);
      if (num > 0) :
         out = out + Substr(wrk, 1, num-1) + wellSym;
      | True :
         out = out + wrk;
         Break;
      fi;
      cnt = cnt + num + Length(badSym)-1;
    end;
    Return(out);
end; -- ReplaceSubstr

Func MatchMask (Src:S; Mask:S):L;
var nw,cw:i;
var tmp:S;
 cw=WordsCount(Mask,"|");
 for nw=1..cw do
  tmp=ExtractWord(nw,Mask,"|");
  if Match(Src,tmp): ^True; fi;
 od;
 ^if(cw=0,Match(Src,Mask),False);
end;

Func ExcludeSign(MaskSign:S; ExclMask:S):S;
var Ret:S;
 if MaskSign="" or ExclMask="": ^MaskSign; fi;
 Ret=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(MaskSign,"|",ExclMask,"|");
 ^Ret;
end;

Func НаборПризнаков (СчД:S; СчК:S; ExclMask:S):S;
var MaskAcc,ret:S;
 Раб.Бюджет2005.ProgressEnable=False;
 MaskAcc=Раб.Бюджет2005.Объединить(СчД,СчК,"|");
 Ret=Раб.Бюджет2005.СписокСправ(MaskAcc,0,ExclMask);
 ^Ret;
end;

Func НаборПризнаков2 (СчД:S; СчК:S; ExclMask:S; Flag:L):S; --True -обязательные признаки False связанные
var MaskAcc,ret:S;
 Раб.Бюджет2005.ProgressEnable=False;
 MaskAcc=Раб.Бюджет2005.Объединить(СчД,СчК,"|");
 Ret=Раб.Бюджет2005.СписокСправ(MaskAcc,if(Flag,1,-1),ExclMask);
 ^Ret;
end;

Func SignToVoc (Sgn:S):S;
var p:i;
 p=Pos(".",Sgn);
 if p=0: ^Sgn; fi;
 ^SubStr(Sgn,1,p);
end;

Func TrueVoc (Set:S; P:I; Sp:S):L;
var z:s;
 if P=1: ^True; fi;
 z=SubStr(Set,p-1,1);
 if z=Sp: ^True; fi;
 ^False;
end;

Func FindVoc (Set:S; Voc:S; Sp:S):I; --Функция ищет VOC в наборе SET с разделителем, символ разделитель Sp
var LVoc,p,z:I;
 LVoc=Length(Voc); --длина справочника
 p=Pos(Voc,Set); --ищем вхождение справочника в наборе
 z=0;
 While p>0 do
  if TrueVoc(Set,p,Sp): Break; fi; --проверяем что нашли именно вхождение справочника а не составную часть
  z=z+p+LVoc-1; --запоминаем позицию "составной части"
  Set=SubStr(Set,p+LVoc,255); --вырезаем "составную часть"
  p=Pos(Voc,Set); --ищем вхождение справочника в оставшемся наборе
  if p=0: z=0; fi;
 od;
 ^z+p;
end;

Func CheckSet (Set:S;Sp:S):S; --проверяет и удаляет замыкающие и ведущие пробелы, разделитетли а также их повторы
var p:i;
var R,s0,s:S;
 R="";
 Set=Trim(Set);
 s0="";
 for p=1..Length(Set) do
  s=SubStr(Set,p,1);
  if S<>Sp: R=R+S; s0=s;
    else
     if s<>s0: R=R+S; s0=s; fi;
  fi;
 od;
 ^R;
end;

Func УдалитьПризнак (Set:S; DelSign:S):S; --Формат DelVoc =VOC.*
var Voc:S;
 Voc=SignToVoc(DelSign);
 if not Voc="": Voc=Voc+"*"; fi;
 ^Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Set," ",Voc,"|");
end;

Func ДобавитьПризнак (Set:S; NewSign:S):S;
var Voc:S;
 Voc=SignToVoc(NewSign);
 if not Voc="": Voc=Voc+"*"; fi;
 ^Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Set," ",NewSign,Voc,"");
end;

Func МухиОтКотлет (Мухи:S; Котлеты:S):S; --приводит набор Мухи к соотвествиию набору Котлеты. Котлеты=Voc1.*|Voc2.*
 ^Раб.Бюджет2005.ПривестиВСоотвНаборСлов(Мухи," ",Котлеты,"|");
end;

Func НаборПризнToMask (Set:S; Sp:S):S; --Преобразует набор с разделителями =пробелам к набору с разделителями равным sp
 ^Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Set," ",Sp);
end;

Func НаборПризнCount (Set:S; Sp:S):I; --считает число признаков в наборе разделиттель =Sp
 ^WordsCount(Set,Sp);
end;

Func ВзятьПризнакИзНабора_Номер (Set:S; Num:I; Sp:S):S;
 ^ExtractWord(Num,Set,Sp);
end;


Proc Template_Open (Create:L);
 if RunSort<>"":
    SortList(RunSort);
    RunSort="";
    Close;
 fi;
end;

Func ВзятьПризнакИзНабораПоМаске (Set:S; Mask:S; Sp:S):S; --Set: Набор --Mask: Искомая маска --Sp: Сепаратор
 ^Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Set," ",Mask,Sp);
end;

Func ПроверитьСимвол (St :S) :L;
 if St>="0" and St<="9": ^True;
   |St>="A" and St<="Z": ^True;
   |St>="a" and St<="z": ^True;
   |St>="А" and St<="Я": ^True;
   |St>="а" and St<="я": ^True;
   |St ="."  or St="_" : ^True;
 fi;
 ^False;
end;

Proc ПроверитьПризнак(St:S);
var n, Len:I;
var Char,BadChars:S;
var Flag:L;
 Len=Length(St);
 BadChars="";
 Flag=False;
 for n=1..Len do
  Char=SubStr(St,n,1);
  if ПроверитьСимвол(Char)=False:
     if Char=" ": Char="пробел";
       |Char=",": Char="запятая";
       |Char='"': Char="двойн.ковычка";
       |Char="'": Char="один.ковычка";
     fi;
     if Match(BadChars,'*"'+Char+'"*')=False: BadChars=BadChars+' "'+Char+'",'; fi;
  fi;
  if Char="." and Flag: Break; fi; --две точки
  if Char=".": Flag=True; else Flag=False; fi;
 od;
 if Flag: Message("Введенный Вами идентификатор содержит двойные точки",mtError); Exit; fi;
 if BadChars="": Exit; fi;
 BadChars=SubStr(BadChars,1,Length(BadChars)-1);
 Message("Недопустимо использовать символы: "+BadChars+" при формировании аналитического признака",mtError);
end;

Func НоваяЗапись (Crd:S; Rec:Record):L;
var OWA:I;
var R:L;
 OWA=OpenWorkArea(Crd,"","UKey="+RecordToString(Rec));
 Try
  if Records(OWA)=0: R=True; else R=False; fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^R;
end;

Func СписокВалют(Value:S):S;
var Result,v,r:s;
var n:i;
 ClearVariable(РАБ.Бюджет.Buf);
 for Currencies V="*" do
  n=n+1;
  Buf[n]=Up(V);
 od;
 n=Alternate("Виды валют",Buf,20);
 if n=0: ^Value; fi;
 r=Buf[n];
 ClearVariable(РАБ.Бюджет.Buf);
 ^r;
end;

Func УдалитьПризнакИзНабора_Диалог (Set:S; Sp:S):S;
var n,nn:i;
 if Set="": ^""; fi;
 ClearVariable(РАБ.Бюджет.Buf);
 nn=НаборПризнCount(Set,Sp)+1;
 if nn=2: ^""; fi;
 Buf[1]="Удалить все";
 for n=2..nn do
  Buf[n]=ВзятьПризнакИзНабора_Номер(Set,n-1,Sp);
 od;
 n=Alternate("Удаление признака",Buf,25);
 if n=0: ^Set; fi;
 if n=1: ^""; fi;
 Set=УдалитьПризнак(Set,Buf[n]);
 ^Set;
end;

Func Check_Sign(Sgn:S; Mask:S):S;
 ^Раб.Бюджет2005.ПроверитьНаборСлов2(Sgn," ",Mask,"|","");
end;

Proc ПроверитьПризнакиНачать;
 ExclAdd="";
end;

Func ПроверитьПризнакиОбязательные (Acc1:S; Acc2:S; Sgn:S; Excl:S):L; 
-- Acc1 счет дебета, Acc2 счет кредита, Sgn проверяемый набор признаков, Excl  маска исключаемых из проверки признаков
var MaskAcc,Mask,tmp1,tmp2,sКБК,sКОСГУ,ВД_:S;
var w,ww,z:i;
 ClearVariable(Раб.Бюджет.Buf);
 ClearVariable(Раб.Бюджет.Buf1);
 ClearVariable(Раб.Бюджет.Buf2);
 sКБК=""; sКОСГУ="";
 ww=WordsCount(Sgn," ");
 for w=1..ww do --вначале проверяем признаки на предмет допустимости и одновременно разносим по ролям
  tmp1=ExtractWord(w,Sgn," ");
  if not Раб.Бюджет2005.MatchMask(tmp1,Excl) then
     if Name_A(tmp1)=" ": Message("Неизвестный аналитический признак '"+tmp1+"'",mtError); ^False; fi;
     tmp2=VocRole(GetAnaGlossary(tmp1));
     z=SearchInArray(Раб.Бюджет.Buf,tmp2,True);
     if z=-1:
        z=InsertInArraySort(Раб.Бюджет.Buf,tmp2);
        InsertInArray(Раб.Бюджет.Buf1,z,tmp1);
        InsertInArray(Раб.Бюджет.Buf2,z,"");
       else
        Buf1[z]=Раб.Бюджет2005.Объединить(Buf1[z],tmp1," ");
     fi;
     if sКБК="" and Раб.Бюджет2005.MatchMask(tmp1,"ФКР.*|КД.*|КИФД.*"):
        sКБК=tmp1;
     fi;
     if sКОСГУ="" and Раб.Бюджет2005.MatchMask(tmp1,"КОСГУ.*"):
        sКОСГУ=tmp1;
     fi;
  fi;
 od;
 Раб.Бюджет2005.ProgressEnable=False;
 MaskAcc=Раб.Бюджет2005.Объединить(Acc1,Acc2,"|");
 if MaskAcc="": ^True; fi;
 ВД_=Раб.Бюджет2005.ВзятьКодСчета(Acc1,"","ВД",False);
 if ВД_="": ВД_=Раб.Бюджет2005.ВзятьКодСчета(Acc2,"","ВД",False); fi;
 Mask=Раб.Бюджет2005.СписокСправ(MaskAcc,1,Excl);
 --Разносим справочники по ролям
 ww=WordsCount(Mask,"|");
 for w=1..ww do
  tmp1=ExtractWord(w,Mask,"|");
  tmp2=VocRole(SubStr(tmp1,1,Pos(".",tmp1)-1));
  z=SearchInArray(Раб.Бюджет.Buf,tmp2,True);
  if z=-1:
     z=InsertInArraySort(Раб.Бюджет.Buf,tmp2);
     InsertInArray(Раб.Бюджет.Buf1,z,"");
     InsertInArray(Раб.Бюджет.Buf2,z,tmp1);
    else
     Buf2[z]=Раб.Бюджет2005.Объединить(Buf2[z],tmp1,"|");
  fi;
 od;
 --
 ww=LengthOfArray(Buf);
 for w=1..ww do
  if not Buf[w]="":
     z=WordsCount(Buf1[w]," ");
     if z=0: Message("В веденной аналитике, для счетов "+Acc1+"/"+Acc2+", отсутствует один из обязательных справочников роли "+Buf[w]+" ("+Buf2[w]+")",mtError); ^False; fi;
     if z>1: Message("В наборе аналитических признаков введен второй признак роли "+Buf[w]+" ("+ExtractWord(2,Buf1[w]," ")+")",mtError); ^False; fi;
    else
     if not Раб.Бюджет2005.ПроверитьНаборСлов(Buf1[w]," ",Buf2[w],"|","В веденной аналитике, для счетов "+Acc1+"/"+Acc2+", отсутствует обязательный справочник "): ^False; fi;
  fi;
 od;
 --
 if not sКБК="" and not sКОСГУ="":
    if Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаРасхКОСГУ):
       if not Match(sКБК,"ФКР.*"): Message("Для "+sКОСГУ+" требуется указыть признак из справочника 'ФКР (классификация расходов)', а не "+sКБК,mtError); ^False; fi;
      |Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДоходКОСГУ):
       if not Match(sКБК,"КД.*"): Message("Для "+sКОСГУ+" требуется указыть признак из справочника 'КД (классификация доходов)', а не "+sКБК,mtError); ^False; fi;
      |Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДефицитКОСГУ):
       if not Match(sКБК,"КИФД.*"): Message("Для "+sКОСГУ+" требуется указыть признак из справочника 'КИФД (классификация дефицитов)', а не "+sКБК,mtError); ^False; fi;
      |Match(sКБК,"ФКР.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаРасхКОСГУ+if(ВД_="3","|КОСГУ.000!","")): Message("Для "+sКБК+" (классификация расходов) требуется указыть признак из справочника 'КОСГУ' ("+if(ВД_="3","000,","")+"211,212,213,221,222,223,224,225,226,231,232,241,242,251,252,253,261,262,263,290,310,320,330,340,530), а не "+sКОСГУ,mtError); ^False; fi;
      |Match(sКБК,"КД.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДоходКОСГУ+if(ВД_="3","|КОСГУ.000!","")): Message("Для "+sКБК+" (классификация доходов) требуется указыть признак из справочника 'КОСГУ' ("+if(ВД_="3","000,","")+"110,120,130,140,151,152,153,160,171,172,180,410,420,430), а не "+sКОСГУ,mtError); ^False; fi;
      |Match(sКБК,"КИФД.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДефицитКОСГУ+if(ВД_="3","|КОСГУ.000!","")): Message("Для "+sКБК+" (классификация дефицитов) требуется указыть признак из справочника 'КОСГУ' ("+if(ВД_="3","000,","")+"171,310,410,510,520,540,550,610,620,630,650,710,720,810,820), а не "+sКОСГУ,mtError); ^False; fi;
    fi;
 fi;
 ^True;
end;

Func ПроверитьПризнакиСвязанные (Acc1:S; Acc2:S; Sgn:S; Excl:S):L;
-- Acc1 счет дебета, Acc2 счет кредита, Sgn проверяемый набор признаков, Excl  маска исключаемых из проверки признаков
var MaskAcc,Mask,tmp1,tmp2,sКБК,sКОСГУ,ВД_:S;
var w,ww,z:i;
 ClearVariable(Раб.Бюджет.Buf);
 ClearVariable(Раб.Бюджет.Buf1);
 ClearVariable(Раб.Бюджет.Buf2);
 sКБК=""; sКОСГУ="";
 ww=WordsCount(Sgn," ");
 for w=1..ww do --вначале проверяем признаки на предмет допустимости и одновременно разносим по ролям
  tmp1=ExtractWord(w,Sgn," ");
  if not Раб.Бюджет2005.MatchMask(tmp1,Excl) then
     if Name_A(tmp1)=" ": Message("Неизвестный аналитический признак '"+tmp1+"'",mtError); ^False; fi;
     tmp2=VocRole(GetAnaGlossary(tmp1));
     z=SearchInArray(Раб.Бюджет.Buf,tmp2,True);
     if z=-1:
        z=InsertInArraySort(Раб.Бюджет.Buf,tmp2);
        InsertInArray(Раб.Бюджет.Buf1,z,tmp1);
        InsertInArray(Раб.Бюджет.Buf2,z,"");
       else
        Buf1[z]=Раб.Бюджет2005.Объединить(Buf1[z],tmp1," ");
     fi;
     if sКБК="" and Раб.Бюджет2005.MatchMask(tmp1,"ФКР.*|КД.*|КИФД.*"):
        sКБК=tmp1;
     fi;
     if sКОСГУ="" and Раб.Бюджет2005.MatchMask(tmp1,"КОСГУ.*"):
        sКОСГУ=tmp1;
     fi;
  fi;
 od;
 if Pos(Excl,ExclAdd)=0 and not Excl="":
    ExclAdd=ExclAdd+"|"+Excl;
    if Pos("|",ExclAdd)=1: ExclAdd=SubStr(ExclAdd,2,255); fi;
 fi;
 Раб.Бюджет2005.ProgressEnable=False;
 MaskAcc=Раб.Бюджет2005.Объединить(Acc1,Acc2,"|");
 if MaskAcc="": ^True; fi;
 ВД_=Раб.Бюджет2005.ВзятьКодСчета(Acc1,"","ВД",False);
 if ВД_="": ВД_=Раб.Бюджет2005.ВзятьКодСчета(Acc2,"","ВД",False); fi;
 Mask=Раб.Бюджет2005.СписокСправ(MaskAcc,-1,ExclAdd);
 --Разносим справочники по ролям
 ww=WordsCount(Mask,"|");
 for w=1..ww do
  tmp1=ExtractWord(w,Mask,"|");
  tmp2=VocRole(SubStr(tmp1,1,Pos(".",tmp1)-1));
  z=SearchInArray(Раб.Бюджет.Buf,tmp2,True);
  if z=-1:
     z=InsertInArraySort(Раб.Бюджет.Buf,tmp2);
     InsertInArray(Раб.Бюджет.Buf1,z,"");
     InsertInArray(Раб.Бюджет.Buf2,z,tmp1);
    else
     Buf2[z]=Раб.Бюджет2005.Объединить(Buf2[z],tmp1,"|");
  fi;
 od;
 --
 ww=LengthOfArray(Buf);
 for w=1..ww do
  if not Buf[w]="":
     z=WordsCount(Buf1[w]," ");
     if z=0: 
        if EnqOkCancel("В веденной аналитике, для счетов "+Acc1+"/"+Acc2+", отсутствует один из необязательных справочников "+Buf2[w]+" роли "+Buf[w],mtWarning)=cmCancel: ^False; fi;
        ExclAdd=Раб.Бюджет2005.Объединить(ExclAdd,Buf2[w],"|");
        ^True;
     fi;
     if z>1: Message("В наборе аналитических признаков введен второй признак роли "+Buf[w]+" ("+ExtractWord(2,Buf1[w]," ")+")",mtError); ^False; fi;
    else
     tmp2=Раб.Бюджет2005.ПроверитьНаборСлов2(Buf1[w]," ",Buf2[w],"|","");
     While not tmp2="" do
      if EnqOkCancel("В веденной аналитике, для счетов "+Acc1+"/"+Acc2+" ,отсутствует необязательный справочник '"+tmp2+"' Пропустить?",mtWarning)=cmCancel: ^False; fi;
      ExclAdd=Раб.Бюджет2005.Объединить(ExclAdd,tmp2,"|");
      Buf2[w]=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Buf2[w],"|",tmp2,"|");
      tmp2=Раб.Бюджет2005.ПроверитьНаборСлов2(Buf1[w]," ",Buf2[w],"|","");
     od;
  fi;
 od;
 --
 if not sКБК="" and not sКОСГУ="":
    if Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаРасхКОСГУ):
       if not Match(sКБК,"ФКР.*"): Message("Для "+sКОСГУ+" требуется указыть признак из справочника 'ФКР (классификация расходов)', а не "+sКБК,mtError); ^False; fi;
      |Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДоходКОСГУ):
       if not Match(sКБК,"КД.*"): Message("Для "+sКОСГУ+" требуется указыть признак из справочника 'КД (классификация доходов)', а не "+sКБК,mtError); ^False; fi;
      |Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДефицитКОСГУ):
       if not Match(sКБК,"КИФД.*"): Message("Для "+sКОСГУ+" требуется указыть признак из справочника 'КИФД (классификация дефицитов)', а не "+sКБК,mtError); ^False; fi;
      |Match(sКБК,"ФКР.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаРасхКОСГУ+if(ВД_="3","|КОСГУ.000!","")): Message("Для "+sКБК+" (классификация расходов) требуется указыть признак из справочника 'КОСГУ' ("+if(ВД_="3","000,","")+"211,212,213,221,222,223,224,225,226,231,232,241,242,251,252,253,261,262,263,290,310,320,330,340,530), а не "+sКОСГУ,mtError); ^False; fi;
      |Match(sКБК,"КД.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДоходКОСГУ+if(ВД_="3","|КОСГУ.000!","")): Message("Для "+sКБК+" (классификация доходов) требуется указыть признак из справочника 'КОСГУ' ("+if(ВД_="3","000,","")+"110,120,130,140,151,152,153,160,171,172,180,410,420,430,440), а не "+sКОСГУ,mtError); ^False; fi;
      |Match(sКБК,"КИФД.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДефицитКОСГУ+if(ВД_="3","|КОСГУ.000!","")): Message("Для "+sКБК+" (классификация дефицитов) требуется указыть признак из справочника 'КОСГУ' ("+if(ВД_="3","000,","")+"171,310,410,510,520,540,550,610,620,630,650,710,720,810,820), а не "+sКОСГУ,mtError); ^False; fi;
    fi;
 fi;
 ^True;
end;

Func ПроверитьПризнаки (Acc1:S; Acc2:S; Sgn:S; Excl:S):L; --сообщений не выводит, проверяет как обазательные так и связнные признаки
-- Acc1 счет дебета, Acc2 счет кредита, Sgn проверяемый набор признаков, Excl  маска исключаемых из проверки признаков
var MaskAcc,Mask,tmp1,tmp2,sКБК,sКОСГУ,ВД_:S;
var w,ww,z:i;
 ClearVariable(Раб.Бюджет.Buf);
 ClearVariable(Раб.Бюджет.Buf1);
 ClearVariable(Раб.Бюджет.Buf2);
 ww=WordsCount(Sgn," ");
 for w=1..ww do --вначале проверяем признаки на предмет допустимости и одновременно разносим по ролям
  tmp1=ExtractWord(w,Sgn," ");
  if not Раб.Бюджет2005.MatchMask(tmp1,Excl) then
     if Name_A(tmp1)=" ": ^False; fi;
     tmp2=VocRole(GetAnaGlossary(tmp1));
     z=SearchInArray(Раб.Бюджет.Buf,tmp2,True);
     if z=-1:
        z=InsertInArraySort(Раб.Бюджет.Buf,tmp2);
        InsertInArray(Раб.Бюджет.Buf1,z,tmp1);
        InsertInArray(Раб.Бюджет.Buf2,z,"");
       else
        Buf1[z]=Раб.Бюджет2005.Объединить(Buf1[z],tmp1," ");
     fi;
     if sКБК="" and Раб.Бюджет2005.MatchMask(tmp1,"ФКР.*|КД.*|КИФД.*"):
        sКБК=tmp1;
     fi;
     if sКОСГУ="" and Раб.Бюджет2005.MatchMask(tmp1,"КОСГУ.*"):
        sКОСГУ=tmp1;
     fi;
  fi;
 od;
 Раб.Бюджет2005.ProgressEnable=False;
 MaskAcc=Раб.Бюджет2005.Объединить(Acc1,Acc2,"|");
 if MaskAcc="": ^True; fi;
 ВД_=Раб.Бюджет2005.ВзятьКодСчета(Acc1,"","ВД",False);
 if ВД_="": ВД_=Раб.Бюджет2005.ВзятьКодСчета(Acc2,"","ВД",False); fi;
 Mask=Раб.Бюджет2005.СписокСправ(MaskAcc,0,Excl);
 --Разносим справочники по ролям
 ww=WordsCount(Mask,"|");
 for w=1..ww do
  tmp1=ExtractWord(w,Mask,"|");
  tmp2=VocRole(SubStr(tmp1,1,Pos(".",tmp1)-1));
  z=SearchInArray(Раб.Бюджет.Buf,tmp2,True);
  if z=-1:
     z=InsertInArraySort(Раб.Бюджет.Buf,tmp2);
     InsertInArray(Раб.Бюджет.Buf1,z,"");
     InsertInArray(Раб.Бюджет.Buf2,z,tmp1);
    else
     Buf2[z]=Раб.Бюджет2005.Объединить(Buf2[z],tmp1,"|");
  fi;
 od;
 --
 ww=LengthOfArray(Buf);
 for w=1..ww do
  if not Buf[w]="":
     z=WordsCount(Buf1[w]," ");
     if not z=1:  ^False; fi;
    else
     if not Раб.Бюджет2005.ПроверитьНаборСлов(Buf1[w]," ",Buf2[w],"|",""): ^False; fi;
  fi;
 od;
 --
 if not sКБК="" and not sКОСГУ="":
    if Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаРасхКОСГУ):
       if not Match(sКБК,"ФКР.*"): ^False; fi;
      |Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДоходКОСГУ):
       if not Match(sКБК,"КД.*"): ^False; fi;
      |Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДефицитКОСГУ):
       if not Match(sКБК,"КИФД.*"): ^False; fi;
      |Match(sКБК,"ФКР.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаРасхКОСГУ+if(ВД_="3","|КОСГУ.000!","")): ^False; fi;
      |Match(sКБК,"КД.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДоходКОСГУ+if(ВД_="3","|КОСГУ.000!","")): ^False; fi;
      |Match(sКБК,"КИФД.*"):
       if not Раб.Бюджет2005.MatchMask(sКОСГУ,Раб.Бюджет2005.МаскаДефицитКОСГУ+if(ВД_="3","|КОСГУ.000!","")): ^False; fi;
    fi;
 fi;
 ^True;
end;

Func ВзятьСчетИзМаски (Mask:S; Flag:L; ДН:D; ДК:D):S; --Flag=True  Счет Flag=False Кор. Счет
var Rep:Report;
var p1,p2,p:i;
var R:s;
 R="";
 p1=Pos("'",Mask);
 p2=Pos("{",Mask);
 p=Min(p1,p2);
 if p=1: Mask="";
   |p>1: Mask=SubStr(Mask,1,p-1);
 fi;
 if Flag:
     Rep=RepOpen('"'+PlanVar("Std_Rpo")+'\Shared\Rep\Служебные отчеты.lst"."005"',Mask,"",ДН,ДК);
   else
     Rep=RepOpen('"'+PlanVar("Std_Rpo")+'\Shared\Rep\Служебные отчеты.lst"."006"',Mask,"",ДН,ДК);
 fi;
 Try
  While RepNext(Rep) do
   R=R+"|"+RepIdent(Rep);
  od;
 Finally
  Rep=RepClose(Rep);
 end;
 R=SubStr(R,2,255);
 ^R;
end;


Конец
