--
--
--
БЛАНКСШАБЛОНОМ "Сервис - налог на имущество";

var ПринудительноИсключитьСправочники :String;
--var ПринудительноИсключитьСправочники :String="Ц"; -- разделитель |
--var ПринудительноИсключитьСправочники :String="КВАРТИРА|ЭТАЖ|ПОДЪЕЗД"; -- разделитель |
--var ИсключитьСписокНФА :Logical=True;
var ИсключитьСписокНФА :Logical=False;
--var Нестандарт :Logical=True;
var Нестандарт :Logical=False;

var Def_WorkYear  :Integer=2015;
var МаскаДИ2013   :String="*.?.101.2?.???|*.?.102.2?.???|*.?.101.3?.???|*.?.102.3?.???|*.?.101.4?.???|*.?.102.4?.???";
var Фокус         :String="";

2--0 2Переменные
btn_Exit         :Object;
btnДИ2013выг     :Object;
btnДИ2013заг     :Object;
btnCompare       :Object;
btnDelДИ2013     :Object;

СекцArrayНФА     :Object;
СекцArrayМОЛ     :Object;
СекцArrayМХЭ     :Object;
СекцArrayДОП     :Object;
СекцWorkTabl     :Object;

ПозицииArrayНФА  :Integer;
ПозицииArrayМОЛ  :Integer;
ПозицииArrayМХЭ  :Integer;
ПозицииArrayДОП  :Integer;
Позиции          :Integer;

var УЧТГОД       :Integer;

2--0 2Массивы

var Buf[]         :String;

var LST_UNQ_ИНВ[] :String;
var LST_ИНВ_SUM[] :Numeric;
var LST_UNQ_ДБЛ[] :Integer;

var LST_UNQ_МБП[] :String;
var LST_МБП_SUM[] :Numeric;
var LST_МБП_OUT[] :Logical;

var КБК_РАБ_001[] :String;
var КБК_РАБ_002[] :String;
var НФА__ИСКЛЮЧ[] :String;

var arr_REFНФА[] :String;
var arr_КОДНФА[] :String;
var arr_REFМОЛ[] :String;
var arr_КОДМОЛ[] :String;
var arr_REFМХЭ[] :String;
var arr_КОДМХЭ[] :String;
var arr_REFДОП[] :String;
var arr_КОДДОП[] :String;

var count_arrНФА :Integer;
var count_arrМОЛ :Integer;
var count_arrМХЭ :Integer;
var count_arrДОП :Integer;

var aAna[] :String;
var aVoc[] :String;
var aDop[] :String;
var Lock[] :Record;

var aUNQELM[] :String;
var aLSTELM[] :String;
var aОСТСУМ[] :Numeric;
var aОСТКОЛ[] :Numeric;
var тUNQELM[] :String;
var тLSTELM[] :String;
var тОСТСУМ[] :Numeric;
var тОСТКОЛ[] :Numeric;
var тSEARCH[] :Logical;

var rUNQELM[] :String;
var rEFLST1[] :String;
var rEFLST2[] :String;
var rRECTBL[] :Record;
var rRECSUB[] :Record;

Proc btn_Exit_OnClick(Sender: String);
 Close;
end;

Proc ОчиститьВспомМассив;
 ClearVariable(arr_REFНФА);
 ClearVariable(arr_КОДНФА);
 ClearVariable(arr_REFМОЛ);
 ClearVariable(arr_КОДМОЛ);
 ClearVariable(arr_REFМХЭ);
 ClearVariable(arr_КОДМХЭ);
 ClearVariable(arr_REFДОП);
 ClearVariable(arr_КОДДОП);
 count_arrНФА=0; count_arrМОЛ=0; count_arrМХЭ=0; count_arrДОП=0;
 ClearVariable(ПозицииArrayНФА);
 ClearVariable(ПозицииArrayМОЛ);
 ClearVariable(ПозицииArrayМХЭ);
 ClearVariable(ПозицииArrayДОП);
end;

Proc ОчиститьОстатки;
 ClearVariable(aUNQELM);
 ClearVariable(aLSTELM);
 ClearVariable(aОСТСУМ);
 ClearVariable(aОСТКОЛ);
 ClearVariable(тUNQELM);
 ClearVariable(тLSTELM);
 ClearVariable(тОСТСУМ);
 ClearVariable(тОСТКОЛ);
 ClearVariable(тSEARCH);
end;

Proc ОчиститьREFМБП;
 ClearVariable(rUNQELM);
 ClearVariable(rEFLST1);
 ClearVariable(rEFLST2);
 ClearVariable(rRECTBL);
 ClearVariable(rRECSUB);
end;

Proc Очистить;

 ClearVariable(Buf);
 ClearVariable(aAna);
 ClearVariable(aVoc);
 ClearVariable(aDop);
 ClearVariable(Lock);

 ClearVariable(LST_UNQ_ИНВ);
 ClearVariable(LST_ИНВ_SUM);
 ClearVariable(LST_UNQ_ДБЛ);

 ClearVariable(LST_UNQ_МБП);
 ClearVariable(LST_МБП_SUM);
 ClearVariable(LST_МБП_OUT);

 ClearVariable(КБК_РАБ_001);
 ClearVariable(КБК_РАБ_002);
 ClearVariable(НФА__ИСКЛЮЧ);

 ОчиститьВспомМассив;
 ОчиститьОстатки;
 ОчиститьREFМБП;

end;

Func ТолькоЦифры(sourceValue:String) :String;
var num, ii, intChars :Integer;
var RES, WRD :String;
 RES="";
 num=Length(sourceValue);
 if num>0:
   for ii=1 to num do
     WRD=SubStr(sourceValue, ii, 1);
     intChars=Ascii(WRD);
     if (intChars>=48 and intChars<=57) or intChars=46: RES=RES+WRD; fi;
   od;
 fi;
 ^RES;
end;

