--
-- Автор бланка : ТБ.Бюджет
--
БЛАНКСШАБЛОНОМ "Даты - сервис";

var btnName_Menu :String='Проверка и редактирование дат ввода в эксплуатацию и принятия к учету';
var ПринудительноИсключитьСправочники :String;
--var ПринудительноИсключитьСправочники :String="Ц"; -- разделитель |

var btnService :Logical=False;
--var btnService :Logical=True;

btnExit :Object;
btnRead :Object;
btnSave :Object;

btnODEx :Object;
btnODIm :Object;

rb_fВСЕ :Object;
rb_fМОЛ :Object;
rb_fМХЭ :Object;
rb_fСЧТ :Object;
rb_fЗАП :Object;
rb_fПДР :Object;
СекцWorkФТР :Object;
СекцWorkЗТN :Object;
СекцWorkДТN :Object;
СекцWorkДТF :Object;

cb_ТолькоПустые :Object;
cb_ЕслиКонецГод :Object;
cb_НетВыравнСтр :Object;
cb_Синхрон_Даты :Object;

var ValidDate       :Date=1.1.1900;

var кнпS00          :String="create";
var кнпS01          :String="коду НФА";
var кнпS02          :String="наименованию НФА";
var кнпS03          :String="учетному номеру";
var кнпS04          :String="дате прин. к учету";
var кнпS05          :String="дате ввода в экспл.";
var кнпS06          :String="счету";
var кнпS07          :String="МОЛ";
var кнпS08          :String="местонахождению";
var кнпS09          :String="подразделению";
var flgF00          :Logical;
var кнпF00          :String=if(flgF00, "Снять фиксацию", "Фиксировать шапку");
var УСЛ_считывания  :String;

var ddНачало        :Date=1.1.1800;
var curРежимПоиска  :Integer;
var oldРежимПоиска  :Integer;
var flgТолькоПустые :Logical;
var flgЕслиКонецГод :Logical;
var flgНетВыравнСтр :Logical;
var flgСинхрон_Даты :Logical;
var choice_Режим    :Integer;
var choice_Пункт    :Integer;

var Buf[]           :String;
var Key[]           :String;
var Txt[]           :String;

var Позиции         :Integer;

var NNN[]           :Integer=$;
var tblКОДНФА[]     :String;
var tblИМЯНФА[]     :String;
var tblКОДУЧН[]     :String;
var tblКОДСЧ6[]     :String;
var tblКОДМОЛ[]     :String;
var tblИМЯМОЛ[]     :String;
var tblКОДМХЭ[]     :String;
var tblИМЯМХЭ[]     :String;
var tblКОДПДР[]     :String;
var tblИМЯПДР[]     :String;
var tblДОПАНА[]     :String;
var tblДАТВЭs[]     :Date;
var tblДАТПУs[]     :Date;
var tblДАТВЭn[]     :Date;
var tblДАТПУn[]     :Date;
var tblRECTbl[]     :Record;
var tblRECSub[]     :Record;
var tblCreate[]     :String;

var Lock[]          :Record;

var aAna[]       :String;
var тUNQELM[]    :String;
var тLSTELM[]    :String;
var тLSTМОЛ[]    :String;
var тLSTМХЭ[]    :String;
var тLSTДОП[]    :String;
var тОСТСУМ[]    :Numeric;
var тОСТКОЛ[]    :Numeric;
var тDATДПУ[]    :Date;
var тDATДВЭ[]    :Date;
var тSEARCH[]    :Logical;

var count_arrНФА :Integer;
var count_arrПРЧ :Integer;
var arr_КОДНФА[] :String;
var arr_REFНФА[] :String;
var arr_КОДПРЧ[] :String;
var arr_REFПРЧ[] :String;
var КБК_РАБ_001[] :String;
var КБК_РАБ_002[] :String;

2-- Общие процедуры и функции

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(Key);
 ClearVariable(Txt);
 --
 ClearVariable(Lock);
 --
 ClearVariable(КБК_РАБ_001);
 ClearVariable(КБК_РАБ_002);
end;

Proc ОчисткаОтчета;
 choice_Режим=0;
 choice_Пункт=0;
 УСЛ_считывания="";
 ClearVariable(Позиции);
 ClearVariable(NNN);
 ClearVariable(tblКОДНФА);
 ClearVariable(tblИМЯНФА);
 ClearVariable(tblКОДУЧН);
 ClearVariable(tblДАТПУn);
 ClearVariable(tblДАТВЭn);
 ClearVariable(tblДАТПУs);
 ClearVariable(tblДАТВЭs);
 ClearVariable(tblКОДСЧ6);
 ClearVariable(tblИМЯМОЛ);
 ClearVariable(tblИМЯМХЭ);
 ClearVariable(tblИМЯПДР);
 ClearVariable(tblДОПАНА);
 ClearVariable(tblКОДМОЛ);
 ClearVariable(tblКОДМХЭ);
 ClearVariable(tblКОДПДР);
 ClearVariable(tblRECTbl);
 ClearVariable(tblRECSub);
 ClearVariable(tblCreate);
end;

Proc ОчиститьОстатки;
 ClearVariable(тUNQELM);
 ClearVariable(тLSTELM);
 ClearVariable(тLSTМОЛ);
 ClearVariable(тLSTМХЭ);
 ClearVariable(тLSTДОП);
 ClearVariable(тОСТСУМ);
 ClearVariable(тОСТКОЛ);
 ClearVariable(тDATДПУ);
 ClearVariable(тDATДВЭ);
 ClearVariable(тSEARCH);
end;

Proc ОчиститьВспомМассив;
 ClearVariable(arr_КОДНФА);
 ClearVariable(arr_REFНФА);
 ClearVariable(arr_КОДПРЧ);
 ClearVariable(arr_REFПРЧ);
 count_arrНФА=0; count_arrПРЧ=0;
end;


Func TimeToHMSstring(valTime :Integer) :String;
var ihh, imm, icc :Integer;
var shh, smm, scc :String;
 shh=''; smm=''; scc='';
 ihh=Int(Trunc(valTime/3600));
 imm=Int(Trunc((valTime-ihh*3600)/60));
 icc=valTime-ihh*3600-imm*60;
 shh=Str(ihh); shh=RepStr('0', 2-Length(shh))+shh;
 smm=Str(imm); smm=RepStr('0', 2-Length(smm))+smm;
 scc=Str(icc); scc=RepStr('0', 2-Length(scc))+scc;
 ^(shh+':'+smm+':'+scc);
end;

Func ОтменитьИзмененияУсловийОтчета :Logical;
var FF :Logical;
var qq :Integer;
 FF=False;
 if Позиции>0:
   qq=EnqOkCancel("Условия отбора данных для отчета изменились!^MОчистить отчет?", mtConfirmation);
   if qq=cmOk: ОчисткаОтчета;
   |  qq=cmCancel: FF=True;
   fi;
 fi;
 ^FF;
end;

Proc ValidateОтчет;
 СекцWorkФТР.Visible=(Позиции>0);
 СекцWorkЗТN.Visible=(Позиции>0);
 СекцWorkДТN.Visible=(Позиции>0 and not flgНетВыравнСтр);
 СекцWorkДТF.Visible=(Позиции>0 and     flgНетВыравнСтр);
end;

Proc ВнешнийВид_Флаги(Разрешено:Logical);
 if not Разрешено: flgЕслиКонецГод=False; fi;
 cb_ЕслиКонецГод.Enabled = Разрешено;
end;

Func ЗаменитьСимволСтрокиВпозиции(valStr:String; repChar:String; repPos:Integer) :String;
var tmpFirst, tmpLast, out :String;
var len :Integer;
 tmpFirst=""; tmpLast=""; out="";
 len=Length(valStr);
 if repPos<1: repPos=1; fi;
 if repPos>len or repChar="" or valStr="": ^valStr; fi;
 repChar=SubStr(repChar, 1, 1);
 if repPos>1: tmpFirst=SubStr(valStr, 1, repPos-1); else tmpFirst=""; fi;
 if repPos<len: tmpLast=SubStr(valStr, repPos+1, len-repPos); else tmpLast=""; fi;
 out=tmpFirst+repChar+tmpLast;
 ^out;
end;

Func УдалитьРазделитель_дляНашаСорт(Value:String) :String;
var nn :Integer;
 nn=Pos("#", Value);
 while nn>0 do Value=ЗаменитьСимволСтрокиВпозиции(Value, "_", nn); nn=Pos("#", Value); od;
 ^Value;
end;

