БЛАНКСШАБЛОНОМ "Корректировка учета НФА";

Func УзнатьИнструкцию :String;
var RES:String;
 Try RES=PlanVar("Учет"); Except RES=""; end;
 ^RES;
end;

var ТипУчр:String=УзнатьИнструкцию;

flgПС:Integer=if(ТипУчр="174н":3|ТипУчр="183н":4, 2);
--var flgПС:Integer=1; -- казеннное учреждение

btnДелНФА :Object; btnДелИНВ :Object; btnClose :Object; rbtFlg1 :Object; rbtFlg2 :Object; rbtFlg3 :Object;
btnАнлСЧТ :Object; btnДобСЧТ :Object; btnДаты  :Object;

скцБК_ЗАГ :Object;
скцБК_ТАБ :Object;

cb_искЛизинг :Object;
cb_искСрПути :Object;
cb_искИКазны :Object;
cb_искАссигн :Object;
cb_искПланПд :Object;
cb_искЛ_ГРБС :Object;
cb_искЛ__РБС :Object;

var btnName_menu :String='Корректировка учета НФА';
var UserDateDefault :Date=31.12.2008;
var Buf1[] :String;
var Buf2[] :String;
var Buf3[] :String;

var pfxINV  :String="УЧН";
var Buf[]   :String;
var flgWork :Integer;
var Позиции :Integer;

var NNN_БК[] :Integer=$;
var SRT_БК[] :String;
var КОД_БК[] :String;
var КОД_ЭК[] :String;
var КОД_ВД[] :String;
var ИСКЛБК[] :Logical;

var flgискЛизинг :Logical;
var flgискСрПути :Logical;
var flgискИКазны :Logical;
var flgискАссигн :Logical;
var flgискПланПд :Logical;
var flgискЛ_ГРБС :Logical;
var flgискЛ__РБС :Logical;

var BufAcc[] :String;
var BufBal[] :String;
var BufTxt[] :String;

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(Buf1);
 ClearVariable(Buf2);
 ClearVariable(Buf3);
 ClearVariable(Позиции);
 ClearVariable(NNN_БК);
 ClearVariable(SRT_БК);
 ClearVariable(КОД_БК);
 ClearVariable(КОД_ЭК);
 ClearVariable(КОД_ВД);
 ClearVariable(ИСКЛБК);
end;