Func ДвижимоеИмуществоДо2013_СоздатьСписок(RepDate:Date; ИНВ:Logical) :Logical;
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment, svrANA, svrSGN, КОДСЧТ, КОДКБК, КОДНФА, КОДУЧН :String;
var aSum1, aSum2, SUM :Numeric;
var xx, len, ii, jj, pp :Integer;
var СЧДЕБ :Logical;
var aDate :Date;

 ClearVariable(aAna);
 ClearVariable(КБК_РАБ_001);
 ClearVariable(КБК_РАБ_002);
 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepNoNullBal+TujRepCombinedAna+TujRepBalAccount;
 len=TujReport(ВременныйФайл, 1.1.100, RepDate, МаскаДИ2013, "(НФА.*)&(ДИ2013)&"+if(ИНВ, "(УЧН.*)", "(~УЧН.*)"), "ДНФА", "", "", xx, False);
 if len>0:
   ShowProgress(len, "Создание списка движимого имущества принятого к учету до 2013 года"+if(ИНВ, "", " (МБП)"));
   OpenTextJur(ВременныйФайл);
   Try
     ii=1;
     while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
       ProgressPos(ii);
       ii=ii+1;
       if aDeb="00" or aDeb="00Z": КОДСЧТ=aCre; СЧДЕБ=False; fi;
       if aCre="00" or aCre="00Z": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
       if Match(КОДСЧТ, "???.????.???????.???.?.101.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; КОДКБК=SubStr(КОДСЧТ, 1, 20)+".310";
       |  Match(КОДСЧТ, "???.????.???????.???.?.102.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; КОДКБК=SubStr(КОДСЧТ, 1, 20)+".320";
       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.00;
         fi;
         КОДНФА=""; КОДУЧН="";
         xx=LengthOfArray(aAna);
         if xx>0:
           for jj=1 to xx do
             pp=Pos(":", aAna[jj]);
             if pp>0: svrANA=SubStr(aAna[jj], 1, pp-1); else svrANA=aAna[jj]; fi;
             svrSGN=SubStr(svrANA, 1, 1);
             if svrSGN="+" or svrSGN="-": svrANA=Trim(SubStr(svrANA, 2, 255)); fi;
             if Match(svrANA, "НФА.*"): КОДНФА=svrANA; fi;
             if ИНВ: if Match(svrANA, "УЧН.*"): КОДУЧН=svrANA; fi; fi;
           od; -- цикл по аналитике
         fi; --xx>0
         if ValidSign(КОДНФА):
           if ИНВ:
             if ValidSign(КОДУЧН):
               svrANA=КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН;
               if КОДКБК<>"": AddInArray(КБК_РАБ_001, True, False, КОДКБК); fi;
               --AddInArray(LST_UNQ_ИНВ, True, False, svrANA);
               pp=SearchInArray(LST_UNQ_ИНВ, svrANA, True, 1);
               if not pp>0:
                 jj=InsertInArraySort(LST_UNQ_ИНВ, svrANA);
                 InsertInArray(LST_ИНВ_SUM, jj, SUM);
               else
                 LST_ИНВ_SUM[pp]=LST_ИНВ_SUM[pp]+SUM;
               fi;
             fi;
           else
             svrANA=КОДСЧТ+"#"+КОДНФА;
             if КОДКБК<>"": AddInArray(КБК_РАБ_002, True, False, КОДКБК); fi;
             pp=SearchInArray(LST_UNQ_МБП, svrANA, True, 1);
             if not pp>0:
               jj=InsertInArraySort(LST_UNQ_МБП, svrANA);
               InsertInArray(LST_МБП_SUM, jj, SUM);
             else
               LST_МБП_SUM[pp]=LST_МБП_SUM[pp]+SUM;
             fi;
           fi;
         fi;
       fi;
     end; --while
   Finally
     CloseTextJur;
     CloseProgress;
   end; -- Try
   Try DeleteFile(ВременныйФайл); Except end;
 else
   Trace("Движимого имущества принятого к учету до 2013 года не обнаружено."+if(ИНВ, "", " (МБП < 3'000 руб.)")+". Возможно не проставлена соответствующая аналитика в картотеке остатков НФА");
   ^False;
 fi; -- len>0 (TujReport)
 if ИНВ: ^if(LengthOfArray(LST_UNQ_ИНВ)>0, True, False); else ^if(LengthOfArray(LST_UNQ_МБП)>0, True, False); fi;
end;

Proc ПроверкаИсправительныхПроводок(aДНО:Date; aДКО:Date; ИНВ:Logical);
var AccTrans, AnaTrans, КОДСЧТ, КОДНФА, КОДУЧН, svrANA :String;
var Iter, pp, jj :Integer;
var SUM :Numeric;
 AccTrans="(((*.2?.???|*.3?.???|*.4?.???)&(*.?.101.??.310|*.?.102.??.320))/00)";
 if ИНВ: AnaTrans="{(НФА.*)&(ТИТУЛ)&(ДИ2013)&(УЧН.*)}"; else AnaTrans="{(НФА.*)&(ТИТУЛ)&(ДИ2013)&(~УЧН.*)}"; fi;
 for Transaction Iter=AccTrans+AnaTrans, aДНО, aДКО do
   SUM=TransSum(Iter);
   if SUM>0.00:
     КОДСЧТ=TransDeb(Iter);
     if Match(КОДСЧТ, "???.????.???????.???.?.101.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
     |  Match(КОДСЧТ, "???.????.???????.???.?.102.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
     else КОДСЧТ="";
     fi;
     if КОДСЧТ<>"" and TransCre(Iter)="00":
       КОДНФА=РАБ.УПП.LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "НФА", True);
       if ИНВ: КОДУЧН=РАБ.УПП.LIB.ПризнакИзСтрокиАналитикиПроводки(Iter, "УЧН", True); else КОДУЧН=""; fi;
       if ИНВ:
         if ValidSign(КОДУЧН):
           svrANA=КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН;
           AddInArray(LST_UNQ_ИНВ, True, False, svrANA);
         fi;
       else
         svrANA=КОДСЧТ+"#"+КОДНФА;
         pp=SearchInArray(LST_UNQ_МБП, svrANA, True, 1);
         if not pp>0:
           jj=InsertInArraySort(LST_UNQ_МБП, svrANA);
           InsertInArray(LST_МБП_SUM, jj, SUM);
         else
           LST_МБП_SUM[pp]=LST_МБП_SUM[pp]+SUM;
         fi;
       fi;
     fi;
   fi;
 end; -- for Transaction
end;

Func ДвижимоеИмуществоДо2013_ОстаткиНаКонецГода(RepDate:Date) :Integer;
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment, svrANA, svrSGN, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП :String;
var КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, АНАДОП :String;
var xx, len, ii, jj, zz, pp, vv, hh :Integer;
var aSum1, aSum2, SUM, KOL, QUA :Numeric;
var СЧДЕБ :Logical;
var aDate :Date;

 ClearVariable(aAna);
 ClearVariable(aVoc);
 ClearVariable(aDop);

 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepNoNullBal+TujRepCombinedAna+TujRepBalAccount;
 len=TujReport(ВременныйФайл, 1.1.100, RepDate, МаскаДИ2013, "(НФА.*)&(УЧН.*)", "ДНФА", "", "", xx, False);
 if len>0:
--   svrANA=ExecuteFuncS("РАБ.НФА.LIBREP.AddVoc_OSTOPER", RepDate, True, False, "|", False);
   svrANA=ExecuteFuncS("РАБ.НФА.LIBREP.AddVoc_OSTOPER_MOD2", RepDate, True, False, "|", False, ПринудительноИсключитьСправочники);
   if svrANA<>"":
     pp=WordsCount(svrANA, "|");
     if pp>0: for ii=1 to pp do AddInArray(aVoc, True, False, ExtractWord(ii, svrANA, "|")+".*"); od; fi;
   fi;
   vv=LengthOfArray(aVoc);
   if vv>0: aDop[vv]=""; fi;
   ОчиститьОстатки;
   ОчиститьВспомМассив;
   ShowProgress(len, "Остатки инвентарного движимого имущества на "+DateToString(RepDate)+".");
   OpenTextJur(ВременныйФайл);
   Try
     ii=1;
     while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
       ProgressPos(ii);
       ii=ii+1;
       if aDeb="00" or aDeb="00Z": КОДСЧТ=aCre; СЧДЕБ=False; fi;
       if aCre="00" or aCre="00Z": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
       if Match(КОДСЧТ, "???.????.???????.???.?.101.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
       |  Match(КОДСЧТ, "???.????.???????.???.?.102.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
       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.00;
         fi;
         КОДНФА=""; КОДУЧН=""; КОДМОЛ=""; КОДМХЭ=""; АНАДОП=""; svrANA="";
         xx=LengthOfArray(aAna);
         if xx>0:
           for jj=1 to xx do
             pp=Pos(":", aAna[jj]);
             if pp>0: 
               QUA=StringToNumeric(SubStr(aAna[jj], pp+1, Length(aAna[jj])-pp));
               svrANA=SubStr(aAna[jj], 1, pp-1);
             else 
               svrANA=aAna[jj];
             fi;
             svrSGN=SubStr(svrANA, 1, 1);
             if svrSGN="+" or svrSGN="-": svrANA=Trim(SubStr(svrANA, 2, 255)); fi;
             --
             if Match(svrANA, "НФА.*"): КОДНФА=svrANA; KOL=if(СЧДЕБ, QUA, -QUA); fi;
             if Match(svrANA, "УЧН.*"): КОДУЧН=svrANA; fi;
             if Match(svrANA, "МОЛ.*"): КОДМОЛ=svrANA; fi;
             if Match(svrANA,   "М.*"): КОДМХЭ=svrANA; fi;
             if vv>0:
               for zz=1 to vv do
                 if Match(svrANA, aVoc[zz]): aDop[zz]=svrANA; fi;
               od;
             fi;
           od; -- цикл по аналитике
         fi; --xx>0
         if vv>0:
           for zz=1 to vv do
             АНАДОП=РАБ.УПП.LIB.Объединить(АНАДОП, Trim(aDop[zz]), " ");
           od;
         fi;
         КОДМОЛ=Trim(КОДМОЛ);
         КОДМХЭ=Trim(КОДМХЭ);
         АНАДОП=Trim(АНАДОП);

         if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
         if КОДМХЭ="": КОДМХЭ="МХЭ.$$$"; fi;
         if АНАДОП="": АНАДОП="ДОП.$$$"; else АНАДОП=РАБ.БЮДЖЕТ2005.СортироватьНаборСлов(АНАДОП, " ", True); fi;
         --
         if Name_A(КОДНФА)<>" " and Name_A(КОДУЧН)<>" ":
           -- Формирование ссылок на аналитику
           -- НФА
           refStrНФА="";
           hh=SearchInArray(arr_КОДНФА, КОДНФА, True, 1);
           if hh=-1:
             count_arrНФА=count_arrНФА+1;
             refStrНФА=Format("%.10d", count_arrНФА);
             pp=InsertInArraySort(arr_КОДНФА, КОДНФА);
             InsertInArray(arr_REFНФА, pp, refStrНФА);
           else
             refStrНФА=arr_REFНФА[hh];
           fi;
           -- МОЛ
           refStrМОЛ="";
           hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
           if hh=-1:
             count_arrМОЛ=count_arrМОЛ+1;
             refStrМОЛ=Format("%.10d", count_arrМОЛ);
             pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
             InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
           else
             refStrМОЛ=arr_REFМОЛ[hh];
           fi;
           -- МХЭ
           refStrМХЭ="";
           hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
           if hh=-1:
             count_arrМХЭ=count_arrМХЭ+1;
             refStrМХЭ=Format("%.10d", count_arrМХЭ);
             pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
             InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
           else
             refStrМХЭ=arr_REFМХЭ[hh];
           fi;
           -- Дополнительная аналитика
           refStrДОП="";
           hh=SearchInArray(arr_КОДДОП, АНАДОП, True, 1);
           if hh=-1:
             count_arrДОП=count_arrДОП+1;
             refStrДОП=Format("%.10d", count_arrДОП);
             pp=InsertInArraySort(arr_КОДДОП, АНАДОП);
             InsertInArray(arr_REFДОП, pp, refStrДОП);
           else
             refStrДОП=arr_REFДОП[hh];
           fi;
           -- УНИКАЛЬНАЯ СТРОКА ОБЪЕКТОВ ОСТАТКОВ
           svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
           svrSGN=КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН;
           --
           hh=SearchInArray(aUNQELM, svrANA, True, 1);
           if hh=-1:
             pp=InsertInArraySort(aUNQELM, svrANA);
             InsertInArray(aLSTELM, pp, svrSGN);
             InsertInArray(aОСТСУМ, pp, SUM);
             InsertInArray(aОСТКОЛ, pp, KOL);
           else
             aОСТСУМ[hh]=aОСТСУМ[hh]+SUM;
             aОСТКОЛ[hh]=aОСТКОЛ[hh]+KOL;
           fi;
         fi; --if Name_A(КОДНФА)<>" " and Name_A(КОДУЧН)<>" "
       fi; --КОДСЧТ<>""
     end; --while
   Finally
     CloseTextJur;
     CloseProgress;
   end; -- Try
   Try DeleteFile(ВременныйФайл); Except end;
 fi; -- len>0 (TujReport)

 xx=LengthOfArray(aUNQELM);

 if xx>0:

   if count_arrНФА>0:
      ПозицииArrayНФА=count_arrНФА;
      ShowProgress(1, "Сортировка промежуточных данных (справочники НФА)...");
      Try
        SortSection(ПозицииArrayНФА, "arr_REFНФА", True, False);
      Finally
        CloseProgress;
      end;
   fi;
   if count_arrМОЛ>0:
      ПозицииArrayМОЛ=count_arrМОЛ;
      ShowProgress(1, "Сортировка промежуточных данных (справочники МОЛ)...");
      Try
        SortSection(ПозицииArrayМОЛ, "arr_REFМОЛ", True, False);
      Finally
        CloseProgress;
      end;
   fi;
   if count_arrМХЭ>0:
      ПозицииArrayМХЭ=count_arrМХЭ;
      ShowProgress(1, "Сортировка промежуточных данных (справочники МХЭ)...");
      Try
        SortSection(ПозицииArrayМХЭ, "arr_REFМХЭ", True, False);
      Finally
        CloseProgress;
      end;
   fi;
   if count_arrДОП>0:
      ПозицииArrayДОП=count_arrДОП;
      ShowProgress(1, "Сортировка промежуточных данных (справочники ДОП)...");
      Try
        SortSection(ПозицииArrayДОП, "arr_REFДОП", True, False);
      Finally
        CloseProgress;
      end;
   fi;

   ShowProgress(xx, "Обработка выгруженного инвентарного движимого имущества...");
   Try
     for ii=1 to xx do
       ProgressPos(ii);
       if aОСТСУМ[ii]>0.00:
         zz=SearchInArray(LST_UNQ_ИНВ, aLSTELM[ii], True, 1);
         if zz>0: -- есть в списке движимого имущества принятого к учету до 2013 года
           hh=SearchInArray(тUNQELM, aUNQELM[ii], True, 1);
           if not hh>0:
             pp=InsertInArraySort(тUNQELM, aUNQELM[ii]);
             InsertInArray(тLSTELM, pp, aLSTELM[ii]);
             InsertInArray(тОСТСУМ, pp, aОСТСУМ[ii]);
             InsertInArray(тОСТКОЛ, pp, aОСТКОЛ[ii]);
             InsertInArray(тSEARCH, pp, False);
           fi;
           LST_UNQ_ДБЛ[zz]=LST_UNQ_ДБЛ[zz]+1; -- число вхождений тLSTELM
         fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;

 fi; -- len=LengthOfArray(aUNQELM)>0

 ^LengthOfArray(тUNQELM);

end; -- ДвижимоеИмуществоДо2013_ОстаткиНаКонецГода

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

Func КоличествоТочно_Текстом(tchKOL:Numeric) :String;
 ^Format("%17."+Str(РАБ.УПП.LIB.LENM(tchKOL))+"N", tchKOL);
end;

Proc ДвижимоеИмуществоДо2013_ЗаписатьФайл_ИНВ(aПуть:String; WY:Integer);
var nameFile, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП, КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, КОДДОП :String;
var FS, num, ii, hh, pp :Integer;
var FlagCreate :Logical;
var SUM :Numeric;

 num=LengthOfArray(тUNQELM);
 if num>0:
   nameFile=aПуть+"ДИ2013_ВыгрузкаДляБазы"+Str(WY+1)+"_ИНВ.log";
   ShowProgress(num, "Запись в файл ДИ (ИНВ) принятого к учету до 2013г.");
   Try
     Try
       Try if ExistFile(nameFile): DeleteFile(nameFile); fi; Except end;
       FlagCreate=False;
       FS=TextFileCreate(nameFile);
       FlagCreate=True;
       -- Записываем заголовок
       TextFileWriteLn(FS, "/// * Список движимого имущества принятого к учету до 2013 г. * ");
       TextFileWriteLn(FS, "/// * инвентарные объекты (цена от 3'000 руб.) * ");
       TextFileWriteLn(FS, "/// Выгрузка для базы "+Str(WY+1)+" года.");
       TextFileWriteLn(FS, "/// Дата и время выгрузки - "+DateToString(ToDay)+"г. "+ExecuteFuncS("РАБ.НФА.LIBREP.TimeToHMSstring_adv", Time, ":"));
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "/// Число элементов: "+Str(num));
       TextFileWriteLn(FS, "/// Сумма массива: "+Format("%17.2N", SumOfArray(тОСТСУМ, num)));
       TextFileWriteLn(FS, "");
       pp=LengthOfArray(КБК_РАБ_001);
       if pp>0:
         TextFileWriteLn(FS, "///  КБК в работе: ");
         for ii=1 to pp do
           TextFileWriteLn(FS, "### "+КБК_РАБ_001[ii]);
         od;
       fi;
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "");
       -- Записываем данные инвентарных объектов (с учетными номерами)
       SUM=0.00;
       for ii=1 to num do
         ProgressPos(ii);
         hh=SearchInArray(LST_UNQ_ИНВ, тLSTELM[ii], True, 1);
         if hh>0:
           if тОСТСУМ[ii]>0.00:

             refStrМОЛ = Trim(ExtractWord(1, тUNQELM[ii], "#")); pp=SearchInArray(arr_REFМОЛ, refStrМОЛ, True, 1); if pp>0: КОДМОЛ=arr_КОДМОЛ[pp]; else КОДМОЛ=""; fi;
             refStrМХЭ = Trim(ExtractWord(2, тUNQELM[ii], "#")); pp=SearchInArray(arr_REFМХЭ, refStrМХЭ, True, 1); if pp>0: КОДМХЭ=arr_КОДМХЭ[pp]; else КОДМХЭ=""; fi;
             refStrДОП = Trim(ExtractWord(3, тUNQELM[ii], "#")); pp=SearchInArray(arr_REFДОП, refStrДОП, True, 1); if pp>0: КОДДОП=arr_КОДДОП[pp]; else КОДДОП=""; fi;
             КОДСЧТ    = Trim(ExtractWord(4, тUNQELM[ii], "#"));
             refStrНФА = Trim(ExtractWord(5, тUNQELM[ii], "#")); pp=SearchInArray(arr_REFНФА, refStrНФА, True, 1); if pp>0: КОДНФА=arr_КОДНФА[pp]; else КОДНФА=""; fi;
             КОДУЧН    = Trim(ExtractWord(6, тUNQELM[ii], "#"));

             if КОДМОЛ="МОЛ.$$$": КОДМОЛ=""; fi;
             if КОДМХЭ="МХЭ.$$$": КОДМХЭ=""; fi;
             if КОДДОП="ДОП.$$$": КОДДОП=""; fi;

             TextFileWriteLn(FS, "");
             TextFileWriteLn(FS, "@@1 "+тLSTELM[ii]);
             TextFileWriteLn(FS, "@@2 "+КОДМОЛ);
             TextFileWriteLn(FS, "@@3 "+КОДМХЭ);
             TextFileWriteLn(FS, "@@4 "+КОДДОП);
             SUM=SUM+тОСТСУМ[ii];
             TextFileWriteLn(FS, "@@5 "+Format("%17.2N", тОСТСУМ[ii]));
             TextFileWriteLn(FS, "@@6 "+КоличествоТочно_Текстом(тОСТКОЛ[ii]));
             TextFileWriteLn(FS, "@@7 "+if(LST_UNQ_ДБЛ[hh]>1, Str(LST_UNQ_ДБЛ[hh]), ""));
             TextFileWriteLn(FS, "@@#");

           fi;
         fi;
       od;
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "/// Сумма элементов: "+Format("%17.2N", SUM));
       TextFileClose(FS);
       if ExistFile(nameFile): if EnqOkCancel("Открыть созданный файл выгрузки?", mtInformation)=cmOK: OpenEditor(nameFile); fi; fi;
     Except
       ЗакрытьФайлПоОшибке(FS, FlagCreate, nameFile);
       Raise;
     end;
   Finally
     CloseProgress;
   end;
 fi;

end;

Proc ДвижимоеИмуществоДо2013_ВыгрузкаФайл_ИНВ(aПуть:String; WY:Integer);
var DatRepB, DatRepE :Date;
var Work :Logical;
 DatRepB=Dat(1, 1, WY  );
 DatRepE=Dat(1, 1, WY+1);
 Work=ДвижимоеИмуществоДо2013_СоздатьСписок(DatRepB, True);
 if Work:
   ПроверкаИсправительныхПроводок(DatRepB, DatRepE, True);
   if ДвижимоеИмуществоДо2013_ОстаткиНаКонецГода(DatRepE)>0:
     ДвижимоеИмуществоДо2013_ЗаписатьФайл_ИНВ(aПуть, WY);
   else
     Message("Ошибка!^MНеобходимых для выгрузки данных не найдено.", mtError);
   fi;
 fi;
end;

Proc СчитаемОстаткиМБП_принятогоДо2013(ДНО:Date; ДКО:Date);
var СЧТБАЛ, СЧТАМТ, КОДНФА :String;
var SUMBAL, SUMOUT :Numeric;
var len, ii :Integer;
 len=LengthOfArray(LST_UNQ_МБП);
 if len>0:
   ShowProgress(len, "Обработка ДИ (МБП) принятого к учету до 2013г.");
   Try
     for ii=1 to len do
       ProgressPos(ii);
       SUMBAL=0.00; SUMOUT=0.00;
       if not LST_МБП_OUT[ii]:
         SUMBAL=LST_МБП_SUM[ii];
         if SUMBAL<>0.00:
           СЧТБАЛ=ExtractWord(1, LST_UNQ_МБП[ii], "#");
           КОДНФА=ExtractWord(2, LST_UNQ_МБП[ii], "#");
           СЧТАМТ=SubStr(СЧТБАЛ, 1, 30)+"410"; -- счет для подсчета суммы выбытия
           Try SUMOUT=Cre(Round(Turn(СЧТАМТ+"{"+КОДНФА+"&~УЧН.*}", ДНО, ДКО), 2)); Except SUMOUT=0.00; end; -- выбыло за период
           if SUMOUT>0.00: LST_МБП_SUM[ii]=SUMBAL-SUMOUT; if not (SUMBAL-SUMOUT)>0.00: LST_МБП_SUM[ii]=0.00; LST_МБП_OUT[ii]=True; fi; fi;
         fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 fi;
end; -- СчитаемОстаткиМБП_принятогоДо2013

Func ЧислоЭлементовМБП :Integer;
var len, ii, RES :Integer;
 RES=0;
 len=LengthOfArray(LST_UNQ_МБП);
 if len>0:
   for ii=1 to len do
     if not LST_МБП_OUT[ii] and LST_МБП_SUM[ii]>0.00: RES=RES+1; fi;
   od;
 fi;
 ^RES;
end;

Proc ДвижимоеИмуществоДо2013_ЗаписатьФайл_МБП(aПуть:String; WY:Integer);
var nameFile :String;
var FS, num, ii, pp :Integer;
var FlagCreate :Logical;
var SUM :Numeric;

 num=LengthOfArray(LST_UNQ_МБП);
 if num>0:
   nameFile=aПуть+"ДИ2013_ВыгрузкаДляБазы"+Str(WY+1)+"_МБП.log";
   ShowProgress(num, "Запись в файл ДИ (МБП) принятого к учету до 2013г.");
   Try
     Try
       Try if ExistFile(nameFile): DeleteFile(nameFile); fi; Except end;
       FlagCreate=False;
       FS=TextFileCreate(nameFile);
       FlagCreate=True;
       -- Записываем заголовок
       TextFileWriteLn(FS, "/// * Список движимого имущества принятого к учету до 2013 г. * ");
       TextFileWriteLn(FS, "/// * неинвентарные объекты (цена до 3'000 руб. [без УЧН]) * ");
       TextFileWriteLn(FS, "/// Выгрузка для базы "+Str(WY+1)+" года.");
       TextFileWriteLn(FS, "/// Дата и время выгрузки - "+DateToString(ToDay)+"г. "+ExecuteFuncS("РАБ.НФА.LIBREP.TimeToHMSstring_adv", Time, ":"));
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "/// Число элементов: "+Str(ЧислоЭлементовМБП));
       TextFileWriteLn(FS, "");
       pp=LengthOfArray(КБК_РАБ_002);
       if pp>0:
         TextFileWriteLn(FS, "///  КБК в работе: ");
         for ii=1 to pp do
           TextFileWriteLn(FS, "### "+КБК_РАБ_002[ii]);
         od;
       fi;
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "");
       -- Записываем данные НЕинвентарных объектов (без УЧН)
       SUM=0.00;
       for ii=1 to num do
         ProgressPos(ii);
         if not LST_МБП_OUT[ii] and LST_МБП_SUM[ii]>0.00:
           TextFileWriteLn(FS, "");
           TextFileWriteLn(FS, "@@1 "+LST_UNQ_МБП[ii]);
           TextFileWriteLn(FS, "@@2 "+Format("%17.2N", LST_МБП_SUM[ii]));
           SUM=SUM+LST_МБП_SUM[ii];
           TextFileWriteLn(FS, "@@#");
         fi;
       od;
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "/// Сумма элементов: "+Format("%17.2N", SUM));
       TextFileClose(FS);
       if ExistFile(nameFile): if EnqOkCancel("Открыть созданный файл выгрузки?", mtInformation)=cmOK: OpenEditor(nameFile); fi; fi;
     Except
       ЗакрытьФайлПоОшибке(FS, FlagCreate, nameFile);
       Raise;
     end;
   Finally
     CloseProgress;
   end;
 fi;

