БланкСШаблоном "Преобразования типов и форматные преобразования ";
				 -- Многие М.М.     01.01.100- 29.05.98
				 -- Алексеев С.В.   30.05.98 - 31.05.98
				 -- Умнов Д.	    31.05.98 - 08.09.98
				 -- Егоров М.О.     09.09.98 - 09.09.98

--*********** функции работы с датами**********************************
  dfDDMMYY	   :Integer = 1;   -- 31.05.98
  dfDDMMYYг	   :Integer = 2;   -- 31.05.98 г.
  dfDDMMYYгода	   :Integer = 3;   -- 31.05.98 года
  dfDDMMYYYY	   :Integer = 4;   -- 31.05.1998
  dfDDMMYYYYг	   :Integer = 5;   -- 31.05.1998 г.
  dfDDMMYYYYгода   :Integer = 6;   -- 31.05.1998 года
  dfDDMMMMYY	   :Integer = 7;   -- 31 мая 98
  dfDDMMMMYYг	   :Integer = 8;   -- 31 мая 98 г.
  dfDDMMMMYYгода   :Integer = 9;   -- 31 мая 98 года
  dfDDMMMMYYYY	   :Integer = 10;  -- 31 мая 1998
  dfDDMMMMYYYYг    :Integer = 11;  -- 31 мая 1998 г.
  dfDDMMMMYYYYгода :Integer = 12;  -- 31 мая 1998 года
  dfDDMMMMYYYYгод  :Integer = 13;  -- "31" мая 1998 года
  dfYYYYMMDD	   :Integer = 14;  -- 1998-05-31

  -- необходимо использовать вместо старых ДатаСтрок, ДатаС, ДатаСтр
  -- пример вызова: ДатаСтр(Сегодня, dfDDMMYY); -- 31.05.98
  func ДатаСтр (dd :Date; frmt :Integer) :String;
    -- Представление даты
    if	  frmt=dfDDMMYY :	     -- 31.05.98
      ^МАСЧ(СТР(ДЕНЬ(dd)))+"."+МАСЧ(СТР(МЕС(dd)))+"."+МАСЧ(СТР(ГОД(dd)-ОТБР(ГОД(dd),-2)));
    elsif frmt=dfDDMMYYг :	     -- 31.05.98 г.
      ^МАСЧ(СТР(ДЕНЬ(dd)))+"."+МАСЧ(СТР(МЕС(dd)))+"."+МАСЧ(СТР(ГОД(dd)-ОТБР(ГОД(dd),-2)))+" г.";
    elsif frmt=dfDDMMYYгода :	     -- 31.05.98 года
      ^МАСЧ(СТР(ДЕНЬ(dd)))+"."+МАСЧ(СТР(МЕС(dd)))+"."+МАСЧ(СТР(ГОД(dd)-ОТБР(ГОД(dd),-2)))+" года";
    elsif frmt=dfDDMMYYYY :	      -- 31.05.1998
      ^МАСЧ(СТР(ДЕНЬ(dd)))+"."+МАСЧ(СТР(МЕС(dd)))+"."+СТР(ГОД(dd));
    elsif frmt=dfDDMMYYYYг :	     -- 31.05.1998 г.
      ^МАСЧ(СТР(ДЕНЬ(dd)))+"."+МАСЧ(СТР(МЕС(dd)))+"."+СТР(ГОД(dd))+" г.";
    elsif frmt=dfDDMMYYYYгода :      -- 31.05.1998 года
      ^МАСЧ(СТР(ДЕНЬ(dd)))+"."+МАСЧ(СТР(МЕС(dd)))+"."+СТР(ГОД(dd))+" года";
    elsif frmt=dfDDMMMMYY :	      -- 31 мая 98
      ^МАСЧ(СТР(ДЕНЬ(dd)))+" "+Месяца(МЕС(dd))+" "+МАСЧ(СТР(ГОД(dd)-ОТБР(ГОД(dd),-2)));
    elsif frmt=dfDDMMMMYYг :	     -- 31 мая 98 г.
      ^МАСЧ(СТР(ДЕНЬ(dd)))+" "+Месяца(МЕС(dd))+" "+МАСЧ(СТР(ГОД(dd)-ОТБР(ГОД(dd),-2)))+" г.";
    elsif frmt=dfDDMMMMYYгода :      -- 31 мая 98 года
      ^МАСЧ(СТР(ДЕНЬ(dd)))+" "+Месяца(МЕС(dd))+" "+МАСЧ(СТР(ГОД(dd)-ОТБР(ГОД(dd),-2)))+" года";
    elsif frmt=dfDDMMMMYYYY :	      -- 31 мая 1998
      ^МАСЧ(СТР(ДЕНЬ(dd)))+" "+Месяца(МЕС(dd))+" "+СТР(ГОД(dd));
    elsif frmt=dfDDMMMMYYYYг :	     -- 31 мая 1998 г.
      ^МАСЧ(СТР(ДЕНЬ(dd)))+" "+Месяца(МЕС(dd))+" "+СТР(ГОД(dd))+" г.";
    elsif frmt=dfDDMMMMYYYYгода :    -- 31 мая 1998 года
      ^МАСЧ(СТР(ДЕНЬ(dd)))+" "+Месяца(МЕС(dd))+" "+СТР(ГОД(dd))+" года";
    elsif frmt=dfDDMMMMYYYYгод :    -- "31" мая 1998 года
      ^'"'+МАСЧ(СТР(ДЕНЬ(dd)))+'" '+Месяца(МЕС(dd))+" "+СТР(ГОД(dd))+" года";
    elsif frmt=dfYYYYMMDD then	     -- 1998-05-31
      ^Str(Year(DD))+"-"+МАСЧ(Str(Mon(DD)))+"-"+МАСЧ(Str(Day(DD)));
    end;
  end; -- ДатаСтр --

  func DateToSQLStr(s: date): String;
  -- преобразование даты в формат MS-SQL
  var i: Integer;
  var sBuff, sD,sM, sY: String;
    sBuff = ДатаСтр(s,4);
    i = Pos('.', sBuff);
    sD = SubStr(sBuff, 1, i - 1);
    sBuff = SubStr(sBuff, i + 1, Length(sBuff));
    i = Pos('.', sBuff);
    sM = SubStr(sBuff, 1, i - 1);
    sY = SubStr(sBuff, i + 1, Length(sBuff));
    Return(sY + sM + sD);
  end; -- DateToSQLStr