Func СделатьОдинаковымиДаты :Logical;
var RO, OA, num, len, ii, jj, yy, kk, xx, zz :Integer;
var DDопер, DateDefault, dv, du :Date;
var МЭ, Strdv, Strdu :String;
var ConstНФА_ИНВ, SUM, KOL, Цена :Numeric;
var OK, Work :Logical;

 yy=EnqOkCancel("Синхронизировать пустые даты ввода в эксплуатацию^Mс датой принятия к учету (только для НФА в эксплуатации)?", mtConfirmation);
 if yy=cmCancel: ^False; fi;
 OK=False;
 ClearVariable(Buf1);
 ClearVariable(Buf2);
 ClearVariable(Buf3);
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_ОСТ_НФА", "", "");
 Try
   num=Records(RO);
   if num>0:
     -- Константы НФА
     DDопер=AddMon(UserDateDefault, 12);
     Try SUM=Com_Var("ОС_РАСХ", DDопер); Except SUM=0.00; end;
     if not SUM>0: if DDопер>=1.1.2009: SUM=3000; else SUM=1000; fi; fi;
     ConstНФА_ИНВ=SUM;
     ShowProgress(num, "Работаем...");
     Try
       kk=0; yy=0; jj=0; ii=0; zz=0;
       for jj=1 to num do
	 ProgressPos(jj);
	 if kk=0: BeginChanging(RO); fi;
	 kk=kk+1;
	 DDопер=GetFieldD(RO, jj, "ДАТОПЕР");
	 МЭ=GetFieldS(RO, jj, "М");
	 if DDопер>1.1.1900 and Match(МЭ, "М.Э.*"):
	   if DDопер>UserDateDefault: DateDefault=UserDateDefault; else DateDefault=DDопер; fi;
	   -- *** --
	   OA=OpenArray(RO, jj, "ПОЗИЦИИОС", "", "");
	   len=Records(OA);
	   if len>0:
	      for ii=1 to len do
		dv=GetFieldD(OA, ii, "ДЭКСПЛ"); if dv>1.1.1800: Strdv=DateToString(dv); else Strdv="пуст. дата"; fi;
		du=GetFieldD(OA, ii, "ДУЧЕТ");	if du>1.1.1800: Strdu=DateToString(du); else Strdu="пуст. дата"; fi;
		Work=False;
		SUM=GetFieldN(OA, ii, "СУМНФА");
		KOL=GetFieldN(OA, ii, "КОЛНФА");
		if KOL>0.00: Цена=Abs(SUM)/Abs(KOL); else Цена=0.00; fi;
		if Цена>ConstНФА_ИНВ:
		  if dv<1.1.1900 and du>1.1.1900: Work=True; dv=du;
		  |  dv>1.1.1900 and du<1.1.1900: Work=True; du=dv;
		  |  dv<1.1.1900 and du<1.1.1900: Work=True; du=DateDefault; dv=DateDefault;
		  fi;
		  if Work:
		    xx=PutFieldD(OA, ii, "ДЭКСПЛ", dv);
		    xx=PutFieldD(OA, ii, "ДУЧЕТ",  du);
		    zz=zz+1;
		    Buf1[zz]="Запись "+RecordToString(GetRecordKey(RO, jj))+". Строка таблицы N "+Str(ii)+".";
		    Buf2[zz]="Инфо записи: "+Trim(GetFieldS(OA, ii, "НФА"))+" "+Trim(GetFieldS(OA, ii, "УЧНОМ"))+" "+Trim(GetFieldS(OA, ii, "СЧНФА"))+" стоимость "+Str(SUM, 2);
		    Buf3[zz]="Дата принятия к учету: была - "+Strdu+", стала - "+DateToString(du)+". Дата ввода в эксплуатацию: была - "+Strdv+", стала - "+DateToString(dv)+". ";
		  fi;
		fi;
	      od;
	   fi;
	   CloseWorkArea(OA);
	   -- *** --
	 fi;
	 if kk=200: --записываем очередную порцию записей
	   EndChanging(RO);
	   yy=yy+kk;
	   kk=0;
	 fi;
       od;
       if kk>0: EndChanging(RO); yy=yy+kk; fi; --если последняя порцию неполная
       if jj=num: OK=True; fi;
       num=LengthOfArray(Buf1);
       if num>0: -- Buf1
	 ShowProgress(num, "Создание протокола...");
	 МЭ=PlanVar('CACHE')+"\Протокол_даты_вэкспл.txt";
	 Try
	   if ExistFile(МЭ): DeleteFile(МЭ); fi;
	   Work=False;
	   xx=TextFileCreate(МЭ);
	   Work=True;
	   TextFileWriteLn(xx, "ПРОТОКОЛ синхронизация даты ввода в эксплуатацию (только для картотеки остатков НФА)");
	   TextFileWriteLn(xx, "");
	   for ii=1 to num do
	     ProgressPos(ii);
	     TextFileWriteLn(xx, Buf1[ii]);
	     TextFileWriteLn(xx, Buf2[ii]);
	     TextFileWriteLn(xx, Buf3[ii]);
	     TextFileWriteLn(xx, "");
	   od;
	 Except
	   if Work=True:
	     TextFileClose(xx);
	     Message("Ошибка записи в файл '"+МЭ+"'!", mtError);
	   else
	     Message("Ошибка создания файла '"+МЭ+"'!", mtError);
	   fi;
	 end;
	 TextFileClose(xx);
	 OpenEditor(МЭ);
       fi;
     Except
       Message(if(yy>0, "Всего обработано "+Str(yy)+" записей из "+Str(num)+"."+Chr(13), "")+
			"Ошибка "+Str(ErrorCode)+"."+Chr(13)+
			"Дальнейшая обработка невозможна!", mtError);
       CancelChanging(RO);
       Raise;
     end;
   else
     Message("Картотека НФА [РПО_ОСТ_НФА] пустая!", mtWarning);
     ^False;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 ^OK;
end;

Proc СделатьОдинаковымиДаты_Execute;
 if СделатьОдинаковымиДаты: Message("Синхронизация завершена!", mtInformation); fi;
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;

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

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

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