end;

Proc ДвижимоеИмуществоДо2013_ВыгрузкаФайл_МБП(aПуть:String; WY:Integer);
var DatRepB, DatRepE :Date;
var Work :Logical;
 DatRepB=Dat(1, 1, WY);
 DatRepE=Dat(1, 1, WY+1);
 Work=ДвижимоеИмуществоДо2013_СоздатьСписок(DatRepB, False);
 if Work:
   ПроверкаИсправительныхПроводок(DatRepB, DatRepE, False);
   СчитаемОстаткиМБП_принятогоДо2013(DatRepB, DatRepE);
   ДвижимоеИмуществоДо2013_ЗаписатьФайл_МБП(aПуть, WY);
 fi;
end;

Proc ДвижимоеИмуществоДо2013_ВыгрузкаФайл(МБП:Logical; WY:Integer);
var Путь :String;
var num :Integer;
 -- *** ВЫГРУЗКА ***
 if ChooseFolder(Путь, "Выберите папку для сохранения файла выгрузки...")=cmOk:
   ClearTrace(True);
   Refresh(False);
   if МБП: 
     ДвижимоеИмуществоДо2013_ВыгрузкаФайл_МБП(Путь, WY);
   else
     ДвижимоеИмуществоДо2013_ВыгрузкаФайл_ИНВ(Путь, WY);
   fi;
 fi; --ChooseFolder
end;

Func ПоследняяДатаОстатков_КартотекиОстатковНФА :Date;
var RO, num :Integer;
var ddCrd :Date;
 ddCrd=1.1.100;
 RO=OpenWorkArea("РПО_ОСТ_НФА", "ДАТОПЕР", "");
 Try
   num=Records(RO);
   if Records(RO)>0: ddCrd=GetFieldD(RO, num, "ДАТОПЕР"); fi;
 Finally
   CloseWorkArea(RO);
 end;
 ^ddCrd;
end;