Func ВариантыЗагрузкиОстатков_Выбор(aРежим:Integer) :String;
var RES, ANA, Ключ, Value, msg :String;
var RO, num, ii, len, pp, xx :Integer;
var REC :Record;
 RES="";
 if aРежим>0:
   RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
   Try
     len=Records(RO);
     if len>0:
       Очистить;
       if aРежим=1: 
         msg="МОЛ";
         ShowProgress(len, "Считывание данных...");
         Try
           for ii=1 to len do
             ProgressPos(ii);
             ANA=Trim(GetFieldS(RO, ii, "МОЛ"));
             if ANA<>"":
               Value=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(ANA)));
               Ключ=if(Value<>"" and Up(Value)<>Up(ANA), Value, "яяяяяяяяяя")+"#"+ANA;
               num=SearchInArray(Key, Ключ, True, 1);
               if not num>0:
                 pp=InsertInArraySort(Key, Ключ);
                 InsertInArray(Txt, pp, ANA+"--"+Value);
                 InsertInArray(Buf, pp, ANA);
               fi;
             fi;
           od;
         Finally
           CloseProgress;
         end;
       |  aРежим=2:
         msg="местонахождение";
         ShowProgress(len, "Считывание данных...");
         Try
           for ii=1 to len do
             ProgressPos(ii);
             ANA=Trim(GetFieldS(RO, ii, "М"));
             if ANA<>"":
               Value=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(ANA)));
               Ключ=if(Value<>"" and Up(Value)<>Up(ANA), Value, "яяяяяяяяяя")+"#"+ANA;
               num=SearchInArray(Key, Ключ, True, 1);
               if not num>0:
                 pp=InsertInArraySort(Key, Ключ);
                 InsertInArray(Txt, pp, ANA+"--"+Value);
                 InsertInArray(Buf, pp, ANA);
               fi;
             fi;
           od;
         Finally
           CloseProgress;
         end;
       |  aРежим=3:
         msg="синт.счет";
         ShowProgress(len, "Считывание данных...");
         Try
           ii=0;
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.101.?1.???"; Txt[ii] = "101.?1--жилые помещения";
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.101.?2.???"; Txt[ii] = "101.?2--нежилые помещения";
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.101.?3.???"; Txt[ii] = "101.?3--сооружения";
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.101.?4.???"; Txt[ii] = "101.?4--машины и оборудование";
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.101.?5.???"; Txt[ii] = "101.?5--транспортные средства";
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.101.?6.???"; Txt[ii] = "101.?6--производственный и хозяйственный инвентарь";
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.101.?7.???"; Txt[ii] = "101.?7--библиотечный фонд";
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.101.?8.???"; Txt[ii] = "101.?8--прочие основные средства";
           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.102.?0.???"; Txt[ii] = "102.?0--нематериальные активы";
--           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.105.?1.???"; Txt[ii] = "105.?1--медикаменты и перевязочные средства";
--           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.105.?2.???"; Txt[ii] = "105.?2--продукты питания";
--           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.105.?3.???"; Txt[ii] = "105.?3--горюче-смазочные материалы";
--           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.105.?4.???"; Txt[ii] = "105.?4--строительные материалы";
--           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.105.?5.???"; Txt[ii] = "105.?5--мягкий инвентарь";
--           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.105.?6.???"; Txt[ii] = "105.?6--прочие материальные запасы";
--           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.105.?7.???"; Txt[ii] = "105.?7--готовая продукция";
--           ii=ii+1; ProgressPos(ii); Buf[ii] = "*.?.105.?8.???"; Txt[ii] = "105.?8--товары";
         Finally
           CloseProgress;
         end;
       |  aРежим=5:
         msg="подразделение";
         ShowProgress(0, "Считывание данных...");
         Try
           len=0; ii=0;
           for Transaction xx="*.?.101.??.310|*.?.102.??.320{П.*}", 1.1.100, 1.1.2100 do len=len+1; end;
           ShowProgress(len, "Считывание данных...");
           for Transaction xx="*.?.101.??.310|*.?.102.??.320{П.*}", 1.1.100, 1.1.2100 do
             ii=ii+1; ProgressPos(ii);
             if Up(TransCardFile(xx))="РПО_ОСТ_НФА":
               ANA=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(xx, "П", True);
               if ANA<>"":
                 Value=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(ANA)));
                 Ключ=if(Value<>"" and Up(Value)<>Up(ANA), Value, "яяяяяяяяяя")+"#"+ANA;
                 num=SearchInArray(Key, Ключ, True, 1);
                 if not num>0:
                   pp=InsertInArraySort(Key, Ключ);
                   InsertInArray(Txt, pp, ANA+"--"+Value);
                   InsertInArray(Buf, pp, ANA);
                 fi;
               fi;
             fi;
           end; --Transaction
         Finally
           CloseProgress;
         end;
       fi;
       if aРежим=1 or aРежим=2 or aРежим=3 or aРежим=5:
         len=LengthOfArray(Txt);
         if len>0 and len=LengthOfArray(Buf):
           num=AlternateTree("Выберите "+msg+"...", Txt, -1, if(choice_Режим=aРежим, choice_Пункт, 1), 12, "#", "Показатель", "Расшифровка", -1, False);
           if num>0:
             choice_Режим=aРежим;
             choice_Пункт=num;
             RES=Buf[num];
           fi; --num>0
         else
           Message("Ошибка при формировании вариантов загрузки!", mtError);
         fi;
       |  aРежим=4:
         REC=OpenCardFile("РПО_ОСТ_НФА_ROnly", "--", if(choice_Режим=aРежим, IntegerToRecord(choice_Пункт), NIL), crdRecordOnly);
         if REC<>NIL: 
           choice_Режим=aРежим;
           choice_Пункт=RecordToInteger(REC);
           RES=RecordToString(REC);
         fi;
       else
         Message("Некорректный режим фильтрации списка НФА!", mtError);
       fi; --есть что выбрать
     else
       Message("Картотека остатков НФА пустая!", mtError);
     fi; -- len>0
   Finally
     CloseWorkArea(RO);
   end;
 fi;
 ^RES;
end;

Func ДатаНужнаДляРедактирвания(adVE:Date; adPU:Date; flgПустые:Logical; flgКонецГод:Logical) :Logical;
var d1d, m1m, y1y, d2d, m2m, y2y :Integer;
 if flgПустые:
   if adVE>ddНачало and adPU>ddНачало : 
     if flgКонецГод:
       d1d=Day(adVE); m1m=Day(adVE); y1y=Year(adVE); d2d=Day(adPU); m2m=Mon(adPU); y2y=Year(adPU);
       if ((d1d=31 or d1d=30) and m1m=12 and y1y>2004) or ((d2d=31 or d2d=30) and m2m=12 and y2y>2004): ^True; fi;
     fi;
   |  adVE>ddНачало and adPU=1.1.100  : ^True;
   |  adVE=1.1.100  and adPU=ddНачало : ^True;
   |  adVE=1.1.100  and adPU=1.1.100  : ^True;
   fi;
 else
   ^True;
 fi;
 ^False;
end;

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

