-- Шаблон создан мастером бланков
-- 18.11.2004 13:25:39
--
БланкСШаблоном[23.12.2009] "Служебный бланк";

var МаскаРасхКОСГУ :S="КОСГУ.21?!|КОСГУ.22?!|КОСГУ.23?!|КОСГУ.24?!|КОСГУ.25?!|КОСГУ.26?!|КОСГУ.29?!|КОСГУ.3??!|КОСГУ.53?!";
var МаскаДоходКОСГУ:S="КОСГУ.1??!|КОСГУ.4??!";
var МаскаДефицитКОСГУ:S="КОСГУ.171!|КОСГУ.31?!|КОСГУ.41?!|КОСГУ.51?!|КОСГУ.52?!|КОСГУ.54?!|КОСГУ.55?!|КОСГУ.61?!|КОСГУ.62?!|КОСГУ.63?!|КОСГУ.64?!|КОСГУ.65?!|КОСГУ.71?!|КОСГУ.72?!|КОСГУ.81?!|КОСГУ.82?!";
var МаскаРасхСч :S="*.21?|*.22?|*.23?|*.24?|*.25?|*.26?|*.29?|*.3??|*.53?";
var МаскаДоходСч:S="*.1??|*.4??";
var МаскаДефицитСч:S="*.171|*.31?|*.41?|*.51?|*.52?|*.54?|*.55?|*.61?|*.62?|*.63?|*.64?|*.65?|*.71?|*.72?|*.81?|*.82?";

РежимМаски:S;

var МаскаФКР  :String=if(РежимМаски="*","*.*.*.*","???.????.???????.???");
var МаскаКД   :String=if(РежимМаски="*","*.*.*.*.*.*","???.?.??.?????.??.????");
var МаскаКИВФ :String=if(РежимМаски="*","*.*.*.*.*.*.*","???.??.??.??.??.??.????");
var МаскаКИФД :String=if(РежимМаски="*","*.*.*.*.*.*.*","???.??.??.??.??.??.????");
--Маски тестовые, пока дорабатываем...
var МаскаКР2016  :String=if(РежимМаски="*","*.*.*","????.??????????.???");
var МаскаКД2016   :String=if(РежимМаски="*","*.*.*.*.*.*","?.??.?????.??.????.???");
var МаскаКИФД2016 :String=if(РежимМаски="*","*.*.*.*","??.??.??????.???????");

var МаскаВД   :String=if(РежимМаски="*","*","?");
var МаскаИст  :String=if(РежимМаски="*","*","?");
var МаскаСинт :String=if(РежимМаски="*","*","???");
var МаскаАн   :String=if(РежимМаски="*","*","??");
var МаскаКОСГУ:String=if(РежимМаски="*","*","???");
var МаскаСч5  :String=if(РежимМаски="*","*.*","???.??");
var МаскаСч8  :String=if(РежимМаски="*","*.*.*","???.??.???");
var МаскаСч6  :String=if(РежимМаски="*","*.*.*","?.???.??");
var МаскаСч9  :String=if(РежимМаски="*","*.*.*.*","?.???.??.???");
var МаскаСчетаФКР :String=МаскаФКР +"."+МаскаСч6+"."+МаскаКОСГУ;
var МаскаСчетаКД  :String=МаскаКД  +"."+МаскаСч6+"."+МаскаКОСГУ;
var МаскаСчетаКИВФ:String=МаскаКИВФ+"."+МаскаСч6+"."+МаскаКОСГУ;
var МаскаСчетаКИФД:String=МаскаКИФД+"."+МаскаСч6+"."+МаскаКОСГУ;

var МаскаСчетаКР2016  :String=МаскаКР2016   +"."+МаскаСч6+"."+МаскаКОСГУ;
var МаскаСчетаКД2016  :String=МаскаКД2016   +"."+МаскаСч6+"."+МаскаКОСГУ;
var МаскаСчетаКИФД2016:String=МаскаКИФД2016 +"."+МаскаСч6+"."+МаскаКОСГУ;

var Buf []:S;
var Buf2[]:S;
var BufI[]:I;
var Dir[]:S;

var BufСправ[]:S;
var BufСч[]:S;

var ProgressEnable:L;

var HideEditor:L;

var BufS[]:S;
var BufW[]:S;

Func ТипКБКСчета(Value:S):S;
 РежимМаски="?";
 if Match(Value,МаскаФКР+"!"): ^"ФКР";
   |Match(Value,МаскаКД+"!"): ^"КД";
   |Match(Value,МаскаКИВФ+"!"): ^"КИФД";
 fi;
 ^"";
end;

Func ПолучитьМаскуСчета (Value0:S; Value1:S; Value2:S; Value3:S; Value4:S; Value5:S; Value6:S):S; --Возращает маску счета по заданным логическим группам
var R:S;
--Value0 Тип классификации "ВКР","КД","КИД";
--Value1 Бюджетная классификация
--Value2 Источник финансирования
--Value3 Синтетика
--Value4 Аналитика
--Value5 Классификация сектора гос. управления
--Value6 Режим формирования маски "*" или "?", "?" более строгий формат, если задана пустота то возращаеться значение счета если заполнены все значения иначе пустота
 if Value0="ВКР": Value0="ФКР";
   |Value0="КИД": Value0="КИВФ";
 fi;
 РежимМаски=Value6;
 if Value0="": ^""; fi;
 if Value1<>"" and Match(Value1,МаскаФКР)=False and Match(Value1,МаскаКД)=False and Match(Value1,МаскаКИВФ)=False: ^""; fi;
 if Value2<>"" and Match(Value2,МаскаИст)=False: ^""; fi;
 if Value3<>"" and Match(Value3,МаскаСинт)=False: ^""; fi;
 if Value4<>"" and Match(Value4,МаскаАн)=False: ^""; fi;
 if Value5<>"" and Match(Value5,МаскаКОСГУ)=False: ^""; fi;
 if Value6="":
    if Value1<>"" and Value2<>"" and Value3<>"" and Value4<>"" and Value5<>"":  R=Value1+"."+Value2+"."+Value3+"."+Value4+"."+Value5; else R=""; fi;
    ^R;
 fi;
 if Value1="":
    if Value0="ФКР":R=МаскаФКР;|Value0="КД":R=МаскаКД;|Value0="КИВФ":R=МаскаКИВФ; fi;
   else
    R=Value1;
 fi;
 if Value2="": R=R+"."+МаскаИст;  else R=R+"."+Value2; fi;
 if Value3="": R=R+"."+МаскаСинт;  else R=R+"."+Value3; fi;
 if Value4="": R=R+"."+МаскаАн;  else R=R+"."+Value4; fi;
 if Value5="": R=R+"."+МаскаКОСГУ;  else R=R+"."+Value5; fi;
 ^R;
end;

Func ЕстьСчетПоМаске (Value1:S):L; --Проверяеть есть ли счета попадающие под маску Value1
var Acc:S;
 Try
  for Account Acc=Value1 do
   ^True;
  od;
 Except
 end;
 ^False;
end;

Func ОбъединитьУсловияКонтроль256 (str1:S; str2:S; sum:S; msgerror256:l; ДобавитьСкобки:l):S;-- при возврате 1 пробела переполнение 256 символов

 var ln1,ln2:i;
  str1=trim(str1);ln1=длина(str1);if ln1>0:str1='('+str1+')';fi;
  str2=trim(str2);ln2=длина(str2);if ln2>0:str2='('+str2+')';fi;
  if ДобавитьСкобки:
     if ln1>0:str1='('+str1+')';fi;
     if ln2>0:str2='('+str2+')';fi;
  fi;
  if ln1=0 or ln2=0:^str1+str2;
   | длина(sum)+ln1+ln2>255:
      if msgerror256:Message('Ошибка!^MРезультат превышает максимальную^Mдлину строки в 256 символов^M'+str1+'^M'+sum+'^M'+str2,mterror);fi;
      ^' ';
  fi;
  ^str1+sum+str2;
end;

Func ЗаменаПодстроки(ст:s;что:s;начто:s):s; --замена в 1 проход
  ^Раб.Формат.ReplaceSubstr(ст,что,начто);
end;

Func ЗаменаПодстрокиВсе(ст:s;что:s;начто:s):s; --замена в n проходов (пока есть что заменять)
  var ss:s;
 ss=ЗаменаПодстроки(ст,что,начто);
 while ст<>ss  do ст=ss;ss=ЗаменаПодстроки(ст,что,начто);od;
 ^ss;
end;

Func СоотвСчетаМаске
 (
 значсч:s;-- ограничение! значсч должно являтся полным значением а не маской!
 маск:s;
 ПроверкаНаРеальность_значсч_маск:l
 ):Л;
var сч:s;
if ПроверкаНаРеальность_значсч_маск:
   if маск='':^false;fi;
   if not ПравильныйПризнак(значсч):^false;fi;
