БЛАНКСШАБЛОНОМ[20.04.2006] "Выгрузка остатков НФА";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
var спр_код0[]:s;
var спр_код []:s;
var спр_имя []:s=if(спр_код[$]='','НЕОПРЕДЕЛЕН',Name_A(спр_код [$]));
var спр_имя0[]:s=Name_A(спр_код0[$]);
var спр_ст  []:l;
var спр_ст_УЧН  []:l;
var спр_макс:i=max(1,lengthofarray(спр_код0),lengthofarray(спр_код));
var st[]:s;
ФлДопОпции:l;
ФлКопирУЧНвЗН:l;
ФлНФА106:l;
var USE_ИНВ_ЦЕНА :Numeric;
2Func0 TimeToString(t:i):s;
 var hh,mm,ss:i;
 var hhs,mms,sss:s;
 hh=int(trunc(t/3600));
 mm=int(trunc((t-hh*3600)/60));
 ss=t-hh*3600-mm*60;
 hhs=str(hh);hhs=repstr('0',2-Length(hhs))+hhs;
 mms=str(mm);mms=repstr('0',2-Length(mms))+mms;
 sss=str(ss);sss=repstr('0',2-Length(sss))+sss;
 ^hhs+':'+mms+':'+sss;
2End0;


btnClose:Object; btnДействия:Object; СекцТабл :Object;
--BTNNAME_MENU    :String='Выгрузка остатков НФА ВД';
BTNNAME_MENU    :String='Выгрузка остатков НФА 2011->2012';
var Позиции     :Integer;
--var WorkYear    :Integer=2006;
var WorkYear    :Integer=2009;
var pfxINV      :String=if(WorkYear>2006, "УЧН",  "ИНВ");
var pfxNEW      :String="УЧН";
var dopan       :String;
var dopan1       :String;
var ДАТАОТЧ     :Date;
var статус      :String="статус";
var УЧН_ИНВКАРТ :Logical;
var УЧН_ПЕРЕНУМ :Logical;
var КОЛ_НЕНУЛЬ  :Logical;
var ИСКАТЬДАТЫ  :Logical=[True];
var ИГНОРНФА104 :Logical;
--
var flgБО       :Logical;
var flgВД       :Logical;
var flgВКЛ      :Logical;
var flgВП       :Logical;
var flgГГ       :Logical;
var flgК        :Logical;
var flgКВ       :Logical;
var flgКТ       :Logical;
var flgММДД     :Logical;
var flgП        :Logical;
var flgПГР      :Logical;
var flgПРТ      :Logical;
var flgРАЗМЕР   :Logical;
var flgРБС      :Logical;
var flgРОСТ     :Logical;
var flgФ        :Logical;
var flgЦ        :Logical;

--var MskНФА      :String="((*.101.*|*.102.*|*.105.*)&(???.????.???????.???.?.???.??.???))";
--var MskНФА      :String="((*.101.*|*.102.*|*.105.*)&(ЗАБ.??.???.??))";


--var MskНФА      :String="((*.101.*|*.102.*)&(???.????.???????.???.?.???.??.???))";-- учн

var MskНФА      :String=if(ФлНФА106,"(ЗАБ.??.106.??|???.????.???????.???.?.106.??.???)","((*.101.*|*.102.*|*.103.*|*.105.*)&(ЗАБ.??.???.??|???.????.???????.???.?.???.??.???))");

--var MskНФА      :String="((*.101.*|*.102.*|*.105.*)&(ЗАБ.??.???.??))";

var Buf[]       :String;
var BufT[]      :String;
var BufD[]      :String;
var nAna[]      :String;
var aAna[]      :String;

var addINV[]    :String;
var txtМОЛ[]    :String;
var txtМХЭ[]    :String;
var txtDANA[]   :String;
var refDANA[]   :Integer;

var LSTДА1[]    :String;
var LSTДА2[]    :String;
var LSTДА3[]    :String;
var LSTНФА[]    :String;
var LSTСУМ[]    :Numeric;
var LSTКОЛ[]    :Numeric;
--
var arМОЛ[]     :String;
var arМХЭ[]     :String;
var arНФА[]     :String;
var arУЧН[]     :String;
var arСЧУ[]     :String;
var arСЧА[]     :String;
var arДОП[]     :String;
var arНЕТМЕСАМ[]:Integer;
var arКОЛ[]     :Numeric;
var arСУМ[]     :Numeric;
var arАМТ[]     :Numeric;
var arДВЭ[]     :Date;
var arДПУ[]     :Date;
var arSRT[]     :String;
var arERR[]     :String;
var arСЧ6[]     :String;

var итКОЛ       :Numeric=SumOfArray(arКОЛ, Позиции);
var итСУМ       :Numeric=SumOfArray(arСУМ, Позиции);
var итАМТ       :Numeric=SumOfArray(arАМТ, Позиции);

2-- Общие процедуры и функции
Proc ОчиститьLST;
 ClearVariable(LSTНФА); ClearVariable(LSTДА1);
 ClearVariable(LSTСУМ); ClearVariable(LSTДА2);
 ClearVariable(LSTКОЛ); ClearVariable(LSTДА3);
end;

Proc Очистить;
 ClearVariable(txtМОЛ); ClearVariable(txtDANA); ClearVariable(nAna); ClearVariable(BufT); ClearVariable(addINV);
 ClearVariable(txtМХЭ); ClearVariable(refDANA); ClearVariable(aAna); ClearVariable(BufD); ClearVariable(Buf);
 ОчиститьLST;
end;

Proc ОчиститьТаблицу;
 ClearVariable(arМОЛ); ClearVariable(arУЧН); ClearVariable(arКОЛ); ClearVariable(arДОП); ClearVariable(arSRT);
 ClearVariable(arМХЭ); ClearVariable(arСЧУ); ClearVariable(arСУМ); ClearVariable(arДВЭ); ClearVariable(arERR);
 ClearVariable(arНФА); ClearVariable(arСЧА); ClearVariable(arАМТ); ClearVariable(arДПУ); ClearVariable(arСЧ6);ClearVariable(arНЕТМЕСАМ);
end;

Func ВыборДаты(srcDate:Date) :Date;
var dd :Date;
 if srcDate>1.1.100: dd=Calendar(srcDate); else dd=Calendar(ToDay); fi;
 if not(dd<=1.1.100): ^dd; else ^srcDate; fi;
end;

Func GetDate :Date;  -- считываем в заданном поле дату
var name :String;
 name=AsString(Template.Field);
 if name="ДАТАОТЧ": ^ДАТАОТЧ;
 fi;
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var name :String;
 name=AsString(Template.Field);
 if name="ДАТАОТЧ": ДАТАОТЧ = Value;
 fi;
end;

Proc СброситьНеобСправочники;
 flgБО      = False;
 flgВД      = False;
 flgВКЛ     = False;
 flgВП      = False;
 flgГГ      = False;
 flgК       = False;
 flgКВ      = False;
 flgКТ      = False;
 flgММДД    = False;
 flgП       = False;
 flgПГР     = False;
 flgПРТ     = False;
 flgРАЗМЕР  = False;
 flgРБС     = False;
 flgРОСТ    = False;
 flgФ       = False;
 flgЦ       = False;
end;

Func ПроверкаСправочников :Integer; -- на выходе - количество справочников в работе
var kol,t,z :Integer;

 kol=0;
 z=lengthofarray(спр_код);
 for t=1..z do
   if спр_ст[t]:
      спр_ст[t]=Saldo(MskНФА+"{"+"НФА.*&"+спр_код[t]+"*}", ДАТАОТЧ)>0;
   fi;
   if спр_ст[t]:
      kol=kol+1;
   fi;
 od;
 ^kol;
 if flgП      and not Saldo(MskНФА+"{"+"НФА.*&П.*"      +"}", ДАТАОТЧ)>0: flgП      = False; fi; -- [1]
 if flgКТ     and not Saldo(MskНФА+"{"+"НФА.*&КТ.*"     +"}", ДАТАОТЧ)>0: flgКТ     = False; fi; -- [2]
 if flgВД     and not Saldo(MskНФА+"{"+"НФА.*&ВД.*"     +"}", ДАТАОТЧ)>0: flgВД     = False; fi; -- [3]
 if flgПГР    and not Saldo(MskНФА+"{"+"НФА.*&ВКЛ.*"    +"}", ДАТАОТЧ)>0: flgПГР    = False; fi; -- [4]
 if flgРБС    and not Saldo(MskНФА+"{"+"НФА.*&РБС.*"    +"}", ДАТАОТЧ)>0: flgРБС    = False; fi; -- [5]

 if flgГГ     and not Saldo(MskНФА+"{"+"НФА.*&ГГ.*"     +"}", ДАТАОТЧ)>0: flgГГ     = False; fi; -- [6]
 if flgММДД   and not Saldo(MskНФА+"{"+"НФА.*&ММДД.*"   +"}", ДАТАОТЧ)>0: flgММДД   = False; fi; -- [7]
 if flgК      and not Saldo(MskНФА+"{"+"НФА.*&К.*"      +"}", ДАТАОТЧ)>0: flgК      = False; fi; -- [8]
 if flgВКЛ    and not Saldo(MskНФА+"{"+"НФА.*&ВКЛ.*"    +"}", ДАТАОТЧ)>0: flgВКЛ    = False; fi; -- [9]
 if flgВП     and not Saldo(MskНФА+"{"+"НФА.*&ВП.*"     +"}", ДАТАОТЧ)>0: flgВП     = False; fi; -- [10]
 if flgКВ     and not Saldo(MskНФА+"{"+"НФА.*&КВ.*"     +"}", ДАТАОТЧ)>0: flgКВ     = False; fi; -- [11]

 if flgПРТ    and not Saldo(MskНФА+"{"+"НФА.*&ПРТ.*"    +"}", ДАТАОТЧ)>0: flgПРТ    = False; fi; -- [12]
 if flgРАЗМЕР and not Saldo(MskНФА+"{"+"НФА.*&РАЗМЕР.*" +"}", ДАТАОТЧ)>0: flgРАЗМЕР = False; fi; -- [13]
 if flgРОСТ   and not Saldo(MskНФА+"{"+"НФА.*&РОСТ.*"   +"}", ДАТАОТЧ)>0: flgРОСТ   = False; fi; -- [14]
 if flgБО     and not Saldo(MskНФА+"{"+"НФА.*&БО.*"     +"}", ДАТАОТЧ)>0: flgБО     = False; fi; -- [15]
 if flgФ      and not Saldo(MskНФА+"{"+"НФА.*&Ф.*"      +"}", ДАТАОТЧ)>0: flgФ      = False; fi; -- [16]
 if flgЦ      and not Saldo(MskНФА+"{"+"НФА.*&Ц.*"      +"}", ДАТАОТЧ)>0: flgЦ      = False; fi; -- [17]

 if flgП      : kol=kol+1; fi;
 if flgКТ     : kol=kol+1; fi;
 if flgВД     : kol=kol+1; fi;
 if flgПГР    : kol=kol+1; fi;
 if flgРБС    : kol=kol+1; fi;

 if flgГГ     : kol=kol+1; fi;
 if flgММДД   : kol=kol+1; fi;
 if flgК      : kol=kol+1; fi;
 if flgВКЛ    : kol=kol+1; fi;
 if flgВП     : kol=kol+1; fi;
 if flgКВ     : kol=kol+1; fi;

 if flgПРТ    : kol=kol+1; fi;
 if flgРАЗМЕР : kol=kol+1; fi;
 if flgРОСТ   : kol=kol+1; fi;
 if flgБО     : kol=kol+1; fi;
 if flgФ      : kol=kol+1; fi;
 if flgЦ      : kol=kol+1; fi;

 ^kol;
end;

Func Mod(X:Integer; Y:Integer) :Integer; -- возвращает остаток от деления (X - делимое; Y - делитель)
 ^Int(X-Y*Int(Trunc(X/Y)));
end;

Func ЧетныйИндекс(Iter:Integer) :Logical;
 Iter=Abs(Iter);
 if Iter=1: ^False;
 |  Iter=2: ^True;
 |  Iter>2: if Mod(Iter, 2)=0: ^True; else ^False; fi;
 else ^False;
 fi;
end;

Func АвтокорректировкаПризнакаНФА_НастройкиОпераций(msg:Logical) :Logical;
var RO, OA, num, len, k, kk, i, j, xx, max_trans, kol_trans, NFA_trans :Integer;
var ini_trans, tmp, res :String;
 if msg:
    num=EnqOkCancel("Произвести в настройках операций по движению НФА^Mавтокорректировку привязки признака НФА в проводках?", mtConfirmation);
    if num=cmCancel: ^False; fi;
 fi;
 RO=OpenWorkArea("РПО_ДНФА", "", "");
 ShowProgress(0, "Подготовка...");
 Try
   num=Records(RO);
   if num>0:
      Try
        BeginChanging(RO);
        ShowProgress(num, "Обработка настроек операций...");
        for i=1 to num do
          res="";
          OA=OpenArray(RO, i, "ЗАПРОС", "", "");
          len=Records(OA);
          if len>0:
             max_trans=0; NFA_trans=0;
             for j=1 to len do
               ini_trans=GetFieldS(OA, j, "НОМПРОВОДКИ");
               kol_trans=0;
               kk=Length(ini_trans);
               if not ЧетныйИндекс(kk): kk=kk-1; fi;
               if kk>1:
                  k=kk;
                  while k>0 do
                    tmp=Up(SubStr(ini_trans, k, 1));
                    if tmp="Д" or tmp="К" or tmp="О": kol_trans=kol_trans+1; fi;
                    k=k-2;
                  end;
               fi;
               max_trans=Max(max_trans, kol_trans);
               if GetFieldI(OA, j, "ТИППАРАМЕТРА")=1 and Up(GetFieldS(OA, j, "ПОЛЕПОДТАБЛИЦЫ"))='НФА':    NFA_trans=j; fi;
--               if GetFieldI(OA, j, "ТИППАРАМЕТРА")=2 and Up(GetFieldS(OA, j, "ПОЛЕПОДТАБЛИЦЫ"))='КОЛНФА': QUA_trans=j; fi;
--               if GetFieldI(OA, j, "ТИППАРАМЕТРА")=3 and Up(GetFieldS(OA, j, "ПОЛЕПОДТАБЛИЦЫ"))='СУМНФА': SUM_trans=j; fi;
             od;
             ini_trans="";
             if NFA_trans>0:
                ini_trans=GetFieldS(OA, NFA_trans, "НОМПРОВОДКИ");
                kk=Length(ini_trans);
                if not ЧетныйИндекс(kk): kk=kk-1; fi;
                if kk<max_trans and max_trans>0: kk=max_trans; fi;
                if kk>1:
                  xx=0;
                  k=0;
                  while kk>=xx do
                    k=k+1;
                    xx=xx+2;
                    tmp=Up(SubStr(ini_trans, xx, 1));
                    if (tmp<>"Д" or tmp<>"К" or tmp<>"О") and k<=max_trans: tmp="о"; fi;
                    res=res+Str(k)+Lo(tmp);
                  od;
                fi;
                if res<>"": xx=PutFieldS(OA, NFA_trans, "НОМПРОВОДКИ", res); fi;
             fi;
          fi;
          CloseWorkArea(OA);
        od;
        EndChanging(RO);
      Except
        CancelChanging(RO);
        if msg: Message("Ошибка "+Str(ErrorCode)+"!", mtError); fi;
        Raise;
        ^False;
      end;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 if i=num: ^True; fi;
 ^False;
end;

Func ПодготовитьINIНФА :Logical;
var RO, OA, num, i, j, len, num_NFA, xx :Integer;
var OK :Logical;
 OK=False;
 ClearVariable(Buf);
 ClearVariable(BufT);
 RO=OpenWorkArea("РПО_ДНФА", "", "");
 Try
   num=Records(RO);
   if num>0:
      ShowProgress(num, "Подготовка...");
      Try
        for i=1 to num do
          OA=OpenArray(RO, i, "ЗАПРОС", "", "");
          len=Records(OA);
          if len>0:
             num_NFA=0;
             for j=1 to len do
               if GetFieldI(OA, j, "ТИППАРАМЕТРА")=1 and Up(GetFieldS(OA, j, "ПОЛЕПОДТАБЛИЦЫ"))='НФА':
                  num_NFA=j;
                  Break;
               fi;
             od;
             if num_NFA>0:
                xx=InsertInArraySort(Buf, GetFieldS(RO, i, "ДНФА"));
                InsertInArray(BufT, xx, GetFieldS(OA, num_NFA, "НОМПРОВОДКИ"));
             fi;
          fi;
          CloseWorkArea(OA);
        od;
      Finally
        CloseProgress;
      end;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 if LengthOfArray(Buf)>0: OK=True; fi;
 ^OK;
end;

Func ВзятьКОДНФАизОСТАТКОВ(Value:String) :String;
var num, i, len :Integer;
var Char, res :String;
 num=Pos("НФА.10", Up(Value));
 if num>0: -- возможный признак НФА
    if num>1: Value=Delete(Value, 1, num-1); fi;
    len=Length(Value);
    if len>0:
       res="";
       for i=1 to len do
         Char=SubStr(Value, i, 1);
         if РАБ.НФА.FUNC_LIB.ПроверитьСимвол(Char): res=res+Char; else Break; fi;
       od;
       if res<>"" and Name_A(res)<>" ": ^res; fi;
    fi;
 fi;
 ^"";
end;