Proc ДвижимоеИмуществоДо2013_Выгрузка_Выполнить;
var ddWork :Date;
var num :Integer;
 -- *** ВЫГРУЗКА ***
 if not УЧТГОД>2000: 
   Try УЧТГОД=Int(PlanVar("ГОД")); Except УЧТГОД=Def_WorkYear; end;
 fi;
 if not УЧТГОД>2000: 
   Message("Некорректный учетный год.^MПеревыберите учетный год.", mtError);
   Exit;
 fi;
 ddWork=Dat(1, 1, УЧТГОД+1);
 if not ПоследняяДатаОстатков_КартотекиОстатковНФА<ddWork:
   Message("Выполняется выгрузка НФА на "+DateToString(ddWork)+"^Mа в картотеке остатков НФА есть записи^Mс датой остатков позже даты выгрузки", mtError);
   Exit;
 fi;
 ClearVariable(Buf);
 Buf[1]="Инвентарные объекты [от 3'000 руб (УЧН)] - выгрузка данных в файл";
 Buf[2]="Неинвентарные объекты [меньше 3'000 руб] - выгрузка данных в файл";
 num=Alternate("Движимое имущество до 2013 ВЫГРУЗКА", Buf, -1, 1, 12);
 if num=1: ДвижимоеИмуществоДо2013_ВыгрузкаФайл(False, УЧТГОД);
 |  num=2: ДвижимоеИмуществоДо2013_ВыгрузкаФайл(True,  УЧТГОД);
 fi;
end;

Proc ДвижимоеИмуществоДо2013_ПомечаемНаОснованииДПУ(aWY:Integer);
var RO, num, ii, OA, len, jj, xx, yy, kk :Integer;
var Work, First :Logical;
var КОДСЧТ, КОДУЧН, ANA :String;
var ДПУ, ДОР, ДОК :Date;
var SUM, AMT :Numeric;
 num=EnqOkCancel("Данная процедура помечает остатки на 01.01."+Str(aWY)+"^Mаналитическим признаком,^Mнеобходимым для расчета налога на имущество.^MПродолжить?", mtConfirmation);
 if num=cmCancel: Exit; fi;
 ClearTrace(True);
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 ShowProgress(0, "Работаем...");
 Try
   num=Records(RO);
   if num>0:
     ДОР=Dat(1, 1, aWY);
     First=False;
     BeginChanging(RO);
     First=True;
     Try
       ShowProgress(num, "Работаем...");
       xx=0; yy=0; КОДСЧТ=""; КОДУЧН=""; ANA=""; SUM=0.00; AMT=0.00;
       for ii=1 to num do
         ProgressPos(ii);
         if xx=0 and not First: BeginChanging(RO); fi;
         First=False;
         xx=xx+1;
         ДОК=GetFieldD(RO, ii, "ДАТОПЕР");
         if ДОК<ДОР:
           OA=OpenArray(RO, ii, "ПОЗИЦИИОС", "", "");
           len=Records(OA);
           if len>0:
             for jj=1 to len do
               Work=False;
               КОДСЧТ=Trim(GetFieldS(OA, jj, "СЧНФА"));
               КОДУЧН=Trim(GetFieldS(OA, jj, "УЧНОМ"));
               ДПУ=GetFieldD(OA, jj, "ДУЧЕТ");
               ANA=Trim(GetFieldS(OA, jj, "ДОПАН"));
               if ДПУ<1.1.2013:
                 if Match(КОДСЧТ, "*.?.101.2?.???") or
                    Match(КОДСЧТ, "*.?.102.2?.???") or
                    Match(КОДСЧТ, "*.?.101.3?.???") or
                    Match(КОДСЧТ, "*.?.102.3?.???") or
                    Match(КОДСЧТ, "*.?.101.4?.???") or
                    Match(КОДСЧТ, "*.?.102.4?.???"):
                   if Match(КОДУЧН, "УЧН.*"):
                     if ANA="": Work=True; else if not Pos(" ДИ2013 ", " "+ANA+" ")>0: Work=True; fi; fi;
                   fi;
                 fi;
               fi;

               if Work:
                 ANA=РАБ.УПП.LIB.Объединить("ДИ2013", ANA, " ");
                 kk=PutFieldS(OA, jj, "ДОПАН", ANA);
                 SUM=SUM+GetFieldN(OA, jj, "СУМНФА");
                 AMT=AMT+GetFieldN(OA, jj, "СУМАМ00");
               fi;

             od;
           fi;
           CloseWorkArea(OA);
         fi;
         if xx=500: --записываем очередную порцию записей
           EndChanging(RO);
           yy=yy+xx;
           xx=0;
         fi;
       od;
       if xx>0: EndChanging(RO); yy=yy+xx; fi; --если последняя порция неполная
     Except
       Message("Ошибка "+Str(ErrorCode)+".", mtError);
       CancelChanging(RO);
       Raise;
     end;
   else
     Message("Картотека остатков НФА пустая.", mtError);
   fi;
 Finally
   CloseProgress;
   CloseWorkArea(RO);
   if SUM>0.00: 
     Trace("Всего балансовая стоимость ДИ до 2013 - "+Format("%17.2N", SUM));
     Trace("Всего амортизация ДИ до 2013 - "+Format("%17.2N", AMT));
   fi;
 end;
end;

Func ЗагрузкаКБКконвертации(aPathFile:String) :Logical;
var aFile, num, pp :Integer;
var Value, wrd1, wrd2 :String;
 ClearVariable(КБК_РАБ_001);
 ClearVariable(КБК_РАБ_002);
 aFile=TextFileOpenRead(aPathFile);
 Try
   Try
     while not TextFileEndOfFile(aFile) do
       Value=Up(Trim(TextFileReadLn(aFile)));
       num=WordsCount(Value, "|");
       if num>0:
         wrd1=ExtractWord(1, Value, "|");
         wrd2=ExtractWord(2, Value, "|");
         if Match(wrd1, "???.????.???????.???.310") and Match(wrd2, "???.????.???????.???.310"):
           pp=InsertInArraySort(КБК_РАБ_001, SubStr(wrd1, 1, 20));
           InsertInArray(КБК_РАБ_002, pp, SubStr(wrd2, 1, 20));
         fi;
       fi;
     end; --while
   Except
     TextFileClose(aFile);
     ^False;
   end;
 Finally
   TextFileClose(aFile);
 end;
 if LengthOfArray(КБК_РАБ_001)=LengthOfArray(КБК_РАБ_002) and LengthOfArray(КБК_РАБ_001)>0: ^True; else ^False; fi;
end;

Proc Загрузка_ДобавитьДанные_МБП(aVal1:String; aVal2:String);
var SUM :Numeric;
var pp :Integer;
 Try SUM=StringToNumeric(ТолькоЦифры(aVal2)); Except SUM=0.00; end;
 if aVal1<>"" and SUM>0.00:
   pp=InsertInArraySort(LST_UNQ_МБП, aVal1);
   InsertInArray(LST_МБП_SUM, pp, SUM);
 fi;
end;

Func ДвижимоеИмуществоДо2013_СчитываниеФайла_МБП(aPathFile:String) :Logical;
var SrcStr, val1, val2, wrd :String;
var aFile :Integer;
 ClearVariable(LST_UNQ_МБП);
 ClearVariable(LST_МБП_SUM);
 aFile=TextFileOpenRead(aPathFile);
 Try
   Try
     val1=""; val2="";
     while not TextFileEndOfFile(aFile) do
       SrcStr=Trim(TextFileReadLn(aFile));
       wrd=SubStr(SrcStr, 1, 3);
       if wrd="@@1": val1=Trim(SubStr(SrcStr, 4, 255));
       |  wrd="@@2": val2=Trim(SubStr(SrcStr, 4, 255));
       |  wrd="@@#": Загрузка_ДобавитьДанные_МБП(val1, val2); val1=""; val2="";
       fi;
     end; --while
   Except
     TextFileClose(aFile);
     ^False;
   end;
 Finally
   TextFileClose(aFile);
 end;
 if LengthOfArray(LST_UNQ_МБП)=LengthOfArray(LST_МБП_SUM) and LengthOfArray(LST_UNQ_МБП)>0: ^True; else ^False; fi;
end;

Proc ДвижимоеИмуществоДо2013_МБП_Отчет(ДатОтч:Date);
var ПутьVAR, ПутьОТЧ, НаимОТЧ :String;
 Try ПутьVAR=PlanVar("НФА")+"\ОТЧЕТЫ"; Except ПутьVAR=""; end;
 if ПутьVAR<>"":
   ПутьОТЧ=РАБ.БЮДЖЕТ2005.Контроль2Слэш(ПутьVAR+"\НФАОТЧ2007.lst");
   if not ExistFile(ПутьОТЧ): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
   НаимОТЧ=РАБ.БЮДЖЕТ2005.Контроль2Слэш(ПутьVAR+"\НФАОТЧ2007.lst"+"|По_проводкам");
   Report(НаимОТЧ, 1.1.100, ДатОтч, МаскаДИ2013, "(НФА.*)&(ДИ2013)&(~УЧН.*)");
 fi;
end;

Proc СброситьПризнакДИ2013_ТолькоДляМБП(ДатОтч:Date);
var RO, num, ii, OA, len, jj, xx, yy, kk :Integer;
var КОДСЧТ, КОДУЧН, ДОПАНА :String;
var First :Logical;
var ДОК :Date;
 num=EnqOkCancel("Данная процедура сбрасывает признак ДИ2013 для неинвентарного движимого имущества (НФА<3'000руб).^MПродолжить?", mtConfirmation);
 if num=cmCancel: Exit; fi;
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 ShowProgress(0, "Работаем...");
 Try
   num=Records(RO);
   if num>0:
     First=False;
     BeginChanging(RO);
     First=True;
     Try
       ShowProgress(num, "Работаем...");
       xx=0; yy=0; КОДСЧТ=""; КОДУЧН=""; ДОПАНА="";
       for ii=1 to num do
         ProgressPos(ii);
         if xx=0 and not First: BeginChanging(RO); fi;
         First=False;
         xx=xx+1;
         ДОК=GetFieldD(RO, ii, "ДАТОПЕР");
         if ДОК<ДатОтч:
           OA=OpenArray(RO, ii, "ПОЗИЦИИОС", "", "");
           len=Records(OA);
           if len>0:
             for jj=1 to len do
               КОДСЧТ=Trim(GetFieldS(OA, jj, "СЧНФА"));
               КОДУЧН=Trim(GetFieldS(OA, jj, "УЧНОМ"));
               ДОПАНА=Trim(GetFieldS(OA, jj, "ДОПАН"));
               if КОДУЧН="":
                 if Match(КОДСЧТ, "*.?.101.2?.???") or
                    Match(КОДСЧТ, "*.?.102.2?.???") or
                    Match(КОДСЧТ, "*.?.101.3?.???") or
                    Match(КОДСЧТ, "*.?.102.3?.???") or
                    Match(КОДСЧТ, "*.?.101.4?.???") or
                    Match(КОДСЧТ, "*.?.102.4?.???"):
                   if Pos(" ДИ2013 ", " "+ДОПАНА+" ")>0:
                     ДОПАНА=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабораПоМаске(ДОПАНА, " ", "ДИ2013", "");
                     kk=PutFieldS(OA, jj, "ДОПАН", ДОПАНА);
                   fi;
                 fi;
               fi;
             od;
           fi;
           CloseWorkArea(OA);
         fi;
         if xx=500: --записываем очередную порцию записей
           EndChanging(RO);
           yy=yy+xx;
           xx=0;
         fi;
       od;
       if xx>0: EndChanging(RO); yy=yy+xx; fi; --если последняя порция неполная
     Except
       Message("Ошибка "+Str(ErrorCode)+".", mtError);
       CancelChanging(RO);
       Raise;
     end;
   else
     Message("Картотека остатков НФА пустая.", mtError);
   fi;
 Finally
   CloseProgress;
   CloseWorkArea(RO);
 end;