fi;
if Length(значсч)+Length(маск)+4<255:маск=значсч+'&('+маск+')';fi;
-- Проверяет соответствие счета маске, где маска - условие для отбора счетов
 for счета сч=маск do
  if значсч=сч:^true;fi;
 od;
 ^false;
end;
Func ЕстьСчетаПоМаскам(Маска1:s;Маска2:s):l;
var tmp_s,acc:s;
var t,z,maxln:i;
  tmp_s=ОбъединитьУсловияКонтроль256(Маска1,Маска2,'&',false,true);
  if tmp_s<>' ':^ЕстьСчетПоМаске(tmp_s);fi;
  -- обработка превышения 256 символов по сумме масок
  if Маска2<Маска1:tmp_s=Маска1;Маска1=Маска2;Маска2=tmp_s;fi;--Маска1 стала минимальной по длине
  ClearVariable(РАБ.Бюджет2005.buf);t=0;maxln=0;
  for Account Acc=Маска2 ,sort do -- разбиваем самое длинное условие по счетам
   t=t+1;
   РАБ.Бюджет2005.buf[t]=Acc;
   maxln=max(maxln,Length(acc));
  od;
  z=LengthOfArray(РАБ.Бюджет2005.buf);
  if Length(Маска1)+maxln+3<256:
     for t=1..z do
       if СоотвСчетаМаске(РАБ.Бюджет2005.buf[t],Маска1,false):^true;
       fi;
     od;
   | true:
     tmp_s=РАБ.Бюджет2005.buf[z]; -- максимальный счет по Маска2
     for Account Acc=Маска2 ,sort do -- сравнение по счетам
      if searchinarray(РАБ.Бюджет2005.buf,acc,true)>0: ^true; fi;
      if acc>tmp_s: ^false; fi;
     od;
  fi;
  ^false;

end;


Func ВзятьКодСчета (Source:S; Mode:S; Value:S; Flag:L):S;
var b,l:i;
var R:S;
 --Mode Тип КБК "ВКР","КД","КИД"
 --Source Счета
 --Value (Mode=ВКР) Какой код берем= ППП,РП,ЦС,ВР,КБК,ИСТ,СИНТ,АН,КСГУ
 --Value (Mode=КД) Какой код берем= ППП,ГР,ПГР,СТ,ЭЛ,ПРГ,ИСТ,СИНТ,АН,КСГУ
 --Value (Mode=КИД) Какой код берем= ППП,ГР,ПГР,СТ,ПСТ,ЭЛ,ПРГ,ИСТ,СИНТ,АН,КСГУ
 --Flag брать с начала или только код
 if Source="": ^""; fi;
 if Mode="": Mode=ТипКБКСчета(Source); fi;
 if Mode="": ^""; fi;
 if Mode="ФКР" or Mode="ВКР" or Mode="КР":
    if Value="ППП"    : b=1; l=3;
      |Value="РП"     : if Flag: b=1; l=8;  else b=5;  l=4; fi;  --                        С      К
      |Value="ЦС"     : if Flag: b=1; l=16; else b=10; l=7; fi;  -- П                    И И      С
      |Value="ВР"     : if Flag: b=1; l=20; else b=18; l=3; fi;  -- П   Р    Ц       В   С Н   А  Г
      |Value="КБК"    : b=1; l=20;                               -- П   П    С       Р   Т Т   Н  У
      |Value="БК"     : b=1; l=20;                               -- ???.????.???????.???.?.???.??.???
      |Value="ВД"     : if Flag: b=1; l=22; else b=22; l=1; fi;  -- 123456789012345678901234567890123
      |Value="ИСТ"    : if Flag: b=1; l=22; else b=22; l=1; fi;
      |Value="СИНТ"   : if Flag: b=1; l=26; else b=24; l=3; fi;
      |Value="АН"     : if Flag: b=1; l=29; else b=28; l=2; fi;
      |Value="КОСГУ"  : if Flag: b=1; l=33; else b=31; l=3; fi;
      |Value="КСГУ"   : if Flag: b=1; l=33; else b=31; l=3; fi;
      |Value="СЧ9"    : b=22; l=12;                              --ВД+Синт+Ан+Косгу
      |Value="СЧ8"    : b=24; l=10;                              --Синт+Ан+Косгу
      |Value="СЧ6"    : b=22; l=8;                               --ВД+Синт+Ан
      |Value="СЧ5"    : b=24; l=6;                               --Синт+Ан
      |Value="СЧ4"    : b=22; l=5;                               --ВД+Синт
      |Value="СЧ_ВД"  : b=22; l=1;
      |Value="СЧ_ИСТ" : b=22; l=1;
      |Value="СЧ_СИНТ": if Flag: b=22; l=5; else b=24; l=3; fi;
      |Value="СЧ_АН"  : if Flag: b=22; l=8; else b=28; l=2; fi;
      |True: ^"";
    fi;
   |Mode="КД":
    if Value="ППП"    : b=1; l=3;
      |Value="ГР"     : if Flag: b=1; l=5;  else b=5;  l=1; fi;  --                          С      К
      |Value="ПГР"    : if Flag: b=1; l=8;  else b=7;  l=2; fi;  -- П     П           П    И И      С
      |Value="СТ"     : if Flag: b=1; l=14; else b=10; l=5; fi;  -- П   Г Г  С     Э  Р    С Н   А  Г
      |Value="ЭЛ"     : if Flag: b=1; l=17; else b=16; l=2; fi;  -- П   Р Р  Т     Л  Г    Т Т   Н  У
      |Value="ПРГ"    : if Flag: b=1; l=22; else b=19; l=4; fi;  -- ???.?.??.?????.??.????.?.???.??.???
      |Value="КБК"    : b=1; l=22;                               -- 12345678901234567890123456789012345
      |Value="БК"     : b=1; l=22;
      |Value="ВД"     : if Flag: b=1; l=24; else b=24; l=1; fi;
      |Value="ИСТ"    : if Flag: b=1; l=24; else b=24; l=1; fi;
      |Value="СИНТ"   : if Flag: b=1; l=28; else b=26; l=3; fi;
      |Value="АН"     : if Flag: b=1; l=31; else b=30; l=2; fi;
      |Value="КОСГУ"  : if Flag: b=1; l=35; else b=33; l=3; fi;
      |Value="КСГУ"   : if Flag: b=1; l=35; else b=33; l=3; fi;
      |Value="СЧ9"    : b=24; l=12;                              --ВД+Синт+Ан+Косгу
      |Value="СЧ8"    : b=26; l=10;                              --Синт+Ан+Косгу
      |Value="СЧ6"    : b=24; l=8;                               --ВД+Синт+Ан
      |Value="СЧ5"    : b=26; l=6;                               --Синт+Ан
      |Value="СЧ4"    : b=24; l=5;                               --ВД+Синт
      |Value="СЧ_ВД"  : b=24; l=1;
      |Value="СЧ_ИСТ" : b=24; l=1;
      |Value="СЧ_СИНТ": if Flag: b=24; l=5; else b=26; l=3; fi;
      |Value="СЧ_АН"  : if Flag: b=24; l=8; else b=30; l=2; fi;
      |True: ^"";
    fi;
   |Mode="КИФД" or Mode="КИВФ" or Mode="КИД":
    if Value="ППП"    : b=1; l=3;
      |Value="ГР"     : if Flag: b=1; l=6;  else b=5;  l=2; fi;  --                           С      К
      |Value="ПГР"    : if Flag: b=1; l=9;  else b=8;  l=2; fi;  -- П      П     П     П    И И      С
      |Value="СТ"     : if Flag: b=1; l=12; else b=11; l=2; fi;  -- П   Г  Г  С  С  Э  Р    С Н   А  Г
      |Value="ПСТ"    : if Flag: b=1; l=15; else b=14; l=2; fi;  -- П   Р  Р  Т  Т  Л  Г    Т Т   Н  У
      |Value="ЭЛ"     : if Flag: b=1; l=18; else b=17; l=2; fi;  -- ???.??.??.??.??.??.????.?.???.??.???
      |Value="ПРГ"    : if Flag: b=1; l=23; else b=20; l=4; fi;  -- 123456789012345678901234567890123456
      |Value="КБК"    : b=1; l=23;
      |Value="БК"     : b=1; l=23;
      |Value="ВД"     : if Flag: b=1; l=25; else b=25; l=1; fi;
      |Value="ИСТ"    : if Flag: b=1; l=25; else b=25; l=1; fi;
      |Value="СИНТ"   : if Flag: b=1; l=29; else b=27; l=3; fi;
      |Value="АН"     : if Flag: b=1; l=32; else b=31; l=2; fi;
      |Value="КОСГУ"  : if Flag: b=1; l=36; else b=34; l=3; fi;
      |Value="КСГУ"   : if Flag: b=1; l=36; else b=34; l=3; fi;
      |Value="СЧ9"    : b=25; l=12;                              --ВД+Синт+Ан+Косгу
      |Value="СЧ8"    : b=27; l=10;                              --Синт+Ан+Косгу
      |Value="СЧ6"    : b=25; l=8;                               --ВД+Синт+Ан
      |Value="СЧ5"    : b=27; l=6;                               --Синт+Ан
      |Value="СЧ4"    : b=25; l=5;                               --ВД+Синт
      |Value="СЧ_ВД"  : b=25; l=1;
      |Value="СЧ_ИСТ" : b=25; l=1;
      |Value="СЧ_СИНТ": if Flag: b=25; l=5; else b=27; l=3; fi;
      |Value="СЧ_АН"  : if Flag: b=25; l=8; else b=31; l=2; fi;
      |True: ^"";
    fi;
 fi;
 R=SubStr(Source,b,l);
 ^R;