func ЦифраДаты(ДД:Date;НомерЦифры:Integer):String;
-- Возвращает цифру даты по номеру
var рез:String;
  рез='';
  if ДД<>1.1.100:
    рез=SubStr(DateToString(ДД),НомерЦифры,1);
  fi;
  ^рез;
end;

--func ДатаСтрок (ДД :Date) :String;
--  -- Полное строковое представление даты через пробел: "31 мая 1998 года"
--  ^МАСЧ(СТР(ДЕНЬ(ДД)))+" "+Месяца(МЕС(ДД))+" "+СТР(ГОД(ДД))+" года";
--end; -- ДатаСтрок --

--func ДатаС (ДД :Date) :String;
--  -- Представление даты: "31.05.1998"
--  ^МАСЧ(СТР(ДЕНЬ(ДД)))+"."+МАСЧ(СТР(МЕС(ДД)))+"."+СТР(ГОД(ДД));
--end; -- ДатаС --

--func ДатаСтр (ДД :Date) :String;
--  -- Представление даты: "31.05.98 г."
--  ^МАСЧ(СТР(ДЕНЬ(ДД)))+"."+МАСЧ(СТР(МЕС(ДД)))+"."+СТР(ГОД(ДД)-1900)+" г.";
--end; -- ДатаСтр --


--*********** функции работы со строками**********************************

  func StrZ(n :Integer; len :Integer) :String;
    -- Преобразование целого к строке с ведущими нулями
  var s :String;
    s = Str(n);
    while (Length(s) < len) do	s = '0'+s;  od;
    ^ s;
  end; -- StrZ --

  func Str2Int(aStr :String) :Integer;
    -- Преобразование целого к строке с ведущими нулями
  var s,Si :String;
  var i :Integer;
    s = '';
    For i = 1..Length(aStr) do
       Si = Substr(aStr,i,1);
       If Раб.Сис.IsNum(Si) :
	  s = s + Si;
       fi;
    od;
    ^ Цел(s);
  end; -- Str2Int --

  func StrProb(n :String; len :Integer) :String;
    -- Преобразование строки к строке с заданной длиной пробелами
  var s :String;
    s = n;
    while (Length(s) < len) do	s = s+' ';  od;
    ^ s;
  end; -- StrProb --

  func BoolStr (l :Logical) :String;
    -- Преобразование логического к строке
    ^if(l:'true','false');
  end; -- BoolStr --

  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 TrimLeft(ss :String) :String;
  -- удаляет левые незначащие пробелы из строки
  var ind :Integer;
     if (ss = '') : Return(ss); fi;
     for ind = 0..(Length(ss)-1) do
       if (Substr(ss, ind+1, 1) <> ' ') : Break ; fi;
     end;
     Return(Substr(ss, ind+1, Length(ss)-ind));
  end; -- TrimLeft

  func TrimRight(s : String) :String;
  -- удаляет замыкающие пробелы из строки
  var a :String;
  var j :Integer;
    j = Length(s);
    a = Substr(s, j, 1);
    while (a=' ') and (j>0) do
      j = j - 1;
      a = Substr(s, j, 1);
    od;
    Return(Substr(s, 1, j));
  end; -- TrimRight

  func Trim (s : String) :String;
  -- удаляет из строки ведущие и замыкающие пробелы
    s = TrimLeft(s);
    s = TrimRight(s);
    return s;