end;

Func КонвертироватьКБК(ACC:String) :String;
var KBK, RES :String;
var num :Integer;
 RES=ACC;
 if Match(ACC, "???.????.???????.???.?.101.??.???") or Match(ACC, "???.????.???????.???.?.102.??.???"):
   KBK=SubStr(ACC, 1, 20);
   num=SearchInArray(КБК_РАБ_001, KBK, True, 1);
   if num>0:
     RES=КБК_РАБ_002[num]+SubStr(ACC, 21, 13);
   fi;
 fi;
 ^RES;
end;

Func ПреобразоватьСсылкиМассив(StrRef1:String; StrRef2:String) :Integer;
var num, ii, xx :Integer;
 xx=0;
 ClearVariable(aDop);
 num=WordsCount(StrRef1, "|");
 if num>0:
   for ii=1 to num do
     xx=xx+1;
     aDop[xx]=ExtractWord(ii, StrRef1, "|");
   od;
 fi;
 num=WordsCount(StrRef2, "|");
 if num>0:
   for ii=1 to num do
     xx=xx+1;
     aDop[xx]=ExtractWord(ii, StrRef2, "|");
   od;
 fi;
 ^LengthOfArray(aDop);
end;

Func Монопольно(aRO:Integer; aNum:Integer; aRec:Record) :Logical;
var OK :Logical;
var pp :Integer;
 OK=False;
 pp=SearchInArray(Lock, aRec, True, 1);
 if pp>0: OK=True; else if LockRecord(aRO, aNum, 3): AddInArray(Lock, True, False, aRec); OK=True; fi; fi;
 ^OK;
end;

Func КорректныйГодСписка(aPathFile:String; wYear:Integer) :Logical;
var aFile, tYear :Integer;
var Value :String;
var OK :Logical;
 OK=False;
 aFile=TextFileOpenRead(aPathFile);
 Try
   Try
     while not TextFileEndOfFile(aFile) do
       Value=Up(Trim(TextFileReadLn(aFile)));
       if Match(Value, "/// Выгрузка для базы ???? года."):
                      --123456789012345678901234567890
         Try tYear=Int(SubStr(Value, 23, 4)); Except tYear=0; end;
         if tYear=wYear: OK=True; fi;
       fi;
     end; --while
   Except
     TextFileClose(aFile);
     ^False;
   end;
 Finally
   TextFileClose(aFile);
 end;
 ^OK;
end;

Proc ДвижимоеИмуществоДо2013_ЗагрузкаИзФайла_МБП(aWY:Integer);
var RO, num, ii, OA, len, jj, xx, yy, kk, aa, bb, njj, nrr, numTbl, numSub, newIns, nn1, nn2, hh :Integer;
var FileKBK, FileOUT, КОДСЧТ, КОДНФА, КОДУЧН, ДОПАНА, ANA :String;
var Work, First, fOkKBK, fOkOUT :Logical;
var ДОР, ДОК :Date;
var SUM, KOL, QUA :Numeric;
 num=EnqOkCancel("Данная процедура помечает остатки на 01.01."+Str(aWY)+"^M(неинвентарное движимое имущество)^Mаналитическим признаком,^Mнеобходимым для расчета налога на имущество.^MПродолжить?", mtConfirmation);
 if num=cmCancel: Exit; fi;
 ДОР=Dat(1, 1, aWY);
 SUM=Abs(Saldo(МаскаДИ2013+"{(НФА.*)&(ДИ2013)&(~УЧН.*)}", ДОР));
 if SUM>0.00:
   kk=Enquiry("Выберите нужное действие (действие ТОЛЬКО для НФА без УЧН)...", "Неинвентарное движимое имущество ( < 3'000руб) принятое к учету до 2013 года помечено (частично или полностью) необходимой аналитикой.^MНеобходимо сбросить признак ДИ2013 и выполнить данную процедуру повторно или пометить требуемые НФА в ручном режиме.", "Отмена;Отчет по проводкам;Сбросить признак ДИ2013", mtWarning);
   if kk=2: ДвижимоеИмуществоДо2013_МБП_Отчет(ДОР);
   |  kk=3: СброситьПризнакДИ2013_ТолькоДляМБП(ДОР);
   fi;
   Exit;
 fi;
 if ChooseFile(FileKBK, "Укажите стандартную таблицу конвертации КБК счетов", "Табл_Конв_Сч(1).txt|*.txt")=cmCancel: Exit; fi;
 if ChooseFile(FileOUT, "Укажите файл выгрузки движимого имущество до 2013 (МБП)", "ДИ2013_ВыгрузкаДляБазы"+Str(aWY)+"_МБП.log|*.log")=cmCancel: Exit; fi;
 fOkKBK=if(ExistFile(FileKBK), True, False);
 fOkOUT=if(ExistFile(FileOUT), True, False);
 if fOkOUT: fOkOUT=КорректныйГодСписка(FileOUT, aWY); fi;
 if not fOkOUT:
   Message("Год указанный в файле-выгрузке не соответствует учетному году "+Str(aWY)+".", mtError);
 fi;
 if fOkKBK and fOkOUT:
   fOkKBK=ЗагрузкаКБКконвертации(FileKBK);
   fOkOUT=ДвижимоеИмуществоДо2013_СчитываниеФайла_МБП(FileOUT);
 fi;
 if fOkKBK and fOkOUT:
   ClearVariable(Lock);
   RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
   ShowProgress(0, "Работаем...");
   Try
     num=Records(RO);
     if num>0:
       ОчиститьREFМБП;
       xx=0;
       ShowProgress(num, "Считывание и обработка остатков...");
       for ii=1 to num do
         ProgressPos(ii);
         Work=GetFieldL(RO, ii, "ПРОВОДИТЬ");
         ДОК=GetFieldD(RO, ii, "ДАТОПЕР");
         if Work and ДОК<ДОР:
           OA=OpenArray(RO, ii, "ПОЗИЦИИОС", "", "");
           len=Records(OA);
           if len>0:
             for jj=1 to len do
               КОДСЧТ=Trim(GetFieldS(OA, jj, "СЧНФА"));
               КОДНФА=Trim(GetFieldS(OA, jj, "НФА"));
               КОДУЧН=Trim(GetFieldS(OA, jj, "УЧНОМ"));
               ДОПАНА=Trim(GetFieldS(OA, jj, "ДОПАН"));
                       SUM=GetFieldN(OA, jj, "СУМНФА");
               if КОДУЧН="" and ValidSign(КОДНФА) and SUM>0.00:
                 if Match(КОДСЧТ, "*.?.101.2?.???") or
                    Match(КОДСЧТ, "*.?.102.2?.???") or
                    Match(КОДСЧТ, "*.?.101.3?.???") or
                    Match(КОДСЧТ, "*.?.102.3?.???") or
                    Match(КОДСЧТ, "*.?.101.4?.???") or
                    Match(КОДСЧТ, "*.?.102.4?.???"):
                   if not Pos(" ДИ2013 ", " "+ДОПАНА+" ")>0:
                     xx=xx+1;
                     rRECTBL[xx]=GetRecordKey(RO, ii);
                     rRECSUB[xx]=GetRecordKey(OA, jj);
                     КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
                     ANA=КОДСЧТ+"#"+КОДНФА;
                     kk=SearchInArray(rUNQELM, ANA, True, 1);
                     if not kk>0:
                       yy=InsertInArraySort(rUNQELM, ANA);
                       InsertInArray(rEFLST1, yy, Str(xx));
                       InsertInArray(rEFLST2, yy, "");
                     else
                       if (Length(rEFLST1[kk])+Length(Str(xx))+1)>255:
                         if not (Length(rEFLST2[kk])+Length(Str(xx))+1)>255:
                           rEFLST2[kk]=rEFLST2[kk]+"|"+Str(xx);
                         else
                           Trace("Переполнение строки ссылок на записи остатков элемента - "+rUNQELM[kk]);
                         fi;
                       else
                         rEFLST1[kk]=rEFLST1[kk]+"|"+Str(xx);
                       fi;
                     fi;
                   fi;
                 fi;
               fi;
             od;
           fi;
           CloseWorkArea(OA);
         fi; --if ДОК<ДОР:
       od;
       len=LengthOfArray(LST_UNQ_МБП);
       if len>0:
         First=False;
         BeginChanging(RO);
         First=True;
         Try
           ShowProgress(num, "Помечаем неинвентарное движимое имущество принятое к учету до 2013г.");
           xx=0; yy=0; bb=0;
           ClearVariable(Buf);
           ClearVariable(aAna);
           for ii=1 to len do
             ProgressPos(ii);
             if xx=0 and not First: BeginChanging(RO); fi;
             First=False;
             xx=xx+1;
             --
             КОДСЧТ=ExtractWord(1, LST_UNQ_МБП[ii], "#");
             КОДНФА=ExtractWord(2, LST_UNQ_МБП[ii], "#");
             КОДСЧТ=КонвертироватьКБК(КОДСЧТ);
             ANA=КОДСЧТ+"#"+КОДНФА;
             hh=SearchInArray(rUNQELM, ANA, True, 1);
             if hh>0:
               njj=ПреобразоватьСсылкиМассив(rEFLST1[hh], rEFLST2[hh]);
               if njj>0:
                 for jj=1 to njj do
                   nrr=Int(aDop[jj]);
                   if nrr>0:
                     numTbl=GetRecordNumber(RO, rRECTBL[nrr]);
                     if numTbl>0:
                       if Монопольно(RO, numTbl, rRECTBL[nrr]):
                         OA=OpenArray(RO, numTbl, "ПОЗИЦИИОС", "", "");
                         numSub=GetRecordNumber(OA, rRECSUB[nrr]);
                         if numSub>0:
                           SUM=GetFieldN(OA, numSub, "СУМНФА");
                           KOL=GetFieldN(OA, numSub, "КОЛНФА");
                           ДОПАНА=Trim(GetFieldS(OA, numSub, "ДОПАН"));
                           if LST_МБП_SUM[ii]>=SUM:
                             nn1=PutFieldS(OA, numSub, "ДОПАН", РАБ.УПП.LIB.Объединить("ДИ2013", ДОПАНА, " "));
                             LST_МБП_SUM[ii]=LST_МБП_SUM[ii]-SUM;
                             aa=aa+1;
                             aAna[aa]="Элемент "+LST_UNQ_МБП[ii]+" на сумму "+Str(SUM, 2)+" записан в "+RecordToString(rRECTBL[nrr])+" - "+RecordToString(rRECSUB[nrr]);
                           else
                             newIns=InsertRecord(OA);
                             CopyRecord(OA, OA, numSub, newIns);
                             nn1=PutFieldN(OA, numSub, "СУМНФА", SUM-LST_МБП_SUM[ii]);
                             nn2=PutFieldN(OA, newIns, "СУМНФА", LST_МБП_SUM[ii]);
                             if KOL>0.00:
--                               nn1=PutFieldN(OA, numSub, "КОЛНФА", KOL*(SUM-LST_МБП_SUM[ii])/SUM);
--                               nn2=PutFieldN(OA, newIns, "КОЛНФА", KOL*LST_МБП_SUM[ii]/SUM);
                               QUA=KOL*LST_МБП_SUM[ii]/SUM;
                               nn1=PutFieldN(OA, numSub, "КОЛНФА", KOL-QUA);
                               nn2=PutFieldN(OA, newIns, "КОЛНФА", QUA);
                             fi;
                             nn2=PutFieldS(OA, newIns, "ДОПАН", РАБ.УПП.LIB.Объединить("ДИ2013", ДОПАНА, " "));
                             LST_МБП_SUM[ii]=0.00;
                             aa=aa+1;
                             aAna[aa]="Запись "+RecordToString(rRECTBL[nrr])+" - "+RecordToString(rRECSUB[nrr])+" разделена. Элемент "+LST_UNQ_МБП[ii]+"на сумму "+Str(LST_МБП_SUM[ii], 2)+" записан в "+RecordToString(rRECTBL[nrr])+" - "+RecordToString(GetRecordKey(OA, newIns));
                           fi;
                         else
                           bb=bb+1;
                           Buf[bb]="Для элемента "+LST_UNQ_МБП[ii]+" ["+RecordToString(rRECSUB[nrr])+"] ошибка преобразования ссылки на подтаблицу записи в картотеке РПО_ОСТ_НФА";
                         fi;
                         CloseWorkArea(OA);
                       fi;
                     else
                       bb=bb+1;
                       Buf[bb]="Для элемента "+LST_UNQ_МБП[ii]+" ["+RecordToString(rRECTBL[nrr])+"] ошибка преобразования ссылки на запись в картотеке РПО_ОСТ_НФА";
                     fi;
                   else
                     bb=bb+1;
                     Buf[bb]="Для элемента "+LST_UNQ_МБП[ii]+" ["+aDop[jj]+"] некорректная ссылка на остатки в картотеке РПО_ОСТ_НФА";
                   fi;
                   if not LST_МБП_SUM[ii]>0.00: Break; fi;
                 od; -- цикл по ссылкам
               else
                 bb=bb+1;
                 Buf[bb]="Для элемента "+LST_UNQ_МБП[ii]+" не найдены ссылки на остатки в картотеке РПО_ОСТ_НФА";
               fi;
             else
               bb=bb+1;
               Buf[bb]="Для элемента "+LST_UNQ_МБП[ii]+" не найдена строка остатков";
             fi;
             --
             if xx=500: --записываем очередную порцию записей
               EndChanging(RO);
               yy=yy+xx;
               xx=0;
             fi;
           od;
           if xx>0: EndChanging(RO); yy=yy+xx; fi; --если последняя порция неполная
         Except
           Message("Ошибка "+Str(ErrorCode)+".", mtError);
           CancelChanging(RO);
           Raise;
         end;
       fi; --len>0
     else
       Message("Картотека остатков НФА пустая.", mtError);
     fi;
   Finally
     CloseProgress;
     CloseWorkArea(RO);
   end;
 else
   Message("Ошибка при загрузке начальных данных", mtError);
 fi; --fOkKBK and fOkOUT
 xx=0;
 num=LengthOfArray(Buf)+LengthOfArray(aAna)+2;
 if num>0:
   ShowProgress(num, "Запись протокола...");
   ANA=PlanVar("WRK")+"\ДИ2013_ЗагрузкаДляБазы"+Str(aWY)+"_МБП_Протокол.log";
   Try
     Try
       Try if ExistFile(ANA): DeleteFile(ANA); fi; Except end;
       Work=False;
       RO=TextFileCreate(ANA);
       Work=True;
       -- Записываем заголовок
       xx=xx+1; ProgressPos(xx);
       TextFileWriteLn(RO, "Протокол загрузки движимого имущества принятого к учету до 2013 г.");
       TextFileWriteLn(RO, "неинвентарные объекты (цена до 3'000 руб. [без УЧН])");
       TextFileWriteLn(RO, "Выгрузка для базы "+Str(aWY)+" года.");
       TextFileWriteLn(RO, "Дата и время выгрузки - "+DateToString(ToDay)+"г. "+ExecuteFuncS("РАБ.НФА.LIBREP.TimeToHMSstring_adv", Time, ":"));
       TextFileWriteLn(RO, "");
       TextFileWriteLn(RO, "ПРОТОКОЛ ИСПОЛНЕНИЯ");
       len=LengthOfArray(aAna);
       if len>0:
         for ii=1 to len do
           xx=xx+1; ProgressPos(xx);
           TextFileWriteLn(RO, aAna[ii]);
         od;
       fi;
       xx=xx+1; ProgressPos(xx);
       TextFileWriteLn(RO, "");
       TextFileWriteLn(RO, "");
       TextFileWriteLn(RO, "ПРОТОКОЛ ОШИБОК");
       len=LengthOfArray(Buf);
       if len>0:
         for ii=1 to len do
           xx=xx+1; ProgressPos(xx);
           TextFileWriteLn(RO, Buf[ii]);
         od;
       fi;
       TextFileClose(RO);
       if ExistFile(ANA): if EnqOkCancel("Открыть созданный файл протокола?", mtInformation)=cmOK: OpenEditor(ANA); fi; fi;
     Except
       ЗакрытьФайлПоОшибке(RO, Work, ANA);
       Raise;
     end;
   Finally
     CloseProgress;
   end;
 fi;
end;

Proc Загрузка_ДобавитьДанные_ИНВ(aVal1:String; aVal2:String; aVal3:String; aVal4:String; aVal5:String; aVal6:String; aVal7:String);
var КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, АНАДОП, refStrМОЛ, refStrМХЭ, refStrДОП, refStrНФА, unqOST, unqELM :String;
var DBL, hh, pp :Integer;
var SUM, KOL :Numeric;

 КОДСЧТ=Trim(ExtractWord(1, aVal1, "#"));
 КОДНФА=Trim(ExtractWord(2, aVal1, "#"));
 КОДУЧН=Trim(ExtractWord(3, aVal1, "#"));
 КОДМОЛ=aVal2;
 КОДМХЭ=aVal3;
 АНАДОП=aVal4;
 Try SUM=StringToNumeric(ТолькоЦифры(aVal5)); Except SUM=0.00; end;
 Try KOL=StringToNumeric(ТолькоЦифры(aVal6)); Except KOL=0.00; end;
 Try DBL=            Int(ТолькоЦифры(aVal7)); Except DBL=0;    end;
 if Match(КОДСЧТ, "???.????.???????.???.?.10?.??.???") and ValidSign(КОДНФА) and ValidSign(КОДУЧН) and SUM>0.00:
   if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
   if КОДМХЭ="": КОДМХЭ="МХЭ.$$$"; fi;
   if АНАДОП="": АНАДОП="ДОП.$$$"; fi;
   КОДСЧТ=КонвертироватьКБК(КОДСЧТ);
   -- Формирование ссылок на аналитику
   -- НФА
   refStrНФА="";
   hh=SearchInArray(arr_КОДНФА, КОДНФА, True, 1);
   if hh=-1:
     count_arrНФА=count_arrНФА+1;
     refStrНФА=Format("%.10d", count_arrНФА);
     pp=InsertInArraySort(arr_КОДНФА, КОДНФА);
     InsertInArray(arr_REFНФА, pp, refStrНФА);
   else
     refStrНФА=arr_REFНФА[hh];
   fi;
   -- МОЛ
   refStrМОЛ="";
   hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
   if hh=-1:
     count_arrМОЛ=count_arrМОЛ+1;
     refStrМОЛ=Format("%.10d", count_arrМОЛ);
     pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
     InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
   else
     refStrМОЛ=arr_REFМОЛ[hh];
   fi;
   -- МХЭ
   refStrМХЭ="";
   hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
   if hh=-1:
     count_arrМХЭ=count_arrМХЭ+1;
     refStrМХЭ=Format("%.10d", count_arrМХЭ);
     pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
     InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
   else
     refStrМХЭ=arr_REFМХЭ[hh];
   fi;
   -- Дополнительная аналитика
   refStrДОП="";
   hh=SearchInArray(arr_КОДДОП, АНАДОП, True, 1);
   if hh=-1:
     count_arrДОП=count_arrДОП+1;
     refStrДОП=Format("%.10d", count_arrДОП);
     pp=InsertInArraySort(arr_КОДДОП, АНАДОП);
     InsertInArray(arr_REFДОП, pp, refStrДОП);
   else
     refStrДОП=arr_REFДОП[hh];
   fi;
   -- УНИКАЛЬНАЯ СТРОКА ОБЪЕКТОВ ОСТАТКОВ
   unqOST=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
   unqELM=КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН;
   --
   hh=SearchInArray(тUNQELM, unqOST, True, 1);
   if hh=-1:
     pp=InsertInArraySort(тUNQELM, unqOST);
     InsertInArray(тLSTELM, pp, unqELM);
     InsertInArray(тОСТСУМ, pp, SUM);
     InsertInArray(тОСТКОЛ, pp, KOL);
     InsertInArray(тSEARCH, pp, False);
   -- else -- такого при загрузке не должно быть, значит ошибка
   fi;
 fi;
end;

Func ДвижимоеИмуществоДо2013_СчитываниеФайла_ИНВ(aPathFile:String) :Logical;
var SrcStr, wrd, val1, val2, val3, val4, val5, val6, val7 :String;
var aFile, ii :Integer;
 ClearVariable(тUNQELM);
 ClearVariable(тLSTELM);
 ClearVariable(тОСТСУМ);
 ClearVariable(тОСТКОЛ);
 ClearVariable(тSEARCH);
 ОчиститьВспомМассив;
 ii=0;
 ShowProgress(0, "Считывание файла...");
 aFile=TextFileOpenRead(aPathFile);
 Try
   Try
     val1=""; val2=""; val3=""; val4=""; val5=""; val6=""; val7="";
     while not TextFileEndOfFile(aFile) do
       ii=ii+1; ProgressPos(ii);
       SrcStr=Trim(TextFileReadLn(aFile));
       wrd=SubStr(SrcStr, 1, 3);
       if wrd="@@1": val1=Trim(SubStr(SrcStr, 4, 255)); -- уникальный элемент
       |  wrd="@@2": val2=Trim(SubStr(SrcStr, 4, 255)); -- МОЛ
       |  wrd="@@3": val3=Trim(SubStr(SrcStr, 4, 255)); -- МХЭ
       |  wrd="@@4": val4=Trim(SubStr(SrcStr, 4, 255)); -- дополнительная аналитика
       |  wrd="@@5": val5=Trim(SubStr(SrcStr, 4, 255)); -- сумма
       |  wrd="@@6": val6=Trim(SubStr(SrcStr, 4, 255)); -- количество
       |  wrd="@@7": val7=Trim(SubStr(SrcStr, 4, 255)); -- счетчик дублирования (не пусто если уникальных элементов > 1)
       |  wrd="@@#": Загрузка_ДобавитьДанные_ИНВ(val1, val2, val3, val4, val5, val6, val7); val1=""; val2=""; val3=""; val4=""; val5=""; val6=""; val7="";
       fi;
     end; --while
   Except
     TextFileClose(aFile);
     ^False;
   end;
 Finally
   TextFileClose(aFile);
   CloseProgress;
 end;
 if LengthOfArray(тUNQELM)=LengthOfArray(тОСТСУМ) and LengthOfArray(тUNQELM)>0: ^True; else ^False; fi;
end;

Func ПреобразоватьНабор_Справочники(srcSET:String) :String;
var RES, tmp :String;
var num, ii :Integer;
 RES="";
 if srcSET<>"":
   num=WordsCount(srcSET, "|");
   if num>0:
     for ii=1 to num do
       tmp=ExtractWord(ii, srcSET, "|")+".*";
       RES=РАБ.УПП.LIB.Объединить(RES, tmp, "|");
     od;
   fi;
 fi;
 ^RES;
end;