end;

Func ВзятьКодКБК (Source:S; Mode:S; Value:S; Flag:L):S;
var b,l:i;
var R:S;
 --Mode Тип КБК "ВКР","КД","КИД"
 --Source КБК+"."+КСГУ
 --Value (Mode=ВКР) Какой код берем= ППП,РП,ЦС,ВР,КСГУ
 --Value (Mode=КД) Какой код берем= ППП,ГР,ПГР,СТ,ЭЛ,ПРГ,КСГУ
 --Value (Mode=КИД) Какой код берем= ППП,ГР,ПГР,СТ,ПСТ,ЭЛ,ПРГ,КСГУ
 --Flag брать с начала или только код
 if Mode="": Mode=ТипКБКСчета(Source); fi;
 if Source="" or Mode="": ^""; fi;
 if Mode="ФКР" or Mode="ВКР" or Mode="КР":
    if Value="ППП"  : b=1; l=3;                                  -- П                    С
      |Value="РП"   : if Flag: b=1; l=8;  else b=5;  l=4; fi;    -- П   Р    Ц       В   Г
      |Value="ЦС"   : if Flag: b=1; l=16; else b=10; l=7; fi;    -- П   П    С       Р   У
      |Value="ВР"   : if Flag: b=1; l=20; else b=18; l=3; fi;    -- ???.????.???????.???.???
      |Value="КБК"  : b=1; l=20;                                 -- 123456789012345678901234
      |Value="БК"   : b=1; l=20;
      |Value="КОСГУ": if Flag: b=1; l=24; else b=22; l=3; fi;
      |Value="КСГУ" : if Flag: b=1; l=24; else b=22; l=3; fi;
      |True: ^"";
    fi;
   |Mode="КД":
    if Value="ППП"  : b=1; l=3;
      |Value="ГР"   : if Flag: b=1; l=5;  else b=5;  l=1; fi;  --                        К
      |Value="ПГР"  : if Flag: b=1; l=8;  else b=7;  l=2; fi;  -- П     П           П    С
      |Value="СТ"   : if Flag: b=1; l=14; else b=10; l=5; fi;  -- П   Г Г  С     Э  Р    Г
      |Value="ЭЛ"   : if Flag: b=1; l=17; else b=16; l=2; fi;  -- П   Р Р  Т     Л  Г    У
      |Value="ПРГ"  : if Flag: b=1; l=22; else b=19; l=4; fi;  -- ???.?.??.?????.??.????.???
      |Value="КБК"  : b=1; l=22;                               -- 12345678901234567890123456
      |Value="БК"   : b=1; l=22;
      |Value="КОСГУ": if Flag: b=1; l=26; else b=24; l=3; fi;
      |Value="КСГУ" : if Flag: b=1; l=26; else b=24; l=3; fi;
      |True: ^"";
    fi;
   |Mode="КИФД" or Mode="КИВФ" or Mode="КИД":                  --                         К
    if Value="ППП"  : b=1; l=3;                                --                         О
      |Value="ГР"   : if Flag: b=1; l=6;  else b=5;  l=2; fi;  -- П      П     П     П    С
      |Value="ПГР"  : if Flag: b=1; l=9;  else b=8;  l=2; fi;  -- П   Г  Г  С  С  Э  Р    Г
      |Value="СТ"   : if Flag: b=1; l=12; else b=11; l=2; fi;  -- П   Р  Р  Т  Т  Л  Г    У
      |Value="ПСТ"  : if Flag: b=1; l=15; else b=14; l=2; fi;  --
      |Value="ЭЛ"   : if Flag: b=1; l=18; else b=17; l=2; fi;  -- ???.??.??.??.??.??.????.???
      |Value="ПРГ"  : if Flag: b=1; l=23; else b=20; l=4; fi;  -- 123456789012345678901234567
      |Value="КБК"  : b=1; l=23;
      |Value="БК"   : b=1; l=23;
      |Value="КОСГУ": if Flag: b=1; l=27; else b=25; l=3; fi;
      |Value="КСГУ" : if Flag: b=1; l=27; else b=25; l=3; fi;
      |True: ^"";
    fi;
 fi;
 R=SubStr(Source,b,l);
 ^R;
end;

Func ВзятьКБКФК(aКБК:S; aТипКБК:S; aЗнач:S):S;
var tmp:S;
var Flag:L;
 if Length(aКБК) <> 20:
    Trace("Неправильная длина КБК:" + aКБК);
    ^"";
 fi;
 if aКБК="" or aТипКБК="": ^""; fi;
 if aТипКБК="10":
    tmp=SubStr(aКБК,1,3)+"."+SubStr(aКБК,4,4)+"."+SubStr(aКБК,8,7)+"."+SubStr(aКБК,15,3)+"."+SubStr(aКБК,18,3);
    aТипКБК="КР";
   |aТипКБК="20":
    tmp=SubStr(aКБК,1,3)+"."+SubStr(aКБК,4,1)+"."+SubStr(aКБК,5,2)+"."+SubStr(aКБК,7,5)+"."+SubStr(aКБК,12,2)+"."+SubStr(aКБК,14,4)+"."+SubStr(aКБК,18,3);
    aТипКБК="КД";
   |aТипКБК="31" or aТипКБК="32":
    tmp=SubStr(aКБК,1,3)+"."+SubStr(aКБК,4,2)+"."+SubStr(aКБК,6,2)+"."+SubStr(aКБК,8,2)+"."+SubStr(aКБК,10,2)+"."+SubStr(aКБК,12,2)+"."+SubStr(aКБК,14,4)+"."+SubStr(aКБК,18,3);
    aТипКБК="КИФД";
   |True: ^"";
 fi;
 if aЗнач="БК+КОСГУ": aЗнач="КОСГУ"; Flag=True; else Flag=False; fi;
 ^ВзятьКодКБК(tmp,aТипКБК,aЗнач,Flag);
end;

Func ВзятьКодСчета9(Source:S; Value:S; Flag:L):S;
var b,l:i;
var R:S;
  --Value  Какой код берем ИСТ,СИНТ,АН,КСГУ
 if Source="": ^""; fi;
 if Value="ВД"   : b=1; l=1;
   |Value="ИСТ"  : b=1; l=1;
   |Value="СИНТ" : if Flag: b=1; l=5;  else b=3;  l=3; fi;
   |Value="АН"   : if Flag: b=1; l=8;  else b=7;  l=2; fi;
   |Value="КОСГУ": if Flag: b=1; l=12; else b=10; l=3; fi;
   |Value="КСГУ" : if Flag: b=1; l=12; else b=10; l=3; fi;
   |True: ^"";
 fi;
 R=SubStr(Source,b,l);
 ^R;
end;

Func ЦелеваяСтатья (Value1:S):S;
 if Match(Value1,"1??????")=False: ^Value1; else ^""; fi;
end;

Func ЦелеваяПрограмма (Value1:S):S;
 if Match(Value1,"1??????")=True: ^Value1; else ^""; fi;
end;

Func ПроверитьКорСчетов (Value0:S; Value1:S; Value2:S; Value3:L):L; --Проверяет корреспонденцию счетов, включая первые 17 знаков (неконтролируются через план счетов)
var tmp1,tmp2:S;
--Value0 Тип классификации "ВКР","КД","КИД"
--Value1 Счет дебета
--Value2 Счет кредита
--Value3 Выводить сообщение об ошибке
 if Value1="" or Value2="": ^True; fi;
 if Correspond(Value1,Value2)=False: 
    if Value3: Message("Ошибка! Счета '"+Value1+"/"+Value2+"' не могут корреспондировать!"); fi;
    ^False;
 fi;
 tmp1=ВзятьКодСчета(Value0,Value1,"КБК",False);
 tmp2=ВзятьКодСчета(Value0,Value2,"КБК",False);
 if tmp1<>tmp2:
    if Value3: Message("Ошибка! Счета '"+Value1+"/"+Value2+"' не могут корреспондировать (Различная классификация)!"); fi;
    ^False;
 fi;
 ^True;