Proc Сортировка_Меню(TV01:Logical; TV02:Logical; TV03:Logical; TV04:Logical; TV05:Logical; TV06:Logical; TV07:Logical; TV08:Logical; TV09:Logical; TV10:Logical);
var sysTxt, sysShd :Integer;

 sysTxt=РАБ.ЦВЕТА.GetColor("coBtnText");
 sysShd=РАБ.ЦВЕТА.GetColor("coBtnShadow");

 СекцWorkЗТN.Cell(2, 02, CellFontColor, if(TV01, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 03, CellFontColor, if(TV02, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 04, CellFontColor, if(TV03, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 05, CellFontColor, if(TV04, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 06, CellFontColor, if(TV05, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 07, CellFontColor, if(TV06, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 08, CellFontColor, if(TV07, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 09, CellFontColor, if(TV08, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 10, CellFontColor, if(TV09, sysTxt, sysShd));
 СекцWorkЗТN.Cell(2, 11, CellFontColor, if(TV10, sysTxt, sysShd));

 СекцWorkЗТN.Cell(2, 02, CellFontStyle, if(TV01, fsBold, 0));
 СекцWorkЗТN.Cell(2, 03, CellFontStyle, if(TV02, fsBold, 0));
 СекцWorkЗТN.Cell(2, 04, CellFontStyle, if(TV03, fsBold, 0));
 СекцWorkЗТN.Cell(2, 05, CellFontStyle, if(TV04, fsBold, 0));
 СекцWorkЗТN.Cell(2, 06, CellFontStyle, if(TV05, fsBold, 0));
 СекцWorkЗТN.Cell(2, 07, CellFontStyle, if(TV06, fsBold, 0));
 СекцWorkЗТN.Cell(2, 08, CellFontStyle, if(TV07, fsBold, 0));
 СекцWorkЗТN.Cell(2, 09, CellFontStyle, if(TV08, fsBold, 0));
 СекцWorkЗТN.Cell(2, 10, CellFontStyle, if(TV09, fsBold, 0));
 СекцWorkЗТN.Cell(2, 11, CellFontStyle, if(TV10, fsBold, 0));

end;

Proc СортировкаТаблицы(aField:String);
var SortField :String;
var len :Integer;
 len=Позиции;
 if len>0:
   ShowProgress(len, "Сортировка таблицы...");
   Try
     if aField="кнпS00": SortField="TBLCREATE"; Сортировка_Меню(True,  False, False, False, False, False, False, False, False, False);
     |  aField="кнпS01": SortField="TBLКОДНФА"; Сортировка_Меню(False, True,  False, False, False, False, False, False, False, False);
     |  aField="кнпS02": SortField="TBLИМЯНФА"; Сортировка_Меню(False, False, True,  False, False, False, False, False, False, False);
     |  aField="кнпS03": SortField="TBLКОДУЧН"; Сортировка_Меню(False, False, False, True,  False, False, False, False, False, False);
     |  aField="кнпS04": SortField="TBLДАТПУN"; Сортировка_Меню(False, False, False, False, True,  False, False, False, False, False);
     |  aField="кнпS05": SortField="TBLДАТВЭN"; Сортировка_Меню(False, False, False, False, False, True,  False, False, False, False);
     |  aField="кнпS06": SortField="TBLКОДСЧ6"; Сортировка_Меню(False, False, False, False, False, False, True,  False, False, False);
     |  aField="кнпS07": SortField="TBLИМЯМОЛ"; Сортировка_Меню(False, False, False, False, False, False, False, True,  False, False);
     |  aField="кнпS08": SortField="TBLИМЯМХЭ"; Сортировка_Меню(False, False, False, False, False, False, False, False, True,  False);
     |  aField="кнпS09": SortField="TBLИМЯПДР"; Сортировка_Меню(False, False, False, False, False, False, False, False, False, True );
     else SortField="";
     fi;
     if SortField="": SortField="TBLCREATE"; Сортировка_Меню(True, False, False, False, False, False, False, False, False, False); fi;
     SortSection("СекцWorkДТN", SortField, True, False);
     ClearVariable(NNN);
   Finally
     CloseProgress;
   end;
 fi;
end;

Proc ФиксироватьТаблицу(Разрешено:Logical);
 if Разрешено:
   Template.Freeze(asInteger(СекцWorkЗТN.Column(2, ColLeft, "")), asInteger(СекцWorkЗТN.Row(9, RowTop, "")));
 else
   Template.Freeze(0, 0);
 fi;
end;

Proc ЗагрузкаНФАвОстаткахПоФильтру(aРежим:Integer);
var RO, len, ii, OA, num, jj, xx :Integer;
var УСЛ, FTR, КОДСЧТ, КОДУЧН, КОДНФА, КОДМХЭ, КОДПДР, КОДМОЛ, ANA001, ANA002, ОБЩАНА :String;
var RECTbl, RECSub :Record;
var dd_VE, dd_PU :Date;
var Work, OK :Logical;
 УСЛ=Up(ВариантыЗагрузкиОстатков_Выбор(aРежим));
 Work=if(aРежим>0 and УСЛ="", False, True);
 if Work:
   FTR="";
   if aРежим=1: FTR="МОЛ='"+УСЛ+"'";
   |  aРежим=2: FTR=  "М='"+УСЛ+"'";
   |  aРежим=3: FTR="";
   |  aРежим=4: FTR="Ukey="+УСЛ;
   |  aРежим=5: FTR="";
   else FTR="";
   fi;
   ShowProgress(0, "Подготовка...");
   RO=OpenWorkArea("РПО_ОСТ_НФА", "", FTR);
   Try
     len=Records(RO);
     if len>0:
       ОчисткаОтчета;
       ShowProgress(len, "Поиск данных...");
       xx=0;
       for ii=1 to len do
         ProgressPos(ii);
         КОДМОЛ=""; КОДМХЭ=""; КОДПДР=""; ANA001=""; ANA002=""; КОДСЧТ=""; КОДУЧН=""; КОДНФА=""; ОБЩАНА=""; RECTbl=NIL; RECSub=NIL; dd_VE=1.1.100; dd_PU=1.1.100;
         OA=OpenArray(RO, ii, "ПОЗИЦИИОС", "", "");
         num=Records(OA);
         if num>0:
           КОДМОЛ=Trim(GetFieldS(RO, ii, "МОЛ"));
           КОДМХЭ=Trim(GetFieldS(RO, ii, "М"));
           ANA001=Trim(GetFieldS(RO, ii, "ОБЩАН"));
           RECTbl=GetRecordKey(RO, ii);
           for jj=1 to num do
             КОДСЧТ=Trim(GetFieldS(OA, jj, "СЧНФА"));
             КОДУЧН=Trim(GetFieldS(OA, jj, "УЧНОМ"));
             ANA002=Trim(GetFieldS(OA, jj, "ДОПАН"));
             ОБЩАНА=Объединить(ANA001, ANA002, " ");
             КОДПДР=Trim(РАБ.БЮДЖЕТ2005.ВзятьСловоИзНабораПоМаске(ОБЩАНА, " ", "П.*", ""));
             if КОДПДР<>"": ОБЩАНА=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабораПоМаске(ОБЩАНА, " ", "П.*", ""); fi;
             dd_VE=GetFieldD(OA, jj, "ДЭКСПЛ");
             dd_PU=GetFieldD(OA, jj, "ДУЧЕТ");
             if aРежим=3: OK=Match(КОДСЧТ, УСЛ);
             |  aРежим=5: OK=if(Up(КОДПДР)=УСЛ, True, False);
             else OK=True;
             fi;
             if OK and Match(КОДУЧН, "УЧН.*"):
               if ДатаНужнаДляРедактирвания(dd_VE, dd_PU, flgТолькоПустые, flgЕслиКонецГод):
                 RECSub=GetRecordKey(OA, jj);
                 КОДНФА=Trim(GetFieldS(OA, jj, "НФА"));
                 xx=xx+1;
                 tblКОДНФА[xx]=КОДНФА;
                 tblИМЯНФА[xx]=Trim(Name_A(КОДНФА)); if tblИМЯНФА[xx]="": tblИМЯНФА[xx]=КОДНФА; fi;
                 tblКОДУЧН[xx]=Trim(SubStr(КОДУЧН, 5, 255));
                 tblДАТПУn[xx]=dd_PU;
                 tblДАТВЭn[xx]=dd_VE;
                 tblДАТПУs[xx]=tblДАТПУn[xx];
                 tblДАТВЭs[xx]=tblДАТВЭn[xx];
                 tblКОДМОЛ[xx]=КОДМОЛ;
                 tblИМЯМОЛ[xx]=Trim(Name_A(КОДМОЛ)); if tblИМЯМОЛ[xx]="": tblИМЯМОЛ[xx]=КОДМОЛ; fi;
                 tblКОДМХЭ[xx]=КОДМХЭ;
                 tblИМЯМХЭ[xx]=Trim(Name_A(КОДМХЭ)); if tblИМЯМХЭ[xx]="": tblИМЯМХЭ[xx]=КОДМХЭ; fi;
                 tblКОДСЧ6[xx]=if(Match(КОДСЧТ, "???.????.???????.???.?.???.??.???"), SubStr(КОДСЧТ, 24, 3)+".0"+SubStr(КОДСЧТ, 29, 1), "");
                                               --1234567890123456789012345678901234567890
                                               --         1         2         3
                 if КОДПДР<>"":
                   tblКОДПДР[xx]=КОДПДР;
                   tblИМЯПДР[xx]=Trim(Name_A(КОДПДР)); if tblИМЯПДР[xx]="": tblИМЯПДР[xx]=КОДПДР; fi;
                 fi;
                 tblДОПАНА[xx]=ОБЩАНА;
                 tblRECTbl[xx]=RECTbl;
                 tblRECSub[xx]=RECSub;
                 tblCreate[xx]=RecordToString(RECTbl)+"#"+RecordToString(RECSub);
               fi;
             fi;
           od;
         fi;
         CloseWorkArea(OA);
       od;
     fi;
   Finally
     CloseWorkArea(RO);
     CloseProgress;
   end;
 fi;
 xx=LengthOfArray(tblДАТВЭn);
 if xx>0: Позиции=xx; УСЛ_считывания=УСЛ; else Message("По заданным условиям отбора^Mданных не найдено", mtWarning); fi;
 ValidateОтчет;
 СортировкаТаблицы("кнпS00");
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;

Proc СохранениеИзменений;
var RO, OA, len, ii, ppTbl, ppSub, y1, y2 :Integer;
var updВЭ, updПУ :Logical;
 if Позиции>0:
   if CanUpdate("РПО_ОСТ_НФА"):
     ShowProgress(0, "Подготовка...");
     RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
     Try
       if Records(RO)>0:
         BeginChanging(RO);
         Try
           len=LengthOfArray(tblCreate);
           if len>0:
             ClearVariable(Lock);
             ShowProgress(len, "Сохранение результатов работы...");
             for ii=1 to len do
               ProgressPos(ii);
               updВЭ=(tblДАТВЭn[ii]<>tblДАТВЭs[ii] and tblДАТВЭn[ii]>1.1.100);
               updПУ=(tblДАТПУn[ii]<>tblДАТПУs[ii] and tblДАТПУn[ii]>1.1.100);
               if updВЭ or updПУ:
                 ppTbl=GetRecordNumber(RO, tblRECTbl[ii]);
                 if ppTbl>0:
                   if Монопольно(RO, ppTbl, tblRECTbl[ii]):
                     OA=OpenArray(RO, ppTbl, "ПОЗИЦИИОС", "", "");
                     ppSub=GetRecordNumber(OA, tblRECSub[ii]);
                     if ppSub>0:
                       if updВЭ: y1=PutFieldD(OA, ppSub, "ДЭКСПЛ", tblДАТВЭn[ii]); fi;
                       if updПУ: y2=PutFieldD(OA, ppSub, "ДУЧЕТ",  tblДАТПУn[ii]); fi;
                     fi;
                     CloseWorkArea(OA);
                   fi;
                 fi;
               fi;
             od;
           fi;
           EndChanging(RO);
         Except
           Message("Ошибка "+Str(ErrorCode)+".", mtError);
           CancelChanging(RO);
           Raise;
         end;
       fi;
     Finally
       CloseWorkArea(RO);
       CloseProgress;
     end;
   else
     Message("Картотеку остатков НФА нельзя изменить.^MВозможно надо использовать другую схему доступа.", mtError);
   fi;
 else
   Message("Сохранять нечего.^MПредварительно сделайте расчет", mtWarning);
 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 ИнвентарныйСписок_ОстаткиНаКонецГода(RepDate:Date) :Integer;
var КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, ДОПАНА, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП :String;
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment, svrANA, svrSGN :String;
var xx, len, ii, jj, zz, pp, num, hh :Integer;
var aSum1, aSum2, SUM, KOL, QUA :Numeric;
var СЧДЕБ :Logical;
var aDate :Date;

 ClearVariable(aAna);
 ClearVariable(Key);

 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepNoNullBal+TujRepCombinedAna+TujRepBalAccount;
 len=TujReport(ВременныйФайл, 1.1.100, RepDate, "*.?.101.??.???|*.?.102.??.???", "(НФА.*)&(УЧН.*)", "ДНФА", "", "", xx, False);
 if len>0:
   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(Key, True, False, ExtractWord(ii, svrANA, "|")+".*"); od; fi;
   fi;
   num=LengthOfArray(Key);
   ОчиститьОстатки;
   ОчиститьВспомМассив;
   ShowProgress(len, "Подсчет остатков инвентарного имущества на конец "+Str(Year(RepDate)-1)+" года.");
   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=""; svrSGN="";
         if num>0:
           ClearVariable(Txt);
           Txt[num]="";
         fi;
         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 num>0:
               for zz=1 to num do
                 if Match(svrANA, Key[zz]): Txt[zz]=svrANA; fi; -- дополнительная аналитика
               od;
             fi;
           od; -- цикл по аналитике
         fi; --xx>0
         if num>0:
           for zz=1 to num do
             ДОПАНА=РАБ.УПП.LIB.Объединить(ДОПАНА, Trim(Txt[zz]), " ");
           od;
         fi;
         КОДМОЛ=Trim(КОДМОЛ);
         КОДМХЭ=Trim(КОДМХЭ);
         ДОПАНА=Trim(ДОПАНА);
-- дублирование исключения
--         if ПринудительноИсключитьСправочники<>"" and ДОПАНА<>"":
--           ДОПАНА=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабораПоМаске(ДОПАНА, " ", ПреобразоватьНабор_Справочники(ПринудительноИсключитьСправочники), "|");
--         fi;
         if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
         if КОДМХЭ="": КОДМХЭ="МХЭ.$$$"; fi;
         if ДОПАНА="": ДОПАНА="ДОП.$$$"; else ДОПАНА=РАБ.БЮДЖЕТ2005.СортироватьНаборСлов(ДОПАНА, " ", True); fi;
         --
         if Name_A(КОДНФА)<>" " and Name_A(КОДУЧН)<>" ":
           -- Формирование ссылок на аналитику
           -- НФА
           refStrНФА="";
           hh=SearchInArray(arr_КОДНФА, 2КОДНФА0, True, 1);
           if hh=-1:
             count_arrНФА=count_arrНФА+1;
             refStrНФА=Format("%.10d", count_arrНФА);
             pp=InsertInArraySort(arr_КОДНФА, 2КОДНФА0);
             InsertInArray(arr_REFНФА, pp, refStrНФА);
           else
             refStrНФА=arr_REFНФА[hh];
           fi;
           -- Прочая аналитика (МОЛ)
           refStrМОЛ="";
           hh=SearchInArray(arr_КОДПРЧ, 2КОДМОЛ0, True, 1);
           if hh=-1:
             count_arrПРЧ=count_arrПРЧ+1;
             refStrМОЛ=Format("%.10d", count_arrПРЧ);
             pp=InsertInArraySort(arr_КОДПРЧ, 2КОДМОЛ0);
             InsertInArray(arr_REFПРЧ, pp, refStrМОЛ);
           else
             refStrМОЛ=arr_REFПРЧ[hh];
           fi;
           -- Прочая аналитика (МХЭ)
           refStrМХЭ="";
           hh=SearchInArray(arr_КОДПРЧ, 2КОДМХЭ0, True, 1);
           if hh=-1:
             count_arrПРЧ=count_arrПРЧ+1;
             refStrМХЭ=Format("%.10d", count_arrПРЧ);
             pp=InsertInArraySort(arr_КОДПРЧ, 2КОДМХЭ0);
             InsertInArray(arr_REFПРЧ, pp, refStrМХЭ);
           else
             refStrМХЭ=arr_REFПРЧ[hh];
           fi;
           -- Прочая аналитика (дополнительная)
           refStrДОП="";
           hh=SearchInArray(arr_КОДПРЧ, 2ДОПАНА0, True, 1);
           if hh=-1:
             count_arrПРЧ=count_arrПРЧ+1;
             refStrДОП=Format("%.10d", count_arrПРЧ);
             pp=InsertInArraySort(arr_КОДПРЧ, 2ДОПАНА0);
             InsertInArray(arr_REFПРЧ, pp, refStrДОП);
           else
             refStrДОП=arr_REFПРЧ[hh];
           fi;
           -- УНИКАЛЬНАЯ СТРОКА ОБЪЕКТОВ ОСТАТКОВ
           svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
           svrSGN=КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН;
           --
           hh=SearchInArray(тUNQELM, svrANA, True, 1);
           if hh=-1:
             pp=InsertInArraySort(тUNQELM, svrANA);
             InsertInArray(тLSTELM, pp, svrSGN);
             InsertInArray(тLSTМОЛ, pp, КОДМОЛ);
             InsertInArray(тLSTМХЭ, pp, КОДМХЭ);
             InsertInArray(тLSTДОП, pp, ДОПАНА);
             InsertInArray(тОСТСУМ, pp, SUM);
             InsertInArray(тОСТКОЛ, pp, KOL);
           else
             тОСТСУМ[hh]=тОСТСУМ[hh]+SUM;
             тОСТКОЛ[hh]=тОСТКОЛ[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)
 ^LengthOfArray(тUNQELM);
end; -- ИнвентарныйСписок_ОстаткиНаКонецГода

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

Func ВзятьДЭКСПЛ_КМНТ(КМНТ:String) :Date;
var ДЭКСПЛ :Date;
var pp :Integer;
 КМНТ=' '+КМНТ;
 pp=Pos(' ДЭКСПЛ=', КМНТ);
 if pp>0:
   КМНТ=Trim(SubStr(КМНТ, pp+8, 10));
   Try ДЭКСПЛ=StringToDate(КМНТ); Except ДЭКСПЛ=1.1.100; end;
 fi;
 ^ДЭКСПЛ;
end;

Func ВзятьДУЧЕТ_КМНТ(КМНТ:String):Date;
var ДУЧЕТ :Date;
var pp :Integer;
 КМНТ=' '+КМНТ;
 pp=Pos(' ДУЧЕТ=',  КМНТ);
 if pp>0:
   КМНТ=Trim(SubStr(КМНТ, pp+8, 10));
   if Match(КМНТ, '?.??.????'): КМНТ='1'+КМНТ; fi;
   Try ДУЧЕТ=StringToDate(КМНТ); Except ДУЧЕТ=1.1.100; end;
 fi;
 ^ДУЧЕТ;
end;

Func ВзятьДатуВводаЭксплуат_Сложный(Fnc_Date:Date; Crd_Date:Date; vКОДНФА:String; vКОДУЧН:String; vКОДСЧТ:String; vКОДМХЭ:String; ddEND:Date; vXconstНФА100П:Numeric) :Date;
var MskAna, СЧТКОД :String;
var dd_Null, Rep_Date :Date;
var Цена :Numeric;
var pp :Integer;
 dd_Null=1.1.1800;
 if Crd_Date > dd_Null and Fnc_Date > dd_Null : if Crd_Date<Fnc_Date: Rep_Date=Crd_Date; else Rep_Date=Fnc_Date; fi;
 |  Crd_Date > dd_Null and Fnc_Date = 1.1.100 : Rep_Date=Crd_Date;
 |  Crd_Date = 1.1.100 and Fnc_Date > dd_Null : Rep_Date=Fnc_Date;
 else Rep_Date=1.1.100;
 fi;
 if Rep_Date>dd_Null: ^Rep_Date; fi;
 --
 Rep_Date=1.1.100;
 MskAna=vКОДСЧТ+"/(*.?.???.??.???|00){"+vКОДНФА+"&"+vКОДУЧН+"}";
 for Transaction pp=MskAna, 1.1.100, ddEnd  do
   Rep_Date=ВзятьДЭКСПЛ_КМНТ(TransComment(pp));
   if Rep_Date>dd_Null: ^Rep_Date; fi;
   Try Цена=Abs(TransSum(pp, "РУБ"))/Abs(TransSum(pp, "КОЛ")); Except Цена=0.00; end;
   СЧТКОД=TransCre(pp);
   if Match(vКОДМХЭ, "М.Э.*") or (СЧТКОД="00" and TransCardFile(pp)="РПО_ОСТ_НФА"): Rep_Date=TransDate(pp); fi;
   if Rep_Date>dd_Null: ^Rep_Date; fi;
   if Rep_Date=1.1.100:
     if Match(СЧТКОД, "*.?.101.??.3?0") or -- внутренние перемещения
        Match(СЧТКОД, "*.?.106.??.3?0") or -- принятие к учету
        Match(СЧТКОД, "*.?.304.04.3?0") or -- централизованное снабжение
        Match(СЧТКОД, "*.?.401.10.14?") or
        Match(СЧТКОД, "*.?.401.10.15?") or
        Match(СЧТКОД, "*.?.401.10.180") or
        ((Match(СЧТКОД, "*.?.401.20.271") or Match(СЧТКОД, "*.?.109.??.271")) and Цена<=vXconstНФА100П):
          Rep_Date=TransDate(pp);
          if Rep_Date>dd_Null: ^Rep_Date; fi;
     fi;
   fi;
 end;
 ^Rep_Date;
end;

Func ВзятьДатуПринятияУчету_Сложный(Fnc_Date:Date; Crd_Date:Date; vКОДНФА:String; vКОДУЧН:String; vКОДСЧТ:String; ddEND:Date) :Date;
var dd_Null, Rep_Date :Date;
var MskAna :String;
var pp :Integer;
 dd_Null=1.1.1800;
 if Crd_Date > dd_Null and Fnc_Date > dd_Null : if Crd_Date<Fnc_Date: Rep_Date=Crd_Date; else Rep_Date=Fnc_Date; fi;
 |  Crd_Date > dd_Null and Fnc_Date = 1.1.100 : Rep_Date=Crd_Date;
 |  Crd_Date = 1.1.100 and Fnc_Date > dd_Null : Rep_Date=Fnc_Date;
 else Rep_Date=1.1.100;
 fi;
 if Rep_Date>dd_Null: ^Rep_Date; fi;
 --
 Rep_Date=1.1.100;
 MskAna=vКОДСЧТ+"/(*.106.??.3?0|*.304.04.3?0|*.401.10.14?|*.401.10.15?|*.401.10.172|*.401.10.180|00)"+"{"+vКОДНФА+"&"+vКОДУЧН+"}";
 for Transaction pp=MskAna, 1.1.100, ddEnd  do
   Rep_Date=ВзятьДУЧЕТ_КМНТ(TransComment(pp));
   if Rep_Date>dd_Null: ^Rep_Date; fi;
   Rep_Date=TransDate(pp);
   if Rep_Date>dd_Null: ^Rep_Date; fi;
 end;
 ^Rep_Date;
end;

Func ВзятьДатуВводаЭксплуат_П_модиф(vR1:Integer; vIter:Integer; Сложный:Logical; rvКОДНФА:String; rvКОДУЧН:String; rvКОДСЧТ:String; rvКОДМХЭ:String; RddEND:Date; rXconstНФА100П:Numeric) :Date;
var dd_Null, Rep_Date, clcFnc_Date, clcCrd_Date :Date;
 dd_Null  = 1.1.1800;
 Rep_Date = 1.1.100;
 if Name_A(rvКОДНФА)=" " or Name_A(rvКОДУЧН)=" ": ^Rep_Date; fi;
 clcFnc_Date = 1.1.100+Int(Saldo("ЗАБ.НФА.ДЭКСПЛ{"+rvКОДНФА+"&"+rvКОДУЧН+"}", RddEND));
 if clcFnc_Date>dd_Null and Year(clcFnc_Date)<2100: ^clcFnc_Date; fi;
 if Сложный:
   clcCrd_Date = 1.1.100;
   if vIter>0 and Up(WorkAreaCardFile(vR1))="РПО_ИНВКАРТ_ОС": clcCrd_Date = GetFieldD(vR1, vIter, "ДАТ_ВЭКСП"); fi;
   Rep_Date=ВзятьДатуВводаЭксплуат_Сложный(clcFnc_Date, clcCrd_Date, rvКОДНФА, rvКОДУЧН, rvКОДСЧТ, rvКОДМХЭ, RddEND, rXconstНФА100П);
 else
   if clcFnc_Date>dd_Null and Year(clcFnc_Date)<2100: Rep_Date=clcFnc_Date; fi;
 fi;
 ^Rep_Date;
end;

Func ВзятьДатуПринятияУчету_П_модиф(vR1:Integer; vIter:Integer; Сложный:Logical; rvКОДНФА:String; rvКОДУЧН:String; rvКОДСЧТ:String; RddEND:Date) :Date;
var dd_Null, Rep_Date, clcFnc_Date, clcCrd_Date :Date;
 dd_Null=1.1.1800;
 Rep_Date=1.1.100;
 if Name_A(rvКОДНФА)=" " or Name_A(rvКОДУЧН)=" ": ^Rep_Date; fi;
 clcFnc_Date = 1.1.100+Int(Saldo("ЗАБ.НФА.ДУЧЕТ{"+rvКОДНФА+"&"+rvКОДУЧН+"}", RddEND));
 if clcFnc_Date>dd_Null and Year(clcFnc_Date)<2100: ^clcFnc_Date; fi;
 if Сложный:
   clcCrd_Date = 1.1.100;
   if vIter>0 and Up(WorkAreaCardFile(vR1))="РПО_ИНВКАРТ_ОС": clcCrd_Date = GetFieldD(vR1, vIter, "ОПРИХ_ДАТА"); fi;
   Rep_Date=ВзятьДатуПринятияУчету_Сложный(clcFnc_Date, clcCrd_Date, rvКОДНФА, rvКОДУЧН, rvКОДСЧТ, RddEND);
 else
   if clcFnc_Date>dd_Null and Year(clcFnc_Date)<2100: Rep_Date=clcFnc_Date; fi;
 fi;
 ^Rep_Date;
end;

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

Proc ДатыОстатков_Экспорт_ЗаписатьФайл(aПуть:String; RepDate:Date; aConstНФА100П:Numeric; aConstНФА_ИНВ:Numeric);
var nameFile, КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, ДОПАНА :String;
var ROинв, ppИНВ, FS, num, ii, xx :Integer;
var ddpu, ddve :Date;
var FlagCreate :Logical;
var SUM, Цена :Numeric;
var REC :Record;
 num=LengthOfArray(тUNQELM);
 if num>0:
   nameFile=aПуть+"Протокол_дат_ДПУ_ДВЭ_"+Format("%.4d", Year(RepDate))+Format("%.2d", Mon(RepDate))+Format("%.2d", Day(RepDate))+".prtkl";
   ShowProgress(num, "Запись в файл дат принятия к учету, ввода в эксплуатацию.");
   ROинв=OpenWorkArea("РПО_ИНВКАРТ_ОС", "", "");
   Try
     Try
       Try if ExistFile(nameFile): DeleteFile(nameFile); fi; Except end;
       FlagCreate=False;
       FS=TextFileCreate(nameFile);
       FlagCreate=True;
       -- Записываем заголовок
       TextFileWriteLn(FS, "/// *** ДАТЫ ПРИНЯТИЯ К УЧЕТУ, ВВОДА В ЭКСПЛУАТАЦИЮ ***");
       TextFileWriteLn(FS, "/// Дата и время выгрузки - "+DateToString(ToDay)+"г. "+ExecuteFuncS("РАБ.НФА.LIBREP.TimeToHMSstring_adv", Time, ":"));
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "");
       SUM=0.00;
       xx=0;
       for ii=1 to num do
         ProgressPos(ii);
         if тОСТКОЛ[ii]<>0: Цена=тОСТСУМ[ii]/тОСТКОЛ[ii]; else Цена=0.00; fi;
         if Цена>aConstНФА_ИНВ:
           xx=xx+1;
           КОДСЧТ=Trim(ExtractWord(1, тLSTELM[ii], "#"));
           КОДНФА=Trim(ExtractWord(2, тLSTELM[ii], "#"));
           КОДУЧН=Trim(ExtractWord(3, тLSTELM[ii], "#"));
           КОДМОЛ=Trim(тLSTМОЛ[ii]);
           КОДМХЭ=Trim(тLSTМХЭ[ii]);
           ДОПАНА=Trim(тLSTДОП[ii]);
           if КОДМОЛ="МОЛ.$$$": КОДМОЛ=""; fi;
           if КОДМХЭ="МХЭ.$$$": КОДМХЭ=""; fi;
           if ДОПАНА="ДОП.$$$": ДОПАНА=""; fi;
           ppИНВ=0;
           if Name_A(КОДНФА)<>" " and Name_A(КОДУЧН)<>" ":
             REC=SignToRecord("ИНВВЕД."+КОДНФА+"."+КОДУЧН, False);
             if REC<>NIL: ppИНВ=GetRecordNumber(ROинв, REC); fi;
           fi;
           ddpu=ВзятьДатуПринятияУчету_П_модиф(ROинв, ppИНВ, True, КОДНФА, КОДУЧН, КОДСЧТ, RepDate);
           ddve=ВзятьДатуВводаЭксплуат_П_модиф(ROинв, ppИНВ, True, КОДНФА, КОДУЧН, КОДСЧТ, КОДМХЭ, RepDate, aConstНФА100П);
           --
           TextFileWriteLn(FS, "");
           TextFileWriteLn(FS, "@@1 "+КОДСЧТ);
           TextFileWriteLn(FS, "@@2 "+КОДНФА);
           TextFileWriteLn(FS, "@@3 "+КОДУЧН);
           TextFileWriteLn(FS, "@@4 "+КОДМОЛ);
           TextFileWriteLn(FS, "@@5 "+КОДМХЭ);
           TextFileWriteLn(FS, "@@6 "+ДОПАНА);
           SUM=SUM+тОСТСУМ[ii];
           TextFileWriteLn(FS, "@@7 "+if(ddpu>ValidDate, DateToString(ddpu), ""));
           TextFileWriteLn(FS, "@@8 "+if(ddve>ValidDate, DateToString(ddve), ""));
           TextFileWriteLn(FS, "@@9 "+Format("%17.2N", тОСТСУМ[ii]));
           TextFileWriteLn(FS, "@@0 "+КоличествоТочно_Текстом(тОСТКОЛ[ii]));
           TextFileWriteLn(FS, "@@#");
         fi;
       od;
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "");
       TextFileWriteLn(FS, "/// Число элементов: "+Format("%.20d", xx));
       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
     CloseWorkArea(ROинв);
     CloseProgress;
   end;
 fi;
end;

Proc ДатыОстатков_Экспорт(aDate:Date);
var SUM, ConstНФА100П, ConstНФА_ИНВ :Numeric;
var num, WorkYear :Integer;
var Путь :String;
 if ChooseFolder(Путь, "Выберите папку для сохранения файла выгрузки...")=cmOk:
   ClearTrace(True);
   Refresh(False);
   if not aDate>ValidDate:
     Try WorkYear=Int(PlanVar("ГОД")); Except WorkYear=0; end;
     if WorkYear>Year(ValidDate): aDate=Dat(1, 1, WorkYear+1); fi;
   fi;
   Try SUM=Com_Var("ОС_100"  , aDate-1); Except SUM=0.00; end; if not SUM>0.00: if (aDate-1)>=1.1.2011: SUM=40000; else SUM=20000; fi; fi; ConstНФА100П=SUM;
   Try SUM=Com_Var("ОС_РАСХ" , aDate-1); Except SUM=0.00; end; if not SUM>0.00: if (aDate-1)>=1.1.2009: SUM=3000;  else SUM=1000;  fi; fi; ConstНФА_ИНВ=SUM;
   num=ИнвентарныйСписок_ОстаткиНаКонецГода(aDate);
   if num>0:
     ДатыОстатков_Экспорт_ЗаписатьФайл(Путь, aDate, ConstНФА100П, ConstНФА_ИНВ);
   else
     Message("Ошибка!^MНеобходимых для выгрузки данных не найдено.", mtError);
   fi;
 fi; --ChooseFolder
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 КонвертироватьКБК(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;

Proc Загрузка_ДобавитьДанные(aVal1:String; aVal2:String; aVal3:String; aVal4:String; aVal5:String; aVal6:String; aVal7:String; aVal8:String; aVal9:String; aVal0:String);
var КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, ДОПАНА, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП, unqOST, unqELM :String;
var ddpu, ddve :Date;
var SUM, KOL :Numeric;
var hh, pp :Integer;
 КОДСЧТ=aVal1; -- счет бюджетного учета
 КОДНФА=aVal2; -- код НФА
 КОДУЧН=aVal3; -- учетный номер
 КОДМОЛ=aVal4; -- МОЛ
 КОДМХЭ=aVal5; -- МХЭ
 ДОПАНА=aVal6; -- дополнительная аналитика
 Try ddpu=StringToDate(aVal7);                 Except ddpu=1.1.100; end; -- дата принятия к учету
 Try ddve=StringToDate(aVal8);                 Except ddpu=1.1.100; end; -- дата ввода в эксплуатацию
 Try  SUM=StringToNumeric(ТолькоЦифры(aVal9)); Except SUM=0.00;     end; -- сумма
 Try  KOL=StringToNumeric(ТолькоЦифры(aVal0)); Except KOL=0.00;     end; -- количество
 if Match(КОДСЧТ, "???.????.???????.???.?.10?.??.???") and ValidSign(КОДНФА) and ValidSign(КОДУЧН) and SUM>0.00:
   if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
   if КОДМХЭ="": КОДМХЭ="МХЭ.$$$"; fi;
   if ДОПАНА="": ДОПАНА="ДОП.$$$"; fi;
   КОДСЧТ=КонвертироватьКБК(КОДСЧТ);
   -- Формирование ссылок на аналитику
   -- НФА
   refStrНФА="";
   hh=SearchInArray(arr_КОДНФА, 2КОДНФА0, True, 1);
   if hh=-1:
     count_arrНФА=count_arrНФА+1;
     refStrНФА=Format("%.10d", count_arrНФА);
     pp=InsertInArraySort(arr_КОДНФА, 2КОДНФА0);
     InsertInArray(arr_REFНФА, pp, refStrНФА);
   else
     refStrНФА=arr_REFНФА[hh];
   fi;
   -- Прочая аналитика (МОЛ)
   refStrМОЛ="";
   hh=SearchInArray(arr_КОДПРЧ, 2КОДМОЛ0, True, 1);
   if hh=-1:
     count_arrПРЧ=count_arrПРЧ+1;
     refStrМОЛ=Format("%.10d", count_arrПРЧ);
     pp=InsertInArraySort(arr_КОДПРЧ, 2КОДМОЛ0);
     InsertInArray(arr_REFПРЧ, pp, refStrМОЛ);
   else
     refStrМОЛ=arr_REFПРЧ[hh];
   fi;
   -- Прочая аналитика (МХЭ)
   refStrМХЭ="";
   hh=SearchInArray(arr_КОДПРЧ, 2КОДМХЭ0, True, 1);
   if hh=-1:
     count_arrПРЧ=count_arrПРЧ+1;
     refStrМХЭ=Format("%.10d", count_arrПРЧ);
     pp=InsertInArraySort(arr_КОДПРЧ, 2КОДМХЭ0);
     InsertInArray(arr_REFПРЧ, pp, refStrМХЭ);
   else
     refStrМХЭ=arr_REFПРЧ[hh];
   fi;
   -- Прочая аналитика (дополнительная)
   refStrДОП="";
   hh=SearchInArray(arr_КОДПРЧ, 2ДОПАНА0, True, 1);
   if hh=-1:
     count_arrПРЧ=count_arrПРЧ+1;
     refStrДОП=Format("%.10d", count_arrПРЧ);
     pp=InsertInArraySort(arr_КОДПРЧ, 2ДОПАНА0);
     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(тLSTМОЛ, pp, КОДМОЛ);
     InsertInArray(тLSTМХЭ, pp, КОДМХЭ);
     InsertInArray(тLSTДОП, pp, ДОПАНА);
     InsertInArray(тОСТСУМ, pp, SUM);
     InsertInArray(тОСТКОЛ, pp, KOL);
     InsertInArray(тDATДПУ, pp, ddpu);
     InsertInArray(тDATДВЭ, pp, ddve);
     InsertInArray(тSEARCH, pp, False);
   --else -- такого при загрузке не должно быть, значит ошибка
   fi;
 fi;
end;

Func Протокол_дат_ДПУ_ДВЭ_СчитатьФайл(aPathFile:String) :Logical;
var SrcStr, wrd, val1, val2, val3, val4, val5, val6, val7, val8, val9, val0 :String;
var aFile, ii :Integer;
 ОчиститьОстатки;
 ОчиститьВспомМассив;
 ii=0;
 ShowProgress(0, "Считывание файла выгрузки дат...");
 aFile=TextFileOpenRead(aPathFile);
 Try
   Try
     val1=""; val2=""; val3=""; val4=""; val5=""; val6=""; val7=""; val8=""; val9=""; val0="";
     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)); -- дата принятия к учету
       |  wrd="@@8": val8=Trim(SubStr(SrcStr, 4, 255)); -- дата ввода в эксплуатацию
       |  wrd="@@9": val9=Trim(SubStr(SrcStr, 4, 255)); -- сумма
       |  wrd="@@0": val0=Trim(SubStr(SrcStr, 4, 255)); -- количество
       |  wrd="@@#": Загрузка_ДобавитьДанные(val1, val2, val3, val4, val5, val6, val7, val8, val9, val0); val1=""; val2=""; val3=""; val4=""; val5=""; val6=""; val7=""; val8=""; val9=""; val0="";
       fi;
     end; --while
   Except
     TextFileClose(aFile);
     ^False;
   end;
 Finally
   TextFileClose(aFile);
   CloseProgress;
 end;
 ii=LengthOfArray(тUNQELM);
 if ii>0 and ii=LengthOfArray(тDATДПУ) and ii=LengthOfArray(тDATДВЭ): ^True; else ^False; fi;
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 ДатыОстатков_Импорт;
var  FileKBK, FileDAT, КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, ДОПАНА, АНАДОП, refStrМОЛ, refStrМХЭ, refStrДОП, refStrНФА, ANA, Value :String;
var RO, num, ii, xx, yy, aa, bb, OA, len, jj, rr, pp, zz :Integer;
var ddpuCRD, ddveCRD, ddpuSAV, ddveSAV, ddWorks :Date;
var fOkKBK, fOkDAT, Work, First :Logical;
var BAL, KOL :Numeric;
 if ChooseFile(FileKBK, "Укажите стандартную таблицу конвертации КБК счетов", "Табл_Конв_Сч(1).txt|*.txt")=cmCancel: Exit; fi;
 if ChooseFile(FileDAT, "Укажите файл выгрузки дат принятия к учету, ввода в эксплуатацию", "Протокол_дат_ДПУ_ДВЭ_*.prtkl|*.prtkl")=cmCancel: Exit; fi;
 fOkKBK=if(ExistFile(FileKBK), True, False);
 fOkDAT=if(ExistFile(FileDAT), True, False);
 if fOkKBK and fOkDAT:
   fOkKBK=ЗагрузкаКБКконвертации(FileKBK);
   fOkDAT=Протокол_дат_ДПУ_ДВЭ_СчитатьФайл(FileDAT);
 fi;
 if fOkKBK and fOkDAT:
   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;
         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;
           if Work:
             КОДМОЛ=GetFieldS(RO, ii, "МОЛ");
             КОДМХЭ=GetFieldS(RO, ii, "М");
             if Монопольно(RO, ii, GetRecordKey(RO, ii)):
               OA=OpenArray(RO, ii, "ПОЗИЦИИОС", "", "");
               len=Records(OA);
               if len>0:
                 КОДСЧТ=""; КОДНФА=""; КОДУЧН=""; ДОПАНА=""; refStrНФА=""; refStrМОЛ=""; refStrМХЭ=""; refStrДОП="";
                 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;
                   ddpuCRD=GetFieldD(OA, jj, "ДУЧЕТ");
                   ddveCRD=GetFieldD(OA, jj, "ДЭКСПЛ");
                   BAL=GetFieldN(OA, jj, "СУМНФА");
                   KOL=GetFieldN(OA, jj, "КОЛНФА");
                   if BAL>0.00 and KOL>0.00  and
                      Match(КОДНФА, "НФА.*") and 
                      Match(КОДУЧН, "УЧН.*") and 
                      Match(КОДМОЛ, "МОЛ.*") and
                      Match(КОДМХЭ, "М.*")   and
                      (Match(КОДСЧТ, "*.?.101.??.???") or Match(КОДСЧТ, "*.?.102.??.???")):
                     КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
                     -- Формирование ссылок на аналитику
                     rr=SearchInArray(arr_КОДНФА, КОДНФА, True, 1); if rr>0: refStrНФА=arr_REFНФА[rr]; fi;
                     rr=SearchInArray(arr_КОДПРЧ, КОДМОЛ, True, 1); if rr>0: refStrМОЛ=arr_REFПРЧ[rr]; fi;
                     rr=SearchInArray(arr_КОДПРЧ, КОДМХЭ, True, 1); if rr>0: refStrМХЭ=arr_REFПРЧ[rr]; fi;
                     rr=SearchInArray(arr_КОДПРЧ, ДОПАНА, True, 1); if rr>0: refStrДОП=arr_REFПРЧ[rr]; fi;
                     if refStrНФА<>"" and refStrМОЛ<>"" and refStrМХЭ<>"" and refStrДОП<>"":
                       ANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
                       pp=SearchInArray(тUNQELM, ANA, True, 1);
                       if pp>0:
                         тSEARCH[pp]=True;
                         if Round(BAL, 2)=Round(тОСТСУМ[pp], 2):
                           if Round(KOL, 4)=Round(тОСТКОЛ[pp], 4):
                             ddpuSAV=1.1.100; ddveSAV=1.1.100; ddWorks=1.1.100;
                             if тDATДПУ[pp]<>ddpuCRD and тDATДПУ[pp]>ValidDate: ddpuSAV=тDATДПУ[pp]; fi;
                             if тDATДВЭ[pp]<>ddveCRD and тDATДВЭ[pp]>ValidDate: ddveSAV=тDATДВЭ[pp]; fi;
                             if     ddveSAV>ValidDate and not ddpuSAV>ValidDate : ddWorks=ddveSAV;
                             |  not ddveSAV>ValidDate and     ddpuSAV>ValidDate : ddWorks=ddpuSAV;
                             |      ddveSAV>ValidDate and     ddpuSAV>ValidDate : ddWorks=ddveSAV;
                             else ddWorks=1.1.100;
                             fi;
                             if ddpuSAV>ValidDate: zz=PutFieldD(OA, jj, "ДУЧЕТ",  ddpuSAV); fi;
                             if ddveSAV>ValidDate: zz=PutFieldD(OA, jj, "ДЭКСПЛ", ddveSAV); fi;
                             if ddWorks>ValidDate:
                               Value="ГГ."+Str(Year(ddWorks))+" ММДД."+Format("%.2d", Mon(ddWorks))+"."+Format("%.2d", Day(ddWorks));
                               zz=PutFieldS(OA, jj, "ДЭКСПЛММДДГГ", Value);
                             fi;
                             aa=aa+1;
                             aAna[aa]="";
                             aa=aa+1;
                             aAna[aa]=RecordToString(GetRecordKey(RO, ii))+"@"+RecordToString(GetRecordKey(OA, jj))+". Элемент "+КОДМОЛ+"#"+КОДМХЭ+"#"+АНАДОП+"#"+КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН;
                             aa=aa+1;
                             aAna[aa]=RecordToString(GetRecordKey(RO, ii))+"@"+RecordToString(GetRecordKey(OA, jj))+". Дата принятия к учету была "+DateToString(ddpuCRD)+". Дата принятия к учету стала "+DateToString(ddpuSAV)+".";
                             aa=aa+1;
                             aAna[aa]=RecordToString(GetRecordKey(RO, ii))+"@"+RecordToString(GetRecordKey(OA, jj))+". Дата ввода в эксплуатацию была "+DateToString(ddveCRD)+". Дата ввода в эксплуатацию стала "+DateToString(ddveSAV)+".";
                           else
                             bb=bb+1;
                             Buf[bb]="Элемент "+КОДМОЛ+"#"+КОДМХЭ+"#"+АНАДОП+"#"+КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН+" количество "+Str(KOL, 6)+" <> количеству выгрузки "+Str(тОСТКОЛ[pp], 6)+")";
                           fi;
                         else
                           bb=bb+1;
                           Buf[bb]="Элемент "+КОДМОЛ+"#"+КОДМХЭ+"#"+АНАДОП+"#"+КОДСЧТ+"#"+КОДНФА+"#"+КОДУЧН+" сумма "+Str(BAL, 2)+" <> сумме выгрузки "+Str(тОСТСУМ[pp], 2)+")";
                         fi;
                       fi;
                     fi; --if refStrНФА<>"" and refStrМОЛ<>"" and refStrМХЭ<>"" and refStrДОП<>""
                   fi; --if BAL>0.00 and KOL>0.00...
                 od; --OA
               fi; --len>0:
               CloseWorkArea(OA);
             fi; -- if Монопольно
           fi; --if ДОК<ДОР:
           if xx=500: --записываем очередную порцию записей
             EndChanging(RO);
             yy=yy+xx;
             xx=0;
           fi;
         od; --RO
         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; --if fOkKBK and fOkDAT:
 xx=0;
 num=LengthOfArray(Buf)+LengthOfArray(aAna)+LengthOfArray(тUNQELM)+2;
 if num>0:
   ShowProgress(num, "Запись протокола...");
   ANA=PlanVar("WRK")+"\Протокол_записи_дат_ДПУ_ДВЭ.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, "Протокол загрузки и записи дат принятия к учету, ввода в эксплуатацию");
       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, "КОНТРОЛЬ ВЫГРУЗКИ");
       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 Test_Удалить_ДПУ_ДВЭ;
var RO, OA, num, ii, len, jj, zz, xx, yy :Integer;
var First :Logical;
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 ShowProgress(0, "Работаем...");
 Try
   num=Records(RO);
   if num>0:
     ShowProgress(num, "Удаление ДПУ ДВЭ...");
     First=False;
     BeginChanging(RO);
     First=True;
     Try
       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;
         if Монопольно(RO, ii, GetRecordKey(RO, ii)):
           OA=OpenArray(RO, ii, "ПОЗИЦИИОС", "", "");
           len=Records(OA);
           if len>0:
             for jj=1 to len do
               zz=PutFieldD(OA, jj, "ДУЧЕТ",  1.1.100);
               zz=PutFieldD(OA, jj, "ДЭКСПЛ", 1.1.100);
               zz=PutFieldS(OA, jj, "ДЭКСПЛММДДГГ", "");
             od; --OA
           fi; --len>0:
           CloseWorkArea(OA);
         fi; -- if Монопольно
         if xx=500: --записываем очередную порцию записей
           EndChanging(RO);
           yy=yy+xx;
           xx=0;
         fi;
       od; --RO
       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;

2-- События объектов
Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnExit" : Close;
 |  Sender="btnRead" : ЗагрузкаНФАвОстаткахПоФильтру(curРежимПоиска);
 |  Sender="btnSave" : СохранениеИзменений;
 |  Sender="btnODEx" : ДатыОстатков_Экспорт(1.1.2014);
 |  Sender="btnODIm" : ДатыОстатков_Импорт;
-- |  Sender="btnODIm" : Test_Удалить_ДПУ_ДВЭ;
 fi;
end;

Proc Флаги_onChange(Sender:String);
var New, Old :Logical;
var ОбъектИмя :Object;
var NameVar :String;
 if FindObject(Sender, ОбъектИмя):
   NameVar="flg"+SubStr(Sender, 4, Length(Sender)-3); -- вычисляем имя переменной - 3=cb_
   New = GetVariableL(NameVar); -- текущий статус;
   Old = not New;               -- предыдущий статус
   if ОтменитьИзмененияУсловийОтчета: New=Old; fi;
   PutVariableL(NameVar, New);
   ОбъектИмя.State=New;
   if New<>Old:
     if Sender="cb_ТолькоПустые" : ВнешнийВид_Флаги(New);
     |  Sender="cb_ЕслиКонецГод" :
     fi;
     ValidateОтчет;
   fi;
 fi;
end;

Proc РежимПоиска_onChange(Sender:String);
var curFlag, oldFlag :Integer;
 curFlag=curРежимПоиска; -- текущий статус
 oldFlag=oldРежимПоиска; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 curРежимПоиска=curFlag;
 if curFlag<>oldFlag: 
   oldРежимПоиска=curРежимПоиска;
   ValidateОтчет;
 fi;
end;  

Proc cb_НетВыравнСтр_OnChange(Sender: String);
 ValidateОтчет;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
 if Field="кнпS00" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS01" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS02" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS03" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS04" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS05" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS06" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS07" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS08" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпS09" : СортировкаТаблицы(Field); ^False;
 |  Field="кнпF00" : flgF00 = not flgF00; ФиксироватьТаблицу(flgF00); ^False;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="" :
 fi;
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(nmsFLD :String; Iter:Integer) :Date;  -- считываем в заданном поле дату
 if nmsFLD="tblДАТПУn": ^tblДАТПУn[Iter];
 |  nmsFLD="tblДАТВЭn": ^tblДАТВЭn[Iter];
 fi;
 ^1.1.100;
end;

Proc SetDate(nmsFLD :String; Iter:Integer; Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
 if nmsFLD="tblДАТПУn": tblДАТПУn[Iter]=Value;
 |  nmsFLD="tblДАТВЭn": tblДАТВЭn[Iter]=Value;
 fi;
end;


Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var КОДНФА, nameFLD :String;
var Iter, num, ii :Integer;
var ddCurr, ddSave :Date;
 Template.HideEditor(False);
 nameFLD=asString(Template.Field);
 Iter=asInteger(Template.Frame);
 ddSave=GetDate(nameFLD, Iter);
 ddCurr=ВыборДаты(ddSave);
 if ddCurr<>ddSave:
   ClearVariable(Buf);
   Buf[1]="Вставить дату в текущую ячейку";
   Buf[2]="Вставить дату для всех инвентарных номеров по данному коду НФА";
   num=Alternate("Выберите действие...", Buf, -1, 1, 12);
   if num=1: 
     if flgСинхрон_Даты: 
       SetDate("tblДАТПУn", Iter, ddCurr);
       SetDate("tblДАТВЭn", Iter, ddCurr);
     else 
       SetDate(nameFLD, Iter, ddCurr);
     fi;
   |  num=2:
     КОДНФА=tblКОДНФА[Iter];
     for ii=1 to Позиции do
       if tblКОДНФА[ii]=КОДНФА:  
         if flgСинхрон_Даты:
           SetDate("tblДАТПУn", ii, ddCurr);
           SetDate("tblДАТВЭn", ii, ddCurr);
         else
           SetDate(nameFLD, ii, ddCurr);
         fi;
       fi;
     od;
   fi;
 fi;
 ^"";
end;

Proc ПроверитьБРО;
var sS, pS :String;
 if not ExistFile(PlanVar("LocalData")+"\Картотеки\РПО_ОСТ_НФА_ROnly.bro"):
   sS=РАБ.БЮДЖЕТ2005.Контроль2Слэш(PlanVar("НФА")+"\Картотеки\РПО_ОСТ_НФА_ROnly.bro");
   if ExistFile(sS):
     pS=РАБ.БЮДЖЕТ2005.Контроль2Слэш(PlanVar("LocalData")+"\Картотеки");
     CopyFile(sS, pS);
   fi;
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 Очистить;
 ОчисткаОтчета;
 flgТолькоПустые=False;
 curРежимПоиска=0;
 flgF00=False;
 btnODEx.Visible=btnService;
 btnODIm.Visible=btnService;
end;

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
 ВнешнийВид_Флаги(flgТолькоПустые);
 oldРежимПоиска=curРежимПоиска;
 ValidateОтчет;
 ФиксироватьТаблицу(False);
 ПроверитьБРО;
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 Очистить;
 ОчисткаОтчета;
 ФиксироватьТаблицу(False);
end;

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