Proc ПоискКБК_ВнешнийВид;
var Flag :Logical;

 Flag=if(Позиции>0, True, False);
 btnДобСЧТ.Visible = Flag;
 скцБК_ЗАГ.Visible = Flag;
 скцБК_ТАБ.Visible = Flag;
 cb_искЛизинг.Visible = Flag;
 cb_искСрПути.Visible = Flag;
 cb_искИКазны.Visible = Flag;
 cb_искАссигн.Visible = Flag;
 cb_искПланПд.Visible = Flag;
 cb_искЛ_ГРБС.Visible = Flag;
 cb_искЛ__РБС.Visible = Flag;

 if not Flag:
   flgискЛизинг = False;
   flgискСрПути = False;
   flgискИКазны = False;
   flgискАссигн = False;
   flgискПланПд = False;
   flgискЛ_ГРБС = False;
   flgискЛ__РБС = False;
 else
   flgискЛизинг = True;
   flgискСрПути = True;
   flgискИКазны = True;
   flgискАссигн = False;
   flgискПланПд = True;
   flgискЛ_ГРБС = True;
   flgискЛ__РБС = False;
 fi;

end;

Proc ПоискКБК_Начать;
var Acc, curТИП, curВФД, curКБК, curСЧ8, curЭКД, Value :String;
var RO, R1, num, jj, xx :Integer;
 Очистить;
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "NAME_VOC='СЧ' and Match(CODE, '???.??.???') and not Match(CODE, 'ЗАБ.*') and S03<>''");
 R1=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "");
 Try
   if not Records(RO)>0: Message("Ошибка!^MВозможно картотека бюджетной классификации (РПО_БЮДЖ_КЛАСС) пустая.", mtError); Exit; fi;
   Refresh(False);
   num=0;
   for Account Acc="???.????.???????.???.?.???.??.???|???.?.??.?????.??.????.?.???.??.???" do num=num+1; od;
   ShowProgress(num, "Анализ...");
   jj=0;
   for Account Acc="???.????.???????.???.?.???.??.???|???.?.??.?????.??.????.?.???.??.???", Sort do -- обязательно упорядоченно
     jj=jj+1;
     ProgressPos(jj);
     if AccIsBalance(Acc) and AccountUsed(Acc):
       curКБК=""; curВФД=""; curСЧ8=""; curТИП=""; curЭКД="";
       if Match(Acc, "???.????.???????.???.?.???.??.???")    : curТИП="1"; curКБК=SubStr(Acc, 01, 20); curВФД=SubStr(Acc, 22, 01); curСЧ8=SubStr(Acc, 24, 10);
       |  Match(Acc, "???.?.??.?????.??.????.?.???.??.???")  : curТИП="2"; curКБК=SubStr(Acc, 01, 22); curВФД=SubStr(Acc, 24, 01); curСЧ8=SubStr(Acc, 26, 10);
       fi;
       if curСЧ8<>"" and curТИП<>"":
	 num=Search(RO, 1, curСЧ8);
	 if num>0:
	   curЭКД=Trim(GetFieldS(RO, num, "S03")); -- строка КОСГУ связанных со счетом
	   if curЭКД="310" or curЭКД="410":
	     Value=curТИП+"#"+curВФД+"#"+curКБК+"#310"; 
	     if not SearchInArray(SRT_БК, Value, True, 1)>0:
	       xx=InsertInArraySort(SRT_БК, Value);
	       InsertInArray(КОД_ВД, xx, curВФД);
	       InsertInArray(КОД_БК, xx, curКБК);
	       InsertInArray(КОД_ЭК, xx, "310");
	       InsertInArray(ИСКЛБК, xx, False);
	     fi;
	   fi;
	   if curЭКД="320" or curЭКД="420":
	     Value=curТИП+"#"+curВФД+"#"+curКБК+"#320";
	     if not SearchInArray(SRT_БК, Value, True, 1)>0:
	       xx=InsertInArraySort(SRT_БК, Value);
	       InsertInArray(КОД_ВД, xx, curВФД);
	       InsertInArray(КОД_БК, xx, curКБК);
	       InsertInArray(КОД_ЭК, xx, "320");
	       InsertInArray(ИСКЛБК, xx, False);
	     fi;
	   fi;
	   if curЭКД="340" or curЭКД="440":
	     Value=curТИП+"#"+curВФД+"#"+curКБК+"#340";
	     if not SearchInArray(SRT_БК, Value, True, 1)>0:
	       xx=InsertInArraySort(SRT_БК, Value);
	       InsertInArray(КОД_ВД, xx, curВФД);
	       InsertInArray(КОД_БК, xx, curКБК);
	       InsertInArray(КОД_ЭК, xx, "340");
	       InsertInArray(ИСКЛБК, xx, False);
	     fi;
	   fi;
	 fi;
       fi;
     fi;
   od;
 Finally
   CloseWorkArea(R1);
   CloseWorkArea(RO);
   CloseProgress;
   Позиции=LengthOfArray(SRT_БК);
 end;
 ПоискКБК_ВнешнийВид;
 Template.Object="btnДобСЧТ";