end;

Func НашРекв:Record;
var OWA,nr,n:i;
var Rec:Record;
 OWA=OpenWorkArea("Контрагент","","НАШЕ and GroupAttr=0");
 Try
  Nr=Records(OWA);
  if Nr=1: Rec=GetRecordKey(OWA,1); ^Rec; fi;
  if Nr>1: 
     SetFilter(OWA,"НАШЕ and GroupAttr=0 and РПО_УМОЛЧАНИЕ");
     Nr=Records(OWA);
     if Nr=1: 
        Rec=GetRecordKey(OWA,1); 
        ^Rec;
       else
        Message("Выберите собственный реквизит");
        Rec=OpenCardFile("Контрагент","Наше",nil,crdRecordOnly); 
        ^Rec;
     fi;
  fi;
  Message("Ни одного учреждения с собственными реквизитами не найдено."+chr(13)+"Введите собственные реквизиты.");
  BeginChanging(OWA);
  Try
   n=InsertRecord(OWA);
   Rec=GetRecordKey(OWA,n);
   n=PutFieldS(OWA,n,'Признак',Раб.Предм.PtrStr(Rec,5));
   n=PutFieldL(OWA,n,'Наше',True);
   n=PutFieldL(OWA,n,'РПО_УМОЛЧАНИЕ',True);
   n=PutFieldS(OWA,n,'ПолнИмя',"Наше учреждение");
   n=PutFieldS(OWA,n,'КорИмя',"Наше учреждение");
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 OpenBlank("ИНФО.КОНТРАГЕНТ",True,Rec);
 ^Rec;
end;

Func БанкСчет_(Rec: Record; РБС:L; РР:L):Record;
var OWA,n,nr:i;
var Ret:Record;
var РБС_,Умолчание_:S;
 if Rec=Nil: ^nil; fi;
 РБС_=if(РБС,"True","False");
 if РР: Умолчание_="РПО_Умолчание_РР"; else Умолчание_="Умолчание"; fi;
 OWA=OpenWorkArea("БАНК_СЧЕТА","","Контрагент="+RecordToString(Rec)+" and РПО_РБС="+РБС_);
 Try
  Nr=Records(OWA);
  if Nr=1: Ret=GetRecordKey(OWA,1); ^Ret; fi;
  if Nr>1: 
     SetFilter(OWA,Умолчание_+" and Контрагент="+RecordToString(Rec)+" and РПО_РБС="+РБС_);
     Nr=Records(OWA);
     if Nr=1:
        Ret=GetRecordKey(OWA,1);
        ^Ret;
       else
        Message("Выберите банковские реквизиты");
        Ret=OpenCardFile("Банк_Счета","Контрагент="+RecordToString(Rec)+" and РПО_РБС="+РБС_);
        ^Ret;
     fi;
  fi;
  Message("У учреждения не найдено ни одного банковского реквизита."+chr(13)+"Введите банковские реквизиты.");
  BeginChanging(OWA);
  Try
   n=InsertRecord(OWA);
   Ret=GetRecordKey(OWA,n);
   n=PutFieldR(OWA,n,'КОНТРАГЕНТ',Rec);
   n=PutFieldS(OWA,n,'БАНКИМЯ',GetCardFieldS("Контрагент",Rec,"КорИмя"));
   n=PutFieldL(OWA,n,'НАШ',GetCardFieldL("Контрагент",Rec,"НАШЕ"));
   if РР: n=PutFieldL(OWA,n,'РПО_УМОЛЧАНИЕ_РР',True); else n=PutFieldL(OWA,n,'УМОЛЧАНИЕ',True); fi;
   n=PutFieldL(OWA,n,'РПО_РБС',РБС);
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 OpenBlank("ИНФО.БАНКСЧЕТА",True,Ret);
 ^Ret;
end;

Func БанкСчет(Rec: Record; РБС:L):Record;
 ^БанкСчет_(Rec,РБС,False);
end;

Func БанкСчетРР(Rec: Record; РБС:L):Record;
 ^БанкСчет_(Rec,РБС,True);
end;

Func Сетевая:L;
 if GetScheme="": ^False; else ^True; fi;
end;

Func Объединить (Value1:S; Value2:S; Sp:S):S;
var Ret:S;
 if Value1<>"" and Value2<>"": Ret=Value1+Sp+Value2;
   |Value1= "" and Value2<>"": Ret=Value2;
   |Value1<>"" and Value2="" : Ret=Value1;
   |True: Ret="";
 fi;
 ^Ret;
end;

Func ОбъединитьСкобки (Value1:S; Value2:S; Sp:S):S;
var Ret:S;
 if Value1<>"" and Value2<>"": Ret="(" + Value1+")" + Sp + "(" +Value2 + ")";
   |Value1= "" and Value2<>"": Ret=Value2;
   |Value1<>"" and Value2="" : Ret=Value1;
   |True: Ret="";
 fi;
 ^Ret;
end;

Func СортироватьНаборСлов (Value:S; Sp:S; Flag:L):S; --Сортирует набор по словам
--Value Набор слов
--Sp Сепаратор
--Flag Напрвление сортировки
var w,ww:i;
var tmp:S;
 ClearVariable(Раб.Бюджет2005.Buf);
 ww=WordsCount(Value,Sp);
 for w=1..ww do
  tmp=ExtractWord(w,Value,Sp);
  AddInArray(Раб.Бюджет2005.Buf,True,True,tmp);
 od;
 tmp="";
 for w=1..ww do
  tmp=tmp+sp+РАБ.Бюджет2005.buf[w];
 od;
 tmp=SubStr(tmp,Length(Sp)+1,255);
 ^tmp;
end;

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 ПризнВСправ(Value:S; Sp:S; Mask:S):S; --Преобразует набор признаков в набор справочников
--Value Набор
--Sp Сепаратор
--Mask Маска справочника т.е. его окончание
var nw,cw,p:i;
var tmp,Ret:S;
 Ret="";
 cw=WordsCount(Value,Sp);
 for nw=1..cw do
  tmp=ExtractWord(nw,Value,Sp);
  if tmp<>"":
     p=Pos(".",tmp);
     if p>0: tmp=SubStr(tmp,1,p-1)+Mask; fi;
     Ret=Ret+Sp+tmp;
  fi;
 od;
 Ret=SubStr(Ret,Length(Sp)+1,255);
 ^Ret;
end;

Func NumToStrTriad (Value: N; ns:I):S;
 ^Format("%."+Str(ns)+"N",Value);
end;

Func MatchAccount (Value:S; Mask:S):L;
var Acc:S;
 for Account Acc="("+Value+")&("+Mask+")" do ^True; od;
 ^False;
end;

Func СписокСправ(MaskAcc:S; Mode:I; ExclVoc:S):S; --возвращает список общих справочников для маски счетов, MODE=1 обязательные справочники, -1 необязательные 0 все, ExclVoc --Маска исключаемых справочников
var Acc,tmp,Ret:S;
var w,ww,n,nn:i;
var Flag:L;
 Ret="";
 ClearVariable(Раб.Бюджет2005.BufСправ);
 ClearVariable(Раб.Бюджет2005.Buf);
 nn=0;
 if ProgressEnable: 
    if MaskAcc="@":
       for Account Acc=MaskAcc do nn=nn+1; od;
      else
       nn=LengthOfArray(Раб.Бюджет2005.BufСч);
    fi;
    ShowProgress(nn,"Анализ справочников для счетов..."+MaskAcc);
 fi;
 Try
  --Собираем с каждого счета его набор справочников
  n=0;
  if MaskAcc="@":
     nn=LengthOfArray(Раб.Бюджет2005.BufСч);
     for n=1..nn do
      if ProgressEnable: ProgressPos(n); fi;
      tmp=Объединить(if(Mode=-1,"",SignsMask(BufСч[n],True)),if(Mode=1,"",SignsMask(BufСч[n],False)),"|");
      AddInArray(РАБ.Бюджет2005.Buf,True,False,tmp);
     od;
    else
     for Account Acc=MaskAcc do
      n=n+1;
      if ProgressEnable: ProgressPos(n); fi;
      tmp=Объединить(if(Mode=-1,"",SignsMask(Acc,True)),if(Mode=1,"",SignsMask(Acc,False)),"|");
      AddInArray(РАБ.Бюджет2005.Buf,True,False,tmp);
     od;
  fi;
  --Анализируем набор
  nn=LengthOfArray(РАБ.Бюджет2005.Buf);
  for n=1..nn do
   ww=WordsCount(РАБ.Бюджет2005.Buf[n],"|");
   for w=1..ww do
    tmp=ExtractWord(w,РАБ.Бюджет2005.Buf[n],"|");
    if not tmp="":
       if ExclVoc="": Flag=True; else Flag=not MatchMask(tmp,ExclVoc); fi;
       if Flag: AddInArray(BufСправ,True,False,tmp); fi;
    fi;
   od;
  od;
  --
  nn=LengthOfArray(BufСправ);
  for n=1..nn do
   Ret=Ret+"|"+BufСправ[n];
   BufСправ[n]=BufСправ[n]+" --"+Name_A(SubStr(BufСправ[n],1,Pos("*",BufСправ[n])-1));
  od;
 Finally
  if ProgressEnable: CloseProgress; fi;
 end;
 Ret=SubStr(Ret,2,255);
 ^Ret;