-- закоментарил старый алгоритм
-- Сенков И. В. 09.01.03
--  var a :String;
--  var i,j :Integer;
--    i = 1;
--    a = Substr(s,i,1);
--    while a=' ' do
--	i = i + 1;
--	a = Substr(s,i,1);
--    od;
--    j = Length(s);
--    a = Substr(s, j, 1);
--    while a=' ' do
--	j = j - 1;
--	a = Substr(s, j, 1);
--    od;
--    Return(Substr(s, i, j-i+1));
  end; -- Trim

--*******************************************************************--
--************ ФУНКЦИИ Слов, ВыделитьСлова, СловоВСтроке ************--
--************ Используются в складе 6.9 Не удаляйте их. ************--
--*******************************************************************--

-- Функция подсчитывает количество слов в заданном тексте. Словом считается непрерывная последовательность
-- букв, цифр и знаков подчеркивания, отделенная от соседней такой последовательности символом-разделителем.
-- РАБ.Формат.Слов
  Func Слов(Строки: String; Delim: String): Integer; -- Число слов, разделенных "."
  Var i: Integer;
    if Length(Строки) > 0 :
      While True do
	If Pos(Delim, Строки)<>0:
	  i = i + 1;
	  Строки=Substr(Строки, Pos(Delim, Строки) + 1, Длина(Строки));
	Else
	  return i + 1;
	Fi;
      End;
    end;
  End; --Слов

-- Функция возвращает строку, содержащую несколько слово из исходного текста, причем порядковый номер
-- первого выделяемого слова соответствует значению параметра N1, а количество слов передается через
-- аргумент N2. Словом считается непрерывная последовательность букв, цифр и знаков подчеркивания,
-- отделенная от соседней такой последовательности символом-разделителем.
-- РАБ.Формат.ВыделитьСлова
  func ВыделитьСлова(Строки: String; n1: Integer; n2: Integer; Delim: String): String; -- слова от Нач Слов слов
  var Sub, Rez: String;
  var CurКоорд, i: Integer;
   Sub = Строки;
   I = 1;
   while True do
     CurКоорд=Pos(Delim, Sub);
     if CurКоорд <> 0 :
       if (Слов(Строки, Delim) >= i + 1) And (n1 <= i) And (I <= (n2 + n1 - 1)) :
	 Rez = Rez + Substr(Sub, 1, CurКоорд);
       end;
       I = i + 1;
       Sub = Substr(Sub, CurКоорд + 1, Длина(Sub));
     else
       if (n1 + n2 - 1) >= Слов(Строки, Delim) :
	 Rez = Rez + Substr(Sub, 1, Длина(Sub));
       end;
       break;
     end;
   end;
   return if(Substr(Rez, Длина(Rez), 1) = Delim, Substr(Rez, 1, Длина(Rez) - 1), Rez);
  end; --ВыделитьСлова

-- Функция возвращает значение ИСТИНА, если слово присутствует в тексте, и ЛОЖЬ в противном случае.
-- Словом считается непрерывная последовательность букв, цифр и знаков подчеркивания, отделенная от
-- соседней такой последовательности символом-разделителем.
-- С помощью аргумента Слово задается строка, содержащая слово.
-- Аргумент Текст определяет строку, в которой необходимо провести поиск указанного слова.
-- Последний аргумент указывает разделитель слов.
-- РАБ.Формат.СловоВСтроке

  func СловоВСтроке(Word: String; Text: String; Delim: String): Logical;
  var n1, n2: Integer;
  var Result: Logical;
    if Pos(Delim, Text) > 0 :
      n1 = Pos(Delim + Word, Text); n2 = Pos(Word + Delim, Text);
      Result = (n1 > 0 or n2 > 0);
    else
      Result = (Word = Text);
    end;
    return Result;
  end; -- СловоВСтроке

  func Space(n :Integer) :String;
  -- возвращает n пробелов
  var i :Integer;
  var s :String;
    s = '';
    for i=1..n do s = s + ' ';	end;
    Return(s);
  end; -- Space

  func PlaceStr(n :String; cnt :Integer; align :Integer) :String;
  -- возвращет строку длины cnt выравнивая ее в зависимости от параметра align.
  -- align = 0	- по центру,
  -- align = -1 - по левому краю,
  -- align = 1	- по правому краю.
  var s :String;
  var x :Integer;
    s = n;
    x = cnt-Length(s);
    if align=1	: s = Space(x) + s;
     | align=-1 : s = s + Space(x);
     | align=-0 :
       x = Int(x/2);
       s = Space(x) + s + Space(x);
       if length(s)>cnt : s = SubStr(s, 2, cnt); fi;
    fi;
    return(s);
  end;	-- PlaceStr

  -- функция возвращает полное название признака входящего в группу Srch из строки S
  -- В Srch передавать признак без точки !!!
  -- РАБ.ТСС.БИБ.BUHDEF.ExtractSig
  func ExtractSig(S: String; Srch: String): String;
  var N, N2: Integer;
  var SrchStr, CutStr, Result: String;
    Result = '';
    If SubStr(Srch,Length(Srch),1)<>'.':
      SrchStr = Up(Srch + '.');
    else
      SrchStr = Up(Srch);
    Fi;
    S = Up('{' + S);  -- чтобы при поиске 'П.' не находился 'СФП.'
    N = Pos(' ' + SrchStr, S);
    if N = 0 :
      N = Pos('{' + SrchStr, S);
      if N = 0 :
	N = Pos('+' + SrchStr, S);
	if N = 0 :
	  N = Pos('-' + SrchStr, S);
	end;
      end;
    end; -- N = 0
    if N > 0 :
      CutStr = Substr(S, N + 1, Length(S));
      N2 = Pos(' ', CutStr);
      Result = Substr(CutStr, 1, If(N2 > 0, N2, Длина(CutStr)));
    end;
    Result = Trim(Result);
    CutStr = Substr(Result, 1, 1);
    if CutStr = '-' or CutStr = '+' :
      Result = Substr(Result, 2, Length(Result));
    end;
    return Result;
  end; -- ExtractSig

