БЛАНКСШАБЛОНОМ [07.11.2005] "Ведомость начисленной амортизации", РЕДАКТОР РПО_НАЧ_АМОРТ;
-- ЗАО "Агентство "Русспромоценка"
2-- Переменные и массивы бланка
var BTNNAME_MENU:s='Журнал начислений амортизации на НФА';
var SORT_MENU:s='05';

var БылРасчитанСписокПолейКартотеки:l;
var СписокПолейКартотеки[]:s;
var БылРасчитанСписокОКОФ:l;
var БылОбновленСписокОКОФ:l;
var СписокОКОФ[]:s;
var СписокАмГр[]:i;
var СписокАмГр02[]:i;
var СписокАмГр09[]:i;
var СписокГрПр[]:s;-- список групп для переоценки
var ДатаПоследнегоИзменения_РПО_НФА:d;-- для пересчета СписокОКОФ
var ВремяМодификацииСек_РПО_НФА:i;
var CopyClosedModFob:l=ClosedModFob;
var ИМЯКРТ:s='РПО_НАЧ_АМОРТ';
Var SQLver:l;	 -- расчитывается при открытии бланка (шаблонпослеоткрытия)
Var АМОМЕС_[]=if(pos('ЗАБ.',ПОЗИЦИИ[$].СЧДЕБ)=1,0,ПОЗИЦИИ[$].АМОМЕС);
Var АмоВсе_[]=if(pos('ЗАБ.',ПОЗИЦИИ[$].СЧДЕБ)=1,0,ПОЗИЦИИ[$].АмоВсе);
КОНВ_162:l;
Var КОНВ_162_БЫЛ_РАСЧЕТ:l=КОНВ=162;
ФлCopyClosedModFob:object;
var установили_блокировку:l;
2func UpdateTimeSecCurrent:i;^UpdateTimeSec;end;-- функция обязательная для работы с SQL запросами

func РазрешеноРедактирование:l;
 if (ClosedModFob or Проводить):
    if Проводить:Beep(16);Сообщение('Операция проведена!'+chr(13)+'Для редактирования записи снимите флажок ПРОВОДИТЬ ОПЕРАЦИЮ.',mtWarning);
     | ClosedModFob:EditorCancel;Beep(16);Сообщение('Операция заблокирована!'+chr(13)+'Для редактирования записи снимите флажок БЛОКИРОВКА.',mtWarning);
    fi;
   ^false;
 fi;
 ^true;
end;
func Заблокирована:l;
 if ClosedModFob:EditorCancel;Beep(16);Сообщение('Операция заблокирована!'+chr(13)+'Для редактирования записи снимите флажок БЛОКИРОВКА.',mtWarning);
   ^true;
 fi;
 ^false;
end;


func ПолныхМесяцев(dd1:d;dd2:d):i;-- результат= сколько раз между датами поменялся месяц
  var yy,mm1,mm2:i;
  var d1,d2:d;
  if dd1<dd2:d1=dd1;d2=dd2;
   | true:d2=dd1;d1=dd2;
  fi;
  mm1=год(d1)*12+мес(d1);
  mm2=год(d2)*12+мес(d2);
  ^mm2-mm1;
end;

Proc ЗаполнитьСписокАмГр_ГрПр;
 var wa,rs,i,j,k,p:i;
 var ss,okof:s;
 k=ДлинаМассива(СписокОКОФ);
 j=0;
 okof='';
 While k>j do
   While k>j do
    j=j+1;ss=okof+' '+СписокОКОФ[j];
    if Длина(ss)>233:j=j-1;break;
     | true:okof=ss;
    fi;
   od;
   wa=OpenWorkArea('РПО_ОКОФ','КОД_ОКОФ','pos(КОД_ОКОФ,"'+okof+'")>0');   --
     rs=Records(wa);
     for i=1..rs do
      ss=Trim(GetFieldS(wa,i,'КОД_ОКОФ'));
      p=ПоискВмассиве(СписокОКОФ,ss,true);
      if p>0:СписокАмГр[p]  =int(GetFieldS(wa,i,'АМОРТ_ГР'));
	     СписокАмГр02[p]=int(GetFieldS(wa,i,'АМОРТ_ГР02'));
	     СписокАмГр09[p]=int(GetFieldS(wa,i,'АМОРТ_ГР09'));
	     СписокГрПр[p]  =GetFieldS(wa,i,'ГР_ПЕРЕОЦЕНКИ');
      fi;
     od;
   CloseWorkArea(wa);
   okof='';
 od;
end;

Proc ЗаполнитьСписокОКОФ;
 var wa,rs,i:i;
 var ss:s;
 if БылОбновленСписокОКОФ:exit;fi;
 if не БылРасчитанСписокОКОФ:БылРасчитанСписокОКОФ=true;
   ClearVariable(СписокОКОФ);
   ClearVariable(СписокАмГр);
   ClearVariable(СписокАмГр02);
   ClearVariable(СписокАмГр09);
   ClearVariable(СписокГрПр);
   ClearVariable(ДатаПоследнегоИзменения_РПО_НФА);
   ClearVariable(ВремяМодификацииСек_РПО_НФА);
 fi;
 if ДатаПоследнегоИзменения_РПО_НФА<1.1.2000:ДатаПоследнегоИзменения_РПО_НФА=1.1.2000;fi;
 ss=DateToString(ДатаПоследнегоИзменения_РПО_НФА);
 wa=OpenWorkArea('РПО_НФА','ОКОФ','length(ОКОФ)>8 and UpdateTime>='+ss+' and UpdateTimeSec>'+str(ВремяМодификацииСек_РПО_НФА));   -- sql вариант= LEN([ОКОФ])>8 and Convert(VarChar,[UpdateTime],108)>'00:01:40'
   rs=Records(wa);
   for i=1..rs do ДобавитьВмассив(СписокОКОФ,true,false,Trim(GetFieldS(wa,i,'ОКОФ')));od;
 CloseWorkArea(wa);
 ВремяМодификацииСек_РПО_НФА=Время;
 ДатаПоследнегоИзменения_РПО_НФА=Сегодня;
 if rs>0:ЗаполнитьСписокАмГр_ГрПр;fi;
 БылОбновленСписокОКОФ=true;
end;
Func ВзятьНомерПоОКОФ(КдОКОФ:s):i;
  ЗаполнитьСписокОКОФ;
  ^ПоискВмассиве(СписокОКОФ,Trim(КдОКОФ),true);
end;
Func ВзятьГРПРПоОКОФ(КдОКОФ:s):s;
  if соотв(КдОКОФ,'11.*') or соотв(КдОКОФ,'12.*') or соотв(КдОКОФ,'13.*'):^'ЗДАНИЯ';fi;
  ЗаполнитьСписокОКОФ;
  ^СписокГрПр[ПоискВмассиве(СписокОКОФ,Trim(КдОКОФ),true)];
end;

СекцОбщ1	 :Object;
СекцОбщ2	 :Object;
СекцОтчЗ	 :Object;
СекцОтчТ	 :Object;
СекцОтчИ	 :Object;
СекцОбщ3	 :Object;
cbПроводить	 :Object;
--cbClosedModFob   :Object;
btnРасчет	 :Object;
btnДопАна	 :Object;
var РЕКВН:s=РЕКВ;
var fПровЭкспл	 :Logical=False;
var Flag_onEnter :Logical;
var NewREC	 :Logical=(CurrentState=crdusInserted);
var SelfCRD	 :String="РПО_НАЧ_АМОРТ";
var кнОК	 :String="ОК";
var кнЗкр	 :String="Закрыть";
var ДатОтчСлед	 :Date=Dat(1, ОтчМес,ОтчГод); -- дата следующего отчетного периода: дата проводок - конец отчетного периода
--var ДатОтчСлед   :Date=if(ОтчМес=12, Dat(1, 1, ОтчГод+1), Dat(1, ОтчМес+1, ОтчГод)); -- дата следующего отчетного периода: дата проводок - конец отчетного периода
var ОтчМесСтр	 :String=Месяц(ОтчМес); -- название месяца
var ОтчГодOld	 :Integer;
var ПризнД_	 :String=ПризнД;
var RR		 :String="&";
var Пользов	 :String;
--var УслПД_106_   :String="ВД.ПД*|ВД.2*";
var УслПД_106	 :String=["ВД.ПД*|ВД.2*"];
var УслПД_106_0  :S=РАБ.НФА.INI_SETUP.УслПД_106_0;
--var КнУслПД_106  :String='';
--var УслСПР_	   :String="МОЛ|М|ВД|РБС|ПГР|КТ";
var УслСПР	 :String=["МОЛ|М|ВД|РБС|ПГР|КТ"];
var УслСПР_0	 :S=РАБ.НФА.INI_SETUP.УслСПР_0;
--var КнУслСПР	   :String='';
--var УслНетАморт_ :String="";
var УслНетАморт  :String=[""];
var УслНетАморт_0:S=РАБ.НФА.INI_SETUP.УслНетАморт_0;
--var КнУслНетАморт:String='';
БланкКОД:String;
var Вид_П	 :Integer=[0];
var Вид_П1	 :Integer=[0];
-- Вспомогательные массивы
var Buf[]	 :String;
-- Таблица --
var NN[]	 :String=Str($);
var ИМЯ[]	 :String=РАБ.УПП.LIB.FormatAna	 (Позиции[$].НФА, Вид_П, "наименования нет", "-");
var НомерИНВ[]	 :String=РАБ.УПП.LIB.FormatInvAna(Позиции[$].НФА,Позиции[$].ИНВНОМ, Вид_П1, "б/н", chr(13));
--var НомерИНВ[]   :String=if(Позиции[$].ИНВНОМ="", "б/н", SubStr(Позиции[$].ИНВНОМ, 5, 255));
var СтоОст[]	 :Numeric=Позиции[$].СтоБал-Позиции[$].АмоВсе; -- Остаточная стоимость
var гр6  :Numeric=SumOfArray(АмоМес_,Позиции);
var гр7  :Numeric=SumOfArray(АмоВсе_,Позиции);
--var гр7  :Numeric=SumOfArray(Позиции[].АмоВсе);
--
var ИменаСекций[]:String;
var BufField[]	 :String;
var st[]    :String;
var st1[]   :String;
var BufColorBg[] :Integer;
var BufColorFo[] :Integer;

--var ФильтрОС[]   :String;
--var Аморт_СЧ8[]  :String;
var НФА_СЧ26[]	 :String;
var СписокИНВ[]  :String;
var СписокНФА[]  :String;
var aНФА_ИМЯ[]	 :String;
var aНФА_ИНВ[]	 :String;
var aНОРМА[]	 :Numeric;
var aКОЛ[]	 :Numeric;
var aСТОБАЛ[]	 :Numeric;
var aАМОМЕС[]	 :Numeric;
var aАМОВСЕ[]	 :Numeric;
var aЭКСПЛ[]	 :Logical;
var aПРИЗН[]	 :String;
var aСЧДЕБ[]	 :String;
var aСЧКРЕ[]	 :String;