end;

Func СписокОбщСправ(MaskAcc:S; Mode:I; ExclVoc:S):S; --возвращает список общих справочников для маски счетов, MODE=1 обязательные справочники, -1 необязательные 0 все, ExclVoc --Маска исключаемых справочников
var Acc,tmp,Ret:S;
var z,w,ww,n,nn:i;
var Flag:L;
 Ret="";
 ClearVariable(Раб.Бюджет2005.BufСправ);
 ClearVariable(Раб.Бюджет2005.Buf);
 ClearVariable(Раб.Бюджет2005.BufI);
 nn=0;
 if ProgressEnable: 
    if MaskAcc="@":
       nn=LengthOfArray(Раб.Бюджет2005.BufСч);
      else
       for Account Acc=MaskAcc do nn=nn+1; od;
    fi;
    ShowProgress(nn,"Анализ справочников для счетов..."+MaskAcc);
 fi;
 Try
  --Собираем с каждого счета его набор справочников
  n=0;
  if MaskAcc="@":
     nn=LengthOfArray(Раб.Бюджет2005.BufСч);
     for n=1..nn do
      if ProgressEnable: ProgressPos(n); fi;
      tmp=Объединить(if(Mode=-1,"",SignsMask(BufСч[n],True)),if(Mode=1,"",SignsMask(BufСч[n],False)),"|");
      AddInArray(РАБ.Бюджет2005.Buf,True,False,tmp);
     od;
    else
     for Account Acc=MaskAcc do
      n=n+1;
      if ProgressEnable: ProgressPos(n); fi;
      tmp=Объединить(if(Mode=-1,"",SignsMask(Acc,True)),if(Mode=1,"",SignsMask(Acc,False)),"|");
      AddInArray(РАБ.Бюджет2005.Buf,True,False,tmp);
     od;
  fi;
  --Анализируем набор
  nn=LengthOfArray(РАБ.Бюджет2005.Buf);
  for n=1..nn do
   ww=WordsCount(РАБ.Бюджет2005.Buf[n],"|");
   for w=1..ww do
    tmp=ExtractWord(w,РАБ.Бюджет2005.Buf[n],"|");
    if not tmp="":
       if ExclVoc="": Flag=True; else Flag=not MatchMask(tmp,ExclVoc); fi;
       if Flag:
          z=SearchInArray(BufСправ,tmp,True);
          if z=-1:
             z=InsertInArraySort(BufСправ,tmp);
             InsertInArray(BufI,z,1);
            else
             BufI[z]=BufI[z]+1;
          fi;
       fi;
    fi;
   od;
  od;
  --
  ww=nn;
  --
  nn=LengthOfArray(BufСправ);
  n=1;
  While n<=nn do
   if BufI[n]=ww:
      Ret=Ret+"|"+BufСправ[n];
      BufСправ[n]=BufСправ[n]+" --"+Name_A(SubStr(BufСправ[n],1,Pos("*",BufСправ[n])-1));
      n=n+1;
     else
      DeleteFromArray(BufСправ,n);
      DeleteFromArray(BufI,n);
      nn=nn-1;
   fi;
  od;
 Finally
  if ProgressEnable: CloseProgress; fi;
 end;
 Ret=SubStr(Ret,2,255);
 ^Ret;
end;


Func ПроверитьНаборСлов(Set:S; Sp1:S; Mask:S; Sp2:S; Msg:S):L; --Проверяет набор слов "Set" на соотвествие маске "Mask",Sp1,Sp2 -Разделители, если Msg не пустое то выдаеться сообщение
var w1,nw1,w2,nw2:I;
var tmp1,tmp2:s;
var Flag:L;
 nw1=WordsCount(Mask,Sp2);
 nw2=WordsCount(Set,Sp1);
 if not nw1=0 and nw2=0: if not Msg="": Message(Msg+ExtractWord(1,Mask,Sp2),mtError); fi; ^False; fi;
 for w1=1..nw1 do
  tmp1=ExtractWord(w1,Mask,Sp2);
  Flag=False;
  for w2=1..nw2 do
   tmp2=ExtractWord(w2,Set,Sp1);
   if Match(tmp2,tmp1): Flag=True; Break; fi;
  od;
  if not Flag: if not Msg="": Message(Msg+tmp1,mtError); fi; ^False; fi;
 od;
 ^True;
end;

Func ПроверитьНаборСлов2(Set:S; Sp1:S; Mask:S; Sp2:S; Msg:S):S; --Проверяет набор слов "Set" на соотвествие маске "Mask",Sp1,Sp2 -Разделители, если Msg не пустое то выдаеться сообщение
var w1,nw1,w2,nw2:I;
var tmp1,tmp2:s;
var Flag:L;
 nw1=WordsCount(Mask,Sp2);
 nw2=WordsCount(Set,Sp1);
 if not nw1=0 and nw2=0: if not Msg="": Message(Msg+ExtractWord(1,Mask,Sp2),mtError); fi; ^ExtractWord(1,Mask,Sp2); fi;
 for w1=1..nw1 do
  tmp1=ExtractWord(w1,Mask,Sp2);
  Flag=False;
  for w2=1..nw2 do
   tmp2=ExtractWord(w2,Set,Sp1);
   if Match(tmp2,tmp1): Flag=True; Break; fi;
  od;
  if not Flag: if not Msg="": Message(Msg+tmp1,mtError); fi; ^tmp1; fi;
 od;
 ^"";
end;


Func УдалитьСловоИзНабора_Диалог (Set:S; Sp:S):S;
var w,nw,n:i;
 ClearVariable(Раб.Бюджет2005.Buf);
 nw=WordsCount(Set,Sp);
 if nw=1 or nw=0: ^""; fi;
 for w=1..nw do
  РАБ.Бюджет2005.Buf[w+1]=ExtractWord(w,Set,Sp);
 od;
 РАБ.Бюджет2005.Buf[1]="Удалить все";
 n=Alternate("Удаление",РАБ.Бюджет2005.Buf,-1,1,12);
 if n=0: ^Set; fi;
 Set="";
 if n=1: ^Set; fi;
 for w=2..nw+1 do
  if not w=n: Set=Set+Sp+РАБ.Бюджет2005.Buf[w]; fi;
 od;
 Set=SubStr(Set,Length(Sp)+1,255);
 ^Set;
end;

Func УдалитьСловоИзНабора_Диалог2 (Set:S; Sp:S; vFunc:S):S;  --vFunc имя функции определяющей имя слова
var w,nw,n:i;
var tmp:S;
 ClearVariable(Раб.Бюджет2005.Buf);
 nw=WordsCount(Set,Sp);
 if nw=1 or nw=0: ^""; fi;
 for w=1..nw do
  РАБ.Бюджет2005.Buf[w+1]=ExtractWord(w,Set,Sp);
  if SubStr(РАБ.Бюджет2005.Buf[w+1],Length(РАБ.Бюджет2005.Buf[w+1]),1)="*": tmp=SubStr(РАБ.Бюджет2005.Buf[w+1],1,Length(РАБ.Бюджет2005.Buf[w+1])-1); else tmp=РАБ.Бюджет2005.Buf[w+1]; fi;
  if vFunc="Name_A": РАБ.Бюджет2005.Buf[w+1]=РАБ.Бюджет2005.Buf[w+1]+" --"+Name_A(tmp);
    |vFunc="Name_S": РАБ.Бюджет2005.Buf[w+1]=РАБ.Бюджет2005.Buf[w+1]+" --"+Name_S(tmp);
    |vFunc="Name_C": РАБ.Бюджет2005.Buf[w+1]=РАБ.Бюджет2005.Buf[w+1]+" --"+Name_C(tmp);
    |True: РАБ.Бюджет2005.Buf[w+1]=РАБ.Бюджет2005.Buf[w+1]+" --";
  fi;
 od;
 РАБ.Бюджет2005.Buf[1]="Удалить все";
 n=Alternate("Удаление",РАБ.Бюджет2005.Buf,-1,1,12);
 if n=0: ^Set; fi;
 Set="";
 if n=1: ^Set; fi;
 for w=2..nw+1 do