Func АвтокорректировкаПризнакаНФА_ОперацииДвижения(msg:Logical; датаОстатков:Date) :Logical;
var RO, num, j, kk, yy, xx, zz, i, len, orders, OA :Integer;
var ini_trans, КОДНФА1,  КОДНФА2 :String;
 if msg:
    num=EnqOkCancel("Произвести в картотеке операций по движению НФА^Mавтокорректировку привязки признака НФА в проводках?", mtConfirmation);
    if num=cmCancel: ^False; fi;
 fi;
 if not ПодготовитьINIНФА: if msg: Message("Ошибка считывания настроек^Mопераций по движению НФА!", mtError); fi; ^False; fi;
 if not датаОстатков>=Dat(1, 1, WorkYear):
    Message("Некорректная дата остатков!^M(дата должна быть позже "+DateToString(Dat(1, 1, WorkYear))+")", mtWarning);
    ^False;
 fi;
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_ОПЕРАЦИИДНФА", "", "ПРОВОДИТЬ AND ДАТОПЕР<"+DateToString(датаОстатков));
 Try
   num=Records(RO);
   if num>0:
      ShowProgress(num, "Обработка операций движения НФА...");
      Try
        kk=0; yy=0;
        for j=1 to num do
          ProgressPos(j);
          if kk=0: BeginChanging(RO); fi;
          kk=kk+1;
          -- *** --
          -- Работа с расфиксированной записью
          xx=SearchInArray(Buf, GetFieldS(RO, j, "АН_ДНФА"), True, 1);
          if xx>0:
             ini_trans=BufT[xx];
             if ini_trans<>"": zz=PutFieldS(RO, j, "ТНФА", ini_trans); fi;
          fi;
          -- Работа с фиксированной записью
          -- zz=PutFieldL(RO, j, "ФИКС", False);
          if GetFieldL(RO, j, "ФИКС"):
             ClearVariable(aAna);
             OA=OpenArray(RO, j, "ПОЗИЦИИ_ФИКС", "", "");
             len=Records(OA);
             if len>0:
                for i=1 to len do
                   orders=GetFieldI(OA, i, "НОМЕРПП");
                  КОДНФА1=Trim(GetFieldS(OA, i, "НФАПР"));
                  КОДНФА2=Trim(ВзятьКОДНФАизОСТАТКОВ(GetFieldS(OA, i, "ОСТНФА")));
                  if Match(КОДНФА1, "НФА.???.??.*"): 
                     aAna[orders]=КОДНФА1;
                  else
                     if КОДНФА1="":
                        if aAna[orders]<>"":
                           zz=PutFieldS(OA, i, "НФАПР", aAna[orders]);
                        else
                           if Match(КОДНФА2, "НФА.???.??.*"): zz=PutFieldS(OA, i, "НФАПР", КОДНФА2); fi;
                        fi;
                     fi;
                  fi;
                od;
             fi;
             CloseWorkArea(OA);
          fi;
          -- *** --
          if kk=200: --записываем очередную порцию записей
            EndChanging(RO);
            yy=yy+kk;
            kk=0;
          fi;
        od;
        if kk>0: EndChanging(RO); yy=yy+kk; fi; --если последняя порцию неполная
      Except
        Message(if(yy>0, "Всего обработано "+Str(yy)+" записей из "+Str(num)+"."+Chr(13), "")+
                         "Ошибка "+Str(ErrorCode)+"."+Chr(13)+
                         "Дальнейшая обработка невозможна!", mtError);
        CancelChanging(RO);
        Raise;
        ^False;
      end;
   else
      Message("Картотека операций движения НФА [РПО_ОПЕРАЦИИДНФА] пустая!", mtWarning);
      ^False;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 if j=num: ^True; fi;
 ^False;
end;