2-- Общие процедуры и функции
--func СохранитьНастройкиСправочников(ВидНастроек:s;Значение:s):l;
-- var i,j:i;
-- var ll:l;
-- var ss1,ss2,Файл:s;
--  ClearVariable(st );
--  ClearVariable(st1);
--  ВидНастроек=up(ВидНастроек);
--  if ВидНастроек=up('УслПД_106') or ВидНастроек=up('УслСПР'):
--     ss1=trim(ПеремПБ('БУХ'));
--     if ss1='.' or ss1='':Файл='НастройкиНФА.cfg';
--	| true:Файл=ss1+'\НастройкиНФА.cfg';
--     fi;
--     if ЕстьФайл(Файл):
--	 ll=РАБ.НФА.B03._Загрузить_СтрМассив_ИзФайла.(БланкКОД+'.st',БланкКОД+'.st1',1,Файл);
--	 if not ll:^ll;fi;
--	 j=ДлинаМассива(st);
--	 if j>0:
--	   ll=false;
--	   for i=1..j do
--	    if pos(ВидНастроек,st[i])=1:-- нашли нашу настройку
--	       st[i]=ВидНастроек;st1[i]=trim(Значение);
--	       ll=true;
--	    fi;
--	   od;
--	   if not ll:-- добавляем настройку в массив
--	    j=j+1;st[j]=ВидНастроек;st1[j]=trim(Значение);
--	   fi;
--	  | true:st[1]=ВидНастроек;st1[1]=trim(Значение);
--	 fi;
--	| true:st[1]=ВидНастроек;st1[1]=trim(Значение);
--     fi;
--   | true:^false;
--  fi;
--  ^РАБ.НФА.B03._Выгрузить_СтрМассив_Вфайл.(БланкКОД+'.st',БланкКОД+'.st1',1,ДлинаМассива(st),Файл,false);
--end;
func СчитатьНастройкиСправочников(ВидНастроек:s):s;
 var i,j:i;
 var ll:l;
 var ss1,ss2,Файл:s;
  ClearVariable(st );
  ClearVariable(st1);
  ВидНастроек=up(ВидНастроек);
  if ВидНастроек=up('УслПД_106') or ВидНастроек=up('УслСПР'):
     ss1=trim(ПеремПБ('БУХ'));
     if ss1='.' or ss1='':Файл='НастройкиНФА.cfg';
      | true:Файл=ss1+'\НастройкиНФА.cfg';
     fi;
     if ЕстьФайл(Файл):
       ll=РАБ.НФА.B03._Загрузить_СтрМассив_ИзФайла.(БланкКОД+'.st',БланкКОД+'.st1',1,Файл);
       if not ll:^'';fi;
       j=ДлинаМассива(st);
       for i=1..j do
	if pos(ВидНастроек,st[i])=1:-- нашли нашу настройку
	   ss1=SubStr(st[i],Длина(ВидНастроек)+1,256)+st1[i];
	   ^ss1;
	fi;
       od;
     fi;
  fi;
  ^'';
end;

Func Объединить(Value1:String; Value2:String; Sep:String) :String;
var Ret :String;
 if Value1<>"" and Value2<>"": Ret=Value1+Sep+Value2;
 |  Value1= "" and Value2<>"": Ret=Value2;
 |  Value1<>"" and Value2="" : Ret=Value1;
 |  True: Ret="";
 fi;
 ^Ret;
end;
var BufSPR[]:s;
Func ОбъединитьНаборПризнаков(Set1:String; Sep1:String; Set2:String; Sep2:String; SepOut:String) :String;
var tmp,tmpSPR, out :String;
var num, i ,ii,kk:Integer;
 ClearVariable(Buf);
 ClearVariable(BufSPR);
 out="";
 num=WordsCount(Set2, Sep2);
 if num>0: 
  for i=1 to num do 
    tmp=trim(ExtractWord(i, Set2, Sep2));
    tmpSPR=ВыделитьСлово(1,tmp,'.');
    ii=SearchInArray(BufSPR,tmpSPR,True);
    if ii<1: -- такого справочника еще нет можно добавить
      ii=ВставитьВмассивСорт(BufSPR,tmpSPR);
      ВставитьВмассив(Buf,ii,tmp);
    fi;
--	if SearchInArray(Buf, tmp, True, 1)=-1:
--	  InsertInArraySort(Buf, tmp);
--	fi;
  od; 
 fi;

 num=WordsCount(Set1, Sep1);
 if num>0: 
  for i=1 to num do 
    tmp=trim(ExtractWord(i, Set1, Sep1));
    tmpSPR=ВыделитьСлово(1,tmp,'.');
    ii=SearchInArray(BufSPR,tmpSPR,True);
    if ii<1: -- такого справочника еще нет можно добавить
      ii=ВставитьВмассивСорт(BufSPR,tmpSPR);
      ВставитьВмассив(Buf,ii,tmp);
    fi;
--	if SearchInArray(Buf, tmp, True, 1)=-1:
--	  InsertInArraySort(Buf, tmp);
--	fi;
  od; 
 fi;

-- if num>0:
--   for i=1 to num do
--    tmp=ExtractWord(i, Set2, Sep2); if SearchInArray(Buf, tmp, True, 1)=-1: InsertInArraySort(Buf, tmp); fi;
--   od;
-- fi;
 num=LengthOfArray(Buf);
 if num>0: for i=1 to num do out=Объединить(out, Buf[i], SepOut); od; fi;
 ^out;
end;

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

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

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

Proc ОчиститьТаблицу;
-- ClearVariable(ФильтрОС  );
-- ClearVariable(Аморт_СЧ8 );
 ClearVariable(НФА_СЧ26  );
 ClearVariable(СписокИНВ );
 ClearVariable(СписокНФА );
 ClearVariable(aНФА_ИМЯ  );
 ClearVariable(aНФА_ИНВ  );
 ClearVariable(aНОРМА	 );
 ClearVariable(aКОЛ	 );
 ClearVariable(aСТОБАЛ	 );
 ClearVariable(aАМОМЕС	 );
 ClearVariable(aАМОВСЕ	 );
 ClearVariable(aЭКСПЛ	 );
 ClearVariable(aПРИЗН	 );
 ClearVariable(aСЧДЕБ	 );
 ClearVariable(aСЧКРЕ	 );
end;

Proc ОчиститьПОЗИЦИИ_поле_tr;
var t:i;
  for t=1..ПОЗИЦИИ do
    ПОЗИЦИИ[t].tr=nil;
  od;
end;
Proc Очистить;
var q,wa :Integer;
 ClearVariable(NN); ClearVariable(Buf); ClearVariable(ИМЯ); ClearVariable(НомерИНВ); ClearVariable(СтоОст);
 ОчиститьТаблицу;
end;
Proc ОчиститьПОЗИЦИИtr;
var wa :Integer;
 ОчиститьПОЗИЦИИ_поле_tr;
 editorapply;
 wa=OpenWorkArea('РПО_НАЧ_АМОРТ_TR','','ВЕДОМОСТЬ='+RecordToString(Current)+' or ПЕРИОД="'+ПЕРИОД+'"');
   beginchanging(wa);
   deleteallrecords(wa);
   endchanging(wa);
 CloseWorkArea(wa);
end;

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

Func ВыборВидаТаблицы(State:Integer) :Integer;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="код + наименование";
 Buf[2]="только код";
 Buf[3]="только наименование";
 Buf[4]="наименование + код";
 nn=Alternate("Выберите способ отображения аналитики", Buf, -1, State+1, 12);
 if nn=0: ^State; fi;
 ^(nn-1);
end;

2-- Процедуры и функции для расчета амортизации

Proc СформироватьВедомость;
var Iter, i, len :Integer;
 len=LengthOfArray(aНФА_ИМЯ);
 if len=0:
   Message("За данный период не обнаружены НФА,^Mна которые необходимо начислять амортизацию!", mtWarning);
   Template.Field="ОтчМесСтр";
   Exit;
 fi;
 for i=1 to len do
   Iter=InsertFrame(Позиции, i);
   Позиции[Iter].НФА	= aНФА_ИМЯ[i] ;
   Позиции[Iter].ИНВНОМ = aНФА_ИНВ[i] ;
   Позиции[Iter].НОРМА	= aНОРМА[i]   ;
   Позиции[Iter].КОЛ	= aКОЛ[i]     ;
   Позиции[Iter].СТОБАЛ = aСТОБАЛ[i]  ;
   Позиции[Iter].АМОМЕС = aАМОМЕС[i]  ;
   Позиции[Iter].АМОВСЕ = aАМОВСЕ[i]  ;
   Позиции[Iter].ЭКСПЛ	= aЭКСПЛ[i]   ;
   Позиции[Iter].ПРИЗН	= aПРИЗН[i]   ;
   Позиции[Iter].СЧДЕБ	= aСЧДЕБ[i]   ;
   Позиции[Iter].СЧКРЕ	= aСЧКРЕ[i]   ;
 od;
end;

Func ВставитьСтрокуВедомостиАмортизации(aIter:Integer; пНФА_КОД:String; пНФА_ИНВ:String; пНОРМА:Numeric; пКОЛ:Numeric; пСТОбал:Numeric; пАМОмес:Numeric; пАМОнач:Numeric; МЭ:Logical; пПРИЗН:String; пСЧДЕБ:String; пСЧКРЕ:String) :Integer;
var Iter :Integer;
 Iter=aIter+1;
 aНФА_ИМЯ[Iter] = пНФА_КОД;
 aНФА_ИНВ[Iter] = пНФА_ИНВ;
 aНОРМА[Iter]	= пНОРМА;
 aКОЛ[Iter]	= пКОЛ;
 aСТОБАЛ[Iter]	= пСТОбал;
 aАМОМЕС[Iter]	= пАМОмес;
 aАМОВСЕ[Iter]	= пАМОнач+пАМОмес;
 aЭКСПЛ[Iter]	= МЭ;
 aПРИЗН[Iter]	= пПРИЗН;
 aСЧДЕБ[Iter]	= пСЧДЕБ;
 aСЧКРЕ[Iter]	= пСЧКРЕ;
 ^Iter;
end;

Func ПоследнийПризнакВПроводкахИзСправочника(УСЛсч:String; УСЛан:String; ddн:Date; ddк:Date; VOC:String) :String;
var x, p ,ii,ii1:Integer;
var ANA, tmp ,tmp1:String;
var Res :Numeric;
 ANA=УСЛсч+"{"+УСЛан+"&"+VOC+".*}"; tmp="";
 Try Res=Saldo(ANA, 1.1.100); Except Raise; ^""; end;
 for Transaction x=ANA, ddн, ddк, Reverse do
   p=TransNumSign(x,  ""+VOC+".");
   if p>0: tmp=TransSignName(x, p); ^tmp; fi;
   p=TransNumSign(x, "+"+VOC+".");
   if p>0: tmp=TransSignName(x, p); ^SubStr(tmp, 2, 255); fi;
   p=TransNumSign(x, "-"+VOC+".");
   if p>0: tmp=TransSignName(x, p); ^SubStr(tmp, 2, 255); fi;
 od;
 ^tmp;
end;
--Func ВзятьМинимумДЭКСПЛ_ДУЧЕТ(КОДНФА:String; КОДИНВ:String):d;
--^Раб.НФА.B01.ВзятьМИН_ДУЧЕТ_ДЭКСПЛ(КОДНФА,КОДИНВ);
--var x,  i, num :Integer;
--var dd:Date;
-- i  =Раб.НФА.B01.ВзятьДЭКСПЛ(КОДНФА,КОДИНВ)-1.1.100;
-- num=Раб.НФА.B01.ВзятьДУЧЕТ (КОДНФА,КОДИНВ)-1.1.100;
-- x=min(i,num);
-- if x=0:x=max(i,num);fi;
-- dd=dd+x;
-- if dd>1.1.100:^dd;fi;
-- ^1.1.100;
--end;