end;

Func ОпределитьТипБК(vБК:String; v00:String; vВД:String) :String;
 if Match(vБК+"."+v00, "???.0000.0000000.000.000")	   : ^"КРZ";
 |  Match(vБК,	       "???.0000.0000000.000") and vВД="1" : ^"КРZ";
 |  Match(vБК,	       "???.0000.0000000.000") and vВД="3" : ^"КРZ";
 |  Match(vБК,	       "???.????.???????.???")		   : ^"КРБ";
 |  Match(vБК,	       "???.0.00.00000.00.0000")	   : ^"КДZ";
 |  Match(vБК,	       "???.?.??.?????.??.????")	   : ^"КДБ";
 |  Match(vБК,	       "???.00.00.00.00.00.0000")	   : ^"КИZ";
 |  Match(vБК,	       "???.??.??.??.??.??.????")	   : ^"КИФ";
 fi;
 ^"";
end;

Func ПолучитьКОСГУ(vЭК:String) :String;
var num :Integer;
 num=Int(vЭК);
 if num<300: ^""; fi;
 ^Str(num+100);
end;

Proc ДобавитьНужныеНФАСчета;
var FTR1, FTR2, Prefix, flgТипБК, flgПланСчт, flgКОСГУ, КОДСЧТ, ACC, Key :String;
var len, ii, RO, num, jj, kk :Integer;
var Work :Logical;
 Hint("");
 ClearTrace(True);
 Work=False;
 len=Позиции;
 if len>0: for ii=1 to len do if not ИСКЛБК[ii]: Work=True; Break; fi; od; fi;
 if not Work: 
   if len>0:
     Message("Ошибка!^MНет БК для анализа^Mвозможно все БК с флагом 'Исключить'", mtError); Template.Field="ИСКЛБК"; Template.Frame=1;
   else
     Message("Таблица 'БЮДЖЕТНАЯ КЛАССИФИКАЦИЯ' пустая^MСделайте анализ БК с КОСГУ 310, 320 и 340", mtError); Template.Object="btnАнлСЧТ";
   fi;
   Exit;
 fi;
 --
 ClearVariable(BufAcc);
 ClearVariable(BufBal);
 ClearVariable(BufTxt);
 ClearVariable(Buf);
 ShowProgress(len,"Анализ и формирование плана счетов...");
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "NAME_VOC;CODE", "1=0");
 Try
   if flgПС=1: flgПланСчт=" and Pos('КУ',S04)>0";
   |  flgПС=2: flgПланСчт=" and Pos('КУ',S04)>0";
   |  flgПС=3: flgПланСчт=" and Pos('БУ',S04)>0";
   |  flgПС=4: flgПланСчт=" and Pos('АУ',S04)>0";
   |  flgПС=5: flgПланСчт=" and Pos('ФО',S04)>0";
   |  flgПС=6: flgПланСчт=" and (Pos('ФО',S04)>0 or Pos('КУ',S04)>0)";
   else flgПланСчт="";
   fi;
   for ii=1 to len do
     ProgressPos(ii);
     if not ИСКЛБК[ii]:
       FTR1=""; FTR2="";
       Prefix=РАБ.БЮДЖЕТ2005.ТипКБКСчета(КОД_БК[ii]);
       flgТипБК=ОпределитьТипБК(КОД_БК[ii], КОД_ЭК[ii], КОД_ВД[ii]);
       flgКОСГУ=ПолучитьКОСГУ(КОД_ЭК[ii]);
       FTR1="Name_Voc='СЧ' and ((Pos('"+КОД_ВД[ii]+"',S01)>0 and Pos('"+flgТипБК+"',S01)>0) or (Pos('"+КОД_ВД[ii]+"',S02)>0 and Pos('"+flgТипБК+"',S02)>0))"+flgПланСчт;
       if flgКОСГУ="": FTR2=" and (Pos('."+КОД_ЭК[ii]+"',Code)>0 or Pos('"+КОД_ЭК[ii]+"',S03)>0 or S03='000')"; else FTR2=" and (Pos('."+КОД_ЭК[ii]+"',Code)>0 or Pos('."+flgКОСГУ+"',Code)>0 or Pos('"+КОД_ЭК[ii]+"',S03)>0 or S03='000')"; fi;
       SetFilter(RO, FTR1+FTR2);
       num=Records(RO);
       if num>0:
	 for jj=1 to num do
	   Hint("Анализ "+Str(jj)+" счета из "+Str(num));
	   КОДСЧТ=GetFieldS(RO, jj, "CODE");
	   ACC=КОД_БК[ii]+"."+КОД_ВД[ii]+"."+КОДСЧТ;
	   if Name_S(ACC)=" ":
	     Work=True;
	     if flgискЛизинг and Work: Work = not РАБ.БЮДЖЕТ2005.MatchMask(КОДСЧТ, "101.4?.*|104.4?.*|105.4?.*|106.4?.*|107.4?.*"); fi;
	     if flgискСрПути and Work: Work = not РАБ.БЮДЖЕТ2005.MatchMask(КОДСЧТ, "107.*|201.13.*|201.23.*|202.12.*|202.22.*|202.32.*|203.20.*|501.?6.*|503.?6.*"); fi;
	     if flgискИКазны and Work: Work = not РАБ.БЮДЖЕТ2005.MatchMask(КОДСЧТ, "104.5?.*|108.*"); fi;
	     if flgискАссигн and Work: Work = not РАБ.БЮДЖЕТ2005.MatchMask(КОДСЧТ, "503.*"); fi;
	     if flgискПланПд and Work: if Match(КОДСЧТ, "50?.*"): Work = РАБ.БЮДЖЕТ2005.MatchMask(КОДСЧТ, "50?.1?.*"); fi; fi;
	     if flgискЛ_ГРБС and Work and not (flgПС=5 or flgПС=6): Work = not РАБ.БЮДЖЕТ2005.MatchMask(КОДСЧТ, "501.?1.*|503.?1.*"); fi;
	     if flgискЛ__РБС and Work: Work = not РАБ.БЮДЖЕТ2005.MatchMask(КОДСЧТ, "501.?2.*|503.?2.*|501.?4.*|503.?4.*"); fi;
	     if Work:
	       if SearchInArray(BufAcc, ACC, True, 1)=-1:
		 kk=InsertInArraySort(BufAcc, ACC);
		 InsertInArray(BufBal, kk, GetFieldS(RO, jj, "S05"));
		 InsertInArray(BufTxt, kk, GetFieldS(RO, jj, "Txt"));
	       fi;
	     fi;
	   fi;
	 od;
       fi;
     fi;
   od;
   --
   num=LengthOfArray(BufAcc);
   if num>0:
     РАБ.КСА.Начать;
     for jj=1 to num do РАБ.КСА.ДобавитьСч(BufAcc[jj], if(BufBal[jj]="!", "ЗАБ", "БАЛ"), True); od;
     РАБ.КСА.Закончить(False);
     ClearVariable(BufAcc);
     ClearVariable(BufBal);
     ClearVariable(BufTxt);
     ClearVariable(Buf);
     Message("Добавление счетов завершено", mtWarning);
   else
     Message("Счетов для добавления не найдено", mtWarning);
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 Hint("");
end;