--  if not w=n: Set=Set+Sp+if( not vFunc="",SubStr(РАБ.Бюджет2005.Buf[w],1,Pos(" --",РАБ.Бюджет2005.Buf[w])-1),РАБ.Бюджет2005.Buf[w]); fi;
  if not w=n: Set=Set+Sp+SubStr(РАБ.Бюджет2005.Buf[w],1,Pos(" --",РАБ.Бюджет2005.Buf[w])-1); fi;
 od;
 Set=SubStr(Set,Length(Sp)+1,255);
 ^Set;
end;

Func ПривестиВСоотвНаборСлов(Set:S; Sp1:S; Mask:S; Sp2:S):S;
var nw1,w1,nw2,w2:I;
var Res,tmp1,tmp2:S;
 Res="";
 nw1=WordsCount(Set,Sp1);
 nw2=WordsCount(Mask,Sp2);
 for w1=1..nw1 do
  tmp1=ExtractWord(w1,Set,Sp1);
  for w2=1..nw2 do
   tmp2=ExtractWord(w2,Mask,Sp2);
   if Match(tmp1,tmp2): Res=Res+Sp1+tmp1; Break; fi;
  od;
 od;
 Res=SubStr(Res,Length(Sp1)+1,255);
 ^Res;
end;

Func ЗаменитьРазделительВНабореСлов (Set:S; Sp1:S; Sp2:S):S;
var nw,w:i;
var Res:s;
 Res="";
 nw=WordsCount(Set,Sp1);
 for w=1..nw do
  Res=Res+Sp2+ExtractWord(w,Set,Sp1);
 od;
 Res=SubStr(Res,Length(Sp2)+1,255);
 ^Res;
end;

Func КОСГУВМаску(vКОСГУ:S; Mask:S):S; --Преобразует нули в КОСГУ в маску
var s1,s2,s3:S;
 if not Mask="*" and not Mask="?": Message("Недопустимый символ маски "+Mask,mtError); ^""; fi;
 s1=SubStr(vКОСГУ,1,1);
 s2=SubStr(vКОСГУ,2,1);
 s3=SubStr(vКОСГУ,3,1);
 if s1="0": ^Mask+if(Mask="?","??","");
   |s2="0": ^s1+Mask+if(Mask="?","?","");
   |s3="0": ^s1+s2+Mask;
   |True  : ^vКОСГУ;
 fi;
 ^vКОСГУ;
end;

Func УдалитьСловоИзНабораПоМаске (Set:S; Sp1:S; Mask:S; Sp2:S):S;
var nw1,w1,nw2,w2:I;
var Res,tmp1,tmp2:S;
 if Set="" or Mask="": ^Set; fi;
 Res="";
 nw1=WordsCount(Set,Sp1);
 nw2=WordsCount(Mask,Sp2);
 for w1=1..nw1 do
  tmp1=ExtractWord(w1,Set,Sp1);
  for w2=1..nw2 do
   tmp2=ExtractWord(w2,Mask,Sp2);
   if Match(tmp1,tmp2): tmp1=""; Break; fi;
  od;
  if not tmp1="": Res=Res+Sp1+tmp1; fi;
 od;
 Res=SubStr(Res,Length(Sp1)+1,255);
 ^Res;
end;

Func ВзятьСловоИзНабораПоМаске (Set:S; Sp1:S; Mask:S; Sp2:S):S;
var nw1,w1,nw2,w2:I;
var Res,tmp1,tmp2:S;
 if Set="" or Mask="": ^Set; fi;
 Res="";
 nw1=WordsCount(Set,Sp1);
 nw2=WordsCount(Mask,Sp2);
 for w1=1..nw1 do
  tmp1=ExtractWord(w1,Set,Sp1);
  for w2=1..nw2 do
   tmp2=ExtractWord(w2,Mask,Sp2);
   if Match(tmp1,tmp2): Res=tmp1; Break; fi;
  od;
 od;
 ^Res;
end;

Func ВзятьСловаИзНабораПоМаске (Set:S; Sp1:S; Mask:S; Sp2:S):S;
var nw1,w1,nw2,w2:I;
var Res,tmp1,tmp2:S;
 if Set="" or Mask="": ^Set; fi;
 Res="";
 nw1=WordsCount(Set,Sp1);
 nw2=WordsCount(Mask,Sp2);
 for w1=1..nw1 do
  tmp1=ExtractWord(w1,Set,Sp1);
  for w2=1..nw2 do
   tmp2=ExtractWord(w2,Mask,Sp2);
   if Match(tmp1,tmp2): Res=Res+sp1+tmp1; Break; fi;
  od;
 od;
 ^SubStr(Res,2,255);
end;


Func ДобавитьСловоВНаборСЗаменой (Set:S; Sp1:S; Value:S; Mask:S; Sp2:S):S;
var Res:S;
 if Set="": ^Value; fi;
 Res=УдалитьСловоИзНабораПоМаске(Set,Sp1,Mask,Sp2);
 Res=Объединить(Res,Value,Sp1);
 ^Res;
end;

Func ПолучитьШаблонСчета (Value:S; vШаблон:S):S;
  if vШаблон="СЧ9":
     if Match(Value,"?."): Value=Value+"???.??.???";
       |Match(Value,"?.???."): Value=Value+"??.???";
       |Match(Value,"?.???.??."): Value=Value+"???";
     fi;
    |vШаблон="СЧ20" or vШаблон="БК20" or vШаблон="БК23":
     if Match(Value,"???."): Value=Value+"????.???????.???.?.???.??.???"; --КР
       |Match(Value,"???.????."): Value=Value+"???????.???.?.???.??.???";
       |Match(Value,"???.????.???????."): Value=Value+"???.?.???.??.???";
       |Match(Value,"???.????.???????.???."): Value=Value+"?.???.??.???";
       |Match(Value,"???.????.???????.???.?."): Value=Value+"???.??.???";
       |Match(Value,"???.????.???????.???.?.???."): Value=Value+"??.???";
       |Match(Value,"???.????.???????.???.?.???.??."): Value=Value+"???";
       |Match(Value,"???."): Value=Value+"?.??.?????.??.????.?.???.??.???"; --КД
       |Match(Value,"???.?."): Value=Value+"??.?????.??.????.?.???.??.???";
       |Match(Value,"???.?.??."): Value=Value+"?????.??.????.?.???.??.???";
       |Match(Value,"???.?.??.?????."): Value=Value+"??.????.?.???.??.???";
       |Match(Value,"???.?.??.?????.??."): Value=Value+"????.?.???.??.???";
       |Match(Value,"???.?.??.?????.??.????."): Value=Value+"?.???.??.???";
       |Match(Value,"???.?.??.?????.??.????.?."): Value=Value+"???.??.???";
       |Match(Value,"???.?.??.?????.??.????.?.???."): Value=Value+"??.???";
       |Match(Value,"???.?.??.?????.??.????.?.???.??."): Value=Value+"???";
       |Match(Value,"???."): Value=Value+"??.??.??.??.??.????.?.???.??.???"; --КИФД
       |Match(Value,"???.??."): Value=Value+"??.??.??.??.????.?.???.??.???";
       |Match(Value,"???.??.??."): Value=Value+"??.??.??.????.?.???.??.???";
       |Match(Value,"???.??.??.??."): Value=Value+"??.??.????.?.???.??.???";
       |Match(Value,"???.??.??.??.??."): Value=Value+"??.????.?.???.??.???";
       |Match(Value,"???.??.??.??.??.??."): Value=Value+"????.?.???.??.???";
       |Match(Value,"???.??.??.??.??.??.????."): Value=Value+"?.???.??.???";
       |Match(Value,"???.??.??.??.??.??.????.?.???."): Value=Value+"??.???";
       |Match(Value,"???.??.??.??.??.??.????.?.???.??."): Value=Value+"???";
     fi;
  fi;
  if vШаблон="БК20":
     Value=ВзятьКодСчета(Value,"","КБК",False);
    |vШаблон="БК23":
     Value=ВзятьКодСчета(Value,"","КБК",False)+"."+ВзятьКодСчета(Value,"","КОСГУ",False);
  fi;
  ^Value;
end;


Func ВзятьТипКИФД(vКИФД:S):S;
 if MatchMask(vКИФД,"???.01.*"): ^"КИВФ";
   |MatchMask(vКИФД,"???.02.*"): ^"КИВнФ";
   |True: ^"КИФД";
 fi;
end;