Func ВзятьДатуВводвЭксплуатЖурОст(СЧ26:String; КОДНФА:String; КОДИНВ:String; ddBeg:Date; ddEnd:Date) :Date;-- берется минимальная дата ДЭКСПЛ или дата ДУЧЕТ или дата первой проводки
var x, RO, OA, i, num,pp :Integer;
var sumTurn, sumBase :Numeric;
var REC :Record;
var dd, dd1, dd2 :Date;
var ANA,ss :String;
var OK :Logical;
 REC=NIL; dd=1.1.100; OK=False;
 dd=Раб.НФА.B01.ВзятьМИН_ДУЧЕТ_ДЭКСПЛ(КОДНФА,КОДИНВ);
 if dd>1.1.100:^dd;fi;

 ANA='+'+СЧ26+"/*&~"+СЧ26+"{"+КОДНФА+"&"+КОДИНВ+"}";  -- отработать принятие к учету нового ОС и б/у, для нового - дата проводки, а для б/у?
 for Transaction x=ANA, ddBeg, ddEnd do
     if dd2=1.1.100:dd2=TransDate(x);fi;
     ss=' '+transComment(x);
     pp=pos(' ДЭКСПЛ=',ss);if pp>0:dd =СтрокуВдату(substr(ss,pp+8,10));fi;
     pp=pos(' ДУЧЕТ=',ss) ;if pp>0:dd1=СтрокуВдату(substr(ss,pp+7,10));fi;
     if dd1>1.1.100 and dd1<dd :^dd1;
      | dd >1.1.100 and dd <dd1:^dd ;
      | dd >1.1.100:^dd ;
      | dd1>1.1.100:^dd1;
     fi;
 od;
 ^dd2;
end;
Func ВзятьДатыДЭКСПЛ_ДУЧЕТ(СЧ26:String; КОДНФА:String; КОДИНВ:String; ddBeg:Date; ddEnd:Date) :s;--ДЭКСПЛ_ДУЧЕТ
var x, RO, OA, i, num,pp :Integer;
var sumTurn, sumBase :Numeric;
var REC :Record;
var dd,dd_dexpl :Date;
var ANA,ANAtr,ss,ss1,dd1, dd2 :String;
var OK :Logical;
 dd1=trim(датувстроку(Раб.НФА.B01.ВзятьДЭКСПЛ(КОДНФА,КОДИНВ)));
 if dd1='':dd1='1.1.100';fi;
 dd2=trim(датувстроку(Раб.НФА.B01.ВзятьДУЧЕТ(КОДНФА,КОДИНВ)));
 if dd2='':dd2='1.1.100';fi;
 ^dd1+'_'+dd2;
 REC=NIL; dd=1.1.100; OK=False;
 ANA='+'+СЧ26+"/00{"+КОДНФА+"&"+КОДИНВ+"}";  -- отработать принятие к учету нового ОС и б/у, для нового - дата проводки, а для б/у?
 dd=ddBeg;
 for Transaction x=ANA, ddBeg, ddEnd do
     ss=' '+transComment(x)+' ';
     if dd1='1.1.100' or dd1='':
	pp=pos(' ДЭКСПЛ=',ss);
	if pp>0:
	 ss1=substr(ss,pp+8,10);
	 dd1=ВыделитьСлово(1,ss1,' ');
	 dd_dexpl=строкувдату(dd1);
	fi;
	if dd_dexpl=1.1.100:
	   ANAtr=' '+TransSigns(x);
	   i=pos(' М.Э.',ANAtr);
	   if i<1:i=pos(' +М.Э.',ANAtr);fi;
	   if i<1:i=pos(' -М.Э.',ANAtr);fi;
	   if i>0:dd_dexpl=TransDate(x);fi;
	fi;
     fi;
     if dd2='1.1.100' or dd2='':
	pp=pos(' ДУЧЕТ=',ss);
	if pp>0:
	 ss=substr(ss,pp+7,10);
	 dd2=ВыделитьСлово(1,ss,' ');
	fi;
     fi;
     dd=TransDate(x);
 od;
 if (dd1='1.1.100' or dd1='') and dd_dexpl>1.1.100:dd1=датувстроку(dd_dexpl);fi;
 if (dd2='1.1.100' or dd2='') and dd>1.1.100:dd2=датувстроку(dd);fi;
 if dd1<>'1.1.100' and dd1<>'' and dd2<>'1.1.100' and dd2<>'':^dd1+'_'+dd2; --ДЭКСПЛ_ДУЧЕТ
 fi;
 --- нет ДЭКСПЛ или нет остатков ---
 if dd2='1.1.100'  or dd2='':-- ищем ДУЧЕТ
    ANA='+'+СЧ26+"/*&~"+СЧ26+"{"+КОДНФА+"&"+КОДИНВ+"}";  -- отработать принятие к учету нового ОС и б/у, для нового - дата проводки, а для б/у?
    for Transaction x=ANA, dd, ddEnd do
	ss=' '+transComment(x)+' ';
     if dd1='1.1.100'  or dd1='':--попутно ищем ДЭКСПЛ
	dd_dexpl=Раб.НФА.B01.ВзятьДЭКСПЛ_КМНТ(ss);
	if dd_dexpl=1.1.100:
	   ANAtr=' '+TransSigns(x);
	   i=pos(' М.Э.',ANAtr);
	   if i<1:i=pos(' +М.Э.',ANAtr);fi;
	   if i<1:i=pos(' -М.Э.',ANAtr);fi;
	   if i>0:dd_dexpl=TransDate(x);fi;
	fi;
     fi;
	dd2=датувстроку(TransDate(x));
	break;
    od;
 fi;
 if dd1='1.1.100'  or dd1='':-- ищем ДЭКСПЛ
    ANA=СЧ26+"{"+КОДНФА+"&"+КОДИНВ+"&М.Э.*}";  -- отработать принятие к учету нового ОС и б/у, для нового - дата проводки, а для б/у?
    for Transaction x=ANA, dd, ddEnd do
	ss=' '+transComment(x)+' ';
	dd1=датувстроку(Раб.НФА.B01.ВзятьДЭКСПЛ_КМНТ(ss));
	if dd1='1.1.100' or dd1='':dd1=датувстроку(TransDate(x));fi;
	break;
    od;
 fi;
 if (dd1='1.1.100' or dd1='') and dd_dexpl>1.1.100:dd1=датувстроку(dd_dexpl);fi;
 if (dd2='1.1.100' or dd2='') and dd>1.1.100:dd2=датувстроку(dd);fi;
 ^dd1+'_'+dd2;
end;

Proc НачислитьАмортизацию(НачалоСледПериода:Date; ПРОВЕРЯТЬЭКСПЛ:Logical);--НачалоСледПериода - первое число месяца
var tmpi,lenНФА, lenСЧ, RO, k, i, j, x, p,pp, y,ii1,ii,wa ,НЕТМЕСАМОРТ:Integer;
var tmp,tmp1, Путь, МаскаСЧ, СЧ5, СЧ26, СЧ26АМ, СЧ26АМДЕБ, ANA, ANAБ, ANAv, ПРИЗН, ИНВ, АНАЛИТ ,СЧ26АМДЕБ_401,СЧ26АМКРЕ104,ss:String;
var Sum, Баланс_НФА_АМ_К, Баланс_НФА_АМ_Н, НормаАморт :Numeric;
var НФАамортИ, НФАамортЭ, НФАамортХ, SumBalИ, SumBalЭ, SumBalХ, КОЛИ, КОЛЭ, КОЛХ, ЦенаИ, ЦенаЭ :Numeric;
var АмортМесИ, АмортМесЭ, АмортМесХ :Numeric;
var Режим, OK, МЭ, НАЧИСЛЯЕМ,НеНачислятьАморт :Logical;
var Отч1 :Report;
var ddEnd, dd,ddd, ddVE, ddU,ddBA :Date;
var КЛГРУПП,СрокАм:i;
var СумАмМес:n;
var postfix:s;
var rec:record;
var ТолькоНормаИзКарточкиНФА_101_08,линейно_при_дэкспл_до2007:l;
var МетодАморт_0:i;
 РАБ.НФА.B01.addacc_from_array_ini;
 МетодАморт_0=РАБ.НФА.INI_SETUP.МетодАморт_0;
 ТолькоНормаИзКарточкиНФА_101_08=РАБ.НФА.INI_SETUP.ТолькоНормаИзКарточкиНФА_101_08;
 линейно_при_дэкспл_до2007=РАБ.НФА.INI_SETUP.линейно_при_дэкспл_до2007;
 Hint("");
 Refresh(False);
 Hint("Подготовка данных...");
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 RefreshAna;
 ClearVariable(ПОЗИЦИИ);
 РедакторПрименить;
 Очистить; ОчиститьПОЗИЦИИtr;
 RO=OpenWorkArea(SelfCRD, "", "Ukey<>"+RecordToString(Current));
 Try if Records(RO)=0: ПРОВЕРЯТЬЭКСПЛ=True; fi; Finally CloseWorkArea(RO); end;
 if КОНВ_162: if конв<>162:конв=162;fi;
  | true:     if конв<>1:конв=1;fi;
 fi;
-- ФильтрОС[1]="101.01"; Аморт_СЧ8[1]='104.01.410';
-- ФильтрОС[2]="101.02"; Аморт_СЧ8[2]='104.02.410';
-- ФильтрОС[3]="101.03"; Аморт_СЧ8[3]='104.03.410';
-- ФильтрОС[4]="101.04"; Аморт_СЧ8[4]='104.04.410';
-- ФильтрОС[5]="101.05"; Аморт_СЧ8[5]='104.05.410';
-- ФильтрОС[6]="101.06"; Аморт_СЧ8[6]='104.06.410';
-- ФильтрОС[7]="101.07"; Аморт_СЧ8[7]='104.07.410';
-- ФильтрОС[8]="101.09"; Аморт_СЧ8[8]='104.08.410';
-- ФильтрОС[9]="102.01"; Аморт_СЧ8[9]='104.09.420';
 МаскаСЧ="(*.101.??.???|*.102.??.???)&???.????.???????.???.?.???.??.???";
 -- ???.????.???????.???.?.???.??.???
 -- 123456789012345678901234567890123
 Путь=PlanVar("НФА")+"\Отчеты\НФАОТЧ.lst";
 -- Создаем массив задействованных НФА
 Отч1=RepOpen(Путь+"|НФА_ИНВ_2006", "*.?.101.??.???|*.?.102.??.???|*.?.104.??.???", "НФА.*&УЧН.*", 1.1.100, НачалоСледПериода, "", "НФА");
-- Отч1=RepOpen(Путь+"|НФА_ИНВ_2006", "*.?.101.??.???|*.?.102.??.???|*.?.104.??.???", "НФА.101.04.КОММУТАТОР.CAT2970&УЧН.01380216", 1.1.100, НачалоСледПериода, "", "НФА");
-- Отч1=RepOpen(Путь+"|НФА_ИНВ_2006", "*.?.101.??.???|*.?.102.??.???|*.?.104.??.???", "НФА.*101.04.ОРГ_ТЕХН.НОУТБУК.15&УЧН.*03155", 1.1.100, НачалоСледПериода, "", "НФА");
 k=1; RepReset(Отч1);
 if Пользов='Пользователь локальной версии':
    RO=OpenWorkArea("РПО_НФА", "ПРИЗНАК");
    Try
      while RepNext(Отч1) do
	ПРИЗН=RepIdent(Отч1);
	rec=SignToRecord(ПРИЗН, False);
	if rec=nil:trace('Признак '+ПРИЗН+' отсутствует в картотеке РПО_НФА и обрабатываться не будет!');
	 | true:
	   p=ВзятьНомерЗаписи(RO,rec);
	   if p=0:trace('Признак '+ПРИЗН+' отсутствует в картотеке РПО_НФА и обрабатываться не будет!');
	    | true:
	      if not GetFieldL(RO,p,'АМОРТ0'):
		СписокНФА[k]=RepIdent(Отч1);
		k=k+1;
	      fi;
	   fi;
	fi;
      end;
    Finally
      Отч1=RepClose(Отч1);
      CloseWorkArea(RO);
    end;

  | true:RO=OpenWorkArea("РПО_НФА", "", "1=0");
    Try
      while RepNext(Отч1) do
	ПРИЗН=RepIdent(Отч1);
	rec=SignToRecord(ПРИЗН, False);
	if rec=nil:trace('Признак '+ПРИЗН+' отсутствует в картотеке РПО_НФА и обрабатываться не будет!');
	 | true:
	   tmp="UKey="+RecordToString(rec);
	   SetFilter(RO,tmp);
	   if not GetFieldL(RO,1,'АМОРТ0'):
	     СписокНФА[k]=RepIdent(Отч1);
	     k=k+1;
	   fi;
	fi;
      end;
    Finally
      Отч1=RepClose(Отч1);
      CloseWorkArea(RO);
    end;
 fi;
 -- Создаем массив задействованных счетов
 Отч1=RepOpen(Путь+"|НФА_СЧЕТА", МаскаСЧ, "НФА.*&УЧН.*", 1.1.100, НачалоСледПериода);