Proc УдалитьНеиспользуемыеПризнакиНФА_Execute;
var начало :Integer;
 начало=Time;
 if УдалитьНеиспользуемыеПризнакиНФА:
    Message("Работа завершена!^MВремя работы - "+TimeToHMSstring(Time-начало), mtInformation);
 fi;
end;

Proc УдалитьНеиспользуемыеКарточкиИНВ_Execute;
var начало :Integer;
 начало=Time;
 if УдалитьНеиспользуемыеКарточкиИНВ:
    Message("Работа завершена!^MВремя работы - "+TimeToHMSstring(Time-начало), mtInformation);
 fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
 if Field="ИСКЛБК"  : ИСКЛБК[Iter] = not ИСКЛБК[Iter]; ^False;
 fi;
 ^True;
end;

2-- События объектов
Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnДелНФА" : УдалитьНеиспользуемыеПризнакиНФА_Execute;
 |  Sender="btnДелИНВ" : УдалитьНеиспользуемыеКарточкиИНВ_Execute;
 |  Sender="btnДаты"   : СделатьОдинаковымиДаты_Execute;
 |  Sender="btnClose"  : Close;
 |  Sender="btnАнлСЧТ" : ПоискКБК_Начать;
 |  Sender="btnДобСЧТ" : ДобавитьНужныеНФАСчета;
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 Очистить;
 flgWork=3;
 ПоискКБК_ВнешнийВид;
end;

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

КОНЕЦ