Func Загрузка_Список_НФА(aPathFile:String) :Logical;
var aFile :Integer;
var Value :String;
 ClearVariable(НФА__ИСКЛЮЧ);
 aFile=TextFileOpenRead(aPathFile);
 Try
   Try
     while not TextFileEndOfFile(aFile) do
       Value=Up(Trim(TextFileReadLn(aFile)));
       if Match(Value, "НФА.101.??.*"): AddInArray(НФА__ИСКЛЮЧ, True, False, Value); fi;
     end; --while
   Except
     TextFileClose(aFile);
     ^False;
   end;
 Finally
   TextFileClose(aFile);
 end;
 ^(if(LengthOfArray(НФА__ИСКЛЮЧ)>0, True, False));
end;

Proc ДвижимоеИмуществоДо2013_ЗагрузкаИзФайла_ИНВ(aWY:Integer);
var FileKBK, FileOUT, FileNFA, КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, АНАДОП, ДОПАНА, refStrМОЛ, refStrМХЭ, refStrДОП, refStrНФА, ANA, Value :String;
var RO, OA, num, ii, kk, len, jj, xx, yy, pp, aa, bb, ppi :Integer;
var fOkKBK, fOkOUT, fOkNFA, Work, First :Logical;
var SUM, AMT, BAL, KOL :Numeric;
var ДОР, ДОК :Date;
 num=EnqOkCancel("Данная процедура помечает остатки на 01.01."+Str(aWY)+"^M(ИНВентарное движимое имущество)^Mаналитическим признаком,^Mнеобходимым для расчета налога на имущество.^MПродолжить?", mtConfirmation);
 if num=cmCancel: Exit; fi;
 ДОР=Dat(1, 1, aWY);
 if ChooseFile(FileKBK, "Укажите стандартную таблицу конвертации КБК счетов", "Табл_Конв_Сч(1).txt|*.txt")=cmCancel: Exit; fi;
 if ChooseFile(FileOUT, "Укажите файл выгрузки движимого имущество до 2013 (ИНВентарные объекты)", "ДИ2013_ВыгрузкаДляБазы"+Str(aWY)+"_ИНВ.log|*.log")=cmCancel: Exit; fi;
 if ИсключитьСписокНФА: if ChooseFile(FileNFA, "Укажите файл-список исключаемых НФА", "Список_НФА.lst|*.lst")=cmCancel: Exit; fi; else FileNFA=""; fi;
 fOkKBK=if(ExistFile(FileKBK), True, False);
 fOkOUT=if(ExistFile(FileOUT), True, False);
 if ИсключитьСписокНФА: fOkNFA=if(ExistFile(FileNFA), True, False); else fOkNFA=True; fi;
 if fOkOUT: fOkOUT=КорректныйГодСписка(FileOUT, aWY); fi;
 if not fOkOUT:
   Message("Год указанный в файле-выгрузке не соответствует учетному году "+Str(aWY)+".", mtError);
 fi;
 if fOkKBK and fOkOUT and fOkNFA:
   fOkKBK=ЗагрузкаКБКконвертации(FileKBK);
   fOkOUT=ДвижимоеИмуществоДо2013_СчитываниеФайла_ИНВ(FileOUT);
   if ИсключитьСписокНФА: fOkNFA=Загрузка_Список_НФА(FileNFA); else fOkNFA=True; fi;
 fi;
 if fOkKBK and fOkOUT and fOkNFA:
   ClearVariable(Buf);
   ClearVariable(aAna);
   ClearVariable(Lock);
   RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
   ShowProgress(0, "Работаем...");
   Try
     num=Records(RO);
     if num>0:
       ShowProgress(num, "Считывание и обработка остатков...");
       First=False;
       BeginChanging(RO);
       First=True;
       Try
         xx=0; yy=0; aa=0; bb=0;
         SUM=0.00; AMT=0.00;
         for ii=1 to num do
           КОДМОЛ=""; КОДМХЭ="";
           ProgressPos(ii);
           if xx=0 and not First: BeginChanging(RO); fi;
           First=False;
           xx=xx+1;
           --Work=GetFieldL(RO, ii, "ПРОВОДИТЬ");
           Work=True;
           ДОК=GetFieldD(RO, ii, "ДАТОПЕР");
           if Work and ДОК<ДОР:
             КОДМОЛ=GetFieldS(RO, ii, "МОЛ");
             КОДМХЭ=GetFieldS(RO, ii, "М");
             if Монопольно(RO, ii, GetRecordKey(RO, ii)):
               OA=OpenArray(RO, ii, "ПОЗИЦИИОС", "", "");
               len=Records(OA);
               if len>0:
                 КОДСЧТ=""; КОДНФА=""; КОДУЧН=""; АНАДОП=""; ДОПАНА="";
                 for jj=1 to len do
                   КОДСЧТ=Trim(GetFieldS(OA, jj, "СЧНФА"));
                   КОДНФА=Trim(GetFieldS(OA, jj, "НФА"));
                   КОДУЧН=Trim(GetFieldS(OA, jj, "УЧНОМ"));
                   ДОПАНА=Trim(GetFieldS(OA, jj, "ДОПАН"));
                   АНАДОП=ДОПАНА;
                   if ПринудительноИсключитьСправочники<>"" and АНАДОП<>"":
                     АНАДОП=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабораПоМаске(АНАДОП, " ", ПреобразоватьНабор_Справочники(ПринудительноИсключитьСправочники), "|");
                   fi;
                   if АНАДОП="": АНАДОП="ДОП.$$$"; else АНАДОП=РАБ.БЮДЖЕТ2005.СортироватьНаборСлов(АНАДОП, " ", True); fi;
                   BAL=GetFieldN(OA, jj, "СУМНФА");
                   KOL=GetFieldN(OA, jj, "КОЛНФА");
                   if BAL>0.00 and Match(КОДНФА, "НФА.*") and Match(КОДУЧН, "УЧН.*") and Match(КОДМОЛ, "МОЛ.*") and Match(КОДМХЭ, "М.*"):

                     if ИсключитьСписокНФА: ppi=SearchInArray(НФА__ИСКЛЮЧ, КОДНФА, True, 1); else ppi=-1; fi;
                     if not ppi>0:
                       if Нестандарт:
                         if Up(КОДНФА)="НФА.101.02.АНГАР" or Up(КОДНФА)="НФА.101.02.БЫТОВКА":
                           КОДСЧТ=SubStr(КОДСЧТ, 1, 27)+"3"+SubStr(КОДСЧТ, 29, 5);
                         fi;
                       fi;

                       if Match(КОДСЧТ, "*.?.101.2?.???") or
                          Match(КОДСЧТ, "*.?.102.2?.???") or
                          Match(КОДСЧТ, "*.?.101.3?.???") or
                          Match(КОДСЧТ, "*.?.102.3?.???") or
                          Match(КОДСЧТ, "*.?.101.4?.???") or
                          Match(КОДСЧТ, "*.?.102.4?.???"):

                            КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
                            -- Формирование ссылок на аналитику
                            pp=SearchInArray(arr_КОДНФА, КОДНФА, True, 1); if pp>0: refStrНФА=arr_REFНФА[pp]; else refStrНФА=""; fi;
                            pp=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1); if pp>0: refStrМОЛ=arr_REFМОЛ[pp]; else refStrМОЛ=""; fi;
                            pp=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1); if pp>0: refStrМХЭ=arr_REFМХЭ[pp]; else refStrМХЭ=""; fi;
                            pp=SearchInArray(arr_КОДДОП, АНАДОП, True, 1); if pp>0: refStrДОП=arr_REFДОП[pp]; else refStrДОП=""; fi;

                            if refStrНФА<>"" and refStrМОЛ<>"" and refStrМХЭ<>"" and refStrДОП<>"":
                              ANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
                              pp=SearchInArray(тUNQELM, ANA, True, 1);
                              if pp>0:
                                if Round(BAL, 2)=Round(тОСТСУМ[pp], 2):
                                  тSEARCH[pp]=True;
                                  if not Pos(" ДИ2013 ", " "+ДОПАНА+" ")>0:
                                    Value=РАБ.УПП.LIB.Объединить("ДИ2013", ДОПАНА, " ");
                                    kk=PutFieldS(OA, jj, "ДОПАН", Value);
                                    SUM=SUM+BAL;
                                    AMT=AMT+GetFieldN(OA, jj, "СУМАМ00");
                                    aa=aa+1;
                                    aAna[aa]="Элемент "+КОДМОЛ+"#"+КОДМХЭ+"#"+ДОПАНА+"#"+КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН+" сумма "+Str(BAL, 2)+" записан в "+RecordToString(GetRecordKey(RO, ii))+" - "+RecordToString(GetRecordKey(OA, jj));
                                  else
                                    bb=bb+1;
                                    Buf[bb] ="Элемент "+КОДМОЛ+"#"+КОДМХЭ+"#"+ДОПАНА+"#"+КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН+" сумма "+Str(BAL, 2)+" признак ДИ2013 уже проставлен";
                                  fi;
                                else
                                  bb=bb+1;
                                  Buf[bb]   ="Элемент "+КОДМОЛ+"#"+КОДМХЭ+"#"+ДОПАНА+"#"+КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН+" сумма "+Str(BAL, 2)+" <> сумме выгрузки "+Str(тОСТСУМ[pp], 2)+")";
                                fi;
                              fi;
                            fi;
                       fi;
                     else
                       aa=aa+1;
                       aAna[aa]="Элемент "+КОДМОЛ+"#"+КОДМХЭ+"#"+ДОПАНА+"#"+КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН+" пропущен как исключаемый по коду НФА";
                     fi; --not ppi>0:
                   fi;
                 od;
               fi; --len>0:
               CloseWorkArea(OA);
             fi; -- if Монопольно
           fi; --if ДОК<ДОР:
           if xx=500: --записываем очередную порцию записей
             EndChanging(RO);
             yy=yy+xx;
             xx=0;
           fi;
         od;
         if xx>0: EndChanging(RO); yy=yy+xx; fi; --если последняя порция неполная
       Except
         Message("Ошибка "+Str(ErrorCode)+".", mtError);
         CancelChanging(RO);
         Raise;
       end;
     else
       Message("Картотека остатков НФА пустая.", mtError);
     fi;
   Finally
     CloseProgress;
     CloseWorkArea(RO);
   end;
 else
   Message("Ошибка при загрузке начальных данных", mtError);
 fi; --fOkKBK and fOkOUT
 xx=0;
 num=LengthOfArray(Buf)+LengthOfArray(aAna)+LengthOfArray(тUNQELM)+2;
 if num>0:
   ShowProgress(num, "Запись протокола...");
   ANA=PlanVar("WRK")+"\ДИ2013_ЗагрузкаДляБазы"+Str(aWY)+"_ИНВ_Протокол.log";
   Try
     Try
       Try if ExistFile(ANA): DeleteFile(ANA); fi; Except end;
       Work=False;
       RO=TextFileCreate(ANA);
       Work=True;
       -- Записываем заголовок
       xx=xx+1; ProgressPos(xx);
       TextFileWriteLn(RO, "Протокол загрузки движимого имущества принятого к учету до 2013 г.");
       TextFileWriteLn(RO, "инвентарные объекты (УЧН)");
       TextFileWriteLn(RO, "Выгрузка для базы "+Str(aWY)+" года.");
       TextFileWriteLn(RO, "Дата и время выгрузки - "+DateToString(ToDay)+"г. "+ExecuteFuncS("РАБ.НФА.LIBREP.TimeToHMSstring_adv", Time, ":"));
       TextFileWriteLn(RO, "");
       TextFileWriteLn(RO, "ПРОТОКОЛ ИСПОЛНЕНИЯ");
       len=LengthOfArray(aAna);
       if len>0:
         for ii=1 to len do
           xx=xx+1; ProgressPos(xx);
           TextFileWriteLn(RO, aAna[ii]);
         od;
       fi;
       xx=xx+1; ProgressPos(xx);
       TextFileWriteLn(RO, "");
       TextFileWriteLn(RO, "");
       TextFileWriteLn(RO, "ПРОТОКОЛ ОШИБОК");
       len=LengthOfArray(Buf);
       if len>0:
         for ii=1 to len do
           xx=xx+1; ProgressPos(xx);
           TextFileWriteLn(RO, Buf[ii]);
         od;
       fi;
       TextFileWriteLn(RO, "");
       TextFileWriteLn(RO, "");
       TextFileWriteLn(RO, "КОНТРОЛЬ ВЫГРУЗКИ");
       TextFileWriteLn(RO, "SUM - "+Format("%17.2N", SUM));
       TextFileWriteLn(RO, "AMT - "+Format("%17.2N", AMT));
       TextFileWriteLn(RO, "");
       len=LengthOfArray(тUNQELM);
       if len>0:
         for ii=1 to len do
           xx=xx+1; ProgressPos(xx);
           if not тSEARCH[ii]: -- элемент выгрузки не был записан
             Value="Элемент выгрузки "+тLSTELM[ii]+" на сумму "+Str(тОСТСУМ[ii], 2)+" не был записан в базу.";
             TextFileWriteLn(RO, Value);
           fi;
         od;
       fi;
       TextFileClose(RO);
       if ExistFile(ANA): if EnqOkCancel("Открыть созданный файл протокола?", mtInformation)=cmOK: OpenEditor(ANA); fi; fi;
     Except
       ЗакрытьФайлПоОшибке(RO, Work, ANA);
       Raise;
     end;
   Finally
     CloseProgress;
   end;
 fi;