Func АвтокорректировкаПривязкиПроводокДляПризнакаНФА(UserUse:Logical; msg:Logical) :Logical;
var xx :Integer;
var TextMsg :String;
 if not UserUse: msg=False; fi;
 if msg:
    TextMsg="В настройках операций движения НФА и в картотеке движения НФА^M"+
            "исправить привязку признака НФА в проводках?^M^M"+
            "Возможны действия:^M"+
            "1) Только отчет по ошибкам.^M"+
            "2) Исправить настройки операций + отчет по ошибкам.^M"+
            "3) Все исправить автоматически.";
    xx=Enquiry("Выберите действие...", TextMsg, "Отмена;Пункт 1;Пункт 2;Пункт 3", mtConfirmation);
 else
    xx=4;
 fi;
 if xx=2:
    Refresh(False);
    if Abs(Turn("+*{ДНФА.*&~НФА.*}", 1.1.100, ДАТАОТЧ))>0 or Abs(Turn("-*{ДНФА.*&~НФА.*}", 1.1.100, ДАТАОТЧ))>0:
       if msg: Message("Обнаружены проводки в операциях движения НФА^Mнепомеченные справочником НФА!", mtWarning); fi;
       Report(PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst"+"|Непомеченные_НФА", 1.1.100, ДАТАОТЧ, "", "ДНФА.*&~НФА.*");
      ^False;
    fi;
 |  xx=3:
    if АвтокорректировкаПризнакаНФА_НастройкиОпераций(msg):
       if msg: Message("Корректировка настроек операций движения НФА прошла успешно!", mtInformation); fi;
    fi;
    Refresh(False);
    if Abs(Turn("+*{ДНФА.*&~НФА.*}", 1.1.100, ДАТАОТЧ))>0 or Abs(Turn("-*{ДНФА.*&~НФА.*}", 1.1.100, ДАТАОТЧ))>0:
       if msg: Message("Обнаружены проводки в операциях движения НФА^Mнепомеченные справочником НФА!", mtWarning); fi;
       Report(PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst"+"|Непомеченные_НФА", 1.1.100, ДАТАОТЧ, "", "ДНФА.*&~НФА.*");
      ^False;
    fi;
 |  xx=4:
    if АвтокорректировкаПризнакаНФА_НастройкиОпераций(msg):
       if msg: Message("Корректировка настроек операций движения НФА прошла успешно!", mtInformation); fi;
    fi;
    if АвтокорректировкаПризнакаНФА_ОперацииДвижения(msg, ДАТАОТЧ):
       if msg: Message("Корректировка картотеки операций движения НФА прошла успешно!", mtInformation); fi;
    fi;
    Refresh(False);
 else ^False;
 fi;
 ^True;
end;

Func ВзятьНФАПолныйСчетДеб(Acc:String) :String;
var Res :String;
 if Match(Acc, "???.????.???????.???.?.101.??.???")   : Res=SubStr(Acc, 1, 30)+"310";
 |  Match(Acc, "???.????.???????.???.?.102.??.???")   : Res=SubStr(Acc, 1, 30)+"320";
 |  Match(Acc, "???.????.???????.???.?.103.??.???")   : Res=SubStr(Acc, 1, 30)+"330";
 |  Match(Acc, "???.????.???????.???.?.105.??.???")   : Res=SubStr(Acc, 1, 30)+"340";
 |  Match(Acc, "???.????.???????.???.?.106.??.2??")   : Res=Acc;
 |  Match(Acc, "???.????.???????.???.?.106.?1.???")   : Res=SubStr(Acc, 1, 30)+"310";
 |  Match(Acc, "???.????.???????.???.?.106.?2.???")   : Res=SubStr(Acc, 1, 30)+"320";
 |  Match(Acc, "???.????.???????.???.?.106.?4.???")   : Res=SubStr(Acc, 1, 30)+"340";
 |  Match(Acc, "ЗАБ.??.10?.??")                       : Res=Acc;
 else Res="";
 fi;
 ^Res;
end;
func Соотв104поСЧНФА(СЧНФА:s):s;
  var ss:s;
  if match(СЧНФА,'???.????.???????.???.?.101.??.???') or match(СЧНФА,'???.????.???????.???.?.102.??.???'):
     ss=SubStr(СЧНФА,24,3);
     if ss='102':ss=SubStr(СЧНФА,28,1);^'*.?.104.'+ss+'9.420';
      | ss='101':ss=SubStr(СЧНФА,28,2);^'*.?.104.'+ss+'.410';
     fi;
  fi;
  ^'';
end;

Func СчетАмортизацииПоСчетуНФА(СЧТНФА:String) :String;
var КБК, СЧ6, res :String;
-- res=Раб.НФА.B01.Соотв104поСЧНФА(СЧТНФА);
 res=Соотв104поСЧНФА(СЧТНФА);
 ^res;
end;
Func СчетАмортизацииПоСчетуНФА_полный(СЧНФА:String) :String;
var КБК, СЧ6, res :String;
  var ss:s;
  if match(СЧНФА,'???.????.???????.???.?.101.??.???') or match(СЧНФА,'???.????.???????.???.?.102.??.???'):
     ss=SubStr(СЧНФА,24,3);
     if ss='102':ss=SubStr(СЧНФА,1,23)+'104.'+SubStr(СЧНФА,28,1)+'9.420';
      | ss='101':ss=SubStr(СЧНФА,1,23)+'104.'+SubStr(СЧНФА,28,2)+'.410';
     fi;
  fi;
  ^ss;
end;



Func ВзятьСЧЕТ6(СЧТНФА:String) :String;
var res :String;
 res="";
 if Match(СЧТНФА, "???.????.???????.???.?.101.??.???")   : res=SubStr(СЧТНФА, 24, 6);
 |  Match(СЧТНФА, "???.????.???????.???.?.102.??.???")   : res=SubStr(СЧТНФА, 24, 6);
 |  Match(СЧТНФА, "???.????.???????.???.?.103.??.???")   : res=SubStr(СЧТНФА, 24, 6);
-- |  Match(СЧТНФА, "???.??.??.??.??.??.????.?.103.??.???"): res=SubStr(СЧТНФА, 27, 6);
 |  Match(СЧТНФА, "???.????.???????.???.?.105.??.???")   : res=SubStr(СЧТНФА, 24, 6);
 |  Match(СЧТНФА, "???.????.???????.???.?.106.??.???")   : res=SubStr(СЧТНФА, 24, 6);
 |  Match(СЧТНФА, "ЗАБ.??.10?.??")                       : res="ЗАБАЛАНС";
 else res="";
 fi;
 ^res;
end;
var недвижимоеОС_список[]:s;
proc Заполнить_недвижимоеОС_список;
  var wa,rs,t:i;
  var s0,s1:s;
  ClearVariable(недвижимоеОС_список);
  wa=openworkarea('РПО_НФА','','НЕСПИСЫВАТЬДО1000');
     rs=records(wa);
     for t=1..rs do
       s1=trim(getfields(wa,t,'ПРИЗНАК'));
       if s1<>'':
          s0=trim(getfields(wa,t,'ГРНФА'));
          if s0<>'':
             s0='НФА.'+s0+'.'+s1;
             addinarray(недвижимоеОС_список,true,false,s0);
          fi;
       fi;
     od;
  closeworkarea(wa);
end;

Func НедвижимоеОС(nfa:s):l;
 ^SearchInArray(недвижимоеОС_список,nfa,true)>0;
end;

Func USE_ИНВЕНТАРНЫЙ_НОМЕР(ACC:String; Цена:Numeric; QUA:Numeric; NFA:String) :Logical;
 if Match(ACC, "*.?.101.??.???"):
    if НедвижимоеОС(NFA): ^True; fi;
    if not Match(ACC, "*.101.?7.???") and Цена>USE_ИНВ_ЦЕНА and QUA>0: ^True; fi;
 |  Match(ACC, "*.?.102.??.???"): ^True;
 |  Match(ACC, "*.?.103.??.???"): ^True;
 fi;
 ^False;
end;

Func USE_ИНВЕНТАРНЫЙ_НОМЕР_(nfa:String;uchn:String) :Logical;
var kol,sum,Цена:n;
 if Trim(uchn)='': ^False; fi;
 if НедвижимоеОС(nfa):^True; fi;
 if Match(nfa, "НФА.101.*"):
   kol=ОСТАТОК('*.?.101.??.???{'+nfa+'&'+uchn+'}',ДАТАОТЧ,'КОЛ');
   sum=ОСТАТОК('*.?.101.??.???{'+nfa+'&'+uchn+'}',ДАТАОТЧ);
   if kol>0:Цена=sum/kol;
    | true: Цена=sum;
   fi;
   if Цена<0:Цена=-Цена;fi;
   ^Цена>USE_ИНВ_ЦЕНА;
 |  Match(nfa, "НФА.102.*"): ^True;
 |  Match(nfa, "НФА.103.*"): ^True;
 fi;
 ^False;
end;

Func ДобавитьСвободныйУчетныйНомер(maxLEN:Integer) :String;
var res, ANA, tmp :String;
var xx :Integer;
var OK :Logical;
 res=""; OK=False; xx=0;
 for Sign ANA=pfxINV+"."+RepStr("?", maxLEN), Sort do
   tmp=SubStr(ANA, 5, 255); -- 5 --> ИНВ.X
   --tmp=SubStr(ANA, Length(pfxINV)+2, 255); -- 5 --> ИНВ.X
   xx=Int(tmp);
   if Length(tmp)=maxLEN and xx>0:
     if not SignUsed(ANA) and SearchInArray(aAna, ANA, True, 1)=-1:
       InsertInArraySort(aAna, ANA);
       res=ANA;
       OK=True;
       Break;
     fi;
   fi;
 end;
 if not OK: -- если в цикле не нашли то создаем новый признак
   while not OK do
     xx=xx+1;
     tmp=Str(xx);
     ANA=pfxINV+"."+RepStr("0", maxLEN-Length(tmp))+tmp;
     if Name_A(ANA)=" ": res=ANA; OK=True; fi; -- Name_A на всякий случай
   end;
 fi;
 ^res;
end;
Func ВзятьДЭКСПЛ_КМНТ(КМНТ:s):d;
  var ДЭКСПЛ:d;
  var p:i;
      КМНТ=' '+КМНТ;
      p=pos(' ДЭКСПЛ=',КМНТ);
      if p>0:
       КМНТ=substr(КМНТ,p+8,10);
       ДЭКСПЛ=строкувдату(КМНТ);
      fi;
      ^ДЭКСПЛ;
end;
Func ВзятьДУЧЕТ_КМНТ(КМНТ:s):d;
  var ДУЧЕТ:d;
  var p:i;
      КМНТ=' '+КМНТ;
      p=pos(' ДУЧЕТ=',КМНТ);
      if p>0:
       КМНТ=trim(substr(КМНТ,p+8,10));
       if match(КМНТ,'?.??.????'):КМНТ='1'+КМНТ;fi;
       ДУЧЕТ=строкувдату(КМНТ);
      fi;
      ^ДУЧЕТ;
end;
Func ВзятьПризнакПоСправочникуИзСтрокиПризнаков(СПР:S; Приоритет:S;СтрокаПризнаков:S):s;
var Итог,s0,s1:s;
var p,z,t :i;
 СтрокаПризнаков=up(trim(СтрокаПризнаков));
 if СтрокаПризнаков='':^'';fi;
 Итог='';
 СПР=up(ВыделитьСлово(1,СПР,'.'))+'.';
 СтрокаПризнаков=' '+СтрокаПризнаков+' ';
 Приоритет=Приоритет+' ';
 z=Length(Приоритет);
 for t=1..z do
   s1=SubStr(Приоритет,t,1);
   s0=s1+СПР;
   p=pos(s0,СтрокаПризнаков);
   if p>0:
      СтрокаПризнаков=SubStr(СтрокаПризнаков,p+1,255);
      p=pos(' ',СтрокаПризнаков);
      Итог=s1+SubStr(СтрокаПризнаков,1,p-1);
      Break;
   fi;
 od;
 ^Итог;
end;

Func ВзятьПризнакПоСправочникуИзПроводки(УслНаСч:S;УслНаАн:S; СПР:S; Приоритет:S; dd0:D; dd1:D; revers:L) :s;
var УслНаПр ,Итог:s;
var t :i;
 Итог='';
 СПР=ВыделитьСлово(1,СПР,'.');
 УслНаАн=Раб.НФА.B01.abl(УслНаАн,'&',СПР+'.*');
 УслНаПр=УслНаСч+'{'+УслНаАн+'}';
 if revers:
    for Transaction t=УслНаПр,dd0 , dd1 ,reverse do
        Итог=ВзятьПризнакПоСправочникуИзСтрокиПризнаков(СПР,Приоритет,TransSigns(t));
        Break;
    od;
  | true:
    for Transaction t=УслНаПр,dd0 , dd1  do
        Итог=ВзятьПризнакПоСправочникуИзСтрокиПризнаков(СПР,Приоритет,TransSigns(t));
        Break;
    od;
 fi;
 ^Итог;
end;

Func РасчетДопАнПоПроводкам(УслНаСч:S;УслНаАн:S; списокСПР:S; списокПриоритетов:S; dd0:D; dd1:D; revers:L; ИсклАн:s) :s;
var Итог,s0,s1,s2:s;
var t,z :i;
 ИсклАн=' '+up(ИсклАн);
 Итог='';
 списокСПР=up(списокСПР);
 z=КоличествоСлов(списокСПР,'|');
 for t=1..z do
   s0=ВыделитьСлово(t,списокСПР,'|');
   s1=' '+ВыделитьСлово(1,s0,'.')+'.';
   if pos(s1,ИсклАн)<1:
      s2=ВыделитьСлово(t,списокПриоритетов,'|');
      s2=ВзятьПризнакПоСправочникуИзПроводки(УслНаСч,УслНаАн,s0,s2,dd0,dd1,revers);
      s2=SubStr(s2,2,255);-- отбрасываем пробел или + или -
      Итог=Раб.НФА.B01.ab(Итог,' ',s2);
   fi;
 od;
 ^Итог;
end;

Func ВзятьДатуПринКУчету(СЧ26:String; КОДНФА:String; КОДУЧН:String; ddEND:Date) :Date;
var ANA :String;
var dd  :Date;
var xx  :Integer;
var RO, OA, num, i :Integer;
var REC :Record;
    ^РАБ.НФА.B01.ВзятьДУЧЕТ(КОДНФА,КОДУЧН);
end;

Func ПолеПоТипуПрисутствуетКартотеке(CRD:String; SubCRD:String; Field:String; Type:Integer) :Logical;
var num :Integer;
var WorkCRD :String;
 if CRD="" or not ExistsCardFile(CRD): ^False; fi;
 ClearVariable(Buf);
 num=GetCardFileFields(CRD, Buf, mtlSUBTAB);
 if num>1:
    SortArray(Buf);
    if SearchInArray(Buf, SubCRD, True, 1)>0: WorkCRD=CRD+"@"+SubCRD; else ^False; fi;
 |  num=1:
    if Buf[1]=SubCRD: WorkCRD=CRD+"@"+SubCRD; else ^False; fi;
 else ^False;
 fi;
 ClearVariable(Buf);
 num=GetCardFileFields(WorkCRD, Buf, Type);
 if num>1:
    SortArray(Buf);
    if SearchInArray(Buf, Field, True, 1)>0: ^True; else ^False; fi;
 |  num=1:
    if Buf[1]=Field: ^True; else ^False; fi;
 else ^False;
 fi;
 ^False;
end;

Func ВзятьДатуВводаЭкспл(СЧ26:String; КОДНФА:String; КОДУЧН:String; ddEND:Date; useДУ:Logical) :Date;
var ANA, СЧТ, КОДМХЭ, КОДМОЛ :String;
var dd, dd1, dd2 :Date;
var xx, RO, OA, num, i :Integer;
var SUM, sumBase, Цена :Numeric;
var REC :Record;
    ^РАБ.НФА.B01.ВзятьДЭКСПЛ(КОДНФА,КОДУЧН);
end;

Proc ЗакрытьФайлПоОшибке(numberFile:Integer; FlagCreate:Logical; nameFile:String);
 if FlagCreate=True:
   TextFileClose(numberFile);
   Message("Ошибка записи в файл '"+nameFile+"'!", mtError);
  else
   Message("Ошибка создания файла '"+nameFile+"'!", mtError);
 fi;
end;

Proc ЗаписатьCDF(FullPath:String);
var FlagCreate :Logical;
var FF :Integer;
 Try
   if ExistFile(FullPath): DeleteFile(FullPath); fi;
   FlagCreate=False;
   FF=TextFileCreate(FullPath);
   FlagCreate=True;
   TextFileWriteLn(FF, "[РПО_ОСТ_НФА"                   );
   TextFileWriteLn(FF, "("                              );
   TextFileWriteLn(FF, "CreateTime:DATETIME"            );
   TextFileWriteLn(FF, "UpdateTime:DATETIME"            );
   TextFileWriteLn(FF, "ПРОВОДИТЬ:BOOLEAN"              );
   TextFileWriteLn(FF, "ДАТОПЕР:DATE"                   );
   TextFileWriteLn(FF, "CREATEDUSER:STRING"             );
   TextFileWriteLn(FF, "М:STRING"                       );
   TextFileWriteLn(FF, "МОЛ:STRING"                     );
   TextFileWriteLn(FF, "ГОДОСТ:STRING"                  );
   TextFileWriteLn(FF, "MODIFIEDUSER:STRING"            );
   TextFileWriteLn(FF, "ПОЗИЦИИ:SUBTAB"                 );
   TextFileWriteLn(FF, "М_ИМЯ:STRING"                   );
   TextFileWriteLn(FF, "МОЛ_ИМЯ:STRING"                 );
   TextFileWriteLn(FF, "РПО_КЛЮЧ:STRING"                );
   TextFileWriteLn(FF, "CLOSEDMODFOB:BOOLEAN"           );
   TextFileWriteLn(FF, "НОМЕР:STRING"                   );
   TextFileWriteLn(FF, "НОВЫЙОТЧЕТНЫЙПЕРИОДНАЧАЛО:DATE" );
   TextFileWriteLn(FF, "ПОЗИЦИИ_БУХ:SUBTAB"             );
   TextFileWriteLn(FF, "КОНВ:INTEGER"                   );
   TextFileWriteLn(FF, "CURRENTRECORD:РПО_ОСТ_НФА"      );
   TextFileWriteLn(FF, "СВЕРНУТЬБУХ:BOOLEAN"            );
   TextFileWriteLn(FF, "ОБЩАН:STRING"                   );
   TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН:STRING"           );
   TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К0:REAL"          );
   TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К1:REAL"          );
   TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К2:REAL"          );
   TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К3:REAL"          );
   TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К4:REAL"          );
   TextFileWriteLn(FF, "ПОЗИЦИИОС:SUBTAB"               );
   TextFileWriteLn(FF, "ПРОВОДИТЬ_БУХ:BOOLEAN"          );
   TextFileWriteLn(FF, "ПЕРЕОЦЕНКА:BOOLEAN"             );
   TextFileWriteLn(FF, "КМНТ:STRING"                    );
   TextFileWriteLn(FF, "ИТОГОСУМНФА:REAL"               );
   TextFileWriteLn(FF, "ИТОГОКОЛНФА:REAL"               );
   TextFileWriteLn(FF, "УЧИТЫВАТЬДРАГМЕТ:BOOLEAN"       );
   TextFileWriteLn(FF, "  [РПО_ОСТ_НФА@ПОЗИЦИИ"         );
   TextFileWriteLn(FF, "  ("                            );
   TextFileWriteLn(FF, "  НФА:STRING"                   );
   TextFileWriteLn(FF, "  СЧНФА:STRING"                 );
   TextFileWriteLn(FF, "  СУМНФА:REAL"                  );
   TextFileWriteLn(FF, "  ДОПАН:STRING"                 );
   TextFileWriteLn(FF, "  КОЛНФА:REAL"                  );
   TextFileWriteLn(FF, "  СЧ00:STRING"                  );
   TextFileWriteLn(FF, "  РУЧАН1:STRING"                );
   TextFileWriteLn(FF, "  РУЧАН2:STRING"                );
   TextFileWriteLn(FF, "  ГОДАПЕРЕОЦЕНОК:STRING"        );
   TextFileWriteLn(FF, "  КОЭФПЕРЕОЦЕНОК:STRING"        );
   TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКНФА:STRING"      );
   TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКНФАИТОГ:REAL"    );
   TextFileWriteLn(FF, "  ДЕБПЕРЕОЦЕНОК:STRING"         );
   TextFileWriteLn(FF, "  КРЕПЕРЕОЦЕНОК:STRING"         );
   TextFileWriteLn(FF, "  ФКР0:STRING"                  );
   TextFileWriteLn(FF, "  ДРАГМЕТ00:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ01:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ02:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ03:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ04:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ05:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ06:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ07:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ08:REAL"               );
   TextFileWriteLn(FF, "  )"                            );
   TextFileWriteLn(FF, "  ]"                            );
   TextFileWriteLn(FF, "  [РПО_ОСТ_НФА@ПОЗИЦИИ_БУХ"     );
   TextFileWriteLn(FF, "  ("                            );
   TextFileWriteLn(FF, "  НФАПР:STRING"                 );
   TextFileWriteLn(FF, "  КОЛНФАПР:REAL"                );
   TextFileWriteLn(FF, "  СУМ:REAL"                     );
   TextFileWriteLn(FF, "  ДСЧЕТ:STRING"                 );
   TextFileWriteLn(FF, "  КСЧЕТ:STRING"                 );
   TextFileWriteLn(FF, "  КМНТ:STRING"                  );
   TextFileWriteLn(FF, "  АН:STRING"                    );
   TextFileWriteLn(FF, "  ФКР0:STRING"                  );
   TextFileWriteLn(FF, "  )"                            );
   TextFileWriteLn(FF, "  ]"                            );
   TextFileWriteLn(FF, "  [РПО_ОСТ_НФА@ПОЗИЦИИОС"       );
   TextFileWriteLn(FF, "  ("                            );
   TextFileWriteLn(FF, "  НФА:STRING"                   );
   TextFileWriteLn(FF, "  СЧНФА:STRING"                 );
   TextFileWriteLn(FF, "  СУМНФА:REAL"                  );
   TextFileWriteLn(FF, "  КОЛНФА:REAL"                  );
   TextFileWriteLn(FF, "  СЧ00:STRING"                  );
   TextFileWriteLn(FF, "  РУЧАН1:STRING"                );
   TextFileWriteLn(FF, "  РУЧАН2:STRING"                );
   TextFileWriteLn(FF, "  ДОПАН:STRING"                 );
   TextFileWriteLn(FF, "  ДЕБАМОРТ00:STRING"            );
   TextFileWriteLn(FF, "  СЧЕТАМОРТ:STRING"             );
   TextFileWriteLn(FF, "  ДЕБАМОРТ:STRING"              );
   TextFileWriteLn(FF, "  ДЭКСПЛ:DATE"                  );
   TextFileWriteLn(FF, "  ДЭКСПЛММДДГГ:STRING"          );
   TextFileWriteLn(FF, "  ДУЧЕТ:DATE"                   );
   TextFileWriteLn(FF, "  УЧНОМ:STRING"                 );
   TextFileWriteLn(FF, "  СУМАМ00:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ01:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ02:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ03:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ04:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ05:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ06:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ07:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ08:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ09:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ10:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ11:REAL"                 );
   TextFileWriteLn(FF, "  СУМАМ12:REAL"                 );
   TextFileWriteLn(FF, "  НЕТМЕСАМОРТ:INTEGER"          );
   TextFileWriteLn(FF, "  ДРАГМЕТ00:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ01:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ02:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ03:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ04:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ05:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ06:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ07:REAL"               );
   TextFileWriteLn(FF, "  ДРАГМЕТ08:REAL"               );
   TextFileWriteLn(FF, "  ГОДАПЕРЕОЦЕНОК:STRING"        );
   TextFileWriteLn(FF, "  КОЭФПЕРЕОЦЕНОК:STRING"        );
   TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКНФА:STRING"      );
   TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКАМОРТ:STRING"    );
   TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКНФАИТОГ:REAL"    );
   TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКАМОРТИТОГ:REAL"  );
   TextFileWriteLn(FF, "  ДЕБПЕРЕОЦЕНОК:STRING"         );
   TextFileWriteLn(FF, "  КРЕПЕРЕОЦЕНОК:STRING"         );
   TextFileWriteLn(FF, "  ДЕБПЕРЕОЦЕНОКАМОРТ:STRING"    );
   TextFileWriteLn(FF, "  КРЕПЕРЕОЦЕНОКАМОРТ:STRING"    );
   TextFileWriteLn(FF, "  КМНТ:STRING"                  );
   TextFileWriteLn(FF, "  ДОПАНПЕР:STRING"              );
   TextFileWriteLn(FF, "  ФКР0:STRING"                  );
   TextFileWriteLn(FF, "  )"                            );
   TextFileWriteLn(FF, "  ]"                            );
   TextFileWriteLn(FF, ")"                              );
   TextFileWriteLn(FF, "]"                              );
 Except
   ЗакрытьФайлПоОшибке(FF, FlagCreate, FullPath); Raise; Exit;
 end;
 TextFileClose(FF);
end;

Func ВзятьСловоИзНабораПоМаске(Set:String; SetSep:String; Mask:String; MaskSep:String) :String;
var nn1, nn2, i, j :Integer;
var Res, tmp1, tmp2 :String;
 if Set="" or Mask="": ^Set; fi;
 Res="";
 nn1=WordsCount(Set,   SetSep);
 nn2=WordsCount(Mask, MaskSep);
 for i=1 to nn1 do
   tmp1=ExtractWord(i, Set, SetSep);
   for j=1 to nn2 do
     tmp2=ExtractWord(j, Mask, MaskSep);
     if Match(tmp1, tmp2): Res=tmp1; Break; fi;
   od;
 od;
 ^Res;
end;

Func СортироватьНаборСлов(Set:String; SepSet:String; Flag:Logical) :String; --Сортирует набор по словам
-- Set набор слов; SepSet разделитель; Flag направление сортировки
var num, i, k :Integer;
var tmp :String;
 ClearVariable(Buf);
 num=WordsCount(Set, SepSet);
 k=0;
 for i=1 to num do
   tmp=ExtractWord(i, Set, SepSet);
   if tmp<>"": k=k+1; Buf[k]=tmp; fi;
 od;
 SortArray(Buf, Flag);
 tmp="";
 for i=1 to k do tmp=tmp+SepSet+Buf[i]; od;
 tmp=SubStr(tmp, Length(SepSet)+1, 255);
 ^tmp;
end;
Путь_:s;
Func РасчетВыгрузкиОстатковНФА :Integer;
-- <0 - критическая ошибка; 0 - ошибка создания протокола; >0 - все нормально
var Режим, Work, СЧДЕБ, БЕЗУЧН, FlagCreate, FlagДУ :Logical;
var FF, len, xx, i, j, p, h, zz, z, мм, м1, м2, kk, voc, y, iter_dd,t ,zzz,НЕТМЕСАМОРТ:Integer;
var Путь, nameFile, aVal1, aVal2, aDeb, aCre, aComment, temp, Value, oldУЧН :String;
var aSum1, aSum2, AMT, SUM, KOL, QUA :Numeric;
var aDate, dd, dv, du :Date;
var КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, КОДСЧТ, СЧ6, txt1, txt2, txt3, refTXT, tmp, ToDayStr, svrANA, YearStr :String;
var REC :Record;
var new_101, new_105, new_rec :Integer;
var Отч1 :Report;
var списокСПР,списокПриоритетов :s;
 списокСПР='';
 tmp=' +-';
 списокПриоритетов='';
 y=LengthOfArray(спр_код);
 for t=1..y do
     if trim(спр_код[t])<>'' and спр_ст_УЧН[t]:
        списокСПР=Раб.НФА.B01.ab(списокСПР,'|',trim(спр_код[t]));
        списокПриоритетов=Раб.НФА.B01.ab(списокПриоритетов,'|',tmp);
     fi;
 od;
 tmp='';y=0;t=0;
 if ДАТАОТЧ<1.1.2007:
   Message("Отсутствует или недопустимая дата остатков!", mtWarning);
   Template.Field="ДАТАОТЧ";
   ^-1;
 fi;
 if ИГНОРНФА104:
   if Abs(Saldo(MskНФА+"{~НФА.*}", ДАТАОТЧ))>0:
      Message("Обнаружены проводки для выгрузки остатков НФА непомеченные справочником НФА.*!", mtWarning);
      Report(PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst"+"|По_проводкам", 1.1.100, ДАТАОТЧ, MskНФА, "~НФА.*");
      ^-1;
   fi;
 else
   if Abs(Saldo(MskНФА+"|(???.????.???????.???.?.104.??.410){~НФА.*}", ДАТАОТЧ))>0:
      Message("Обнаружены проводки для выгрузки остатков НФА непомеченные справочником НФА.*!", mtWarning);
      Report(PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst"+"|По_проводкам", 1.1.100, ДАТАОТЧ, MskНФа+"|(???.????.???????.???.?.104.??.410)", "~НФА.*");
      ^-1;
   fi;
 fi;
 USE_ИНВ_ЦЕНА=Общ_Пер('ОС_РАСХ',ДАТАОТЧ-1);
 Заполнить_недвижимоеОС_список;
 Путь=Путь_;
 kk=ChooseFolder(Путь, "Папка для сохранения файлов выгрузки остатков НФА.");
 if kk=cmCancel: Message("Отказ от формирования выгрузки остатков НФА.", mtInformation); ^-1; fi;
 Путь_=Путь;
 voc=ПроверкаСправочников; -- количество дополнительных справочников
 Refresh(False);
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Подготовка...");
 Try
   nameFile=PlanVar('CACHE')+"\"+GetGUID;

--   len=TujReport(nameFile, 1.1.100, ДАТАОТЧ, MskНФА, "НФА.101.06.КЭО.СВЕТИЛЬНИК.ЛЮМИНИС&М.Х.10_М_КЭО", "ДНФА", "", "", TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna, False);
--   len=TujReport(nameFile, 1.1.100, ДАТАОТЧ, MskНФА, "НФА.105.06.ГАРАЖ.ПУТЕВЫЕ_ЛИСТЫ", "ДНФА", "", "", TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna, False);
   if ФлНФА106:
      len=TujReport(nameFile, 1.1.100, ДАТАОТЧ, MskНФА, "НФА.106.*"+dopan, "ДНФА", "", "", TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna, False);
    | true:
      len=TujReport(nameFile, 1.1.100, ДАТАОТЧ, MskНФА, "НФА.*"+dopan, "ДНФА", "", "", TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna, False);
   fi;
   if len>0:
     OpenTextJur(nameFile);
     Try
       ShowProgress(len, "Обработка данных...");
       i=1;
       ClearVariable(LSTНФА); ClearVariable(LSTСУМ); ClearVariable(LSTКОЛ);
       ClearVariable(LSTДА1); ClearVariable(LSTДА2); ClearVariable(LSTДА3);
       ClearVariable(txtМОЛ); ClearVariable(txtМХЭ); ClearVariable(txtDANA);
       dd=ToDay; ToDayStr=Str(Day(dd))+Str(Mon(dd))+Str(Year(dd));
       мм=0; м1=0; м2=0;
       while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
         ProgressPos(i);
         i=i+1;
         КОДСЧТ=""; SUM=0.00;
         xx=LengthOfArray(aAna);
         if xx>0:
           if aDeb="00" or aDeb="00Z": КОДСЧТ=aCre; СЧДЕБ=False; fi;
           if aCre="00" or aCre="00Z": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
           if Match(КОДСЧТ, "???.????.???????.???.?.101.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False;
           |  Match(КОДСЧТ, "???.????.???????.???.?.102.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False;
           --|  Match(КОДСЧТ, "???.??.??.??.??.??.????.?.103.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 33)+"???"; БЕЗУЧН=False;
           |  Match(КОДСЧТ, "???.????.???????.???.?.103.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False;
           |  Match(КОДСЧТ, "???.????.???????.???.?.105.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=True;
           |  Match(КОДСЧТ, "???.????.???????.???.?.106.??.2??")   :                                     БЕЗУЧН=True;
           |  Match(КОДСЧТ, "???.????.???????.???.?.106.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=True;
           |  Match(КОДСЧТ, "ЗАБ.??.10?.??")                       : КОДСЧТ=КОДСЧТ;                      БЕЗУЧН=True;
           else КОДСЧТ="";
           fi;
           if КОДСЧТ<>"":
             if (aVal1="" or aVal1="РУБ") and aSum1<>0: if СЧДЕБ: SUM=aSum1; else SUM=-aSum1; fi;
             |  (aVal2="" or aVal2="РУБ") and aSum2<>0: if СЧДЕБ: SUM=aSum2; else SUM=-aSum2; fi;
             else SUM=0;
             fi;
             -- очистка аналитики
             КОДНФА=""; КОДУЧН=""; КОДМОЛ=""; КОДМХЭ=""; QUA=0.00; KOL=0.00; refTXT="";
             ClearVariable(refDANA);
             refDANA[17]=0; -- 17 - количество рабочих справочников
             -- разбор аналитики
             for j=1 to xx do
               Work=True; -- для необязательных признаков
               -- подготовка
               p=Pos(":", aAna[j]);
               if p>0:
                 QUA=StringToNumeric(SubStr(aAna[j], p+1, Length(aAna[j])-p));
                 svrANA=SubStr(aAna[j], 1, p-1);
               else
                 svrANA=aAna[j];
               fi;
               tmp=SubStr(svrANA, 1, 1);
               if tmp="+" or tmp="-": svrANA=SubStr(svrANA, 2, 255); fi;
               -- ищем ОБЯЗАТЕЛЬНЫЕ признаки
               if Match(svrANA, "НФА.*"):     Work=False; КОДНФА=svrANA; KOL=if(СЧДЕБ, QUA, -QUA);
               |  Match(svrANA, pfxINV+".*"): Work=False; КОДУЧН=svrANA;
               |  Match(svrANA, "МОЛ.*"):     Work=False; КОДМОЛ=svrANA;
               |  Match(svrANA, "М.*"):       Work=False; КОДМХЭ=svrANA;
               fi;
               -- ищем НЕОБЯЗАТЕЛЬНЫЕ признаки
               if Work and voc>0:


                 zzz=lengthofarray(спр_код);
                 for t=1..zzz do
                   if спр_ст[t]:
                      if Match(svrANA,спр_код[t]+"*"):
                         h=SearchInArray(txtDANA, svrANA, False, 1);
                         if h=-1: мм=мм+1; txtDANA[мм]=svrANA; kk=мм; else kk=h; fi;
                         refDANA[t]=kk;
                      fi;
                   fi;
                 od;


               fi;
             od; -- Цикл по аналитике свертки
             --
             if КОДУЧН="": КОДУЧН=" "; 
              | true:
                if not USE_ИНВЕНТАРНЫЙ_НОМЕР_(КОДНФА,КОДУЧН):
                   if saldo('*.?.104.??.???{'+КОДНФА+'&'+КОДУЧН+'}',ДАТАОТЧ+1)=0:КОДУЧН=" "; -- при отсутствии амортизации выкидываем УЧН
                   fi;
                fi;
             fi;
             --
             if КОДМОЛ="": КОДМОЛ="МОЛ.ОСТ_"+ToDayStr; fi;
             if SearchInArray(txtМОЛ, КОДМОЛ, False, 1)=-1: м1=м1+1; txtМОЛ[м1]=КОДМОЛ; fi;
             --
             if КОДМХЭ="": КОДМХЭ="М.Э.ОСТ_"+ToDayStr; fi;
             if SearchInArray(txtМХЭ, КОДМХЭ, False, 1)=-1: м2=м2+1; txtМХЭ[м2]=КОДМХЭ; fi;
             --
             -- обработка найденных признаков
             refTXT=""; txt1=""; --txt2=""; txt3="";
             if voc>0:
                zz=LengthOfArray(refDANA);
                if zz>0:
                   for z=1 to zz do refTXT=refTXT+"|"+if(refDANA[z]>0, Str(refDANA[z]), " "); od;
                   if Pos("|", refTXT)=1: refTXT=SubStr(refTXT, 2, Length(refTXT)-1); fi;
                fi;
                txt1=if(refDANA[1] >0, txtDANA[refDANA[1]] , " ")+"|"+    --П
                     if(refDANA[2] >0, txtDANA[refDANA[2]] , " ")+"|"+    --КТ
                     if(refDANA[3] >0, txtDANA[refDANA[3]] , " ")+"|"+    --ВД
                     if(refDANA[4] >0, txtDANA[refDANA[4]] , " ")+"|"+    --ПГР
                     if(refDANA[5] >0, txtDANA[refDANA[5]] , " ")+"|"+    --ПГР
                     if(refDANA[6] >0, txtDANA[refDANA[6]] , " ")+"|"+    --ПГР
                     if(refDANA[7] >0, txtDANA[refDANA[7]] , " ")+"|"+    --ПГР
                     if(refDANA[8] >0, txtDANA[refDANA[8]] , " ")+"|"+    --ПГР
                     if(refDANA[9] >0, txtDANA[refDANA[9]] , " ");        --РБС

--                txt2=if(refDANA[6] >0, txtDANA[refDANA[6]] , " ")+"|"+    --ГГ
--                     if(refDANA[7] >0, txtDANA[refDANA[7]] , " ")+"|"+    --ММДД
--                     if(refDANA[8] >0, txtDANA[refDANA[8]] , " ")+"|"+    --К
--                     if(refDANA[9] >0, txtDANA[refDANA[9]] , " ")+"|"+    --ВКЛ
--                     if(refDANA[10]>0, txtDANA[refDANA[10]], " ")+"|"+    --ВП
--                     if(refDANA[11]>0, txtDANA[refDANA[11]], " ");        --КВ

--                txt3=if(refDANA[12]>0, txtDANA[refDANA[12]], " ")+"|"+    --ПРТ
--                     if(refDANA[13]>0, txtDANA[refDANA[13]], " ")+"|"+    --РАЗМЕР
--                     if(refDANA[14]>0, txtDANA[refDANA[14]], " ")+"|"+    --РОСТ
--                     if(refDANA[15]>0, txtDANA[refDANA[15]], " ")+"|"+    --БО
--                     if(refDANA[16]>0, txtDANA[refDANA[16]], " ")+"|"+    --Ф
--                     if(refDANA[17]>0, txtDANA[refDANA[17]], " ");        --Ц
             fi;
             --
_--3             if БЕЗУЧН or КОДУЧН=" " or refTXT="": refTXT=" "; fi;
             if refTXT="": refTXT=" "; fi;
             --
             tmp="";
             if КОДНФА<>"":
               --
               tmp=Str(SearchInArray(txtМОЛ, КОДМОЛ, False, 1))+"|"+
                   Str(SearchInArray(txtМХЭ, КОДМХЭ, False, 1))+"|"+
                                                         КОДСЧТ+"|"+
                                                         КОДНФА+"|"+
                                                         КОДУЧН+"|"+
                                                         refTXT; -- строка для выделения уникальных объектов
               -- КОДМОЛ|КОДМХЭ|КОДСЧТ|КОДНФА|КОДУЧН|refTXT
               h=SearchInArray(LSTНФА, tmp, True, 1);
               if h=-1:
                 p=InsertInArraySort(LSTНФА, tmp);
                 InsertInArray(LSTСУМ, p, SUM);
                 InsertInArray(LSTКОЛ, p, KOL);
                 if voc>0:
                   InsertInArray(LSTДА1, p, txt1);
--                   InsertInArray(LSTДА2, p, txt2);
--                   InsertInArray(LSTДА3, p, txt3);
                 fi;
               else
                 LSTСУМ[h]=LSTСУМ[h]+SUM;
                 LSTКОЛ[h]=LSTКОЛ[h]+KOL;
                 -- синхронизация аналитики
                 if voc>0:
                   txt1=LSTДА1[h];
--                   txt2=LSTДА2[h];
--                   txt3=LSTДА3[h];
                   if refTXT=" ":
                     ClearVariable(BufT);
                     kk=0;
                     zz=WordsCount(txt1, "|");
                     for z=1 to zz do BufT[kk+z]=ExtractWord(kk+z, txt1, "|"); od;
                     kk=kk+zz;
--                     zz=WordsCount(txt2, "|");
--                     for z=1 to zz do BufT[kk+z]=ExtractWord(kk+z, txt2, "|"); od;
--                     kk=kk+zz;
--                     zz=WordsCount(txt3, "|");
--                     for z=1 to zz do BufT[kk+z]=ExtractWord(kk+z, txt3, "|"); od;
--                     kk=kk+zz;
                     for z=1 to kk do
                       tmp=if(refDANA[z]>0, txtDANA[refDANA[z]] , " ");
                       if BufT[z]=" " and tmp<>" ": BufT[z]=tmp; fi;
                     od;
                     --
                     txt1=""; --txt2=""; txt3="";
                     --
                     txt1=if(BufT[1] ="", " ", BufT[1] )+"|"+    --П
                          if(BufT[2] ="", " ", BufT[2] )+"|"+    --КТ
                          if(BufT[3] ="", " ", BufT[3] )+"|"+    --ВД
                          if(BufT[4] ="", " ", BufT[4] )+"|"+    --ПГР
                          if(BufT[5] ="", " ", BufT[5] )+"|"+    --ПГР
                          if(BufT[6] ="", " ", BufT[6] )+"|"+    --ПГР
                          if(BufT[7] ="", " ", BufT[7] )+"|"+    --ПГР
                          if(BufT[8] ="", " ", BufT[8] )+"|"+    --ПГР
                          if(BufT[9] ="", " ", BufT[9] );        --РБС

--                     txt2=if(BufT[6] ="", " ", BufT[6] )+"|"+    --ГГ
--                          if(BufT[7] ="", " ", BufT[7] )+"|"+    --ММДД
--                          if(BufT[8] ="", " ", BufT[8] )+"|"+    --К
--                          if(BufT[9] ="", " ", BufT[9] )+"|"+    --ВКЛ
--                          if(BufT[10]="", " ", BufT[10])+"|"+    --ВП
--                          if(BufT[11]="", " ", BufT[11]);        --КВ

--                     txt3=if(BufT[12]="", " ", BufT[12])+"|"+    --ПРТ
--                          if(BufT[13]="", " ", BufT[13])+"|"+    --РАЗМЕР
--                          if(BufT[14]="", " ", BufT[14])+"|"+    --РОСТ
--                          if(BufT[15]="", " ", BufT[15])+"|"+    --БО
--                          if(BufT[16]="", " ", BufT[16])+"|"+    --Ф
--                          if(BufT[17]="", " ", BufT[17]);        --Ц

                   fi;
                   LSTДА1[h]=txt1;
--                   LSTДА2[h]=txt2;
--                   LSTДА3[h]=txt3;
                 fi; -- voc>0
               fi; -- h=-1
             fi;
           fi; --КОДСЧТ<>"":
         fi; -- в проводке есть аналитика
       end; --while
     Finally
       CloseTextJur;
       if ExistFile(nameFile): DeleteFile(nameFile); fi;
     end; -- Try
   fi; -- len
   --  *** ОБРАБОТКА ПОЛУЧЕННОЙ ИНФОРМАЦИИ ***
   len=LengthOfArray(LSTНФА);
   if len>0:
     FF=OpenWorkArea("РПО_ИНВКАРТ_ОС", "", "");
     Try
       ОчиститьТаблицу;
       ShowProgress(len, "Расчет остатков...");
       ClearVariable(aAna);    -- теперь вспомогательный массив для добавления (ЕСЛИ НЕТ ФЛАГОВ ЗАМЕНЫ) новых учетных номеров
       ClearVariable(nAna);    -- теперь вспомогательный массив для регистрации перенумерации (замены) учетных номеров
       ClearVariable(BufT);     -- теперь это протокол корректировки амортизации
       ClearVariable(txtDANA); -- теперь это протокол перенумерации (замены) учетных номеров
       ClearVariable(addINV);  -- массив с учетными номерами после замены (для флага УЧН_ИНВКАРТ)
       j=0; xx=0; м1=0; м2=0;
       Try p=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.ДлинаНумерации; Except p=0; end;
       FlagДУ=ПолеПоТипуПрисутствуетКартотеке("РПО_ОСТ_НФА", "ПОЗИЦИИ","ДУЧЕТ", mtlDate);
       if p=0 or p>9: p=5; fi;
       for i=1 to len do
         НЕТМЕСАМОРТ=0;
         ProgressPos(i);
         SUM=LSTСУМ[i];
         KOL=LSTКОЛ[i];
         if SUM<>0.00 or KOL<>0.00:
           dv=1.1.100;
           du=1.1.100;
           КОДМОЛ=Trim(txtМОЛ[Int(ExtractWord(1, LSTНФА[i], "|"))]);
           КОДМХЭ=Trim(txtМХЭ[Int(ExtractWord(2, LSTНФА[i], "|"))]);
           КОДСЧТ=Trim(ExtractWord(3, LSTНФА[i], "|"));
           КОДНФА=Trim(ExtractWord(4, LSTНФА[i], "|"));
           КОДУЧН=Trim(ExtractWord(5, LSTНФА[i], "|"));
           -- Дополнительная аналитика
           svrANA="";
           if voc>0:
             zz=WordsCount(LSTДА1[i], "|");
             for z=1 to zz do tmp=ExtractWord(z, LSTДА1[i], "|"); if tmp<>" ": svrANA=svrANA+" "+tmp; fi; od;
--             zz=WordsCount(LSTДА2[i], "|");
--             for z=1 to zz do tmp=ExtractWord(z, LSTДА2[i], "|"); if tmp<>" ": svrANA=svrANA+" "+tmp; fi; od;
--             zz=WordsCount(LSTДА3[i], "|");
--             for z=1 to zz do tmp=ExtractWord(z, LSTДА3[i], "|"); if tmp<>" ": svrANA=svrANA+" "+tmp; fi; od;
             svrANA=Trim(svrANA);

             -- проверка на обязательные справочники по умолчанию VOC.000
             svrANA=СортироватьНаборСлов(svrANA, " ", True);
           fi;
           oldУЧН=Trim(КОДУЧН);
           aDeb=ВзятьНФАПолныйСчетДеб(КОДСЧТ); -- Счет НФА
           aCre=СчетАмортизацииПоСчетуНФА(КОДСЧТ); -- Счет амортизации
           -- Даты
           if oldУЧН<>"" and ИСКАТЬДАТЫ:
              du=ВзятьДатуПринКУчету(aDeb, КОДНФА, oldУЧН, ДАТАОТЧ);
              --
--              tmp="ИНВВЕД."+КОДНФА+"."+oldУЧН;
--              if Name_A(tmp)<>" ":
--                 REC=SignToRecord(tmp, False);
--                 if REC<>NIL:
--                   y=GetRecordNumber(FF, REC);
--                   if y>0: dv=GetFieldD(FF, y, "ДАТ_ВЭКСП"); fi;
--                 fi;
--              fi;
              if dv=1.1.100: dv=ВзятьДатуВводаЭкспл(aDeb, КОДНФА, oldУЧН, ДАТАОТЧ, FlagДУ); fi;
           fi;
           --
           if КОЛ_НЕНУЛЬ and SUM>0.00 and KOL=0.00: KOL=1.00; fi;
           -- учетный номер
           if KOL<>0.00: QUA=SUM/KOL; else QUA=0.00; fi; -- QUA -- сейчас здесь цена
           Work=Length(КОДУЧН)>4 or USE_ИНВЕНТАРНЫЙ_НОМЕР(КОДСЧТ, QUA, KOL,КОДНФА);
           if Work: refTXT=КОДУЧН; else refTXT=""; fi;
           --
           AMT=0.00;
           if Work and refTXT<>"" and aCre<>"": -- поиск амортизации
             -- а если счет амортизации не соответсвует счету НФА?
             -- ... или в проводке нет справочника НФА или УЧН
             -- поиск бесмысленен, так как в любом случае необходима корректировка.
             AMT=Abs(Round(Saldo(aCre+"{"+КОДНФА+"&"+refTXT+"}", ДАТАОТЧ, "РУБ"), 2));
             if pos('?',aCre)>0: -- поиск реального счета амортизации!
                aCre=СчетАмортизацииПоСчетуНФА_Полный(КОДСЧТ); -- Счет амортизации
             fi;

             -- ... так что выгружаем то - что нашли
           fi;
           --
           if SUM>0.00: txt1="1";
           |  SUM=0.00: txt1="2";
           |  SUM<0.00: txt1="3";
           fi;
           СЧ6=ВзятьСЧЕТ6(КОДСЧТ);
           txt2=txt1+"#"+СЧ6+"#"+КОДМОЛ+"#"+КОДМХЭ+"#"+КОДНФА; -- строка сортировки
           --
           if Work:
             if УЧН_ИНВКАРТ and not УЧН_ПЕРЕНУМ:
               tmp=Name_A("ИНВВЕД."+КОДНФА+"."+refTXT);
               if tmp<>"" and tmp<>" ":
                 if Length(tmp)>10:
                   refTXT=pfxINV+"."+tmp;
                 else
                   refTXT=pfxINV+"."+RepStr("0", 10-Length(tmp))+tmp;
                 fi;
                 -- регистрация изменений
                 temp=pfxNEW+"."+SubStr(refTXT, 5, 255);
                 --temp=pfxNEW+"."+SubStr(refTXT, Length(pfxINV)+2, 255);
                 Value=oldУЧН+"@"+temp+"@"+aDeb+"@"+КОДНФА;
                 AddInArray(nAna, True, False, Value); -- для служебного файла перенумерации (для дальнейшего использования)
                 AddInArray(addINV, True, False, temp); -- для анализа при добавлении новых номеров
                 м2=м2+1;
                 -- Протокол синхронизации инвентарных номеров с учетными
                 txtDANA[м2]=aDeb+"@ N до "+oldУЧН+"@ N после "+pfxNEW+"."+SubStr(refTXT, 5, 255)+"@ "+КОДНФА+" ("+Name_A(КОДНФА)+")";
               else -- если инвентарный номер не присвоен...
                 --refTXT=ДобавитьСвободныйУчетныйНомер(p);
                 refTXT=pfxNEW+"."+ToDayStr+"_NEW";
               fi;
             |  УЧН_ПЕРЕНУМ:
               xx=xx+1;
               tmp=Str(xx);
               refTXT=pfxINV+"."+RepStr("0", p-Length(tmp))+tmp;
               -- регистрация изменений
               temp=pfxNEW+"."+SubStr(refTXT, 5, 255);
               --temp=pfxNEW+"."+SubStr(refTXT, Length(pfxINV)+2, 255);
               Value=oldУЧН+"@"+temp+"@"+aDeb+"@"+КОДНФА;
               AddInArray(nAna, True, False, Value); -- для служебного файла перенумерации (для дальнейшего использования)
               м2=м2+1;
               -- Протокол перенумерации учетных номеров
               txtDANA[м2]=aDeb+"@ N до "+КОДУЧН+"@ N после "+refTXT+"@ "+КОДНФА+" ("+Name_A(КОДНФА)+")";
             fi;
           fi;
           -- ***
--           if Work and KOL>=1.00:
           if Work and KOL>=1.00 and not Match(СЧ6, "103.??"):
             -- корректировка амортизации
             QUA=SUM/KOL;
             НЕТМЕСАМОРТ=РАБ.НФА.B01.ВзятьНЕТМЕСАМОРТ(КОДНФА,КОДУЧН);
             if QUA>10000.00 and AMT>SUM: -- если начислили лишнию амортизацию
                м1=м1+1;
                -- Протокол исправления амортизации
                BufT[м1]=">|"+aDeb+"|"+КОДМОЛ+"|"+КОДМХЭ+"|"+КОДНФА+"|"+if(КОДУЧН="", " ", КОДУЧН)+"|"+Str(SUM, 2)+"|"+Str(KOL, 6) +"|"+Str(AMT, 2);
--                AMT=QUA;
--             |  QUA>0.00 and QUA<=10000.00:
--                if Match(КОДМХЭ, "М.Х.*") and AMT>0.00 and SUM<>AMT:
--                   м1=м1+1;
--                   -- Протокол исправления амортизации
--                   BufT[м1]="0|"+aDeb+"|"+КОДМОЛ+"|"+КОДМХЭ+"|"+КОДНФА+"|"+if(КОДУЧН="", " ", КОДУЧН)+"|"+Str(SUM, 2)+"|"+Str(KOL, 6) +"|"+Str(AMT, 2);
--                   AMT=0.00;
--                --|  Match(КОДМХЭ, "М.Э.*") and AMT<SUM: -- старый вариант
--                |  Match(КОДМХЭ, "М.Э.*"):
--                   м1=м1+1;
--                   -- Протокол исправления амортизации
--                   BufT[м1]="<|"+aDeb+"|"+КОДМОЛ+"|"+КОДМХЭ+"|"+КОДНФА+"|"+if(КОДУЧН="", " ", КОДУЧН)+"|"+Str(SUM, 2)+"|"+Str(KOL, 6) +"|"+Str(AMT, 2);
--                   AMT=SUM;
--                fi;
             fi;
             -- Разбиваем количество по единичным объектам + остаток от единицы если не штуки
             kk=Int(KOL);
             aSum1=Round(SUM/kk, 2); -- сумма балансовая
             aSum2=Round(AMT/kk, 2); -- сумма амортизации
             --
             for h=1 to kk do
               --
               j=j+1;
               --
               arМОЛ[j]=КОДМОЛ;
               arМХЭ[j]=КОДМХЭ;
               --
               arКОЛ[j]=1.00;
               arНЕТМЕСАМ[j]=НЕТМЕСАМОРТ;
               if h=kk: arСУМ[j]=aSum1+(SUM-aSum1*kk); else arСУМ[j]=aSum1; fi; -- сумма балансовая
               --
               arСЧУ[j]=aDeb;    -- Счет НФА
               arНФА[j]=КОДНФА;
               arДОП[j]=svrANA; -- дополнительная аналитика
               -- работа с учетным номером
               if h=1 and refTXT<>"":  -- если первый объект с существующим учетным номером
                 arУЧН[j]=pfxNEW+"."+SubStr(refTXT, 5, 255); -- 5 --> ИНВ.X
                 --arУЧН[j]=pfxNEW+"."+SubStr(refTXT, Length(pfxINV)+2, 255); -- 5 --> ИНВ.X
               else
                 -- если в записи больше 1 под одним учетным номером или учетный номер не присвоен
                 if УЧН_ПЕРЕНУМ:
                   xx=xx+1;
                   tmp=Str(xx);
                   refTXT=RepStr("0", p-Length(tmp))+tmp;
                   arУЧН[j]=pfxNEW+"."+refTXT;
                 |  УЧН_ИНВКАРТ and not УЧН_ПЕРЕНУМ:
                   refTXT=pfxNEW+"."+ToDayStr+"_NEW";
                   arУЧН[j]=refTXT;
                 else
                   refTXT=ДобавитьСвободныйУчетныйНомер(p);
                   arУЧН[j]=pfxNEW+"."+SubStr(refTXT, 5, 255); -- 5 --> ИНВ.X
                   --arУЧН[j]=pfxNEW+"."+SubStr(refTXT, Length(pfxINV)+2, 255); -- 5 --> ИНВ.X
                 fi;
               fi;
               --
               if aSum2>0.00: -- сумма амортизации
                 if h=kk: arАМТ[j]=aSum2+(AMT-aSum2*kk); else arАМТ[j]=aSum2; fi; -- сумма амортизации
                 arСЧА[j]=aCre;  -- Счет амортизации
               fi;
               --
               arERR[j]=txt1;
               arСЧ6[j]=СЧ6;
               arSRT[j]=txt2+"#"+refTXT;
               --
               arДВЭ[j]=dv;
               arДПУ[j]=du;
             od;
             if (KOL-kk)>0.00:
               --
               j=j+1;
               --
               arМОЛ[j]=КОДМОЛ;
               arМХЭ[j]=КОДМХЭ;
               --
               arКОЛ[j]=KOL-kk;
               arСУМ[j]=0.00; -- сумма балансовая
               arНЕТМЕСАМ[j]=НЕТМЕСАМОРТ;
               --
               arСЧУ[j]=aDeb;    -- Счет НФА
               arНФА[j]=КОДНФА;
               arДОП[j]=""; -- дополнительная аналитика
               arУЧН[j]="";
               --
               arАМТ[j]=0.00;
               arСЧА[j]="";
               --
               arERR[j]="2";
               arСЧ6[j]=СЧ6;
               arSRT[j]="2#"+SubStr(txt2, 3, 255)+"#"+" ";
               --
               arДВЭ[j]=dv;
               arДПУ[j]=du;
             fi;
           else -- иначе без инвентарного номера
             --
             j=j+1;
             --
             arМОЛ[j]=КОДМОЛ;
             arМХЭ[j]=КОДМХЭ;
             --
             arКОЛ[j]=KOL;
             arСУМ[j]=Round(SUM, 2);
             --
             arСЧУ[j]=aDeb;
             arНФА[j]=КОДНФА;
             arДОП[j]=svrANA; -- дополнительная аналитика

             if Match(СЧ6, "103.??"):
               if Trim(refTXT)="":
                 refTXT=ДобавитьСвободныйУчетныйНомер(p);
                 refTXT=pfxNEW+"."+SubStr(refTXT, 5, 255); -- 5 --> ИНВ.X
               fi;
               arУЧН[j]=Trim(refTXT);
             else
               arУЧН[j]="";
             fi;
             --
             arАМТ[j]=0.00;
             arСЧА[j]="";
             --
             arERR[j]=txt1;
             arСЧ6[j]=СЧ6;
             arSRT[j]=txt2+"#"+refTXT;
             --
             arДВЭ[j]=1.1.100;
             arДПУ[j]=1.1.100;
           fi;
           -- ***
         fi; -- есть что вставлять
       od; -- цикл по LSTНФА
       -- ***
     Finally
       CloseWorkArea(FF);
     end;
     -- *** Сортировка
     Позиции=j;
     CloseProgress;
     ShowProgress(Позиции, "Сортировка...");
     SortSection(Позиции, 2, True);
     -- *** ВЫГРУЗКА ***
     ОчиститьLST;
     ClearVariable(BufD);
     iter_dd=0;
     len=LengthOfArray(arSRT);
     if len>0:
       i=1; -- счетчик по массивам arXXX
       dd=ДАТАОТЧ-1;
       aComment="01.01."+Str(Year(ДАТАОТЧ));
       if Year(ДАТАОТЧ)-Year(dd)>0: YearStr=Str(Year(dd)); else YearStr=Str(Year(ДАТАОТЧ)); fi;
       ShowProgress(len, "Формирование [CRD] файла остатков...");
       м2=м2+1;
       txtDANA[м2]="";
       м2=м2+1;
       txtDANA[м2]="... добавлены новые учетные номера";
       м2=м2+1;
       txtDANA[м2]="";
       for j=1 to 3 do
         if j=1: nameFile=Путь+"РПО_ОСТ_НФА.CRD";
         |  j=2: nameFile=Путь+"РПО_ОСТ_НФА_0.CRD";
         |  j=3: nameFile=Путь+"РПО_ОСТ_НФА_M.CRD";
         else Break;
         fi;
         Try
           if ExistFile(nameFile): DeleteFile(nameFile); fi;
           FlagCreate=False;
           FF=TextFileCreate(nameFile);
           FlagCreate=True;
           -- выгрузка в CRD
           if j=1: TextFileWriteLn(FF, "-- остатки с суммой больше нуля");
           |  j=2: TextFileWriteLn(FF, "-- остатки с суммой равной нулю");
           |  j=3: TextFileWriteLn(FF, "-- остатки с суммой меньше нуля");
           fi;
           TextFileWriteLn(FF, "[РПО_ОСТ_НФА");
           new_rec=0; new_101=0; new_105=0;
           refTXT=""; КОДМОЛ=""; КОДМХЭ=""; КОДНФА=""; КОДСЧТ=""; СЧ6=""; КОДУЧН="";
           xx=0; h=1; zz=0;
           while arErr[i]=Str(j) do -- должно быть упорядочено по arERR или arSRT !!!
             ProgressPos(i);
             КОДМОЛ=arМОЛ[i];
             КОДМХЭ=arМХЭ[i];
             --
             КОДНФА=arНФА[i];
             КОДСЧТ=arСЧУ[i];
             --
             КОДУЧН=Trim(arУЧН[i]);
             if КОДУЧН=pfxNEW+"."+ToDayStr+"_NEW": -- требуется новый учетный номер
               Work=False;
               while not Work do
                 xx=xx+1;
                 temp=Str(xx);
                 Value=pfxNEW+"."+RepStr("0", p-Length(temp))+temp;
                 zz=SearchInArray(addINV, Value, True, h);
                 if zz=-1:
                   AddInArray(addINV, True, False, Value);
                   КОДУЧН=Value;
                   м2=м2+1;
                   -- протокол добавления инвентарных номеров
                   txtDANA[м2]=КОДСЧТ+"@ N новый "+Value+"@ "+КОДНФА+" ("+Name_A(КОДНФА)+")";
                   temp=Value+" -- "+Name_A(КОДНФА);
                   AddInArray(LSTДА1, True, False, temp); -- список применяемых учетных номеров
                   Work=True;
                 else
                   h=zz;
                 fi;
               end;
             |  КОДУЧН<>"":
               temp=КОДУЧН+" -- "+Name_A(КОДНФА);
               AddInArray(LSTДА1, True, False, temp); -- список применяемых учетных номеров
             fi;
             --
             СЧ6=SubStr(arСЧ6[i], 1, 3);
             --
             Work=False;
             if not Match(КОДНФА, "НФА.10?.??.*"): Work=True; fi; -- необходимо предупреждение - НФА не соответсвует структуре
             if not Work: -- ...если проскочили благополучно, то проверяем дальше...
               if СЧ6="ЗАБ":
                 tmp="ЗАБ.??."+SubStr(КОДНФА, 5, 6);
               else
                 tmp="*."+SubStr(КОДНФА, 5, 4)+"?"+SubStr(КОДНФА, 10, 1)+".???"; -- НФА.10?.??.*
               fi;
               if not Match(КОДСЧТ, tmp): Work=True; fi; -- необходимо предупреждение - НФА не соответсвует счету учета
             fi;
             if Work: -- необходима корректировка кода НФА или счета учета
               temp="Счет учета "+КОДСЧТ+"@ "+if(КОДУЧН="", "НЕТ @ ", КОДУЧН+"@ ")+"код НФА "+КОДНФА+" ("+Name_A(КОДНФА)+")";
               AddInArray(LSTДА2, True, False, temp); -- список предупреждений несоответствия НФА по счетам
             fi;
             --
             --tmp=КОДМОЛ+"@"+КОДМХЭ+"@"+СЧ6;
             tmp=КОДМОЛ+"@"+КОДМХЭ+"@"+arСЧ6[i];
             if refTXT<>tmp:  -- новая запись (не подтаблица)
               refTXT=tmp;
               if new_101=-1: TextFileWriteLn(FF, "  ]"); fi;
               new_101=1;
               if new_105=-1: TextFileWriteLn(FF, "  ]"); fi;
               new_105=1;
               if new_rec=-1: TextFileWriteLn(FF, ")"); fi;
               new_rec=1;
             else
               new_rec=-1;
             fi;
             if new_rec=1:
                TextFileWriteLn(FF, "(");
                TextFileWriteLn(FF, "ПРОВОДИТЬ=T");
                TextFileWriteLn(FF, "ДАТОПЕР="+DateToString(dd));
                TextFileWriteLn(FF, "М="+КОДМХЭ);
                TextFileWriteLn(FF, "МОЛ="+КОДМОЛ);
                if Trim(Name_A(КОДМХЭ))<>"": TextFileWriteLn(FF, "М_ИМЯ="+Name_A(КОДМХЭ)); fi;
                if Trim(Name_A(КОДМОЛ))<>"": TextFileWriteLn(FF, "МОЛ_ИМЯ="+Name_A(КОДМОЛ)); fi;
                TextFileWriteLn(FF, "ГОДОСТ="+YearStr);
                TextFileWriteLn(FF, "CLOSEDMODFOB=F");
                TextFileWriteLn(FF, "НОВЫЙОТЧЕТНЫЙПЕРИОДНАЧАЛО="+aComment);
                TextFileWriteLn(FF, "CURRENTRECORD=");
                TextFileWriteLn(FF, "СВЕРНУТЬБУХ=F");
                TextFileWriteLn(FF, "ОБЩАН="+dopan1);
                TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К0=0");
                TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К1=0");
                TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К2=0");
                TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К3=0");
                TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К4=0");
                TextFileWriteLn(FF, "ТЕКУЩИЙРЕГИОН_К4=0");
                TextFileWriteLn(FF, "  [РПО_ОСТ_НФА@ПОЗИЦИИ_БУХ");
                TextFileWriteLn(FF, "  ]");
                new_rec=-1;
             fi;
             if new_rec=-1:
                if СЧ6="101" or СЧ6="102" or СЧ6="103":
                   if new_101=1:
                     new_101=-1;
                     TextFileWriteLn(FF, "  [РПО_ОСТ_НФА@ПОЗИЦИИ");
                     TextFileWriteLn(FF, "  ]");
                     TextFileWriteLn(FF, "  [РПО_ОСТ_НФА@ПОЗИЦИИОС");
                   fi;
                 | СЧ6="105" or СЧ6="106" or СЧ6="ЗАБ":
                   if new_105=1:
                     new_105=-1;
                     TextFileWriteLn(FF, "  [РПО_ОСТ_НФА@ПОЗИЦИИОС");
                     TextFileWriteLn(FF, "  ]");
                     TextFileWriteLn(FF, "  [РПО_ОСТ_НФА@ПОЗИЦИИ");
                   fi;
                fi;
                if new_101=-1:
                  AMT=arАМТ[i];
                  aCre=arСЧА[i];
                  if AMT>0.00:
                    zz=SearchInArray(LSTНФА, aCre, True, 1);
                    if zz=-1:
                      kk=InsertInArraySort(LSTНФА, aCre);
                      InsertInArray(LSTСУМ, kk, AMT);
                    else
                      LSTСУМ[zz]=LSTСУМ[zz]+AMT;
                    fi;
                  fi;
                  TextFileWriteLn(FF, "  (");
                  TextFileWriteLn(FF, "  НФА="    +КОДНФА);
                  TextFileWriteLn(FF, "  СЧНФА="  +КОДСЧТ);
                  TextFileWriteLn(FF, "  СУМНФА=" +Str(arСУМ[i], 2));
                  TextFileWriteLn(FF, "  КОЛНФА=" +Str(arКОЛ[i], РАБ.НФА.FUNC_LIB.LENM(arКОЛ[i])));
                  TextFileWriteLn(FF, "  СЧ00=00");
--                  if pos('187.0201.',trim(КОДСЧТ))=1:TextFileWriteLn(FF, "  ДОПАН=ВД.БД "+arДОП[i]);
--                   | pos('187.0901.',trim(КОДСЧТ))=1:TextFileWriteLn(FF, "  ДОПАН=ВД.ПБС "+arДОП[i]);
--                   | true:TextFileWriteLn(FF, "  ДОПАН="+arДОП[i]);
--                  fi;
--Func РасчетДопАнПоПроводкам(УслНаСч:S;УслНаАн:S; списокСПР:S; списокПриоритетов:S; dd0:D; dd1:D; revers:L; ИсклАн:s) :s;

--                  TextFileWriteLn(FF, "  ДОПАН="+arДОП[i]);
                  if trim(КОДУЧН)<>'' and списокСПР<>'':
                     arДОП[i]=Раб.НФА.B01.ab(trim(arДОП[i]),' ',trim(РасчетДопАнПоПроводкам(КОДСЧТ,КОДНФА+'&'+КОДУЧН,списокСПР,списокПриоритетов,1.1.100,ДАТАОТЧ-1,true,trim(arДОП[i]))));
                  fi;
                  zz=pos(' ЗН.',' '+arДОП[i]);
                  txt3='';
                  if zz>0:
                     adeb=trim(SubStr(' '+arДОП[i],1,zz-1));
                     acre=trim(SubStr(' '+arДОП[i],zz+1,255))+' ';
                     zz=pos(' ', acre);
                     txt3=trim(SubStr(acre,1,zz));
                     acre=trim(SubStr(acre,zz+1,255));
                     arДОП[i]=Раб.НФА.B01.ab(adeb,' ',acre);
                  fi;
                  if ФлКопирУЧНвЗН and txt3='':
                     if КОДУЧН<>'':
                        txt3='ЗН.'+SubStr(КОДУЧН,5,255);
                     fi;
                  fi;
                  TextFileWriteLn(FF, "  РУЧАН1="+txt3);
                  TextFileWriteLn(FF, "  ДОПАН="+arДОП[i]);
                  TextFileWriteLn(FF, "  ДЕБАМОРТ00="+if(AMT>0.00, "00", ""));
                  TextFileWriteLn(FF, "  СЧЕТАМОРТ="+ if(AMT>0.00, arСЧА[i], ""));
                  TextFileWriteLn(FF, "  ДЕБАМОРТ=");
                  if arДВЭ[i]=arДПУ[i] and arДВЭ[i]>1.1.1900: dv=arДВЭ[i];                       -- если arДВЭ[i] равно arДПУ[i]
                  |  arДВЭ[i]<arДПУ[i] and arДВЭ[i]>1.1.1900: dv=arДВЭ[i];                       -- если arДВЭ[i] раньше arДПУ[i]
                  |  arДВЭ[i]<arДПУ[i] and arДВЭ[i]<1.1.1900 and arДПУ[i]>1.1.1900: dv=arДПУ[i]; -- если arДВЭ[i] раньше arДПУ[i]
                  |  arДВЭ[i]>arДПУ[i] and arДПУ[i]>1.1.1900: dv=arДПУ[i];                       -- если arДВЭ[i] позже arДПУ[i]
                  |  arДВЭ[i]>arДПУ[i] and arДПУ[i]<1.1.1900 and arДВЭ[i]>1.1.1900: dv=arДВЭ[i]; -- если arДВЭ[i] позже arДПУ[i]
                  else dv=1.1.100;
                  fi;
                  if arДВЭ[i]>1.1.1900: TextFileWriteLn(FF, "  ДЭКСПЛ="+DateToString(arДВЭ[i])); fi;
                  if arДПУ[i]>1.1.1900: TextFileWriteLn(FF, "  ДУЧЕТ=" +DateToString(arДПУ[i])); fi;
                  if dv>1.1.1900: tmp="ГГ."+Str(Year(dv))+" ММДД."+Format("%.2d", Mon(dv))+"."+Format("%.2d", Day(dv)); else tmp=""; fi;
                  TextFileWriteLn(FF, "  ДЭКСПЛММДДГГ="+tmp);
                  TextFileWriteLn(FF, "  УЧНОМ="+КОДУЧН);
                  TextFileWriteLn(FF, "  СУМАМ00="+if(AMT>0.00, Str(AMT,2), "0"));

--                  TextFileWriteLn(FF, "  СУМАМ01=0");
--                  TextFileWriteLn(FF, "  СУМАМ02=0");
--                  TextFileWriteLn(FF, "  СУМАМ03=0");
--                  TextFileWriteLn(FF, "  СУМАМ04=0");
--                  TextFileWriteLn(FF, "  СУМАМ05=0");
--                  TextFileWriteLn(FF, "  СУМАМ06=0");
--                  TextFileWriteLn(FF, "  СУМАМ07=0");
--                  TextFileWriteLn(FF, "  СУМАМ08=0");
--                  TextFileWriteLn(FF, "  СУМАМ09=0");
--                  TextFileWriteLn(FF, "  СУМАМ10=0");
--                  TextFileWriteLn(FF, "  СУМАМ11=0");
--                  TextFileWriteLn(FF, "  СУМАМ12=0");
--                  TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКНФАИТОГ=0");
--                  TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКАМОРТИТОГ=0");
                  TextFileWriteLn(FF, "  НЕТМЕСАМОРТ="+Str(arНЕТМЕСАМ[j]));
                  TextFileWriteLn(FF, "  )");
                  -- Протокол для дат принятия к учету и ввода в эксплуатацию
                  if arДВЭ[i]>1.1.1900 or arДПУ[i]>1.1.1900:
                     iter_dd=iter_dd+1;
                     BufD[iter_dd]="###1!"+КОДМОЛ+"@"+КОДМХЭ;
                     iter_dd=iter_dd+1;
                     BufD[iter_dd]="###2!"+КОДНФА+"@"+КОДСЧТ+"@"+if(КОДУЧН="", " ", КОДУЧН)+"@"+Format("%17.6F", Round(arСУМ[i], 2))+"@"+if(arДПУ[i]>1.1.1900, DateToString(arДПУ[i]), " ")+"@"+if(arДВЭ[i]>1.1.1900, DateToString(arДВЭ[i]), " ");
                  fi;
                fi;
                if new_105=-1:
                  TextFileWriteLn(FF, "  (");
                  TextFileWriteLn(FF, "  НФА="    +КОДНФА);
                  TextFileWriteLn(FF, "  СЧНФА="  +КОДСЧТ);
                  TextFileWriteLn(FF, "  СУМНФА=" +Str(arСУМ[i], 2));
                  TextFileWriteLn(FF, "  КОЛНФА=" +Str(arКОЛ[i], РАБ.НФА.FUNC_LIB.LENM(arКОЛ[i])));
                  TextFileWriteLn(FF, "  СЧ00="+if(СЧ6="ЗАБ", "00Z", "00"));
--                  if pos('187.0201.',trim(КОДСЧТ))=1:TextFileWriteLn(FF, "  ДОПАН=ВД.БД "+arДОП[i]);
--                   | pos('187.0901.',trim(КОДСЧТ))=1:TextFileWriteLn(FF, "  ДОПАН=ВД.ПБС "+arДОП[i]);
--                   | true:TextFileWriteLn(FF, "  ДОПАН="+arДОП[i]);
--                  fi;
                  TextFileWriteLn(FF, "  ДОПАН="+arДОП[i]);
--                  TextFileWriteLn(FF, "  СУМПЕРЕОЦЕНОКНФАИТОГ=0");
                  TextFileWriteLn(FF, "  )");
                fi;
             fi;
             i=i+1;
           end; -- while arErr[i]=Str(j)
           if new_rec<>0: TextFileWriteLn(FF, "  ]"); fi;
           if new_rec<>0: TextFileWriteLn(FF, ")"); fi;
           TextFileWriteLn(FF, "]");
         Except
           ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^-1;
         end;
         TextFileClose(FF);
         --
         if j=1: nameFile=Путь+"РПО_ОСТ_НФА.CDF";
         |  j=2: nameFile=Путь+"РПО_ОСТ_НФА_0.CDF";
         |  j=3: nameFile=Путь+"РПО_ОСТ_НФА_M.CDF";
         fi;
         ЗаписатьCDF(nameFile);
       od;
     fi; -- len=LengthOfArray(arSRT)
     -- *** ПРОТОКОЛЫ ***
     kk=LengthOfArray(txtDANA)+LengthOfArray(nAna)+LengthOfArray(LSTДА1)+LengthOfArray(LSTДА2)+LengthOfArray(BufT)+LengthOfArray(BufD);
     j=0; -- счетчик для одного ShowProgress и разных массивов
     if kk>0:
       ShowProgress(kk, "Формирование протоколов работы...");
       -- Протокол  синхронизации инвентарных с учетными номерами
       len=LengthOfArray(txtDANA);
       if len>0: -- txtDANA
         if УЧН_ИНВКАРТ and not УЧН_ПЕРЕНУМ:
            nameFile=Путь+"Протокол_инвкарт.txt"; tmp="ПРОТОКОЛ СИНХРОНИЗАЦИИ ИНВЕНТАРНЫХ НОМЕРОВ С УЧЕТНЫМИ";
         |  УЧН_ПЕРЕНУМ:                     
            nameFile=Путь+"Протокол_перенум.txt"; tmp="ПРОТОКОЛ ПЕРЕНУМЕРАЦИИ УЧЕТНЫХ НОМЕРОВ";
         else                                
            nameFile=Путь+"Протокол_учн.txt";     tmp="ПРОТОКОЛ РАБОТЫ С УЧЕТНЫМИ НОМЕРАМИ";
         fi;
         Try
           if ExistFile(nameFile): DeleteFile(nameFile); fi;
           FlagCreate=False;
           FF=TextFileCreate(nameFile);
           FlagCreate=True;
           TextFileWriteLn(FF, tmp);
           TextFileWriteLn(FF, "");
           for i=1 to len do j=j+1; ProgressPos(j); TextFileWriteLn(FF, txtDANA[i]); od;
         Except
           ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^0;
         end;
         TextFileClose(FF);
       fi;
       -- Служебный файл синхронизации инвентарных с учетными номерами
       len=LengthOfArray(nAna);
       if len>0: -- nAna
         nameFile=Путь+"Инвентарный_в_Учетный.log";
         Try
           if ExistFile(nameFile): DeleteFile(nameFile); fi;
           FlagCreate=False;
           FF=TextFileCreate(nameFile);
           FlagCreate=True;
           for i=1 to len do j=j+1; ProgressPos(j); TextFileWriteLn(FF, nAna[i]); od;
         Except
           ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^0;
         end;
         TextFileClose(FF);
       fi;
       -- Служебный файл - список применяемых учетных номеров
       len=LengthOfArray(LSTДА1);
       if len>0: -- LSTДА1
         nameFile=Путь+"Список_учетных_номеров.log";
         Try
           if ExistFile(nameFile): DeleteFile(nameFile); fi;
           FlagCreate=False;
           FF=TextFileCreate(nameFile);
           FlagCreate=True;
           for i=1 to len do j=j+1; ProgressPos(j); TextFileWriteLn(FF, LSTДА1[i]); od;
         Except
           ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^0;
         end;
         TextFileClose(FF);
       fi;
       -- Служебный файл - список предупреждений несоответствия НФА по счетам
       len=LengthOfArray(LSTДА2);
       if len>0: -- LSTДА2
         nameFile=Путь+"Предупреждения_НФА_по_счетам.txt";
         Try
           if ExistFile(nameFile): DeleteFile(nameFile); fi;
           FlagCreate=False;
           FF=TextFileCreate(nameFile);
           FlagCreate=True;
           TextFileWriteLn(FF, "СПИСОК ПРЕДУПРЕЖДЕНИЙ НЕСООТВЕТСТВИЯ КОДА НФА СЧЕТУ УЧЕТА НФА");
           TextFileWriteLn(FF, "без исправления - данные позиции будут не видны в операциях внутренних перемещений и списания");
           TextFileWriteLn(FF, "");
           for i=1 to len do j=j+1; ProgressPos(j); TextFileWriteLn(FF, LSTДА2[i]); od;
         Except
           ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^0;
         end;
         TextFileClose(FF);
       fi;
       -- Протокол корректировки амортизации
       len=LengthOfArray(BufT);
       if len>0: -- BufT
         SortArray(BufT, True);
         nameFile=Путь+"Корректировка_амортизации.txt";
         Try
           if ExistFile(nameFile): DeleteFile(nameFile); fi;
           FlagCreate=False;
           FF=TextFileCreate(nameFile);
           FlagCreate=True;
           TextFileWriteLn(FF, "ПРОТОКОЛ КОРРЕКТИРОВКИ АМОРТИЗАЦИИ");
           TextFileWriteLn(FF, "");
           refTXT=""; КОДСЧТ=""; КОДМОЛ=""; КОДМХЭ=""; КОДНФА=""; КОДУЧН="";
           for i=1 to len do
             j=j+1;
             ProgressPos(j);
             refTXT=ExtractWord(1, BufT[i], "|");
             КОДСЧТ=ExtractWord(2, BufT[i], "|");
             КОДМОЛ=ExtractWord(3, BufT[i], "|");
             КОДМХЭ=ExtractWord(4, BufT[i], "|");
             КОДНФА=ExtractWord(5, BufT[i], "|");
             КОДУЧН=ExtractWord(6, BufT[i], "|");
             txt1=ExtractWord(7, BufT[i], "|");
             txt2=ExtractWord(8, BufT[i], "|");
             txt3=ExtractWord(9, BufT[i], "|");
             if txt1<>"": Try SUM=StringToNumeric(txt1); Except SUM=0.00; end; else SUM=0.00; fi;
             if txt2<>"": Try KOL=StringToNumeric(txt2); Except KOL=0.00; end; else KOL=0.00; fi;
             if txt3<>"": Try AMT=StringToNumeric(txt3); Except AMT=0.00; end; else AMT=0.00; fi;
             if refTXT="0": tmp="излишне  исчислена  для НФА  на складе  (цена<10'000 руб.).";
             |  refTXT=">": tmp="сумма  амортизации  больше  балансовой  (цена>10'000 руб.).";
             |  refTXT="<": tmp="недоначислена при выдаче в эксплуатацию (цена<10'000 руб.).";
             else tmp="";
             fi;
             if tmp<>"":
                TextFileWriteLn(FF, tmp);
               TextFileAppendLn(FF, КОДМОЛ+" ("+Name_A(КОДМОЛ)+"); ");
               TextFileAppendLn(FF, КОДМХЭ+" ("+Name_A(КОДМХЭ)+"); ");
               TextFileAppendLn(FF, КОДНФА+" ("+Name_A(КОДНФА)+"); ");
               TextFileAppendLn(FF, if(КОДУЧН<>" ", КОДУЧН+"; ", "НЕТ; "));
                TextFileWriteLn(FF, "Счет НФА "+КОДСЧТ);
                TextFileWriteLn(FF, "Сумма  балансовая "+Format("%17.6F", SUM));
                TextFileWriteLn(FF, "Количество НФА    "+Format("%17.6F", KOL));
                TextFileWriteLn(FF, "Амортизация  была "+Format("%17.6F", AMT));
               if refTXT="0": QUA=0.00;
               |  refTXT=">": QUA=SUM;
               |  refTXT="<": QUA=SUM;
               fi;
                TextFileWriteLn(FF, "Амортизация новая "+Format("%17.6F", QUA));
                TextFileWriteLn(FF, "");
                TextFileWriteLn(FF, "");
             fi;
           od;
         Except
           ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^0;
         end;
         TextFileClose(FF);
       fi;
       -- Служебный файл - отчет по датам принятия к учету, ввода в эксплуатацию НФА
       len=LengthOfArray(BufD);
       if len>0: -- BufD
         nameFile=Путь+"Отчет_даты_ВЭКСП_НФА.log";
         Try
           if ExistFile(nameFile): DeleteFile(nameFile); fi;
           FlagCreate=False;
           FF=TextFileCreate(nameFile);
           FlagCreate=True;
           TextFileWriteLn(FF, "//// ОТЧЕТ ПО ДАТАМ ПРИНЯТИЯ К УЧЕТУ, ВВОДА В ЭКСПЛУАТАЦИЮ НФА");
           TextFileWriteLn(FF, "//// Рабочих строк: "+Str(len));
           for i=1 to len do j=j+1; ProgressPos(j); TextFileWriteLn(FF, BufD[i]); od;
         Except
           ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^0;
         end;
         TextFileClose(FF);
       fi;
     fi; -- kk>0
     -- Служебный файл - расхождения амортизации между расчетом и балансом
     len=LengthOfArray(LSTНФА);
     if len>0: -- LSTНФА
       ShowProgress(0, "Расчет расхождений амортизации...");
       nameFile=Путь+"Расчет_расхождений_амортизации.txt";
       ClearVariable(BufT);
       Try
         if ExistFile(nameFile): DeleteFile(nameFile); fi;
         FlagCreate=False;
         FF=TextFileCreate(nameFile);
         FlagCreate=True;
         TextFileWriteLn(FF, "СПИСОК РАСХОЖДЕНИЙ СУММ АМОРТИЗАЦИИ МЕЖДУ РАСЧЕТОМ И БАЛАНСОМ");
         TextFileWriteLn(FF, "");
         j=0;
         temp=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst"+"|По_счетам_104";
         Отч1=RepOpen(temp, "*.104.??.4?0", "", 1.1.100, ДАТАОТЧ, "", "");
         RepReset(Отч1);
         Try
           while RepNext(Отч1) do
             КОДСЧТ=""; SUM=0.00; AMT=0.00; KOL=0.00;
             КОДСЧТ=RepIdent(Отч1);
             --AMT=Abs(RepSaldoF(Отч1, отчСверн));
             AMT=-RepSaldoF(Отч1, отчСверн);
             h=SearchInArray(LSTНФА, КОДСЧТ, True, 1);
             if h>0:
               SUM=LSTСУМ[h];
               DeleteFromArray(LSTНФА, h);
               DeleteFromArray(LSTСУМ, h);
               KOL=AMT-SUM;
             else
               KOL=AMT;
             fi;
             j=j+1;
             BufT[j]="Счет "+КОДСЧТ+". - По данным расчета: "+Format("%17.2N", SUM)+". По данным баланса: "+Format("%17.2N", AMT)+". Разница : "+Format("%17.2N", KOL);
           end;
         Finally
           Отч1=RepClose(Отч1);
         end;
         zz=LengthOfArray(LSTНФА);
         if zz>0:
           КОДСЧТ=""; SUM=0.00; AMT=0.00; KOL=0.00;
           for z=1 to zz do
             КОДСЧТ=LSTНФА[z];
             SUM=LSTСУМ[z];
             KOL=AMT-SUM;
             j=j+1;
             BufT[j]="Счет "+КОДСЧТ+". - По данным расчета: "+Format("%17.2N", SUM)+". По данным баланса: "+Format("%17.2N", AMT)+". Разница : "+Format("%17.2N", KOL);
           od;
         fi;
         zz=LengthOfArray(BufT);
         if zz>0: for z=1 to zz do TextFileWriteLn(FF, BufT[z]); od; fi;
       Except
         ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^0;
       end;
       TextFileClose(FF);
     fi;
   else
     Message("Не найдено данных для формирования остатков!", mtInformation);
   fi; -- len=LengthOfArray(LSTНФА)
 Finally
   CloseProgress;
   Очистить;
   ToggleAutoRefresh(Режим);
 end;
 ^1;
end;

Func УдалитьНеиспользуемыеПризнакиНФА :Logical;
var RO, j, num, xx, yy, kk, i :Integer;
var ANA :String;
var OK, FlagCreate :Logical;
 OK=False;
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_НФА", "", "");
 Try
   num=Records(RO);
   if num>0:
      yy=EnqOkCancel("Удалить неиспользуемые признаки НФА?", mtConfirmation);
      if yy=cmCancel: ^False; fi;
      ClearVariable(Buf);
      Try
        xx=num;
        kk=0; yy=0; j=1; i=0;
        ShowProgress(num, "Работаем...");
        while xx>0 do
          ProgressPos(j);
          if kk=0: BeginChanging(RO); fi;
          kk=kk+1;
          -- *** --
          ANA="НФА."+GetFieldS(RO, xx, "ГРНФА")+"."+GetFieldS(RO, xx, "ПРИЗНАК");
          if ValidSign(ANA) and Match(ANA, "НФА.10?.0?.*"):
             if not SignUsed(ANA): 
                i=i+1;
                Buf[i]="Удален неиспользуемый признак - "+ANA+" - UKEY:"+RecordToString(GetRecordKey(RO, xx));
                DeleteRecord(RO, xx);
             fi;
          fi;
          -- *** --
          if kk=200: --записываем очередную порцию записей
            EndChanging(RO);
            yy=yy+kk;
            kk=0;
          fi;
          xx=xx-1;
          j=j+1;
        end;
        if kk>0: EndChanging(RO); yy=yy+kk; fi; --если последняя порцию неполная
        if xx=0: OK=True; fi;
        yy=LengthOfArray(Buf);
        if yy>0:
          ANA=PlanVar('CACHE')+"\"+GetGUID;
          Try
            if ExistFile(ANA): DeleteFile(ANA); fi;
            FlagCreate=False;
            kk=TextFileCreate(ANA);
            FlagCreate=True;
            for j=1 to yy do TextFileWriteLn(kk, Buf[j]); od;
          Except
            ЗакрытьФайлПоОшибке(kk, FlagCreate, ANA); Raise;
          end;
          TextFileClose(kk);
        fi;
        OpenEditor(ANA);
      Except
        Message(if(yy>0, "Всего обработано "+Str(yy)+" записей из "+Str(num)+"."+Chr(13), "")+
                         "Ошибка "+Str(ErrorCode)+"."+Chr(13)+
                         "Дальнейшая обработка невозможна!", mtError);
        CancelChanging(RO);
        Raise;
      end;
   else
      Message("Картотека НФА [РПО_НФА] пустая!", mtWarning);
      ^False;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 ^OK;
end;

Func СделатьОдинаковымиДаты :Logical;
var RO, OA, j, num, len, i, yy, kk, xx :Integer;
var dv, du :Date;
var OK :Logical;
 OK=False;
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 Try
   num=Records(RO);
   if num>0:
      yy=EnqOkCancel("Синхронизировать пустые даты ввода в эксплуатацию или принятия к учету?", mtConfirmation);
      if yy=cmCancel: ^False; fi;
      ShowProgress(num, "Работаем...");
      Try
        kk=0; yy=0; j=1; i=0;
        for j=1 to num do
          ProgressPos(j);
          if kk=0: BeginChanging(RO); fi;
          kk=kk+1;
          -- *** --
          OA=OpenArray(RO, j, "ПОЗИЦИИОС", "", "");
          len=Records(OA);
          if len>0:
             for i=1 to len do
               dv=GetFieldD(OA, i, "ДЭКСПЛ");
               du=GetFieldD(OA, i, "ДУЧЕТ");
               if dv<1.1.1900 and du>1.1.1900: dv=du;
               |  dv>1.1.1900 and du<1.1.1900: du=dv;
               |  dv<1.1.1900 and du<1.1.1900: du=1.1.2003; dv=1.1.2003;
               fi;
               xx=PutFieldD(OA, i, "ДЭКСПЛ", dv);
               xx=PutFieldD(OA, i, "ДУЧЕТ",  du);
             od;
          fi;
          CloseWorkArea(OA);
          -- *** --
          if kk=200: --записываем очередную порцию записей
            EndChanging(RO);
            yy=yy+kk;
            kk=0;
          fi;
        od;
        if kk>0: EndChanging(RO); yy=yy+kk; fi; --если последняя порцию неполная
        if j=num: OK=True; fi;
      Except
        Message(if(yy>0, "Всего обработано "+Str(yy)+" записей из "+Str(num)+"."+Chr(13), "")+
                         "Ошибка "+Str(ErrorCode)+"."+Chr(13)+
                         "Дальнейшая обработка невозможна!", mtError);
        CancelChanging(RO);
        Raise;
      end;
   else
      Message("Картотека НФА [РПО_ОСТ_НФА] пустая!", mtWarning);
      ^False;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 ^OK;
end;

Func КорректировкаВД :Logical;
var RO, OA, j, num, len, i, yy, kk, xx :Integer;
var ANA, tmp, ValueВД :String;
var WorkSubTab :Logical;
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 Try
   num=Records(RO);
   if num>0:
      yy=EnqOkCancel("Проставить (не заменить) выбранный признак ВД,^Mесли его (признака) нет в аналитике операций остатков?", mtConfirmation);
      if yy=cmCancel: ^False; fi;
      tmp=AnaElection("ВД.*", False, False, "");
      if tmp="": ^False; else ValueВД=tmp; fi;
      ShowProgress(num, "Работаем...");
      Try
        kk=0; yy=0;
        for j=1 to num do
          ProgressPos(j);
          WorkSubTab=False;
          ANA=GetFieldS(RO, j, "ОБЩАН");
          tmp=ВзятьСловоИзНабораПоМаске(ANA, " ", "ВД.*", "");
          if tmp="": WorkSubTab=True; ANA=""; tmp=""; fi;
          --
          if kk=0: BeginChanging(RO); fi;
          kk=kk+1;
          -- *** --
          if WorkSubTab:
             OA=OpenArray(RO, j, "ПОЗИЦИИОС", "", "");
             len=Records(OA);
             if len>0:
                for i=1 to len do
                  ANA=GetFieldS(OA, i, "ДОПАН");
                  tmp=ВзятьСловоИзНабораПоМаске(ANA, " ", "ВД.*", "");
                  if tmp="":
                     ANA=РАБ.НФА.FUNC_LIB.Объединить(ANA, ValueВД, " ");
                     xx=PutFieldS(OA, i, "ДОПАН", ANA);
                  fi;
                od;
             fi;
             CloseWorkArea(OA);
             OA=OpenArray(RO, j, "ПОЗИЦИИ", "", "");
             len=Records(OA);
             if len>0:
                for i=1 to len do
                  ANA=GetFieldS(OA, i, "ДОПАН");
                  tmp=ВзятьСловоИзНабораПоМаске(ANA, " ", "ВД.*", "");
                  if tmp="":
                     ANA=РАБ.НФА.FUNC_LIB.Объединить(ANA, ValueВД, " ");
                     xx=PutFieldS(OA, i, "ДОПАН", ANA);
                  fi;
                od;
             fi;
             CloseWorkArea(OA);
          fi;
          -- *** --
          if kk=200: --записываем очередную порцию записей
            EndChanging(RO);
            yy=yy+kk;
            kk=0;
          fi;
        od;
        if kk>0: EndChanging(RO); yy=yy+kk; fi; --если последняя порцию неполная
      Except
        Message(if(yy>0, "Всего обработано "+Str(yy)+" записей из "+Str(num)+"."+Chr(13), "")+
                         "Ошибка "+Str(ErrorCode)+"."+Chr(13)+
                         "Дальнейшая обработка невозможна!", mtError);
        CancelChanging(RO);
        Raise;
        ^False;
      end;
   else
      Message("Картотека НФА [РПО_ОСТ_НФА] пустая!", mtWarning);
      ^False;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 ^True;
end;

Func ОтчетПоДатам :Logical;
var FF, RO, OA, num, j, len, i, xx :Integer;
var REC, nameFile :String;
var OK, FlagCreate :Logical;
 OK=False;
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 Try
   num=Records(RO);
   if num>0:
      ClearVariable(Buf);
      ShowProgress(num, "Работаем...");
      for j=1 to num do
        ProgressPos(j);
        REC=RecordToString(GetRecordKey(RO, j));
        OA=OpenArray(RO, j, "ПОЗИЦИИОС", "", "ДУЧЕТ=1.1.100 AND ДЭКСПЛ=1.1.100");
        len=Records(OA);
        if len>0:
           for i=1 to len do xx=xx+1; Buf[xx]="Запись"+REC+"@Сумма:"+Format("%17.2F", GetFieldN(OA, i, "СУМНФА"))+"@Кол:"+Format("%17.6F", GetFieldN(OA, i, "КОЛНФА"))+"@Код НФА "+GetFieldS(OA, i, "НФА"); od;
        fi;
        CloseWorkArea(OA);
      od;
   fi;
   num=LengthOfArray(Buf);
   if num>0:
      nameFile=PlanVar('CACHE')+"\"+GetGUID;
      Try
        if ExistFile(nameFile): DeleteFile(nameFile); fi;
        FlagCreate=False;
        FF=TextFileCreate(nameFile);
        FlagCreate=True;
        TextFileWriteLn(FF, "ОТЧЕТ ПО НЕПРОСТАВЛЕННЫМ ДАТАМ");
        TextFileWriteLn(FF, "");
        ShowProgress(num, "Пишем отчет...");
        for j=1 to num do j=j+1; ProgressPos(j); TextFileWriteLn(FF, Buf[j]); od;
        OK=True;
      Except
        ЗакрытьФайлПоОшибке(FF, FlagCreate, nameFile); Raise; ^False;
      end;
      TextFileClose(FF);
      if OK: OpenEditor(nameFile); fi;
   else
      Message("Нет данных для отчета!", mtInformation);
      ^False;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 ^OK;
end;

Func ВзятьПутьКфайламВыгрузки(ПутьИмяПротокола:String) :String;
var kk :Integer;
var Путь :String;
 Путь="";
 kk=WordsCount(ПутьИмяПротокола, "\");
 Путь=ExtractWords(1, kk-1, ПутьИмяПротокола, "\")+"\";
 if Pos("\\", ПутьИмяПротокола)=1: Путь="\\"+Путь; fi;
 ^Путь;
end;

Func БезПервогоСлова(Text:String; Sep:String) :String;
var res :String;
var num :Integer;
  res="";
  num=WordsCount(Text, Sep);
  if num<2: ^""; fi;
  res=ExtractWords(2, num-1, Text, Sep);
  ^res;
end;

Func КорректировкаИНВCRD :Logical;
var OK, Режим, Work :Logical;
var Путь, ИмяПротокола, curstr, v1, v2, v3, v4 :String;
var num, readFile, kolWords, RO, kk, yy, j, zz :Integer;
-- Message("В разработке!");
-- ^False;
 OK=False;
 kolWords=4; -- записали в протокол четыре слова в строку
 num=ChooseFile(ИмяПротокола, "Выберите log-файла инвентарных номеров выгрузки остатков НФА...", "Инвентарный_в_Учетный.log|Инвентарный_в_Учетный.log");
 if num=cmCancel: Message("Отказ от выбора log-файла инвентарных номеров выгрузки остатков НФА.", mtInformation); ^False; fi;
 Путь=ВзятьПутьКфайламВыгрузки(ИмяПротокола);
 if Путь="": Message("Ошибка при определении пути выгрузки остатков НФА!", mtError); ^False; fi;
 if not ExistFile(ИмяПротокола): Message("Ошибка доступа к log-файлу инвентарных номеров выгрузки остатков НФА!", mtError); ^False; fi;
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_ИНВКАРТ_ОС", "", "");
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ClearVariable(Buf);
 ClearVariable(BufD);
 ClearVariable(BufT);
 Try
   readFile=TextFileOpenRead(ИмяПротокола, False);
   Try
     while not TextFileEndOfFile(readFile) do -- цикл по содержимому файла
       curstr=TextFileReadLn(readFile);
       v1=""; v2=""; v3=""; v4=""; Work=False;
       if WordsCount(curstr, "@")=kolWords:
          v1=Trim(ExtractWord(1, curstr, "@")); -- старый учетный номер
          v2=Trim(ExtractWord(2, curstr, "@")); -- новый учетный номер
          v3=Trim(ExtractWord(3, curstr, "@")); -- счет
          v4=Trim(ExtractWord(4, curstr, "@")); -- код НФА
          if Match(v1, pfxINV+".*") and
             Match(v2, pfxNEW+".*") and
             Match(v3, "???.????.???????.???.?.10?.??.???") and
             Match(v4, "НФА.???.??.*"):
             v1=БезПервогоСлова(v1, "."); -- аналитика
             v2=БезПервогоСлова(v2, "."); -- аналитика
             Work=True;
          fi;
          if Work:
             if SearchInArray(BufD, v1, True, 1)=-1:
                num=InsertInArraySort(BufD, v1);
                InsertInArray(BufT, num, v2+"|"+v3+"|"+v4);
             fi;
          fi;
       fi;
     end; -- цикл по файлу пока не кончится
   Finally
     TextFileClose(readFile);
   end;
   num=LengthOfArray(BufD);
   if num>0:
      ShowProgress(num, "Обработка инвентарных карточек...");
      Try
        kk=0; yy=0; zz=0;
        for j=1 to num do
          ProgressPos(j);
          if kk=0: BeginChanging(RO); fi;
          kk=kk+1;
          -- *** --
          curstr=GetFieldS(RO, j, "ИНВ"); -- старый учетный номер
          kolWords=SearchInArray(BufD, curstr, True, 1);
          if kolWords>0: -- что-то нашли
             v2=Trim(ExtractWord(1, BufT[kolWords], "|")); -- новый учетный номер
             v3=Trim(ExtractWord(2, BufT[kolWords], "|")); -- счет
             v4=Trim(ExtractWord(3, BufT[kolWords], "|")); -- код НФА
             if v4=GetFieldS(RO, j, "НФА"):
                readFile=PutFieldS(RO, j, "ИНВ",     v2);
                readFile=PutFieldS(RO, j, "ИНВ_ВЕД", v2);
                readFile=PutFieldS(RO, j, "СЧЕТНФА", v3);
                zz=zz+1;
                Buf[zz]="Запись "+RecordToString(GetRecordKey(RO, j))+" изменена. Старый - "+curstr+". Новый - "+v2+".";
             fi;
          fi;
          -- *** --
          if kk=200: --записываем очередную порцию записей
            EndChanging(RO);
            yy=yy+kk;
            kk=0;
          fi;
        od;
        if kk>0: EndChanging(RO); yy=yy+kk; fi; --если последняя порцию неполная
        OK=True;
      Except
        Message(if(yy>0, "Всего обработано "+Str(yy)+" записей из "+Str(num)+"."+Chr(13), "")+
                         "Ошибка "+Str(ErrorCode)+"."+Chr(13)+
                         "Дальнейшая обработка невозможна!", mtError);
        CancelChanging(RO);
        Raise;
        ^False;
      end;
   else
      Message("Ошибка считывания log-файла инвентарных номеров выгрузки остатков НФА!", mtError);
      ^False;
   fi;
   num=LengthOfArray(Buf);
   if num>0: -- Buf
      ShowProgress(num, "Создание протокола...");
      ИмяПротокола=Путь+"Отчет_корректировки_инв_карточек.txt";
      Try
        if ExistFile(ИмяПротокола): DeleteFile(ИмяПротокола); fi;
        Work=False;
        zz=TextFileCreate(ИмяПротокола);
        Work=True;
        TextFileWriteLn(zz, "ОТЧЕТ КОРРЕКТИРОВКИ ИНВЕНТАРНЫХ КАРТОЧЕК");
        TextFileWriteLn(zz, "");
        for j=1 to num do ProgressPos(j); TextFileWriteLn(zz, Buf[j]); od;
      Except
        ЗакрытьФайлПоОшибке(zz, Work, ИмяПротокола); Raise; ^False;
      end;
      TextFileClose(zz);
   fi;
 Finally
   ToggleAutoRefresh(Режим);
   CloseWorkArea(RO);
   CloseProgress;
 end;
 ^OK;
end;

Func КорректировкаДат :Logical;
var OK, Режим, NeedNextRow, Work :Logical;
var num, RO, OA, num_RO, num_OA, readFile, a1, a2, len, iter, xx, zz :Integer;
var Путь, ИмяПротокола, curstr, tmp, knt, WorkStr :String;
var КОДМОЛ, КОДМХЭ, КОДНФА, КОДУЧН, КОДСЧТ :String;
var ДВЭ, ДПУ, dv, du, dd :Date;
var SUM :Numeric;
 OK=False;
 num=ChooseFile(ИмяПротокола, "Выберите протокол дат ввода в эксплуатацию [принятия к учету] выгрузки остатков НФА...", "Отчет_даты_ВЭКСП_НФА.log|Отчет_даты_ВЭКСП_НФА.log");
 if num=cmCancel: Message("Отказ от выбора протокола дат ввода в эксплуатацию^M[принятия к учету] выгрузки остатков НФА!", mtInformation); ^False; fi;
 Путь=ВзятьПутьКфайламВыгрузки(ИмяПротокола);
 if Путь="": Message("Ошибка при определении пути выгрузки остатков НФА!", mtError); ^False; fi;
 if not ExistFile(ИмяПротокола): Message("Ошибка доступа к протоколу дат ввода в эксплуатацию^M[принятия к учету] выгрузки остатков НФА!", mtError); ^False; fi;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 Try
   num_RO=Records(RO);
   if num_RO<1: Message("В картотеке остатков НФА нет записей!", mtError); ^False; fi;
   ClearVariable(arДВЭ); ClearVariable(txtМОЛ);
   ClearVariable(arДПУ); ClearVariable(txtМХЭ);
   ClearVariable(arСУМ); ClearVariable(aAna);
   readFile=TextFileOpenRead(ИмяПротокола, False);
   Try
     NeedNextRow=False; Work=False; len=0; iter=0;
     while not TextFileEndOfFile(readFile) do -- цикл по содержимому файла
       curstr=TextFileReadLn(readFile);
       knt=SubStr(curstr, 1, 5);
       WorkStr=Trim(SubStr(curstr, 6, 255));
       if not NeedNextRow: КОДМОЛ=""; КОДМХЭ=""; КОДНФА=""; КОДУЧН=""; КОДСЧТ=""; ДВЭ=1.1.100; ДПУ=1.1.100; SUM=0.00; fi;
       if knt="//// ":
          if Pos("Рабочих строк: ", WorkStr)=1: Try len=Int(Trim(SubStr(WorkStr, 16, 255))); Except len=0; end; fi;
          if len>0: ShowProgress(len, "Считывание файла..."); fi;
       |  knt="###1!":
          КОДМОЛ=Trim(ExtractWord(1, WorkStr, "@"));
          КОДМХЭ=Trim(ExtractWord(2, WorkStr, "@"));
          NeedNextRow=True; Work=False;
       |  knt="###2!":
          КОДНФА=Trim(ExtractWord(1, WorkStr, "@"));
          КОДСЧТ=Trim(ExtractWord(2, WorkStr, "@"));
          КОДУЧН=Trim(ExtractWord(3, WorkStr, "@"));
          Try SUM=StringToNumeric(Trim(ExtractWord(4, WorkStr, "@"))); Except SUM=0.00; end;
          Try ДПУ=StringToDate(Trim(ExtractWord(5, WorkStr, "@"))); Except ДПУ=1.1.100; end;
          Try ДВЭ=StringToDate(Trim(ExtractWord(6, WorkStr, "@"))); Except ДВЭ=1.1.100; end;
          NeedNextRow=False; Work=True;
       fi;
       if Work:
          if Match(КОДМОЛ, "МОЛ.*") and
             Match(КОДМХЭ, "М.*")   and
             Match(КОДНФА, "НФА.*") and
             (КОДУЧН="" or Match(КОДУЧН, pfxNEW+".*")) and
             (Match(КОДСЧТ, "???.??.??.??.??.??.????.?.???.??.???") or Match(КОДСЧТ, "???.????.???????.???.?.???.??.???")):
             -- *** Основная работа по считыванию файла ***
             tmp="";
             if SearchInArray(txtМОЛ, КОДМОЛ, False, 1)=-1: a1=a1+1; txtМОЛ[a1]=КОДМОЛ; fi;
             if SearchInArray(txtМХЭ, КОДМХЭ, False, 1)=-1: a2=a2+1; txtМХЭ[a2]=КОДМХЭ; fi;
             -- КОДМОЛ|КОДМХЭ|КОДСЧТ|КОДНФА|КОДУЧН
             tmp=Str(SearchInArray(txtМОЛ, КОДМОЛ, False, 1))+"@"+
                 Str(SearchInArray(txtМХЭ, КОДМХЭ, False, 1))+"@"+
                                                       КОДСЧТ+"@"+
                                                       КОДНФА+"@"+
                                        if(КОДУЧН="", " ", КОДУЧН);
             if SearchInArray(aAna, tmp, True, 1)=-1:
                xx=InsertInArraySort(aAna, tmp);
                InsertInArray(arДВЭ, xx, ДВЭ);
                InsertInArray(arДПУ, xx, ДПУ);
                InsertInArray(arСУМ, xx, SUM);
             fi;
             -- ***
          fi;
          Work=False;
       fi;
       iter=iter+1;
       ProgressPos(iter);
     end; -- цикл по файлу пока не кончится
   Finally
     TextFileClose(readFile);
   end;
   num=LengthOfArray(aAna);
   if num>0:
      BeginChanging(RO);
      Try
        ShowProgress(num_RO, "Обработка картотеки 'РПО_ОСТ_НФА'...");
        ClearVariable(Buf); -- для протокола
        Buf[1]="ПРОТОКОЛ СВЕРКИ ДАТ ВВОДА В ЭКСПЛУАТАЦИЮ [ПРИНЯТИЯ К УЧЕТУ] ВЫГРУЗКИ ОСТАТКОВ НФА";
        Buf[2]="";
        zz=2;
        for iter=1 to num_RO do
           ProgressPos(iter);
           КОДМОЛ=""; КОДМХЭ="";
           КОДМОЛ=GetFieldS(RO, iter, "МОЛ");
           КОДМХЭ=GetFieldS(RO, iter, "М");
           OA=OpenArray(RO, iter, "ПОЗИЦИИОС", "", "");
           num_OA=Records(OA);
           if num_OA>0:
             for a1=1 to num_OA do
                tmp=""; КОДНФА=""; КОДУЧН=""; КОДСЧТ=""; ДВЭ=1.1.100; ДПУ=1.1.100; SUM=0.00;
                КОДНФА=GetFieldS(OA, a1, "НФА");
                КОДУЧН=GetFieldS(OA, a1, "УЧНОМ");
                КОДСЧТ=GetFieldS(OA, a1, "СЧНФА");
                ДВЭ=GetFieldD(OA, a1, "ДЭКСПЛ");
                ДПУ=GetFieldD(OA, a1, "ДУЧЕТ");
                SUM=GetFieldN(OA, a1, "СУМНФА");
                tmp=Str(SearchInArray(txtМОЛ, КОДМОЛ, False, 1))+"@"+
                    Str(SearchInArray(txtМХЭ, КОДМХЭ, False, 1))+"@"+
                                                          КОДСЧТ+"@"+
                                                          КОДНФА+"@"+
                                           if(КОДУЧН="", " ", КОДУЧН);
                xx=SearchInArray(aAna, tmp, True, 1);
                if xx>0:
                   if arСУМ[xx]=SUM:
                      dv=ДВЭ; du=ДПУ; Work=False;
                      if arДВЭ[xx]<>ДВЭ and arДВЭ[xx]>1.1.1900: dv=arДВЭ[xx]; a2=PutFieldD(OA, a1, "ДЭКСПЛ", dv); Work=True; fi;
                      if arДПУ[xx]<>ДПУ and arДПУ[xx]>1.1.1900: du=arДПУ[xx]; a2=PutFieldD(OA, a1, "ДУЧЕТ",  du); Work=True; fi;
                      if Work:
                         if dv=du and dv>1.1.1900: dd=dv;                 -- если dv равно du
                         |  dv<du and dv>1.1.1900: dd=dv;                 -- если dv раньше du
                         |  dv<du and dv<1.1.1900 and du>1.1.1900: dd=du; -- если dv раньше du
                         |  dv>du and du>1.1.1900: dd=du;                 -- если dv позже du
                         |  dv>du and du<1.1.1900 and dv>1.1.1900: dd=dv; -- если dv позже du
                         else dd=1.1.100;
                         fi;
                         if dd>1.1.1900: tmp="ГГ."+Str(Year(dd))+" ММДД."+Format("%.2d", Mon(dd))+"."+Format("%.2d", Day(dd)); else tmp=""; fi;
                         a2=PutFieldS(OA, a1, "ДЭКСПЛММДДГГ", tmp);
                         zz=zz+1;
                         Buf[zz]=RecordToString(GetRecordKey(RO, iter))+"@"+КОДНФА+"@"+КОДСЧТ+"@"+КОДУЧН+"@"+" ДВЭ было "+DateToString(ДВЭ)+". "+"ДВЭ стало "+DateToString(dv)+"@"+" ДПУ было "+DateToString(ДПУ)+". "+"ДПУ стало "+DateToString(du);
                      fi;
                   fi;
                fi;
             od;
           fi;
           CloseWorkArea(OA);
        od;
        EndChanging(RO);
        OK=True;
      Except
        CancelChanging(RO);
      end;
      len=LengthOfArray(Buf);
      if len>0: -- Buf
         ShowProgress(len, "Создание протокола...");
         ИмяПротокола=Путь+"Отчет_сверки_ВЭКСП_НФА.txt";
         Try
           if ExistFile(ИмяПротокола): DeleteFile(ИмяПротокола); fi;
           Work=False;
           xx=TextFileCreate(ИмяПротокола);
           Work=True;
           TextFileWriteLn(xx, "ОТЧЕТ СВЕРКИ ДАТ ПРИНЯТИЯ К УЧЕТУ, ВВОДА В ЭКСПЛУАТАЦИЮ НФА");
           TextFileWriteLn(xx, "");
           for a1=1 to len do ProgressPos(a1); TextFileWriteLn(xx, Buf[a1]); od;
         Except
           ЗакрытьФайлПоОшибке(xx, Work, ИмяПротокола); Raise; ^False;
         end;
         TextFileClose(xx);
      fi;
   else
      Message("Ошибка считывания протокола дат ввода в эксплуатацию^M[принятия к учету] выгрузки остатков НФА!", mtError);
      ^False;
   fi;
 Finally
   ToggleAutoRefresh(Режим);
   CloseWorkArea(RO);
   CloseProgress;
 end;
 ^OK;
end;

Proc ДополнительныеДействия;
var xx, tb :Integer;
 ClearVariable(Buf);
 Buf[1]="Выйти, ничего не делая.";
 Buf[2]="Удалить неиспользуемые признаки НФА.";
 Buf[3]="Синхронизировать пустые даты ввода в эксплуатацию или принятия к учету.";
 Buf[4]="Автокорректировка привязки признака НФА в проводках [движение НФА].";
 Buf[5]="Проставить выбранный признак ВД, если нет его в аналитике операции.";
 Buf[6]="Сформировать отчет по непроставленным датам.";
 Buf[7]="На основе log-файла выгрузки остатков корректировать инв.карточки.";
 Buf[8]="По протоколу корректировать дату ввода в эксплуатацию [принятия к учету].";
 xx=Alternate("Выберите действие...", Buf, -1, 1, 12);
 if xx=02: tb=Time; if УдалитьНеиспользуемыеПризнакиНФА: Message("Работа завершена...^MВремя работы - "+Str(Time-tb)+"с."); fi;
 |  xx=03: tb=Time; if СделатьОдинаковымиДаты: Message("Работа завершена...^MВремя работы - "+Str(Time-tb)+"с."); fi;
 |  xx=04: tb=Time; if АвтокорректировкаПривязкиПроводокДляПризнакаНФА(True, True): Message("Работа завершена...^MВремя работы - "+Str(Time-tb)+"с."); fi;
 |  xx=05: tb=Time; if КорректировкаВД: Message("Работа завершена...^MВремя работы - "+Str(Time-tb)+"с."); fi;
 |  xx=06: tb=Time; if ОтчетПоДатам: Message("Работа завершена...^MВремя работы - "+Str(Time-tb)+"с."); fi;
 |  xx=07: tb=Time; if КорректировкаИНВCRD: Message("Работа завершена...^MВремя работы - "+Str(Time-tb)+"с."); fi;
 |  xx=08: tb=Time; if КорректировкаДат: Message("Работа завершена...^MВремя работы - "+Str(Time-tb)+"с."); fi;
 else Exit;
 fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
 if Field="УЧН_ИНВКАРТ": УЧН_ИНВКАРТ = not УЧН_ИНВКАРТ; ^False;
 |  Field="УЧН_ПЕРЕНУМ": УЧН_ПЕРЕНУМ = not УЧН_ПЕРЕНУМ; ^False;
 |  Field="КОЛ_НЕНУЛЬ" :  КОЛ_НЕНУЛЬ = not  КОЛ_НЕНУЛЬ; ^False;
 |  Field="ИСКАТЬДАТЫ" :  ИСКАТЬДАТЫ = not  ИСКАТЬДАТЫ; ^False;
 |  Field="ИГНОРНФА104": ИГНОРНФА104 = not ИГНОРНФА104; ^False;
 |  Field="flgБО"      : flgБО     = not flgБО     ; ^False;
 |  Field="flgВД"      : flgВД     = not flgВД     ; ^False;
 |  Field="flgВКЛ"     : flgВКЛ    = not flgВКЛ    ; ^False;
 |  Field="flgВП"      : flgВП     = not flgВП     ; ^False;
 |  Field="flgГГ"      : flgГГ     = not flgГГ     ; ^False;
 |  Field="flgК"       : flgК      = not flgК      ; ^False;
 |  Field="flgКВ"      : flgКВ     = not flgКВ     ; ^False;
 |  Field="flgКТ"      : flgКТ     = not flgКТ     ; ^False;
 |  Field="flgММДД"    : flgММДД   = not flgММДД   ; ^False;
 |  Field="flgП"       : flgП      = not flgП      ; ^False;
 |  Field="flgПГР"     : flgПГР    = not flgПГР    ; ^False;
 |  Field="flgПРТ"     : flgПРТ    = not flgПРТ    ; ^False;
 |  Field="flgРАЗМЕР"  : flgРАЗМЕР = not flgРАЗМЕР ; ^False;
 |  Field="flgРБС"     : flgРБС    = not flgРБС    ; ^False;
 |  Field="flgРОСТ"    : flgРОСТ   = not flgРОСТ   ; ^False;
 |  Field="flgФ"       : flgФ      = not flgФ      ; ^False;
 |  Field="flgЦ"       : flgЦ      = not flgЦ      ; ^False;
 |  Field="статус"     : СброситьНеобСправочники; ^False;
 |  Field="спр_ст"     : if спр_код[Iter]<>'':спр_ст[Iter]=not спр_ст[Iter];fi; ^False;
 |  Field="спр_ст_УЧН" : if спр_код[Iter]<>'':спр_ст_УЧН[Iter]=not спр_ст_УЧН[Iter];fi; ^False;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
end;

Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var dd :Date;
 Template.HideEditor(False);
 dd=ВыборДаты(GetDate);
 SetDate(dd);
 ^"";
end;
Proc ClearVar_спр;
 ClearVariable(спр_код);
 ClearVariable(спр_имя);
 ClearVariable(спр_ст);
 ClearVariable(спр_ст_УЧН);
end;

func ab(str1:s;sum:s;str2:s):s;
  if длина(str1)=0:^str2;fi;
  if длина(str2)=0:^str1;fi;
  if длина(str1)+длина(str2)+длина(sum)>255:
     Message('Ошибка![функция РАБ.НФА.B01.ab]^MРезультат превышает максимальную^Mдлину строки в 256 символов^M'+str1+'^M'+sum+'^M'+str2,mterror);
     ^str2;
  fi;
  ^str1+sum+str2;
end;
func СписокСправочниковПоМаске(МаскаДляВыбора:s;Разд:s):s; -- получаем список справочников работающих в маске  "спр1|спр2|спр3"
 var ll:l;
 var j,i:i;
 var s,ss,кроме,МаскаДляВыбора1:s;
 ClearVariable(РАБ.НФА.B01.st);
 j=0;кроме='';
   ll=true;
   While ll do
     ll=false;
     if кроме='':МаскаДляВыбора1=МаскаДляВыбора;
      | true:if Length(МаскаДляВыбора1)+Length(кроме)+4>255:^' ';fi;
         МаскаДляВыбора1=МаскаДляВыбора+'&~('+кроме+')';
     fi;
     for Признака s=МаскаДляВыбора1 do
      ss=ВзятьСправочникАналит(s);
      if ПоискВмассиве(st,ss,true)<1:
         ВставитьВмассивСорт(st,ss);
         кроме=кроме+if(кроме<>'','|'+ss+'.*',ss+'.*');
         ll=true;break;
      fi;
     od;
   od;

   j=длинамассива(st);
   ss='';
   for i=1..j do
     ss=ss+Разд+st[i];
   od;
   if ss<>'':ss=SubStr(ss,1+Length(Разд),256);fi;
   ^ss;
end;


Func СписокСПР_ОСТ(днфапризн:s):s;
var RO, OA, num, i, j, len, z,t  :Integer;
var  НЕДЕЙСТВСПР  :STRING; --список скрытых(незадействованных) справочников [через(|)]
var  НЕДЕЙСТВОСТ  :STRING; --список справочников по которым несчитаются остатки [через(|)]
var  spr0,spr:s;
 if картотекапризнака(днфапризн)<>'РПО_ДНФА':^'';
 fi;
 clearvariable(aAna);
 RO=OpenWorkArea("РПО_ДНФА", "","UKEY="+recordtostring(признаквзапись(днфапризн)));
 Try
   num=Records(RO);
   if num=1:
      Try
          НЕДЕЙСТВСПР='|'+up(trim(GetFields(RO, 1, "НЕДЕЙСТВСПР")))+'|';
          НЕДЕЙСТВОСТ='|'+up(trim(GetFields(RO, 1, "НЕДЕЙСТВОСТ")))+'|';
          OA=OpenArray(RO, 1, "ЗАПРОС", "", "ОСТАТОК and ТИППАРАМЕТРА=9");-- аналитика для остатков
          len=Records(OA);
          if len>0:
             for j=1 to len do
               spr0=trim(GetFields(OA, j, "ОТВЕТ"));
               if spr0<>'':
                  spr=trim(GetFields(OA, j, "СПР"));
                  if spr<>'':
                     spr='|'+up(spr)+'|';
                     if pos(spr,НЕДЕЙСТВСПР)<1 and pos(spr,НЕДЕЙСТВОСТ)<1:
                        spr0=СписокСправочниковПоМаске(spr0,'|');
                      | true:spr0='';
                     fi;
                   | true:spr0=СписокСправочниковПоМаске(spr0,'|');
                  fi;
                  z=количествослов(spr0,'|');
                  for t=1..z do addinarray(aAna,true,false,выделитьслово(t,spr0,'|'));od;
               fi;
             od;
          fi;
          CloseWorkArea(OA);
      Finally
      end;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 z=LengthOfArray(aAna);
 spr0='';
 for t=1..z do
  spr0=ab(spr0,'|',aAna[t]);
 od;
 ^spr0;

end;
var кн_спр:s='АВТОНАСТРОЙКА';
Функ кн_спр_ПриВходе(Поле: Строка; Итер: Целое): Логич;
var Путь,Имяотчета,ss,ss0:s;
var Отч,t,z,zz,tt:i;
ClearVariable(Buf);
ClearVariable(Buft);
    Buf[1]=  Раб.НФА.Свертка.Get_any_ref_list(ДАТАОТЧ+1,'');

--var r:report;
--Путь=PlanVar("НФА")+"\Отчеты\НФАОТЧ.lst";
--Имяотчета="Отчет (бланки, не менять!!!)";
--  r = RepOpen(Путь+"|"+ИмяОтчета,"("+MskНФА+")",'ДНФА.*&МОЛ.*&М.*&НФА.*', 1.1.100, ДАТАОТЧ,'','ДНФА');
--  try
--    RepReset(r);
--    ClearVar_спр;Отч=0;
--    while RepNext(r) do
--      Отч=Отч+1;
--      Buf[Отч]=RepIdent(r);
--    end;
--  finally
--    r = RepClose(r);
--  end;
  z=lengthofarray(Buf);
  for t=1..z do
   ss=Buf[t];
   zz=количествослов(ss,'|');
   for tt=1..zz do
     ss0=выделитьслово(tt,ss,'|');
     if searchinarray(спр_код0,ss0+'.',false)<1:
        addinarray(Buft,true,false,ss0);
     fi;
   od;
--   trace(ss+'='+Buf[t]);

  od;
  z=lengthofarray(Buft);
  for t=1..z do
    if Buft[t]<>'':
       спр_код[t]=Buft[t]+'.';
       спр_ст [t]=true;
    fi;
  od;
  ^false  ;
end;


2-- События объектов
Proc btnOnClick(Sender:String); -- объекты при нажатии
var tb :Integer;
 if Sender="btnClose"    : Close;
 |  Sender="btnCalc"     : tb=Time; if РасчетВыгрузкиОстатковНФА>0: Message("Выгрузка завершена...^MВремя работы - "+TimeToString(Time-tb)); fi;
 |  Sender="btnCalc1"    : tb=Time; 
    ИСКАТЬДАТЫ =true;
    ИГНОРНФА104=true;


 кн_спр_ПриВходе('',0); if РасчетВыгрузкиОстатковНФА>0: Message("автовыгрузка завершена...^MВремя работы - "+TimeToString(Time-tb)); fi;
 |  Sender="btnДействия" : ДополнительныеДействия;
 fi;
end;

Proc ini_спр_код0;
 ClearVariable(спр_код0);
 спр_код0[1]='НФА.';
 спр_код0[2]='МОЛ.';
 спр_код0[3]='М.';
 спр_код0[4]='УЧН.';
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 btnДействия.Width=0; btnДействия.Height=0; btnДействия.Left=0; btnДействия.Top=0;
 Очистить;
 СброситьНеобСправочники;
 ini_спр_код0;
 УЧН_ИНВКАРТ=False;
 УЧН_ПЕРЕНУМ=False;
  КОЛ_НЕНУЛЬ=False;
  ИСКАТЬДАТЫ=False;
 ИГНОРНФА104=False;
 if ДАТАОТЧ<1.1.2007: ДАТАОТЧ=Dat(1, 1, Year(ToDay)); fi;
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 Очистить;
end;

КОНЕЦ -- конец бланка