Func УпорядочитьНаборСлов (Value:S; Sp:S; Mask:S):S; --Order набор слов по заданной маске
--Value Набор слов
--Sp Сепаратор
--Mask Маска упорядовачивания
var ww1,w1,ww2,w2:i;
var tmp1,tmp2:S;
 ClearVariable(Раб.Бюджет2005.Buf);
 ww1=WordsCount(Value,Sp);
 ww2=WordsCount(Mask,"|");
 for w1=1..ww1 do
  tmp1=ExtractWord(w1,Value,Sp);
  for w2=1..ww2 do
   tmp2=ExtractWord(w2,Mask,"|");
   if Match(tmp1,tmp2):
      AddInArray(Раб.Бюджет2005.Buf,True,True,Str16(w2,2)+tmp1);
   fi;
  od;
  if w2>ww2: AddInArray(Раб.Бюджет2005.Buf,True,True,"FF"+tmp1); fi; --слова не попавшие под маску помещаются в конец и сортируются
 od;
 tmp1="";
 for w1=1..ww1 do
  tmp1=tmp1+sp+SubStr(РАБ.Бюджет2005.buf[w1],3,255);
 od;
 tmp1=SubStr(tmp1,Length(Sp)+1,255);
 ^tmp1;
end;

Func КартПризнакИспользуется(Crd:S; Field:S; Rec:Record; Mask:S):S;
var n,ns:i;
var tmp,tmp2:S;
 ns=RecSignsCount(Crd,Rec);
 for n=1..ns do
  tmp=RecSign(Crd,Rec,n);  --нам интересн только справочник (функция работает криво + без учете иерархии)
  if IsHierArchical(Crd):
     tmp2=SubStr(tmp,1,Pos(".",tmp)-1);
     tmp=CardFileRecSign(Crd,Field,tmp2,Rec);
     if tmp=tmp2+".": ^""; fi; --поле не явлется полем признака
  fi;
  if Match(tmp,Mask):
     if not Name_A(tmp)=" ":
        if SignUsed(tmp): ^tmp; fi;
     fi;
  fi;
 od;
 ^"";
end;

Func Оператор (Sp:S):S;
var w,ww:i;
 ClearVariable(Раб.Бюджет2005.Buf);
 ww=WordsCount(Sp,";");
 for w=1..ww do
  РАБ.Бюджет2005.Buf[w]=ExtractWord(2,ExtractWord(w,sp,";"),"=");
 od;
 w=Alternate("Выбор оператора",РАБ.Бюджет2005.Buf,20,1,12);
 HideEditor=True;
 if not w=0: ^ExtractWord(1,ExtractWord(w,sp,";"),"="); fi;
 HideEditor=False;
 ^"";
end;

Func Объединить_Диалог (Val1:S; Val2:S; Sp:S; Del:S):S;  --Формат сепаратора Разделитель=Наименвание;Разделитель=Наименвание
var z:s;
 if not Val1="" and not Val2="": z=Оператор(Sp); else z=""; HideEditor=True; fi;
 if z=Del: ^Val2; fi;
 if Pos("()",z)=1:
    z=SubStr(z,3,255);
    Val1="("+Val1+")";
 fi;
 ^Val1+z+Val2;
end;

Func Format36(Source:Integer) :String;
var Des, Ost :Integer;
 if Source<0 and Source>1295 : ^("Ошибка! Выход за границы диапазона 1..1295"); fi;
 Des=Int(Trunc(Source/36));
 Ost=Source-(Des*36);
 ^(if(Des>=0 and Des<=9, Str(Des), Chr(Des+55))+if(Ost>=0 and Ost<=9, Str(Ost), Chr(Ost+55)));
end;