end;

Proc ДвижимоеИмуществоДо2013_ЗагрузкаИзФайла(МБП:Logical; aWY:Integer);
var num :Integer;
 -- *** ЗАГРУЗКА ***
 ClearTrace(True);
 Refresh(False);
 if МБП: ДвижимоеИмуществоДо2013_ЗагрузкаИзФайла_МБП(aWY); else ДвижимоеИмуществоДо2013_ЗагрузкаИзФайла_ИНВ(aWY); fi;
end;

Proc ДвижимоеИмуществоДо2013_Загрузка_Выполнить;
var num :Integer;
 -- *** ЗАГРУЗКА ***
 if not УЧТГОД>2000:
   Try УЧТГОД=Int(PlanVar("ГОД")); Except УЧТГОД=Def_WorkYear; end;
 fi;
 if not УЧТГОД>2000:
   Message("Некорректный учетный год.^MПеревыберите учетный год.", mtError);
   Exit;
 fi;
 ClearVariable(Buf);
 Buf[1]="Инвентарные объекты [от 3'000 руб (УЧН)] - загрузка данных из файла (предпочтительно)";
 Buf[2]="Неинвентарные объекты [меньше 3'000 руб] - загрузка данных из файла (предпочтительно)";
 Buf[3]="Инвентарные объекты [от 3'000 руб (УЧН)] - пометить на основании даты принятия к учету в картотеке остатков НФА";
 num=Alternate("Движимое имущество до 2013 - ЗАГРУЗКА", Buf, -1, 1, 12);
 if num=1: ДвижимоеИмуществоДо2013_ЗагрузкаИзФайла(False, УЧТГОД);
 |  num=2: ДвижимоеИмуществоДо2013_ЗагрузкаИзФайла(True,  УЧТГОД);
 |  num=3: ДвижимоеИмуществоДо2013_ПомечаемНаОснованииДПУ(УЧТГОД);
 fi;
end;

2-- События объектов

Proc btnDelДИ2013_OnClick(Sender: String); --Удаление признака ДИ2013
var RO, num, ii, OA, len, jj, xx, yy, kk :Integer;
var ДОПАНА :String;
var First :Logical;
 num=EnqOkCancel("Данная процедура сбрасывает признак ДИ2013 для движимого имущества.^MПродолжить?", mtConfirmation);
 if num=cmCancel: Exit; fi;
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 ShowProgress(0, "Работаем...");
 Try
   num=Records(RO);
   if num>0:
     First=False;
     BeginChanging(RO);
     First=True;
     Try
       ShowProgress(num, "Работаем...");
       xx=0; yy=0; ДОПАНА="";
       for ii=1 to num do
         ProgressPos(ii);
         if xx=0 and not First: BeginChanging(RO); fi;
         First=False;
         xx=xx+1;
         OA=OpenArray(RO, ii, "ПОЗИЦИИОС", "", "");
         len=Records(OA);
         if len>0:
           for jj=1 to len do
             ДОПАНА=Trim(GetFieldS(OA, jj, "ДОПАН"));
             if Pos(" ДИ2013 ", " "+ДОПАНА+" ")>0:
               ДОПАНА=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабораПоМаске(ДОПАНА, " ", "ДИ2013", "");
               kk=PutFieldS(OA, jj, "ДОПАН", ДОПАНА);
             fi;
           od;
         fi;
         CloseWorkArea(OA);
         if xx=500: --записываем очередную порцию записей
           EndChanging(RO);
           yy=yy+xx;
           xx=0;
         fi;
       od;
       if xx>0: EndChanging(RO); yy=yy+xx; fi; --если последняя порция неполная
     Except
       Message("Ошибка "+Str(ErrorCode)+".", mtError);
       CancelChanging(RO);
       Raise;
     end;
   else
     Message("Картотека остатков НФА пустая.", mtError);
   fi;
 Finally
   CloseProgress;
   CloseWorkArea(RO);
 end;
end;

Proc ДвижимоеИмуществоДо2013_Сервис(Sender:String);
 if Sender="btnДИ2013выг": ДвижимоеИмуществоДо2013_Выгрузка_Выполнить;
 |  Sender="btnДИ2013заг": ДвижимоеИмуществоДо2013_Загрузка_Выполнить;
 fi;
end;

Proc btnCompare_OnClick(Sender: String); --Сравнение выгрузки и процедуры (для отладки)
var aPathFile, SrcStr, val1, val2, wrd :String;
var aFile, num, len, ii, xx, pp :Integer;
var Work :Logical;
 ClearVariable(LST_UNQ_ИНВ); -- тут данные процедуры
 ClearVariable(LST_ИНВ_SUM); -- тут данные процедуры
 ClearVariable(LST_UNQ_МБП); -- тут данные выгрузки
 ClearVariable(LST_МБП_SUM); -- тут данные выгрузки
 ClearVariable(Buf);
 ClearTrace(True);
 Refresh(False);
 if ДвижимоеИмуществоДо2013_СоздатьСписок(1.1.2014, True):
   aPathFile="c:\Temp\0\ДИ2013_ВыгрузкаДляБазы2014_ИНВ.log";
   aFile=TextFileOpenRead(aPathFile);
   Try
     Try
       while not TextFileEndOfFile(aFile) do
         SrcStr=Trim(TextFileReadLn(aFile));
         wrd=SubStr(SrcStr, 1, 3);
         if wrd="@@1": 
           val1=Trim(SubStr(SrcStr, 4, 255));
         |  wrd="@@5":
           val2=Trim(SubStr(SrcStr, 4, 255));
         |  wrd="@@#":
           Загрузка_ДобавитьДанные_МБП(val1, val2);
           val1=""; val2="";
         fi;
       end; --while
     Except
       TextFileClose(aFile);
     end;
   Finally
     TextFileClose(aFile);
   end;
   --
   xx=0;
   num=LengthOfArray(LST_UNQ_ИНВ);
   len=LengthOfArray(LST_UNQ_МБП);
   if num>0:
     ShowProgress(num*3, "Сравниваем...");
     Try
       LST_UNQ_ДБЛ[num]=0;
       LST_МБП_OUT[len]=False;
       for ii=1 to num do
         ProgressPos(ii);
         pp=SearchInArray(LST_UNQ_МБП, LST_UNQ_ИНВ[ii], True, 1);
         if pp>0:
           if LST_МБП_OUT[pp] and LST_UNQ_ДБЛ[ii]=1:
             xx=xx+1;
             Buf[xx]="Дублирование элемента "+LST_UNQ_ИНВ[ii];
           else
             if Round(LST_МБП_SUM[pp], 2)=Round(LST_ИНВ_SUM[ii], 2):
               LST_МБП_OUT[pp]=True; LST_UNQ_ДБЛ[ii]=1;
             else
               xx=xx+1;
               Buf[xx]="Разница сумм элемента "+LST_UNQ_ИНВ[ii]+". Сумма процедуры "+Str(LST_ИНВ_SUM[ii], 2)+". Сумма выгрузки "+Str(LST_МБП_SUM[pp], 2);
               LST_МБП_OUT[pp]=True; LST_UNQ_ДБЛ[ii]=1;
             fi;
           fi;
         fi;
       od;
       --
       for ii=1 to num do
         ProgressPos(ii);
         if LST_UNQ_ДБЛ[ii]=0:
           xx=xx+1;
           Buf[xx]="Остаток массива процедуры. Элемент "+LST_UNQ_ИНВ[ii]+". Сумма "+Str(LST_ИНВ_SUM[ii], 2);
         fi;
       od;
       for ii=1 to len do
         ProgressPos(ii);
         if not LST_МБП_OUT[ii]:
           xx=xx+1;
           Buf[xx]="Остаток массива выгрузки. Элемент "+LST_UNQ_МБП[ii]+". Сумма "+Str(LST_МБП_SUM[ii], 2);
         fi;
       od;
     Finally
       CloseProgress;
     end;
   fi;
 fi;
 num=LengthOfArray(Buf);
 if num>0:
   ShowProgress(num, "Запись протокола...");
   wrd=PlanVar("CACHE")+"\Протокол_Сравнения.log";
   Try
     Try
       Try if ExistFile(wrd): DeleteFile(wrd); fi; Except end;
       Work=False;
       xx=TextFileCreate(wrd);
       Work=True;
       TextFileWriteLn(xx, "ПРОТОКОЛ СРАВНЕНИЯ");
       len=LengthOfArray(Buf);
       if len>0:
         for ii=1 to len do
           ProgressPos(ii);
           TextFileWriteLn(xx, Buf[ii]);
         od;
       fi;
       TextFileClose(xx);
       if ExistFile(wrd): if EnqOkCancel("Открыть созданный файл протокола?", mtInformation)=cmOK: OpenEditor(wrd); fi; fi;
     Except
       ЗакрытьФайлПоОшибке(xx, Work, wrd);
       Raise;
     end;
   Finally
     CloseProgress;
   end;
 fi;
end;

2-- События клеток

Func Field_OnValidateI(Field:String; Iter:Integer; Value:Integer): Logical;
 if Value<0: Message("Нельзя вводить отрицательное число.", mtError); ^False; fi;
 if Field="УЧТГОД":
   if Value<2000 or Value>2100: Message("Отчетный год задан вне допустимого диапазона.^M[2000-2100 гг.]", mtError); ^False; fi;
 fi;
 ^True;
end;

Func Год_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ii :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 for ii=1 to 5 do Buf[ii]=Str(Year(ToDay)+ii-4); od;
 ii=Alternate("Год расчета", Buf, 20, if(УЧТГОД>2000, 4-(Year(ToDay)-УЧТГОД), 4), 12);
 if ii=0: ^Cur; fi;
 УЧТГОД=Int(Buf[ii]);
 ^"";
end;

2-- События шаблона

Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 Очистить;
 btnCompare.Visible=False;
 Try УЧТГОД=Int(PlanVar("ГОД")); Except УЧТГОД=Def_WorkYear; end;
end;

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

КОНЕЦ -- бланка