-- Отч1=RepOpen(Путь+"|НФА_СЧЕТА", МаскаСЧ, "НФА.101.04.210104_00*&УЧН.*", 1.1.100, НачалоСледПериода);
 RepReset(Отч1);
 Try
   while RepNext(Отч1) do
     tmp=RepIdent(Отч1);
     tmp=SubStr(tmp, 1, 30)+'???';
     k=SearchInArray(НФА_СЧ26, tmp, True);
     if k<0: k=InsertInArraySort(НФА_СЧ26, tmp); fi;
   end;
 Finally
   Отч1=RepClose(Отч1);
 end;
 Hint("");
 lenНФА=LengthOfArray(СписокНФА); lenСЧ=LengthOfArray(НФА_СЧ26);
 if not(lenНФА>0 and lenСЧ>0): Exit; fi;
 SortArray(СписокНФА);
 ShowProgress(lenСЧ, "Анализ ОС по счету...");
 if Пользов='Пользователь локальной версии':RO=OpenWorkArea("РПО_НФА", "ПРИЗНАК");
  | true:RO=OpenWorkArea("РПО_НФА", "", "1=0");
 fi;
 y=0;
 Try
   for i=1 to lenСЧ do
     ShowProgress(lenСЧ, "Анализ ОС по счету '"+НФА_СЧ26[i]+"'...");
     ProgressPos(i);
----------------------------************************Alla 
     СЧ26=НФА_СЧ26[i];
     СЧ5=SubStr(СЧ26, 24, 6);
--     k=SearchInArray(ФильтрОС, СЧ5, True);
--     if k<0: Message("Ошибка настройки счетов...", mtError); Exit; fi;
     tmp=SubStr(СЧ26, 1, 23);
     СЧ26АМ=Раб.НФА.B01.ВзятьСчетАмортПоСчетуНФА(СЧ26);
     if СЧ26АМ='': Message("Ошибка настройки счетов...", mtError); Exit; fi;
--     СЧ26АМ=tmp+Аморт_СЧ8[k];
     СЧ26АМКРЕ104=СЧ26АМ;
     СЧ26АМДЕБ=tmp+"401.20.271";
     СЧ26АМДЕБ_401=СЧ26АМДЕБ;
     for j=1 to lenНФА do
       ПРИЗН=СписокНФА[j];
       Hint("Анализ аналитического признака "+ПРИЗН+"...");
       if Length(ПРИЗН)>11: -- отсекаем признаки НФА не по правилам подсистемы
	 tmp=SubStr(ПРИЗН, 5, 6);
	 if SubStr(СЧ5, 1, 4)=SubStr(tmp, 1, 4) and SubStr(СЧ5, 6, 1)=SubStr(tmp, 6, 1): -- отсекаем НФА на счетах не соотвествующих ГРНФА
2	   СЧ26АМ=СЧ26АМКРЕ104; -- восстанавливаем значение счета на случай неначисления амортизации на предидущий НФА
	   ANA=СЧ26+if(Name_S(СЧ26АМ)<>" ", "|"+СЧ26АМ, "")+"{"+ПРИЗН+"&УЧН.*}";
	   Sum=Saldo(ANA, НачалоСледПериода);
	   if Sum>0: -- ПРИЗН по всем инвентарным номерам еще не самортизировался
	     ClearVariable(СписокИНВ);
	     ddEnd=(НачалоСледПериода);
	     for Transaction x=ANA, 1.1.100, ddEnd, Reverse do
	       НеНачислятьАморт=False;
	       ИНВ=""; k=0;
	       СЧ26АМДЕБ=СЧ26АМДЕБ_401;
	       СЧ26АМ=СЧ26АМКРЕ104;
	       p=TransNumSign(x, "УЧН.");
	       if p<1:p=TransNumSign(x, "+УЧН.");fi;
	       if p>0 : 
		 ИНВ=ВыделитьСлово(1,TransSignName(x, p),'+');
		 --ИНВ=TransSignName(x, p);
		 k=SearchInArray(СписокИНВ, ИНВ, True);
		 if k<0: InsertInArraySort(СписокИНВ, ИНВ); fi;
	       | True: k=0;
	       fi;
	       if k<0:
		 ANAБ=СЧ26+if(Name_S(СЧ26АМ)<>" ", "|"+СЧ26АМ, "")+"{"+ПРИЗН+"&"+ИНВ+"}";-- остаточная стоимость
		 ANAv=СЧ26+"{"+ПРИЗН+"&"+ИНВ+"}";	    -- балансовая стоимость
		 Баланс_НФА_АМ_К=Saldo(ANAБ, НачалоСледПериода); -- баланс ПРИЗН с инвентарным номером ИНВ на отчетную дату (остаточная стоимость)
		 if Баланс_НФА_АМ_К>0: -- ПРИЗН с инвентарным номером ИНВ еще не самортизировался
		   SumBalИ=Saldo(ANAv, НачалоСледПериода); -- стоимость ПРИЗН с инвентарным номером ИНВ
		   КОЛИ=Saldo(ANAv, НачалоСледПериода, "КОЛ"); -- количество ПРИЗН с инвентарным номером ИНВ
		   if КОЛИ>0: ЦенаИ=SumBalИ/КОЛИ; else ЦенаИ=0; fi;  -- цена
		   ddU=Раб.НФА.B01.ВзятьМИН_ДУЧЕТ_ДЭКСПЛ(ПРИЗН,ИНВ);
		   if ЦенаИ>Общ_Пер('ОС_100',ddU):
--		     if ЦенаИ>Общ_Пер('ОС_100',НачалоСледПериода):
--		       dd=AddMon(НачалоСледПериода, -1);
		     dd=НачалоСледПериода;
		     Баланс_НФА_АМ_Н=Баланс_НФА_АМ_К; -- баланс ПРИЗН с инвентарным номером ИНВ в прошлом месяце (остаточная стоимость)
--		       Баланс_НФА_АМ_Н=Saldo(ANAБ, dd); -- баланс ПРИЗН с инвентарным номером ИНВ в прошлом месяце (остаточная стоимость)
		     OK=False; sum=0;
		     if Баланс_НФА_АМ_Н=0: -- если Баланс_НФА_АМ_Н=0, значит, либо ПРИЗН с инвентарным номером ИНВ приняли к учету в этом месяце, либо это остатки
--			 if SumBalИ=Turn(СЧ26+"/00"+"{"+ПРИЗН+"&"+ИНВ+"}", dd, НачалоСледПериода):
--			   tmp=РАБ.УПП.LIB.ВзятьПериодПоДате(dd,'');
--			   sum=Abs(Turn(СЧ26АМ+"{"+ПРИЗН+"&"+ИНВ+"&"+tmp+"}", dd, НачалоСледПериода));
--			   ddVE=ВзятьДатуВводвЭксплуатЖурОст(СЧ26, ПРИЗН, ИНВ, dd, НачалоСледПериода);
--			   if sum=0 and ddVE<dd and ddVE<>1.1.100: OK=True; fi; -- необходимо доначислить амортизацию
--			 fi;
		     | Баланс_НФА_АМ_Н>0: 
		       tmp=ВзятьДатыДЭКСПЛ_ДУЧЕТ(СЧ26, ПРИЗН, ИНВ, 1.1.100, dd);
		       ddVE=stringtodate(выделитьслово(1,tmp,'_'));if ddVE>НачалоСледПериода:ddVE=1.1.100;fi;
		       ddU =stringtodate(выделитьслово(2,tmp,'_'));if ddU >НачалоСледПериода:ddU =1.1.100;fi;
--			 ddVE=ВзятьДатуВводвЭксплуатЖурОст(СЧ26, ПРИЗН, ИНВ, 1.1.100, dd);
		       if ЦенаИ>Общ_Пер('ОС_100',датопер):ok=true;fi;
		       if not ok:
			  if ddU>31.12.2010 or (ddU=1.1.100 and ddVE>31.12.2010):OK=ЦенаИ>Общ_Пер('ОС_100',датопер);--ОС>40000 (новые и б/у),принятые к учету с 2011г включительно - 157н
			   | ddU>1.1.100 and ddU<1.1.2009  and ddVE=1.1.100	:OK=ЦенаИ>Общ_Пер('ОС_100',ddU) and ЦенаИ<=Общ_Пер('ОС_100',1.1.2009);--только новые ОС от 10000 до 20000,принятые к учету до 2009г - 148н
			  fi;
		       fi;
		       if КОНВ_162:
-- Ершов 24.08.2011	    if ddU>31.12.2008 and ddU<1.1.2011:OK=OK or ЦенаИ>Общ_Пер('ОС_100',ddU) and ЦенаИ<=Общ_Пер('ОС_100',1.1.2011);fi;--При установленном флаге добавляются ОС от 20000 до 40000, (новые и б/у)принятые к учету в 2009-2010гг
			  if ddU<1.1.2011:OK=OK or (ЦенаИ>Общ_Пер('ОС_100',1.1.2009) and ЦенаИ<=Общ_Пер('ОС_100',1.1.2011)); fi;--При установленном флаге добавляются ОС от 20000 до 40000, (новые и б/у)принятые к учету в 2009-2010гг
		       fi;
--			 if ddVE>1.1.100:OK=ЦенаИ>Общ_Пер('ОС_100',датопер); --т.к. датопер>=01.01.2009 то граница 40000
--			  | true:OK=ЦенаИ>Общ_Пер('ОС_100',ddU);
--			 fi;
		     fi;
		     ddd=Раб.НФА.B01.ВзятьМИН_ДУЧЕТ_ДЭКСПЛ(ПРИЗН,ИНВ);
		     if ddd<1.1.2007:postfix='02';
		      | ddd<1.1.2009:postfix='';
--		       if ddVE<1.1.2007:postfix='02';
		      | true:postfix='09';
		     fi;
		     --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! МетодАморт_0
		     НАЧИСЛЯЕМ=False; МЭ=False;
--		       if Баланс_НФА_АМ_Н>0 or OK: НАЧИСЛЯЕМ=True; fi;
		     if OK: НАЧИСЛЯЕМ=True; fi;
		     if НАЧИСЛЯЕМ:
		       if Пользов='Пользователь локальной версии':
			  pp=ВзятьНомерЗаписи(RO,SignToRecord(ПРИЗН, False));
			| true:
			  tmp="UKey="+RecordToString(SignToRecord(ПРИЗН, False));
			  SetFilter(RO, tmp);
			  if Records(RO)<>1: Message("Ошибка обработки списка НФА...", mtError); Exit; fi;
			  pp=1;
		       fi;
		       if Name_S(СЧ26АМ)<>" ": НФАамортИ=Abs(Saldo(СЧ26АМ+"{"+ПРИЗН+"&"+ИНВ+"}", НачалоСледПериода)); else НФАамортИ=0.00; fi;
		       НормаАморт=0;
		       НЕТМЕСАМОРТ=int(Saldo("ЗАБ.НФА.НЕТМЕСАМОРТ{"+ПРИЗН+"&"+ИНВ+"}", НачалоСледПериода));
		   --	 НормаАморт=GetFieldN(RO, 1, "НОРМАМОРТ"+postfix);
		       if pos('НФА.101.08.',ПРИЗН)=1 and ТолькоНормаИзКарточкиНФА_101_08:НормаАморт=GetFieldN(RO, pp, "НОРМАМОРТ"); -- норма амортизации
			| true:
			  if ddVE=1.1.100:ddBA=ddU;
			   | ddU=1.1.100:ddBA=ddVE;
			   | ddU<=ddVE:ddBA=ddU;
			   | ddU>ddVE:ddBA=ddVE;
			  fi;