Func Контроль2Слэш (Val:S):S; --удаляет сдвоенный слэш в пути, кроме первого (т.е. сетевой путь)
var Prefix:S;
 Val=TrimLeft(Val);
 Prefix="";
 if Pos("\\",Val)=1:
    Prefix=SubStr(Val,1,2);
    Val=SubStr(Val,3,255);
 fi;
 if not Pos("\\",Val)=0:
    Val=Раб.Формат.ReplaceSubstr(Val,"\\","\");
 fi;
 ^Prefix+Val;
end;

Func TimeToStr(aTime:I; aFrmt:S):S;
var Res:S;
var h,m,s:i;
 h=Int(Trunc(aTime/3600));
 m=Int(Trunc((aTime-(h*3600))/60));
 s=Int(Trunc(aTime-(h*3600)-(m*60)));
 if aFrmt="HH:MM:SS": Res=Format("%.2D",h)+":"+Format("%.2D",m)+":"+Format("%.2D",s);
   |aFrmt="HH-MM-SS": Res=Format("%.2D",h)+"-"+Format("%.2D",m)+"-"+Format("%.2D",s);
   |aFrmt="H:M:S":    Res=Str(h)+":"+Str(m)+":"+Str(s);
   |aFrmt="H-M-S":    Res=Str(h)+"-"+Str(m)+"-"+Str(s);
   |True: Res=Format("%.2D",h)+":"+Format("%.2D",m)+":"+Format("%.2D",s);
 fi;
 ^Res;
end;

Func Соотв_Ан_КОСГУ (aСинт:S; aАН:S):S;
 if aСинт="" or aСинт="206" or aСинт="208" or aСинт="302":
    if aАН="11":^"211";
      |aАН="12":^"212";
      |aАН="13":^"213";
      |aАН="21":^"221";
      |aАН="22":^"222";
      |aАН="23":^"223";
      |aАН="24":^"224";
      |aАН="25":^"225";
      |aАН="26":^"226";
      |aАН="41":^"241";
      |aАН="42":^"242";
      |aАН="51":^"251";
      |aАН="52":^"252";
      |aАН="53":^"253";
      |aАН="61":^"261";
      |aАН="62":^"262";
      |aАН="63":^"263";
      |aАН="91":^"290";
      |aАН="31":^"310";
      |aАН="32":^"320";
      |aАН="33":^"330";
      |aАН="34":^"340";
      |aАН="72":^"520";
      |aАН="73":^"530";
      |aАН="??":^"???";
    fi;
 fi;
 if aСинт="205":
    if aАН="11":^"110";
      |aАН="21":^"120";
      |aАН="31":^"130";
      |aАН="41":^"140";
      |aАН="51":^"151";
      |aАН="52":^"152";
      |aАН="53":^"153";
      |aАН="61":^"160";
      |aАН="71":^"410";
      |aАН="72":^"420";
      |aАН="73":^"430";
      |aАН="74":^"440";
--      |aАН="75":^"_?_";
      |aАН="81":^"180";
      |aАН="??":^"???";
    fi;
 fi;
 ^"";
end;

Func Соотв_КОСГУ_Ан (aСинт:S; aКОСГУ:S):S;
 if aСинт="" or aСинт="206" or aСинт="208" or aСинт="302":
    if aКОСГУ="211":^"11";
      |aКОСГУ="212":^"12";
      |aКОСГУ="213":^"13";
      |aКОСГУ="221":^"21";
      |aКОСГУ="222":^"22";
      |aКОСГУ="223":^"23";
      |aКОСГУ="224":^"24";
      |aКОСГУ="225":^"25";
      |aКОСГУ="226":^"26";
      |aКОСГУ="241":^"41";
      |aКОСГУ="242":^"42";
      |aКОСГУ="251":^"51";
      |aКОСГУ="252":^"52";
      |aКОСГУ="253":^"53";
      |aКОСГУ="261":^"61";
      |aКОСГУ="262":^"62";
      |aКОСГУ="263":^"63";
      |aКОСГУ="290":^"91";
      |aКОСГУ="310":^"31";
      |aКОСГУ="320":^"32";
      |aКОСГУ="330":^"33";
      |aКОСГУ="340":^"34";
      |aКОСГУ="520":^"72";
      |aКОСГУ="530":^"73";
      |aКОСГУ="???":^"??";
    fi;
 fi;
 if aСинт="205":
    if aКОСГУ="110":^"11";
      |aКОСГУ="120":^"21";
      |aКОСГУ="130":^"31";
      |aКОСГУ="140":^"41";
      |aКОСГУ="151":^"51";
      |aКОСГУ="152":^"52";
      |aКОСГУ="153":^"53";
      |aКОСГУ="160":^"61";
      |aКОСГУ="410":^"71";
      |aКОСГУ="420":^"72";
      |aКОСГУ="430":^"73";
      |aКОСГУ="440":^"74";
--      |aКОСГУ="_?_":^"75":
      |aКОСГУ="180":^"81";
      |aКОСГУ="???":^"??";
    fi;
 fi;
 ^"";
end;


Func БанкВПризн(Банк_Счет:Record):String;
var Res,tmp,Res2:S;
 Res="";
 if Банк_Счет=nil: ^Res; fi;
 tmp=GetCardFieldS("БАНК_СЧЕТА",Банк_Счет,"РПО_Признак");
 if tmp<>"" then
    Res="ЛС."+tmp;
    Res2="ЛС."+GetCardFieldS("БАНК_СЧЕТА",Банк_Счет,"РПО_ЛСчет");
    if Res2="ЛС.": Res2=Res2+GetCardFieldS("БАНК_СЧЕТА",Банк_Счет,"РСЧЕТ"); fi;
   else
    Res="ЛС."+GetCardFieldS("БАНК_СЧЕТА",Банк_Счет,"РПО_ЛСчет");
    if Res="ЛС.": Res=Res+GetCardFieldS("БАНК_СЧЕТА",Банк_Счет,"РСЧЕТ"); fi;
 fi;
 RefreshAna;
 if Name_A(Res)=" ":
    Res="";
    if not Res2="":
       if not Name_A(Res2)=" ": Res=Res2; fi;
    fi;
 fi;
 ^Res;
end;

Func Str2Word (ss:i; sp:s):I;
var s,l,p:i;
var ch,tmp:S;
 tmp="";
 ClearVariable(Раб.Бюджет2005.BufW);
 for s=1..ss do
  l=Length(Раб.Бюджет2005.BufS[s]);
  for p=1..l do
   ch=SubStr(Раб.Бюджет2005.BufS[s],p,1);
   if ch=sp:
      AddInArray(Раб.Бюджет2005.BufW,False,True,tmp);
      tmp="";
     else
      tmp=tmp+ch;
   fi;
  od;
 od;
 AddInArray(Раб.Бюджет2005.BufW,False,True,tmp);
 ^LengthOfArray(Раб.Бюджет2005.BufW);
end;

Func Word2SingleStr (row:i; col:i; Obj:Object; ww:i; sp:s):I;
var w:i;
var tmp:S;
 ClearVariable(Раб.Бюджет2005.BufS);
 tmp=Раб.Бюджет2005.BufW[1];
 for w=2..ww do
  if not AsInteger(Obj.Cell(row,col,CellLinesCount,tmp+sp+Раб.Бюджет2005.BufW[w]))=1:
     AddInArray(Раб.Бюджет2005.BufS,False,True,tmp);
     tmp=Раб.Бюджет2005.BufW[w];
    else
     tmp=tmp+sp+Раб.Бюджет2005.BufW[w];
  fi;
 od;
 AddInArray(Раб.Бюджет2005.BufS,False,True,tmp);
 ^LengthOfArray(Раб.Бюджет2005.BufS);
end;

Func ТипУчета:S;
 ^Trim(PlanVar("УЧЕТ"));
end;

Func ПарсерJDF (jdf:S; val:S):S;
var p:i;
p=Раб.ПЛАН.GET_PAR_JDF(jdf);
if p<1: ^''; fi;
 if val="crd"    : ^Раб.ПЛАН.par[1];
   |val="date"   : ^Раб.ПЛАН.par[2];
   |val="ord"    : ^Раб.ПЛАН.par[3];
   |val="ff"     : ^Раб.ПЛАН.par[4];
   |val="date+ff": ^Объединить(Раб.ПЛАН.par[2]+">1.1.100",if(Раб.ПЛАН.par[4]="","","("+Раб.ПЛАН.par[4]+")")," and ");
   |true         : ^Раб.ПЛАН.par[1]+"|"+Раб.ПЛАН.par[2]+"|"+if(Раб.ПЛАН.par[3]=""," ",Раб.ПЛАН.par[3])+"|"+if(Раб.ПЛАН.par[4]=""," ",Раб.ПЛАН.par[4]);
 fi;
end;

Func ВзятьИмяJDFпоCRD(CRDfile:String) :String; -- если не прошла обработка - видит только разделы, иначе разделы + журналы картотеки по которым отработали проводки
var num, ii :Integer;
var NameJDF :String;
 if ExistsCardFile(CRDfile):
   num=JournalsCount;
   if num>0:
     for ii=1 to num do
       NameJDF=JournalName(ii);
       if JournalType(NameJDF)="КАРТ": if Up(JournalCardfile(NameJDF))=Up(CRDfile): ^NameJDF; fi; fi;
     od;
   fi;
 fi;
 ^"";
end;

Func ПолеДатыПроводкиКартотеки(CRDname:String) :String;
var jdfname:s;
 jdfname=ВзятьИмяJDFпоCRD(CRDname);
 ^Раб.ПЛАН.GET_DATEFIELD_JDF(jdfname);
end;

Func Счет_ПереворотКосгу(Счет:S):S;
var kosgu:S;
  kosgu=ВзятьКодСчета(Счет,"","КОСГУ",False);
  if Match(kosgu,"2??"): ^Счет;
    |Match(kosgu,"1??"): ^Счет;
    |Match(kosgu,"3??"): ^ВзятьКодСчета(Счет,"","АН",True)+".4"+Substr(kosgu,2,2);
    |Match(kosgu,"4??"): ^ВзятьКодСчета(Счет,"","АН",True)+".3"+Substr(kosgu,2,2);
    |Match(kosgu,"5??"): ^ВзятьКодСчета(Счет,"","АН",True)+".6"+Substr(kosgu,2,2);
    |Match(kosgu,"6??"): ^ВзятьКодСчета(Счет,"","АН",True)+".5"+Substr(kosgu,2,2);
    |Match(kosgu,"7??"): ^ВзятьКодСчета(Счет,"","АН",True)+".8"+Substr(kosgu,2,2);
    |Match(kosgu,"8??"): ^ВзятьКодСчета(Счет,"","АН",True)+".7"+Substr(kosgu,2,2);
  fi;
  ^Счет;
end;

--/****f* Раб.Бюджет2005/DirList
--* SYNOPSIS
Func DirList(Path:S; Mask:S; Param:I):I;
--* FUNCTION
--* Возвращает список файлови/или папок в каталоге
--* INPUTS
--* Path - опрашиваемый каталог
--* Mask - маска для запроса файлов
--* Param - дополнительная настройка. Обрабатываются значения:
--* *1 - искать только файлы
--* *2 - искать только папки
--* *0 - искать все
--* RESULT
--* Число найденных элементов
--*
--* Сами элементы находятся в массиве Раб.Бюджет2005.Dir
--* SOURCE
 ClearVariable(РАБ.Бюджет2005.Dir);
 GetFileList(PAth,Mask,Param,РАБ.Бюджет2005.Dir);
 ^LengthOfArray(Раб.Бюджет2005.Dir);
end;
--*********************

Func PathPart(Path:S;what:S):S;
--file,path,ext,filename
var File:S;
var n:I;
  if not ExistFile(Path):
     if what="path":^Path; --Если файла нет, то вероятно весь путь - то, что нам надо.
       else ^"";  --А все остальное мы вернуть не можем
     fi;
  fi;
  n=WordsCount(Path,"\");
  if what="path":
     ^if(Substr(Path,1,2)="\\","\\","")+ExtractWords(1,n-1,Path,"\");--Путь - это все, кроме файла
    else
     File=ExtractWord(n,Path,"\"); --Все после последнего слеша - файл
     if what="file": ^File;
       else
        n=WordsCount(File,".");
        if what="ext":^ExtractWord(n,File,".");
          else ^ExtractWords(1,n-1,File,".");
        fi;
     fi;
  fi;
end;

Func tempfile(Path:S;ext:S):S;
var File:S;
  if Path="":
     Path=PlanVar('CACHE');
  fi;
  if Substr(Path,Length(Path),1)<>"\":
     Path=Path+"\";
  fi;
  File=Path+GetGuid+"."+ext;
  While ExistFile(File) do
     File=Path+GetGuid+"."+ext;
  od;
  ^File;
end;

Func Std_Rpo_AP:S; --абсолютный путь к str_rpo
var p1,FS:s;
  FS=Раб.ПЛАН.ВзятьПолныйПутьSTD_RPO;

  if Substr(FS,Length(FS),1)<>"\":
     FS=FS+"\";
  fi;
 ^FS;
end;

Func MyGUID(aFormat:S):S;
 if aFormat="FK" or aFormat="ФК": ^SubStr(GetGUID,2,36);
   |True: ^GetGUID;
 fi;
end;

Func АктуалБО(aБО:Record; aДата:D): Record; --возращает актуальный экземпляр БО на дата
var OWA:i;
var ff:S;
 ff="ТипДок=1 and Изм_ДатаДок<="+DateToString(aДата);
 OWA=OpenWorkArea("РПО_Свед_БО","",ff+" and БО_Пре="+RecordToString(aБО));
 Try
  While not Records(OWA)=0 do
   aБО=GetRecordKey(OWA,1);
   SetFilter(OWA,ff+" and БО_Пре="+RecordToString(aБО));
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 ^aБО;
end;

Func ПредокБО(aБО:Record): Record; --возращает ссылку на предка
var OWA:i;
var Rec: Record;
 OWA=OpenWorkArea("РПО_Свед_БО","","UKey="+RecordToString(aБО));
 Try
  While not Records(OWA)=0 do
   Rec=GetFieldR(OWA,1,"БО_Пре");
   if not Rec=nil:
      SetFilter(OWA,"UKey="+RecordToString(Rec));
      if not Records(OWA)=0:
         aБО=Rec;
      fi;
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 ^aБО;
end;

Конец