--*********** функции работы с идентификаторами**********************************

--func МаСч(idAcc :String) :String2;
--  -- Добавляет ведущий ноль для идентиф. счетов, состоящих из одной цифры
--  2^0if (length(idAcc)=1 :"0"+idAcc, idAcc);
--end; -- МаСч --


  SignDelim :String = '.';

  func LastIdent(S :String ) :String;
  -- возвращает последнюю часть имени после разделителя групп у идентификатора
  var len ,ind :Integer;
    len = Length(S);
    ind =len;
    while (ind > 0) and (SubStr(S ,ind, 1)<>SignDelim) do
     ind =ind - 1;
    end;
    Return(SubStr(S, ind+1, len-ind));
  end; -- LastIdent

  func UnitAnal (Ana:S):S;
  -- Объединение аналитических признаков из бланка B и параметра Ana
    IF (Ana > " ") AND (B.AN > " ") :
    ^ "{("+Ana+")&("+B.AN+")}";
    |  (Ana > " ") AND (B.AN <=" ") :
    ^ "{("+Ana+")}";
    |  (Ana <=" ") AND (B.AN > " ") :
    ^ "{("+B.AN+")}";
    |  true :  ^ "";   FI;
  end; --  UnitAnal
----------------------------------------------------------------
func ExcludeSign(line:string;prefix:string;connector:string):string;
--функция возвращает строку признаков через пробелы, из которой исключен признак с заданным префиксом, если он там вообще был
--line - строка c аналитикой через пробелы, из кот.надо исключить признак
--prefix - аналит.справочник исключаемого признака без точки
--connector - соеденитель признаков (' ','&','|' и т.п.)
var line0:string;
   if Match(line,"*"+prefix+"*"):
      if Match(line,"*"+connector+prefix+".*") or Match(line,"*"+connector+prefix+connector+"*"):
	 line0=Substr(line,1,pos(prefix,line)-2);
	 line=Substr(line,pos(prefix,line),255);
	 line=line0+if(pos(connector,line)<>0,Substr(line,pos(connector,line),255),'');
      |  Match(line,prefix+".*") or Match(line,prefix+connector+"*") or line=prefix:
	 if pos(connector,line)=0:
	    line='';
	 else
	    line=Substr(line,pos(connector,line)+1,255);
	 fi;
      fi;
   fi;
   ^line;
end;
----------------------------------------------------------------
func ВзятьСправочник(AnSign:string):string;
--функция возвращает аналит.справочник признака AnSign
--(пример Раб.Формат.ВзятьСправочник('П.0001')='П',Раб.Формат.ВзятьСправочник('МС')='МС')
var iPos:integer;
   iPos=pos('.',AnSign);
   if iPos<>0:
      ^Substr(AnSign,1,iPos-1);
   else
      ^AnSign;
   fi;
end;
----------------------------------------------------------------------------

func Frac(aVal: Numeric): Numeric;
  Return aVal - Int(aVal);
end;

----------------------------------------------------------------------------
func Ceil(aVal: Numeric): Integer;
var vRes: Integer;
  vRes = Int(Trunc(aVal));
  if Frac(aVal) > 0 :
     vRes = vRes + 1;
  end;
  Return vRes;
end;

Конец