--			     ddBA=min(ddVE,ddU);
--			     if ddBA=1.1.100:ddBA=max(ddVE,ddU);fi;
			   КЛГРУПП=0;СрокАм=0;СумАмМес=0;
			   ss=GetFieldS(RO, pp ,"ОКОФ");
			   p=ВзятьНомерПоОКОФ(ss);
			   if postfix='09':-- с датой ввода в эксплуатацию с 2009 и более
			     if p>0:КЛГРУПП=СписокАмГр09[p];
				if КЛГРУПП=0:--2009 неопределен - пытаемся выбрать до 2009 г
				   postfix='';КЛГРУПП=СписокАмГр[p];
				fi;
			     fi;
			     if КЛГРУПП=10:СрокАм=int(GetFieldN(RO, pp, "СрокАм"+postfix)*12);
				if СрокАм<=(РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП-1)*12):СрокАм=РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП)*12;fi;
			      | КЛГРУПП>0	      :СрокАм=РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП)*12;
			      | true:

			      СрокАм=int(GetFieldN(RO, pp, "СрокАм"+postfix)*12);
			     fi;
			     if СрокАм>0:СрокАм=СрокАм+НЕТМЕСАМОРТ;fi;-- добавляем к сроку месеца пропущенные на консервации
			     if МетодАморт_0=1:--начисляем с коррекцией под срок
				if СрокАм>0:СрокАм=int(deb(СрокАм+1-ПолныхМесяцев(dd,ddBA)));fi;
				if СрокАм>0:СумАмМес=trunc((ЦенаИ-НФАамортИ/КОЛИ)/СрокАм,2);
				 | true: СумАмМес=ЦенаИ;
				fi;
				НормаАморт=СумАмМес*1200/ЦенаИ;
			      | true:--начисляем линейно
				НормаАморт=1200/СрокАм;
			     fi;
			    | postfix='':-- с датой ввода в эксплуатацию с 2007 по 31.12.2008
			     if p>0:КЛГРУПП=СписокАмГр[p];fi;
			     if КЛГРУПП=10:СрокАм=int(GetFieldN(RO, pp, "СрокАм"+postfix)*12);
				if СрокАм<=(РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП-1)*12):СрокАм=РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП)*12;fi;
			      | КЛГРУПП>0	      :СрокАм=РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП)*12;
			      | true:СрокАм=int(GetFieldN(RO, pp, "СрокАм"+postfix)*12);
			     fi;
			     if СрокАм>0:СрокАм=СрокАм+НЕТМЕСАМОРТ;fi;-- добавляем к сроку месеца пропущенные на консервации
			     if МетодАморт_0=1:--начисляем с коррекцией под срок
				if СрокАм>0:СрокАм=int(deb(СрокАм+1-ПолныхМесяцев(dd,ddBA)));fi;
				if СрокАм>0:СумАмМес=trunc((ЦенаИ-НФАамортИ/КОЛИ)/СрокАм,2);
				 | true: СумАмМес=ЦенаИ;
				fi;
				НормаАморт=СумАмМес*1200/ЦенаИ;
			      | true:--начисляем линейно
				НормаАморт=1200/СрокАм;
			     fi;
			    | true:-- с датой ввода в эксплуатацию до 2007
			       if линейно_при_дэкспл_до2007:НормаАморт=GetFieldN(RO, pp, "НОРМАМОРТ"+postfix);fi;
			       if НормаАморт=0:-- пытаемся вычислить норму по ОКОФ

				  if p>0:КЛГРУПП=СписокАмГр02[p];fi;
				  if КЛГРУПП=10:СрокАм=int(GetFieldN(RO, pp, "СрокАм"+postfix)*12);
				     if СрокАм<=(РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП-1)*12):СрокАм=РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП)*12;fi;
				   | КЛГРУПП>0		   :СрокАм=РАБ.НФА.B01.ВзятьСрокАмортГруппы(КЛГРУПП)*12;
				   | true:СрокАм=int(GetFieldN(RO, pp, "СрокАм"+postfix)*12);
				  fi;
				  if СрокАм>0:СрокАм=СрокАм+НЕТМЕСАМОРТ;fi;-- добавляем к сроку месеца пропущенные на консервации
				  if МетодАморт_0=1:--начисляем с коррекцией под срок
				     if СрокАм>0:СрокАм=int(deb(СрокАм+1-ПолныхМесяцев(dd,ddBA)));fi;
				     if СрокАм>0:СумАмМес=trunc((ЦенаИ-НФАамортИ/КОЛИ)/СрокАм,2);
				      | true: СумАмМес=ЦенаИ;
				     fi;
				     НормаАморт=СумАмМес*1200/ЦенаИ;
				   | true:--начисляем линейно
				     НормаАморт=1200/СрокАм;
				  fi;
			       fi;

			   fi;
		       fi;

		       ПРОВЕРЯТЬЭКСПЛ=False;
		       if ПРОВЕРЯТЬЭКСПЛ:
			 tmp=СЧ26+"{"+ПРИЗН+"&"+ИНВ+"&М.Э.*}";
			 SumBalЭ=Saldo(tmp, НачалоСледПериода); -- баланс НФА - эксплуатация
			 if SumBalЭ>НФАамортИ: -- забыли начислить амортизацию
			   SumBalХ=SumBalИ-SumBalЭ;		-- баланс НФА - хранение
			   КОЛЭ=Saldo(tmp, НачалоСледПериода, "КОЛ");
			   if КОЛЭ>0: ЦенаЭ=SumBalЭ/КОЛЭ; else ЦенаЭ=0; fi; -- цена
			   if ЦенаЭ>Общ_Пер('ОС_РАСХ',НачалоСледПериода) and ЦенаЭ<=Общ_Пер('ОС_100',НачалоСледПериода):
			     МЭ=True;
			     if SumBalЭ=SumBalИ:
			       НФАамортЭ=НФАамортИ;
			     else
			       НФАамортЭ=Round((НФАамортИ/КОЛИ*КОЛЭ), 2);
			     fi;
			     АмортМесЭ=SumBalЭ-НФАамортЭ;   -- месячная амортизация - эксплуатация
			     НФАамортХ=НФАамортИ-НФАамортЭ; -- начисленная амортизация - хранение
			     КОЛХ=КОЛИ-КОЛЭ; -- количество НФА на хранении
			     АмортМесХ=Round(SumBalХ/1200*НормаАморт, 2);
			     if КОЛХ>0: АмортМесХ=Round(АмортМесХ*КОЛХ, 2); fi;
			     if ((SumBalХ-НФАамортХ)<АмортМесХ) and АмортМесХ>0: АмортМесХ=(SumBalХ-НФАамортХ); fi;
			   fi;
			 fi;
		       fi; -- Проверять эксплуатацию
		       if МЭ=False:
			 АмортМесИ=Round(SumBalИ/1200*НормаАморт, 2);
			 --if КОЛИ>0: АмортМесИ=Round(АмортМесИ*КОЛИ, 2); fi;
			 if ((SumBalИ-НФАамортИ)<АмортМесИ) and АмортМесИ>0: АмортМесИ=(SumBalИ-НФАамортИ); fi;
		       fi;
		       АНАЛИТ=""; ANAБ=СЧ26+"|"+СЧ26АМ; ANAv=ПРИЗН+"&"+ИНВ;
		       ii1=КоличествоСлов(УслСПР_0,'|');
--			 СЧ26АМДЕБ=СЧ26АМДЕБ_401;
--			 СЧ26АМ=СЧ26АМКРЕ104;
		       for ii=1..ii1 do
			 tmp1=ВыделитьСлово(ii,УслСПР_0,'|');
			 tmp=ПоследнийПризнакВПроводкахИзСправочника(СЧ26, ANAv, 1.1.100, ddEnd,tmp1);
--			   tmp=ПоследнийПризнакВПроводкахИзСправочника(ANAБ, ANAv, 1.1.100, ddEnd,tmp1);
			 if length(trim(tmp))>2:
			   НеНачислятьАморт=НеНачислятьАморт или Раб.НФА.B01.СоотвПризнака(tmp,УслНетАморт_0) или (КЛГРУПП<1 и НормаАморт=1200);
			 fi;
			 АНАЛИТ=Объединить(АНАЛИТ, tmp, " ");
			 if УслПД_106_0<>'ВСЕГДА_2.106.04.340':
			    if length(tmp)>3 and УслПД_106_0<>'': -- проверка на предпринимательскую деятельность
			      tmp=РАБ.НФА.B01.abl(tmp,'&',УслПД_106_0);
			      for Sign tmp1=tmp do
				if pos(substr(СЧ26АМДЕБ,21,13),' .2.401.20.271 .2.109.60.271 .2.109.61.271 .4.401.20.271 .4.109.60.271 .4.109.61.271 ')>0:tmpi=21;
				 | true:tmpi=-1;
				fi;
				if tmpi>0:
				  СЧ26АМДЕБ=SubStr(СЧ26АМДЕБ, 1, tmpi+1)+'.109.60.271';
--				    РАБ.НФА.B01.addacc_from_array_add(СЧ26АМДЕБ,false);
				  АНАЛИТ=Объединить(АНАЛИТ, 'КОСГУ.271', " ");
				fi;
				Break;
			      od;
			    fi;
			  | true:
				if pos(substr(СЧ26АМДЕБ,21,13),' .2.401.20.271 .2.109.60.271 .2.109.61.271 .4.401.20.271 .4.109.60.271 .4.109.61.271 ')>0:tmpi=21;
				 | true:tmpi=-1;
				fi;
				if tmpi>0:
				  СЧ26АМДЕБ=SubStr(СЧ26АМДЕБ, 1, tmpi+1)+'.109.60.271';
				  АНАЛИТ=Объединить(АНАЛИТ, 'КОСГУ.271', " ");
				fi;
			 fi;

		       od;
		       if НеНачислятьАморт:
			  АмортМесЭ=1;
			  АмортМесХ=1;
			  АмортМесИ=1;
			  СЧ26АМДЕБ='ЗАБ.НФА.НЕТМЕСАМОРТ';
			  СЧ26АМ   ='ЗАБАЛАНС';
		       fi; -- НеНачислятьАморт
			 АНАЛИТ=ОбъединитьНаборПризнаков(АНАЛИТ, " ", ПРИЗНД, " ", " ");
			 if МЭ:
			   if SumBalЭ>0: y=ВставитьСтрокуВедомостиАмортизации(y, ПРИЗН, ИНВ, НормаАморт, if(АмортМесЭ>0, КОЛЭ, 0), SumBalЭ, АмортМесЭ, НФАамортЭ, True,  АНАЛИТ, СЧ26АМДЕБ, СЧ26АМ); fi;
			   if SumBalХ>0: y=ВставитьСтрокуВедомостиАмортизации(y, ПРИЗН, ИНВ, НормаАморт, if(АмортМесХ>0, КОЛХ, 0), SumBalХ, АмортМесХ, НФАамортХ, False, АНАЛИТ, СЧ26АМДЕБ, СЧ26АМ); fi;
			 else
			   if SumBalИ>0: y=ВставитьСтрокуВедомостиАмортизации(y, ПРИЗН, ИНВ, НормаАморт, if(АмортМесИ>0, КОЛИ, 0), SumBalИ, АмортМесИ, НФАамортИ, False, АНАЛИТ, СЧ26АМДЕБ, СЧ26АМ); fi;
			 fi;
		     fi; -- нужно начислять амортизацию
		   fi; -- цена
		 fi; -- есть на балансе по инвентарному номеру
	       fi; -- нашли инвентарный номер
	     end; -- Transaction
	   fi; -- есть на балансе
	 fi; -- отсекаем ненужное
       fi; -- отсекаем ненужное
     od; -- j
   od; -- i
 Finally
   CloseWorkArea(RO);
   CloseProgress;
 end;
 Hint("Формирование ведомости...");
 СформироватьВедомость;
 Hint("");
 ToggleAutorefresh(Режим);
end;

Proc РасчетАмортизацииПров;
var tn:Integer;

 if EnqOkCancel("Данные будут пересчитаны!^MОк?")=cmOK :
   ДатОпер=ДатОтчСлед;
--   ДатОпер=ДатОтчСлед-1;
   Период=РАБ.УПП.LIB.ВзятьПериодПоДате(ДатОпер,'');
   tn=Time;
   НачислитьАмортизацию(ДатОтчСлед, fПровЭкспл);
   Message("Расчет завершен!^MВремя работы - "+Раб.Нфа.B01.TimeToString(Time-tn));
 fi;
end;

Proc ЦветаПолей(ЦветКнопок:Integer);
var n,l :Integer;
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo);
 n=InsertInArraySort(BufField,"КНОК");	      InsertInArray(BufColorBg,n,ЦветКнопок);
 n=InsertInArraySort(BufField,"ОТЧГОД");      InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ОТЧМЕССТР");   InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"РЕКВН");       InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ПРИЗНД_");     InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"НОРМА");       InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ДОЛЖНИСП");    InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ФИОИСП");      InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ДАТАИСП");     InsertInArray(BufColorBg,n,coAqua);
 l=LengthOfArray(BufField);
 for n=1..l do
   if BufColorBg[n]=coTeal: BufColorFo[n]=coWhite;
   |  True: BufColorFo[n]=coBlack;
   fi;
 od;
end;

Proc ВнешнийВид(Проведено:Logical);
var i, j, цвFont, цвBack :Integer;
var СекцИмя : Object;
var ТЧ :Logical;
var tmp :String;
 tmp="СекцОтчТ"; i=1; j=2;
 if FindObject(tmp, СекцИмя):
   if not(Проведено): цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coBlack; цвBack=coYellow; ТЧ=False; fi;
   СекцИмя.Cell(i, j, CellFontColor, цвFont); СекцИмя.Cell(i, j, CellBgColor, цвBack); СекцИмя.Cell(i, j, CellReadOnly, ТЧ);
 fi;
end;

Proc ТолькоЧтение(Flag:Logical);
var len, k, i, j, ik, jk, n, цвFont, цвBack :Integer;
var ТЧ :Logical;
var tmp :String;
var СекцИмя : Object;
 exit;
 ClearVariable(ИменаСекций);
 ИменаСекций[1]="СекцОбщ1";
 ИменаСекций[2]="СекцОбщ2";
 ИменаСекций[3]="СекцОтчТ";
 ИменаСекций[4]="СекцОбщ3";
 len=LengthOfArray(ИменаСекций);
 ShowProgress(len, "Обработка данных...");
 Try
   for k=1..len do
     ProgressPos(k);
     if FindObject(ИменаСекций[k], СекцИмя):
       ik=asInteger(СекцИмя.RowsCount); jk=asInteger(СекцИмя.ColsCount);
       for i=1 .. ik do
	 for j=1 .. jk do
	   tmp=Up(asString(СекцИмя.Cell(i, j, CellContents, ""))); n=SearchInArray(BufField, tmp, True);
	   if n<>-1:
	     if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=BufColorFo[n]; цвBack=BufColorBg[n]; ТЧ=False; fi;
	     СекцИмя.Cell(i, j, CellFontColor, цвFont); СекцИмя.Cell(i, j, CellBgColor, цвBack); СекцИмя.Cell(i, j, CellReadOnly, ТЧ);
	   fi;
	 od;
       od;
     fi;
   od;
 Finally
   CloseProgress;
 end;
 btnРасчет.Enabled=not(Flag);
 btnДопАна.Enabled=not(Flag);
 ВнешнийВид(Flag);
 ClearVariable(ИменаСекций);
end;

Func ПериодСледующегоОтчета: String;
var RO, num, mm, yy :Integer;
var Фильтр :String;
var dd :Date;
 yy=0; mm=0; dd=1.1.100;
 Фильтр="Ukey<>"+RecordToString(Current);
 RO=OpenWorkArea(SelfCRD, "ОТЧГОД; ОТЧМЕС", Фильтр);
 Try 
   num=Records(RO);
   if num<>0:
     yy=GetFieldI(RO, num, "ОТЧГОД");
     Фильтр="Ukey<>"+RecordToString(Current)+" AND ОТЧГОД="+Str(yy);
     SetFilter(RO, Фильтр);
     Order(RO, "ОТЧМЕС");
     num=Records(RO);
     mm=GetFieldI(RO, num, "ОТЧМЕС");
     dd=AddMon(Dat(1, mm, yy)+1);
   fi;
 Finally 
   CloseWorkArea(RO);
 end;
 if dd=1.1.100: dd=Dat(1, 1, Year(ToDay)); fi;
 ^(РАБ.УПП.LIB.ВзятьПериодПоДате(dd, ''));
end;

Func TemplateSaveOK :Logical; -- проверка правильности ввода данных
 if ДатОтчСлед=1.1.100:
   Message("Укажите период отчета!", mtWarning);
   Template.Field="ОтчМесСтр"; 
   ^False;
 fi;
 if Позиции=0:
   Message("Сначала необходимо сделать расчет!", mtWarning);
   Template.Object="btnРасчет"; 
   ^False;
 fi;
 ^True;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
var nn, Store :Integer;
var tmp :String;
var REC :Record;
 Flag_onEnter=False;
 if Field="кнОк"	: if ClosedModFob=False: EditorApply; fi; Close; ^False;
 |  Field="кнЗкр"	: if ClosedModFob=False: EditorCancel; fi; Close; ^False;
 |  Field="РЕКВН"	: REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", REC, crdRecordOnly);
			  if REC=NIL: ^False; fi;
			  РЕКВ=GetCardFieldS("КОНТРАГЕНТ",REC,'КорИмя');
			  ^False;
 |  Field="ОтчМесСтр"	: ClearVariable(Buf); nn=0;
			  Store=ОтчМес;
			  for nn=1..12 do Buf[nn]=Месяц(nn); od;
			  nn=Alternate('Месяц расчета', Buf, 20, ОтчМес, 12);
			  if nn<>0 : ОтчМес=nn;fi;
			  if ОтчМес<>Store: if ОтменитьИзмененияУсловийОтчета: ОтчМес=Store; fi; fi;
			  ДатОпер=ДатОтчСлед;
--			    ДатОпер=ДатОтчСлед-1;
			  Период=РАБ.УПП.LIB.ВзятьПериодПоДате(ДатОпер,'');
			  ^False;
 |  Field="ОтчГод"	: Flag_onEnter=True; ^True;
 |  Field="ПризнД_"	: tmp=Up(AnaElection("*.*&~(ГГ.*|ДНФА.*|ИНВ.*|К.*|ММДД.*|МОЛ.*|М.*|НФА.*|ПЕРИОД.*)"));
			  if tmp="": ^False; fi;
			  ПризнД=РАБ.БЮДЖЕТ.ДобавитьПризнак(ПризнД, tmp);
			  ПризнД=РАБ.БЮДЖЕТ2005.СортироватьНаборСлов(ПризнД, " ", True);
			  ^False;
 |  Field="Вид_П"	: Вид_П =ВыборВидаТаблицы(Вид_П ); if Проводить: EditorApply; fi; ^False;
 |  Field="Вид_П1"	: Вид_П1=РАБ.УПП.LIB.ВыборВидаТаблицыИНВ(Вид_П1); if Проводить: EditorApply; fi; ^False;
 |  Field="Норма"	: if Позиции[Iter].НФА<>"" or Позиции[Iter].НФА<>" ":
			    REC=SignToRecord(Позиции[Iter].НФА);
			    OpenBlank("ИНФО.НФА.НФА", True, REC);
			  fi;
			  ^False;
-- |  Field="КнУслПД_106":nn=Вопрос('','Выберите действие','Отмена;Добавить;Восстановить значение по умолчанию',mtConfirmation);
--			     if nn=2:-- добавить маску
--				tmp=ВыборПризнака(УслСПР,false,true);
--				if tmp<>'':
--				  УслПД_106=Объединить(УслПД_106, tmp+'*',"|");
--				  СохранитьНастройкиСправочников('УслПД_106',УслПД_106);
--				fi;
--			      | nn=3:-- восстановить значение по умолчанию
--				  УслПД_106=УслПД_106_;
--				  СохранитьНастройкиСправочников('УслПД_106',УслПД_106_);
--			     fi;
--			    ^False;
-- |  Field="КнУслНетАморт":nn=Вопрос('','Выберите действие','Отмена;Добавить;Восстановить значение по умолчанию',mtConfirmation);
--			     if nn=2:-- добавить маску
--				tmp=ВыборПризнака(УслСПР,false,true);
--				if tmp<>'':
--				  УслНетАморт=Объединить(УслНетАморт, tmp+'*',"|");
--				  СохранитьНастройкиСправочников('УслНетАморт',УслНетАморт);
--				fi;
--			      | nn=3:-- восстановить значение по умолчанию
--				  УслНетАморт=УслНетАморт_;
--				  СохранитьНастройкиСправочников('УслНетАморт',УслНетАморт_);
--			     fi;
--			    ^False;
-- |  Field="КнУслСПР"	:nn=Вопрос('','Выберите действие','Отмена;Добавить;Восстановить значение по умолчанию',mtConfirmation);
--			     if nn=2:-- добавить маску
--				tmp=ВыборПризнака('*.*',true);
--				if tmp<>'':
--				  УслСПР=Объединить(УслСПР, tmp,"|");
--				  СохранитьНастройкиСправочников('УслПД_106',УслПД_106);
--				fi;
--			      | nn=3:-- восстановить значение по умолчанию
--				  УслСПР=УслСПР_;
--				  СохранитьНастройкиСправочников('УслПД_106',УслПД_106_);
--			     fi;
--			    ^False;
 |  Field="УслСПР_0" or Field="УслПД_106_0" or Field="УслНетАморт_0":
    РАБ.НФА.INI.CurrentField=Field; OpenBlank('РАБ.НФА.INI');
    ClearVariable(УслСПР_0);ClearVariable(УслПД_106_0);ClearVariable(УслНетАморт_0);
    ^false;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="ОтчГод" : if Flag_onEnter=True and ОтчГод<>ОтчГодOld: if ОтменитьИзмененияУсловийОтчета: ОтчГод=ОтчГодOld; fi; fi;
		     if ОтчГод=0: ОтчГод=ОтчГодOld; fi;
 |  Field="ПризнД_"  : ПризнД=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(ПризнД, " ");
-- |  Field="УслПД_106": СохранитьНастройкиСправочников('УслПД_106',УслПД_106);
-- |  Field="УслСПР"   : СохранитьНастройкиСправочников('УслСПР'   ,УслСПР   );

 fi;
 Flag_onEnter=False;
end;

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

Func Год_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var nn, Store, Val :Integer;
var name :String;
 Template.HideEditor(False);
 name=AsString(Template.Field);
 if VariableExists(name)=False: Message("Не найдена переменная!", mtError); ^Cur; fi;
 Try Val=GetVariableI(name); Except ^Cur; end;
 Store=Val;
 ClearVariable(Buf); nn=0;
 for nn=1..5 do Buf[nn]=Str(Year(ToDay)+nn-4); od;
 nn=Alternate('Год расчета', Buf, 20, 4-(Year(ToDay)-Val), 12);
 if nn=0: ^Cur; fi;
 Val=Int(Buf[nn]);
 if Val<>Store: if ОтменитьИзмененияУсловийОтчета: Val=Store; fi; fi;
 PutVariableI(name, Val);
 ОтчГодOld=Val;
 ДатОпер=ДатОтчСлед-1;
 Период=РАБ.УПП.LIB.ВзятьПериодПоДате(ДатОпер,'');
 ^"";
end;

Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var dd: Date;
 Template.HideEditor(False);
 dd=ВыборДаты(GetDate);
 SetDate(dd);
 ^"";
end;

Func Сотрудники_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var REC: Record;
var v1, v2, Sender, tmp :String;
 Template.HideEditor(False);
 REC=NIL;
 Sender=AsString(Template.Field);
 if Sender="ФИОИсп": tmp=ФИОИсп;
 fi;
 REC=OpenCardFile("СОТРУДНИКИ", "", SignToRecord(tmp), crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 v1=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
 v2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ")+" "+GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 if Sender="ДолжнИсп" or Sender="ФИОИсп": ДолжнИсп=v1; ФИОИсп=v2;
 fi;
 ^"";
end;

2-- События объектов
Proc Флаги_onChange(Sender:String);
var Flag, Old, Work :Logical;
var tmp :String;
var nn :Integer;
var ОбъектИмя :Object;
 Work=False;
 if FindObject(Sender, ОбъектИмя): Work=True; fi;
 if Work:
   tmp="f"+SubStr(Sender, 3, Length(Sender)); -- вычисляем имя переменной
   Flag=GetVariableL(tmp); -- текущий статус;
   Old=not(Flag); -- предыдущий статус
   nn=cmOk;
   if Sender="cbПровЭкспл":
     nn=EnqOkCancel("Включение данного флага может существенно увеличить время расчета!^MПродолжить?", mtWarning);
     if nn=cmCancel: Flag=Old; fi;
   fi;
   if nn=cmOk:
     if ОтменитьИзмененияУсловийОтчета: Flag=Old; fi;
   fi;
   PutVariableL(tmp, Flag);
   ОбъектИмя.State=Flag;
 fi;
end;  

Proc SaveTr;
 var wa,rs,ii,nr:i;
 var ll:l;
 var ss:s;
 -- проверка количества проводок
    wa=OpenWorkArea('РПО_НАЧ_АМОРТ_TR','','ВЕДОМОСТЬ='+RecordToString(Current)+' or ПЕРИОД="'+ПЕРИОД+'"');
--    wa=OpenWorkArea('РПО_НАЧ_АМОРТ_TR','','ПЕРИОД='+ПЕРИОД);
    rs=records(wa);
    CloseWorkArea(wa);
    ll=rs=ПОЗИЦИИ;
    if ll:-- сравниваем построчно
      for ii=1..rs do
	ll=ll and ПОЗИЦИИ[ii].tr<>nil;
	if ll:
	  ll=ll
	  and (ПОЗИЦИИ[ii].НФА	    =ПОЗИЦИИ[ii].tr.НФА      )
	  and (ПОЗИЦИИ[ii].ИНВНОМ   =ПОЗИЦИИ[ii].tr.ИНВНОМ   )
	  and (ПОЗИЦИИ[ii].АМОМЕС   =ПОЗИЦИИ[ii].tr.АМОМЕС   )
	  and (ПОЗИЦИИ[ii].СЧДЕБ    =ПОЗИЦИИ[ii].tr.СЧДЕБ    )
	  and (ПОЗИЦИИ[ii].СЧКРЕ    =ПОЗИЦИИ[ii].tr.СЧКРЕ    )
--	    and (ПОЗИЦИИ[ii].ПРИЗН    =ПОЗИЦИИ[ii].tr.ПРИЗН    )
	  and if(trim(ПризнД)='',ПОЗИЦИИ[ii].ПРИЗН=ПОЗИЦИИ[ii].tr.ПРИЗН,
		  ((ПОЗИЦИИ[ii].ПРИЗН+' '+ПризнД=ПОЗИЦИИ[ii].tr.ПРИЗН) or
		   (ПОЗИЦИИ[ii].ПРИЗН=ПОЗИЦИИ[ii].tr.ПРИЗН and pos(' '+ПризнД,ПОЗИЦИИ[ii].ПРИЗН)>0)
		  )
		)

	  and (ПРОВОДИТЬ=ПОЗИЦИИ[ii].tr.ПРОВОДИТЬ)
	  and (ДАТОПЕР	=ПОЗИЦИИ[ii].tr.ДАТОПЕР  )
	  and (ОТЧМЕС	=ПОЗИЦИИ[ii].tr.ОТЧМЕС	 )
	  and (ОТЧГОД	=ПОЗИЦИИ[ii].tr.ОТЧГОД	 )
	  and (РПО_КЛЮЧ =ПОЗИЦИИ[ii].tr.РПО_КЛЮЧ )
	  and (КОНВ	=ПОЗИЦИИ[ii].tr.КОНВ	 )
	  and (Current	=ПОЗИЦИИ[ii].tr.ВЕДОМОСТЬ)
	  and (ПЕРИОД	=ПОЗИЦИИ[ii].tr.ПЕРИОД	 );
	fi;
	if not ll:break;fi;
      od;
    fi;
    if not ll:-- нашли несоответствие!
      -- зачистка проводок по периоду
      ОчиститьПОЗИЦИИtr;
      rs=ПОЗИЦИИ;
      if rs>0:
	wa=OpenWorkArea('РПО_НАЧ_АМОРТ_TR','','ВЕДОМОСТЬ='+RecordToString(Current));
	  beginchanging(wa);
	    for ii=1..rs do
	      nr=InsertRecord(wa);
	      nr=PutFieldR(wa,nr,'ВЕДОМОСТЬ',Current	       );
	      nr=PutFieldS(wa,nr,'НФА'	    ,ПОЗИЦИИ[ii].НФА   );
	      nr=PutFieldS(wa,nr,'ИНВНОМ'   ,ПОЗИЦИИ[ii].ИНВНОМ);
	      nr=PutFieldN(wa,nr,'АМОМЕС'   ,ПОЗИЦИИ[ii].АМОМЕС);
	      nr=PutFieldS(wa,nr,'СЧДЕБ'    ,ПОЗИЦИИ[ii].СЧДЕБ );
	      nr=PutFieldS(wa,nr,'СЧКРЕ'    ,ПОЗИЦИИ[ii].СЧКРЕ );
--		nr=PutFieldS(wa,nr,'ПРИЗН'    ,ПОЗИЦИИ[ii].ПРИЗН );
	      if trim(ПризнД)='':ss='';
	       | true:
		 if pos(' '+ПризнД,ПОЗИЦИИ[ii].ПРИЗН)>0:ss='';
		  | true:ss=' '+ПризнД;
		 fi;
	      fi;
	      nr=PutFieldS(wa,nr,'ПРИЗН'    ,ПОЗИЦИИ[ii].ПРИЗН+ss);
	      nr=PutFieldL(wa,nr,'ПРОВОДИТЬ',ПРОВОДИТЬ);
	      nr=PutFieldD(wa,nr,'ДАТОПЕР'  ,ДАТОПЕР);
	      nr=PutFieldI(wa,nr,'ОТЧМЕС'   ,ОТЧМЕС);
	      nr=PutFieldI(wa,nr,'ОТЧГОД'   ,ОТЧГОД);
	      nr=PutFieldS(wa,nr,'РПО_КЛЮЧ' ,РПО_КЛЮЧ);
	      nr=PutFieldI(wa,nr,'КОНВ'     ,КОНВ);
	      nr=PutFieldS(wa,nr,'ПЕРИОД'   ,ПЕРИОД);
	      ПОЗИЦИИ[ii].tr=GetRecordKey(wa,nr);
	    od;
	  endchanging(wa);
	CloseWorkArea(wa);
      fi;
    fi;
end; 
Proc ПроверитьСчета;
var z,t:i;
    z=ПОЗИЦИИ;
    for t=1..z do
	РАБ.НФА.B01.addacc_from_array_add(ПОЗИЦИИ[t].СЧДЕБ,pos('ЗАБ',ПОЗИЦИИ[t].СЧДЕБ)>0);
	РАБ.НФА.B01.addacc_from_array_add(ПОЗИЦИИ[t].СЧКРЕ,pos('ЗАБ',ПОЗИЦИИ[t].СЧКРЕ)>0);
    od;
end; 

Func ПроверкаДобавлениеСчетовАморт :Logical;
var len, ii, addacc_count :Integer;
var AccToAdd :String;
var Ошибка, Режим :Logical;
 len=Позиции;
 if len>0:
   ShowProgress(len, "Проверка на наличие необходимых счетов в структуре учета...");
   Try
     addacc_count=0;
     ClearVariable(Buf);
     РАБ.БЮДЖЕТ2005.РежимМаски="?";
     РАБ.КСА.Начать;
     for ii=1 to len do
       ProgressPos(ii);
       Ошибка=False;
       if not (Match(Позиции[ii].СЧДЕБ, "ЗАБ.*") or Match(Позиции[ii].СЧКРЕ, "ЗАБ.*")):
	 while not Ошибка do
	   AccToAdd=Позиции[ii].СЧДЕБ;
	   if not Match(AccToAdd, РАБ.БЮДЖЕТ2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
	   if Name_S(AccToAdd)=" ": addacc_count=addacc_count+1; Buf[addacc_count]=AccToAdd; РАБ.КСА.Добавить(AccToAdd); fi;
	   AccToAdd=Позиции[ii].СЧКРЕ;
	   if not Match(AccToAdd, РАБ.БЮДЖЕТ2005.МаскаСчетаФКР): Ошибка=True; Break; fi;
	   if Name_S(AccToAdd)=" ": addacc_count=addacc_count+1; Buf[addacc_count]=AccToAdd; РАБ.КСА.Добавить(AccToAdd); fi;
	   Break;
	 end; -- while
	 if Ошибка:
	   Message("Счет "+AccToAdd+" не соотвествует структуре учета!", mtError);
	   Template.Field="NN";
	   Template.Frame=ii;
	   ^False;
	 fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 fi;
 if addacc_count>0:
   Режим=AutoRefresh;
   ToggleAutoRefresh(True);
   len=EnqOkCancel("Были обнаружены счета отсутствующие в структуре учета!^MДобавить счета?", mtConfirmation);
   if len=cmOk:
     РАБ.КСА.Закончить(False);
     Refresh(False);
     len=LengthOfArray(Buf);
     for ii=1 to len do
       if Name_S(Buf[ii])=" ":
	 Message("Ошибка автоматического добавления счетов!", mtError);
	 ^False;
       fi;
     od;
   else
     Message("Используются счета отсутствующие в структуре учета!^MНевозможно сформировать проводки", mtError);
     ^False;
   fi;
   ToggleAutoRefresh(Режим);
 fi;
 ^True;
end;

Proc cbПроводить_onChange(Sender:String);
var Flag, SaveOK :Logical;
var n :Integer;
 if not Проводить:
    SaveOK=True; -- если защита 'снимается' значит проверка данных уже производилась
    n=EnqOkCancel("Вы действительно хотите исключить данный документ из обработки?", mtConfirmation);
    if n=cmCancel: Flag=True; else Flag=False; fi;
   else
    SaveOK=TemplateSaveOK; 
    if SaveOK: SaveOK=ПроверкаДобавлениеСчетовАморт; fi;
    Flag=SaveOK;
    SaveTr;
 fi;
-- РАБ.НФА.B01.addacc_from_array_ini;
-- ПроверитьСчета;
-- РАБ.НФА.B01.addacc_from_array;
 Проводить=Flag; cbПроводить.State=Проводить;
 ТолькоЧтение(Flag);
 if not(SaveOK): Exit; fi; -- Избегаем двойных сообщений
 EditorApply;
end;

Proc ФлCopyClosedModFob_onChange(Sender:String);
var Flag :Logical;
var q :Integer;
     if not ClosedModFob:ClosedModFob=true;--блокировка от удаления
      | true:-- надо снять флаг
	Раб.SQL.SetClosedModFobUpdateOnBlankEditor_false(ИМЯКРТ,current,5,SQLver,false);
     fi;
     установили_блокировку=true;
     РедакторПрименить;
     установили_блокировку=false;
     ФлCopyClosedModFob.State=ClosedModFob;
     exit;

-- if not ClosedModFob:ClosedModFob=true;CurrentRecord=Current;--блокировка от удаления
--  | true:-- надо снять флаг
--    Раб.НФА.B00SQL.SetClosedModFobUpdateOnBlankEditor_false(ИМЯКРТ,current,5,SQLver,true);
-- fi;
-- РедакторПрименить;
-- ФлCopyClosedModFob.State=CopyClosedModFob;
-- exit;

-- if not ClosedModFob:ClosedModFob=true;--блокировка от удаления
--  | true:-- надо снять флаг
--    Раб.НФА.B00SQL.SetClosedModFobUpdateOnBlankEditor_false(ИМЯКРТ,current,5,SQLver,false);
-- fi;
-- РедакторПрименить;
-- ClearVariable(CopyClosedModFob);
-- ФлCopyClosedModFob.State=ClosedModFob;
-- exit;


-- if ClosedModFob=True:
--    q=EnqOkCancel("Вы действительно хотите заблокировать документ?"+Chr(13)+Chr(13)+
--		    "Дальнейшие изменения документа будут невозможны."+Chr(13)+
--		    "Разблокировать документ сможет только пользователь наделенный соответствующими правами.", mtConfirmation);
--    if q=cmCancel: Flag=False; else Flag=True; fi;
--   else
--    q=EnqOkCancel("Вы действительно хотите разблокировать документ?", mtConfirmation);
--    if q=cmCancel: Flag=True; else Flag=False; fi;
-- fi;
-- ClosedModFob=Flag; cbClosedModFob.State=ClosedModFob;
end;


2-- События шаблона
Proc Template_onOpen(Create:Logical);
var tmp :String;
var Цв :Integer;
  SQLver=SQLЗапросыРазрешены;
 if GetScheme="": ФлCopyClosedModFob.Visible=False; else ФлCopyClosedModFob.Visible=True; fi;
 EnableCommands(False, cmDublRec);
-- Цв=РАБ.УПП.LIB.Цвет(236, 233, 216);
-- СекцОбщ1.Cell(2, 2, CellBgColor, Цв);
-- СекцОбщ1.Cell(2, 4, CellBgColor, Цв);
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("НФА")+"\Настройки\","RPO_amort_000.cfg");
 ЦветаПолей(Цв);
 tmp=UserName(AliasName(SelfCRD));
 Пользов=if(tmp<>"", "Пользователь - "+tmp, "Пользователь локальной версии");
 БланкКОД=РАБ.НФА.B01.БланкИмя;
-- УслПД_106=СчитатьНастройкиСправочников('УслПД_106');
-- УслСПР   =СчитатьНастройкиСправочников('УслСПР');
-- if УслПД_106='':СохранитьНастройкиСправочников('УслПД_106',УслПД_106_);УслПД_106=УслПД_106_;fi;
-- if УслСПР   ='':СохранитьНастройкиСправочников('УслСПР'   ,УслСПР_	);УслСПР   =УслСПР_   ;fi;
end;

Proc Template_onClose(Destroy:Logical); -- При закытии бланка
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo);
 Очистить;
 if CurrentState=CrdusUndefined: Destroy=True; fi;
end;

Proc Template_onCancel; -- при отмене редактирования шаблона
 Очистить;
 if CurrentState=CrdusUndefined: 
   Message("Была произведена отмена редактирования!^MВ картотеке нет записей, бланк будет закрыт.", mtInformation);
   Close;
 fi;
end;

Proc Template_onRead; -- При считывании шаблона
var tmp :String;
 установили_блокировку=false;
 Очистить;
 if NewRec:
   tmp=ПериодСледующегоОтчета;
   ОтчМес=Int(SubStr(tmp, 16, 2)); -- отчетный месяц
   ОтчГод=Int(SubStr(tmp,  8, 4)); -- отчетный год
   ДатаИсп=ToDay;
 fi;
 ТолькоЧтение(Проводить);
end;

Func Template_OnValidate: Logical; -- при проверке шаблона
var n :Integer;
var SaveOK :Logical;
 if not(NewREC): if not(TemplateSaveOK): ^False; fi; fi;
 if NewREC and not(Проводить):
   if not(TemplateSaveOK): ^False; fi;
   if not ПроверкаДобавлениеСчетовАморт: ^False; fi;
   n=EnqOkCancel("Провести данный документ по учету?", mtConfirmation);
   if n=cmOk: 
     SaveOK=TemplateSaveOK; Проводить=SaveOK;
     cbПроводить.State=Проводить;
     ТолькоЧтение(SaveOK);
   fi;
 fi;
 ^True;
end;

Func ВзятьСчетНФАпоСчетуАморт(СЧАморт:String) :String;
 ^Раб.НФА.B01.ВзятьКонецСчет101_102ПоСчетуАм('000.0000.0000000.000.0.'+СЧАморт);
end;
Func ВзятьСчетНФАпоСчетуАморт_(СЧАморт:String) :String;
 if СЧАморт="104.01.410": ^"101.01.310";
 |  СЧАморт="104.02.410": ^"101.02.310";
 |  СЧАморт="104.03.410": ^"101.03.310";
 |  СЧАморт="104.04.410": ^"101.04.310";
 |  СЧАморт="104.05.410": ^"101.05.310";
 |  СЧАморт="104.06.410": ^"101.06.310";
 |  СЧАморт="104.07.410": ^"101.07.310";
 |  СЧАморт="104.08.410": ^"101.08.310";
 |  СЧАморт="104.09.420": ^"102.01.320";
 else ^"";
 fi;
end;
Func ВзятьСчетАмортПоСчетуНФА(СЧНФА:String) :String;
 ^Раб.НФА.B01.ВзятьКонецСчетАмортПоСчетуНФА('000.0000.0000000.000.0.'+СЧНФА+'.000');
end;

Func ВзятьСчетАмортПоСчетуНФА_(СЧНФА:String) :String;

 if СЧНФА="101.01": ^"104.01.410";
 |  СЧНФА="101.02": ^"104.02.410";
 |  СЧНФА="101.03": ^"104.03.410";
 |  СЧНФА="101.04": ^"104.04.410";
 |  СЧНФА="101.05": ^"104.05.410";
 |  СЧНФА="101.06": ^"104.06.410";
 |  СЧНФА="101.07": ^"104.07.410";
 |  СЧНФА="101.09": ^"104.08.410";
 |  СЧНФА="102.01": ^"104.09.420";
-- |  СЧНФА="103.01": ^"104.08.420";
 else ^"";
 fi;
end;

Proc ПривестиВсоответствиеСчетАмортПоНФА(Iter:Integer);
var КОДНФА, tmp :String;
 tmp=ВзятьСчетНФАпоСчетуАморт(SubStr(Позиции[Iter].СЧКРЕ, 24, 10));
 КОДНФА=SubStr(Позиции[Iter].НФА, 5, 6);
-- if КОДНФА='103.01':КОДНФА='102.00';
--    Позиции[Iter].НФА='НФА.102.00.'+SubStr(Позиции[Iter].НФА, 12, 250);
-- fi;

 if КОДНФА<>SubStr(tmp, 1, 6): Позиции[Iter].СЧКРЕ=SubStr(Позиции[Iter].СЧКРЕ, 1, 23)+ВзятьСчетАмортПоСчетуНФА(КОДНФА); fi;
end;

Proc РасчетДопАналитики;
var len, i, num, j ,tmpi:Integer;
var ANA, tmp, СЧ,СЧД, VOC,tmp1 :String;
 len=Позиции;
 if len>0:
   for i=1 to len do
--     if Позиции[I].СЧДЕБ='187.0000.0000000.000..2.401.01.271':
--	  Позиции[I].СЧДЕБ='187.0000.0000000.000.2.401.01.271';
--     fi;
--     if Позиции[I].СЧДЕБ='187.0000.0000000.000..2.106.04.340':
--	  Позиции[I].СЧДЕБ='187.0000.0000000.000.2.106.04.340';
--     fi;
     ПривестиВсоответствиеСчетАмортПоНФА(i);
     ANA=Позиции[i].Призн;
     num=WordsCount(УслСПР_0, '|');
     СЧД=Позиции[I].СЧДЕБ;
     if pos(substr(СЧД,21,13),' .2.109.60.271 .2.109.61.271 .4.109.60.271 .4.109.61.271 ')>0:tmpi=21;
      | true:tmpi=-1;
     fi;
     if tmpi>0:
       СЧД=SubStr(Позиции[I].СЧДЕБ, 1, tmpi+1)+'.401.20.271';
     fi;
     if num>0:
       СЧ=SubStr(Позиции[i].СЧКРЕ, 1, 23)+ВзятьСчетНФАпоСчетуАморт(SubStr(Позиции[i].СЧКРЕ, 24, 10));
       for j=1 to num do
	 VOC=ExtractWord(j, УслСПР_0, "|");
	 tmp=ПоследнийПризнакВПроводкахИзСправочника(СЧ, Позиции[i].НФА+"&"+Позиции[i].ИНВНОМ, 1.1.100, ДатОтчСлед, VOC);
	 ANA=ОбъединитьНаборПризнаков(ANA, " ", tmp, " ", " ");

	 if length(tmp)>3: -- проверка на предпринимательскую деятельность
	   if Соотв(Позиции[I].СЧКРЕ,'*.2.104.??.???') or Соотв(Позиции[I].СЧКРЕ,'*.4.104.??.???'):
	     for Sign tmp1=tmp+'&('+УслПД_106_0+')' do
	       if pos(substr(СЧД,21,13),' .2.401.20.271  .4.401.20.271	')>0:tmpi=21;
		| true:tmpi=-1;
	       fi;
	       if tmpi>0:
		 СЧД=SubStr(СЧД, 1, tmpi+1)+'.109.60.271';
		 ANA=ОбъединитьНаборПризнаков(ANA, " ", "КОСГУ.271", " ", " ");

	       fi;
	       Break;
	     od;

--	      | true:
--		 tmpi=Pos('.2.106.04.340', Позиции[I].СЧДЕБ);
--		 if tmpi>0:
--		   Позиции[I].СЧДЕБ=SubStr(Позиции[I].СЧДЕБ, 1, tmpi)+'.2.401.01.271';
--		 fi;

	   fi;
	 fi;
       od;
     fi;
     Позиции[i].Призн=ANA;
     if trim(Позиции[i].СЧДЕБ)<>trim(СЧД):Позиции[i].СЧДЕБ=trim(СЧД);
     fi;
   od;
 fi;
end;



Proc ПриИзменении(Sender: String);

end;




Proc Расчет_OnClick(Row: Integer; Col: Integer; Double: Logical);
 if РазрешеноРедактирование:РасчетАмортизацииПров;fi;
end;

Proc Допаналитика_OnClick(Row: Integer; Col: Integer; Double: Logical);
 if РазрешеноРедактирование:
   РасчетДопАналитики;
   Message('ok');
 fi;
end;




Proc Удалитьведомость_OnClick(Row: Integer; Col: Integer; Double: Logical);
 var wa:i;
  if вопрдаотказ('Даная ведомость будет удалена! Вы уверены?',mtWarning)=кмдВерно:
    ClearVariable(ПОЗИЦИИ);
    РедакторПрименить;
    ОчиститьПОЗИЦИИtr;
    wa=OpenWorkArea('РПО_НАЧ_АМОРТ','','UKEY='+RecordToString(current));
     BeginChanging(wa);
      УдалитьЗапись(wa,1);
     EndChanging(wa);
    CloseWorkArea(wa);
  fi;

end;

КОНЕЦ