БЛАНКСШАБЛОНОМ[10.02.2006] "Акт о приеме-передаче групп объектов основных средств", РЕДАКТОР РПО_АКТЫ_УНФА;
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
Сек1 :Object;	СекОС1 :Object;   Сек4 :Object;   СекХарОС :Object;
Сек2 :Object;	СекОС2 :Object;   Сек5 :Object;

cb_БезУЧН :Object;   flgБезУЧН :Logical;
cb_УчтЗАБ :Object;   flgУчтЗАБ :Logical;
var УчЗаб :Logical=flgУчтЗАБ;

Proc ВнешнийВид_ВключаемБезУЧН(ВклБезУЧН:Logical);
 if not ВклБезУЧН: flgУчтЗАБ=False; fi;
 cb_УчтЗАБ.Enabled = ВклБезУЧН;
end;

var A1:String="+"; var A2:String="+"; var A3:String="+"; var A4:String="+"; var A5:String="+";
var D1:String="-"; var D2:String="-"; var D3:String="-"; var D4:String="-"; var D5:String="-";

var Кн1 	   :String="...";
var Доля100П	   :Numeric=SumOfArray(состОС[].Доля);
var СтВсего	   :Numeric=SumOfArray(состОС[].ПокВсего);

var НЕ_ВКЛ_КОМИССИЯ_2:l=not ВКЛ_КОМИССИЯ_2;
var Комиссия_max:i=if(ВКЛ_КОМИССИЯ_2,Комиссия_2,0);
--var Комиссия_1:i=if(ВКЛ_КОМИССИЯ_2,0,Комиссия);
var ДолЧленКом_2_[]:s=Комиссия_2[$].ДолЧленКом_2;
var ФИОЧленКом_2_[]:s=Комиссия_2[$].ФИОЧленКом_2;
--var ДолЧленКом_[]:s=Комиссия[$].ДолЧленКом;
--var ФИОЧленКом_[]:s=Комиссия[$].ФИОЧленКом;

var recCurrent:record;
var NewREC	   :Logical=(CurrentState=crdusInserted);
var NN []	   :String=Str($);
var Buf[]	   :String;
var BufI[]	   :Integer;
--var МаскаСЧ	     :String="(*.101.04*|*.101.05*|*.101.06*|*.101.09*)&(???.????.???????.???.?.101.??.?10|ЗАБ.??.101.??)|???.????.???????.???.?.102.01.?20|???.??.??.??.??.??.????.?.103.0?.?30";
var МаскаСЧ	   :String="(*.101.?4*|*.101.?5*|*.101.?6*|*.101.?8*|*.102.??*|*.105.??*)";
var 2БланкИмя0	   :String2;
var 2КлассФормыДок0  :String2;
var 2КодФормыДок0    :String2;
func repqСчетУНФА:s;
 if pos('???',СчетУНФА)<1:^СчетУНФА;fi;
 if length(СчетУНФА)=33:
   if match(СчетУНФА,'*.?.101.??.???'):^substr(СчетУНФА,1,30)+'310';
    | match(СчетУНФА,'*.?.102.??.???'):^substr(СчетУНФА,1,30)+'320';
    | match(СчетУНФА,'*.?.105.??.???'):^substr(СчетУНФА,1,30)+'340';
   fi;
 fi;
 ^СчетУНФА;
end;
var СчетУНФА_	   :String=repqСчетУНФА2;
--
NewRECbln	   :String;
var ВниманиеСТР    :String;
ВниманиеОбъект	   :Object;
var First	   :Logical;
ВниманиеНапоминать :Logical;
КнРасчет	   :Object;
--
var УслДЕБ[]	   :String;
var УслКРЕ[]	   :String;
var УслАНА[]	   :String;
var НФА_ИНВ_COD[]  :String;
var НФА_ИНВ_СУМ[]  :Numeric;
var НФА_ИНВ_КОЛ[]  :Numeric;
var ДОПАНА[]	   :String;
var ИНВ_MSK[]	   :String;
var ИНВ_INI[]	   :String;
var ИНВ_NUM[]	   :Integer;

2-- Общие процедуры и функции
Proc Очистить;
 ClearVariable(УслДЕБ); ClearVariable(НФА_ИНВ_COD); ClearVariable(ИНВ_MSK);
 ClearVariable(УслКРЕ); ClearVariable(НФА_ИНВ_СУМ); ClearVariable(ИНВ_INI);
 ClearVariable(УслАНА); ClearVariable(НФА_ИНВ_КОЛ); ClearVariable(ИНВ_NUM);
 ClearVariable(NN); ClearVariable(Buf); ClearVariable(BufI); ClearVariable(ДОПАНА);
end;

Proc НачальнаяИтерация;
var qq :Integer;
 if стрЦель   <1: Try qq=InsertFrame(стрЦель   , 1); Except end; fi;
 if ДоляСобств<1: Try qq=InsertFrame(ДоляСобств, 1); Except end; fi;
 if состОС    <1: Try qq=InsertFrame(состОС    , 1); Except end; fi;
 if стрЗАК    <1: Try qq=InsertFrame(стрЗАК    , 1); Except end; fi;
 if стрТехДок <1: Try qq=InsertFrame(стрТехДок , 1); Except end; fi;
end;

Proc ДобавитьУдалитьСтроки(Field:String; Iter:Integer; fADD:Logical);
var nSec, qq :Integer;
 nSec=Int(SubStr(Field, 2, 1));
 if fADD:
   if nSec=1: Try qq=InsertFrame(стрЦель   , Iter+1); Except end;
   |  nSec=2: Try qq=InsertFrame(ДоляСобств, Iter+1); Except end;
   |  nSec=3: Try qq=InsertFrame(состОС    , Iter+1); Except end;
   |  nSec=4: Try qq=InsertFrame(стрЗАК    , Iter+1); Except end;
   |  nSec=5: Try qq=InsertFrame(стрТехДок , Iter+1); Except end;
   fi;
 else
   if EnqOkCancel("Вы уверены что хотите удалить данную строчку?", mtConfirmation)=cmOk:
     if nSec=1: if стрЦель   >1: Try DeleteFrame(стрЦель   , Iter); Except end; fi;
     |	nSec=2: if ДоляСобств>1: Try DeleteFrame(ДоляСобств, Iter); Except end; fi;
     |	nSec=3: if состОС    >1: Try DeleteFrame(состОС    , Iter); Except end; fi;
     |	nSec=4: if стрЗАК    >1: Try DeleteFrame(стрЗАК    , Iter); Except end; fi;
     |	nSec=5: if стрТехДок >1: Try DeleteFrame(стрТехДок , Iter); Except end; fi;
     fi;
     НачальнаяИтерация;
   fi;
 fi;
end;

Func НомерТекущейСекции :Integer;
var name :String;
 name=asString(Template.Name);
 if name="Сек1"    : ^1;
 |  name="Сек2"    : ^2;
 |  name="СекОС1"  : ^3;
 |  name="СекОС2"  : ^3;
 |  name="Сек4"    : ^4;
 |  name="Сек5"    : ^5;
 |  name="СекХарОС": ^3;
 else ^0;
 fi;
end;

Proc УдалитьПустыеСтроки(НТС:Integer);
var nn :Integer;
 nn=1;
 if НТС=1:
   while nn<=стрЦель	do if стрЦель[nn].Цель=""	  : Try DeleteFrame(стрЦель,	nn); Except end; else nn=nn+1; fi; od;
 |  НТС=2:
   while nn<=ДоляСобств do if ДоляСобств[nn].Участник=""  : Try DeleteFrame(ДоляСобств, nn); Except end; else nn=nn+1; fi; od;
 |  НТС=3:
   while nn<=состОС	do if состОС[nn].ОС="" and 
      (состОС[nn].НаименОС="" or состОС[nn].НаименОС=" ") : Try DeleteFrame(состОС,	nn); Except end; else nn=nn+1; fi; od;
 |  НТС=4:
   while nn<=стрЗАК	do if стрЗАК[nn].Заключение=""	  : Try DeleteFrame(стрЗАК,	nn); Except end; else nn=nn+1; fi; od;
 |  НТС=5:
   while nn<=стрТехДок	do if стрТехДок[nn].ПрилТехДок="" : Try DeleteFrame(стрТехДок,	nn); Except end; else nn=nn+1; fi; od;
 fi;
 Template.Frame=1;
end;

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

Func GetDate :Date;  -- считываем в заданном поле дату
var name :String;
var Iter :Integer;
 name=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if name="ДатаПодИспол"  : ^ДатаПодИспол;
 |  name="ДатаПодРУК"	 : ^ДатаПодРУК;
 |  name="ДатаДокОсн"	 : ^ДатаДокОсн;
 |  name="ДатаПринБух"	 : ^ДатаПринБух;
 |  name="ДатаСписБух"	 : ^ДатаСписБух;
 |  name="ДатаАкта"	 : ^ДатаАкта;
 |  name="ВалКурсНаДату" : ^ВалКурсНаДату;
 |  name="ДатаВвЭксп"	 : ^состОС[Iter].ДатаВвЭксп;
 |  name="ДатаКапРем"	 : ^состОС[Iter].ДатаКапРем;
 |  name="ДатаЗаключ"	 : ^ДатаЗаключ;
 |  name="ДатаМОЛСдал"	 : ^ДатаМОЛСдал;
 |  name="ДатаПрин"	 : ^ДатаПрин;
 |  name="ДатаДовер"	 : ^ДатаДовер;
 |  name="ДатаМОЛПрин"	 : ^ДатаМОЛПрин;
 fi;
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var name :String;
var Iter :Integer;
 name=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if name="ДатаПодИспол"  : ДатаПодИспол 	   = Value;
 |  name="ДатаПодРУК"	 : ДатаПодРУК		   = Value;
 |  name="ДатаДокОсн"	 : ДатаДокОсн		   = Value;
 |  name="ДатаПринБух"	 : ДатаПринБух		   = Value;
 |  name="ДатаСписБух"	 : ДатаСписБух		   = Value;
 |  name="ДатаАкта"	 : ДатаАкта		   = Value;
 |  name="ВалКурсНаДату" : ВалКурсНаДату	   = Value;
 |  name="ДатаВвЭксп"	 : состОС[Iter].ДатаВвЭксп = Value;
 |  name="ДатаКапРем"	 : состОС[Iter].ДатаКапРем = Value;
 |  name="ДатаЗаключ"	 : ДатаЗаключ		   = Value;
 |  name="ДатаМОЛСдал"	 : ДатаМОЛСдал		   = Value;
 |  name="ДатаПрин"	 : ДатаПрин		   = Value;
 |  name="ДатаДовер"	 : ДатаДовер		   = Value;
 |  name="ДатаМОЛПрин"	 : ДатаМОЛПрин		   = Value;
 fi;
end; 

Proc ВыборКонтрагента(ПЕРВ:Logical; МЫ:Logical; РО:Logical; REC:Record);
-- ПЕРВ - первая организация в "шапке" (учреждение, организации-заказчика, организации-получателя)
--   МЫ - собственные реквизиты
--   РО - выбор контрагента через рабочую область
--  REC - если РО=True, то в REC ссылка на контрагента, иначе REC=NIL
var t1, t2, ОРГАН, ОКПО, АДРЕС, БАНКР :String;
var RO	:Integer;
var rTMP :Record;
 ОРГАН=""; ОКПО=""; АДРЕС=""; БАНКР="";
 if not(РО):
   REC=NIL;
   if МЫ:
     REC=OpenCardFile("Контрагент", "Наше=True and GroupAttr=0", NIL, crdRecordOnly);
   else
     REC=OpenCardFile("Контрагент", "Наше=False", NIL, crdRecordOnly);
   fi;
 fi;
 if REC<>NIL:
   -- Реквизиты контрагента
   RO=OpenWorkArea("Контрагент", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       ОРГАН=GetFieldS(RO, 1, "КОРИМЯ"); ОКПО=GetFieldS(RO, 1, "ОКПО"); АДРЕС=GetFieldS(RO, 1, "ЮРАДРЕС");
       t1=GetFieldS(RO, 1, "ТЕЛЕФОН"); t1=if(t1="", "", "тел. "+t1);
       t2=GetFieldS(RO, 1, "ФАКС");    t2=if(t2="", "", t2+" (факс)");
       if АДРЕС<>'' : АДРЕС=АДРЕС+"; "+t1; else АДРЕС=t1; fi;
       if АДРЕС<>'' : АДРЕС=АДРЕС+"; "+t2; else АДРЕС=t2; fi;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
   -- Банковские реквизиты контрагента
   -- t1="КОНТРАГЕНТ="+RecordToString(REC)+" and "+"НАШ"+" and "+"УМОЛЧАНИЕ"; -- фильтр
   -- RO=OpenWorkArea("Банк_Счета", "", t1);
   rTMP=РАБ.Бюджет2005.БанкСчет(REC, False);
   if rTMP<>NIL:
     RO=OpenWorkArea("Банк_Счета", "", "UKey="+RecordToString(rTMP));
     Try
       if Records(RO)=1:
	 БАНКР="р/с: "+GetFieldS(RO, 1, "РСЧЕТ")+" в "+GetFieldS(RO, 1, "БАНК")+", "+GetFieldS(RO, 1, "ГОРОД")+", "+
	       "к/с: "+GetFieldS(RO, 1, "КСЧЕТ")+", БИК "+GetFieldS(RO, 1, "БИК");
       fi;
     Finally
       CloseWorkArea(RO);
     end;
   fi;
 fi;
 if ПЕРВ:
   Учреждение =ОРГАН; ОКПОучреж=ОКПО; АдресУчреж=АДРЕС; БанкУчреж=БАНКР;
   if ДоляСобств[1].Участник="" : ДоляСобств[1].Участник=Учреждение; ДоляСобств[1].Доля=100; fi;
 else
   Исполнитель=ОРГАН; ОКПОИспол=ОКПО; АдресИспол=АДРЕС; БанкИспол=БАНКР;
 fi;
end;

Proc ВыборКомиссии;
var REC :Record;
var RO, OA, Num, i  :Integer;
 REC=OpenCardFile("Комиссия", "", NIL, crdRecordOnly);
 if REC<>NIL:
   ClearVariable(Комиссия);
   RO=OpenWorkArea("Комиссия", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       ДолПредКом=GetFieldS(RO, 1, "ПРЕДСД"); 
       ФИОПредКом=GetFieldS(RO, 1, "ПРЕДСФ");
       OA=OpenArray(RO, 1, "ЧЛЕНКОМ","");
       Num=Records(OA);
       if Num>0:
	 Try
	   for i=1..Num do
	     Try InsertFrame(Комиссия, i); Except end;
	     Комиссия[i].ДолЧленКом=GetFieldS(OA, i, "ЧЛЕНД");
	     Комиссия[i].ФИОЧленКом=GetFieldS(OA, i, "ЧЛЕНФ");
	   od;
	 Finally
	   CloseWorkArea(OA);
	 end;
       fi;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;
Proc ВыборКомиссии_2;
var REC :Record;
var RO, OA, Num, i  :Integer;
 REC=OpenCardFile("Комиссия", "", NIL, crdRecordOnly);
 if REC<>NIL:
   ClearVariable(Комиссия_2);
   RO=OpenWorkArea("Комиссия", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       ДолПредКом_2=GetFieldS(RO, 1, "ПРЕДСД");
       ФИОПредКом_2=GetFieldS(RO, 1, "ПРЕДСФ");
       OA=OpenArray(RO, 1, "ЧЛЕНКОМ","");
       Num=Records(OA);
       if Num>0:
	 Try
	   for i=1..Num do
	     Try InsertFrame(Комиссия_2, i); Except end;
	     Комиссия_2[i].ДолЧленКом_2=GetFieldS(OA, i, "ЧЛЕНД");
	     Комиссия_2[i].ФИОЧленКом_2=GetFieldS(OA, i, "ЧЛЕНФ");
	   od;
	 Finally
	   CloseWorkArea(OA);
	 end;
       fi;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;
Proc ВыборДоверенности;
var REC :Record;
var RO	:Integer;
 REC=OpenCardFile("Доверенности", "", NIL, crdRecordOnly);
 if REC<>NIL:
   RO=OpenWorkArea("Доверенности", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       ДатаДовер =GetFieldD(RO, 1, "ДАТА");
       НомерДовер=GetFieldS(RO, 1, "НОМЕРБУМ");
       КомуДовер =GetCardFieldS("Контрагент", GetFieldR(RO, 1, "РЕКВ"), "КОРИМЯ")+";"+Chr(13)+GetFieldS(RO, 1, "ФИОС");
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Proc СчитатьСрок(Field:String; Iter:Integer);
var Val :String;
var dd1 ,dd2 :Date;
 ClearVariable(РАБ.НФА.FUNC_LIB.TempDAT); Val=""; dd1=1.1.100; dd1=dd2;
 dd1=состОС[Iter].ДатаВвЭксп;
 if dd1=1.1.100: dd1=ToDay; fi;
 if Field="ФактСрокЭк" : Val=состОС[Iter].ФактСрокЭк;
 |  Field="СрокНовИсп" : Val=состОС[Iter].СрокНовИсп;
 fi;
 dd2=РАБ.НФА.FUNC_LIB.ВзятьКонечнуюДатуИнтервала(Val, dd1);
 if dd2=1.1.100: dd2=ToDay; fi;
 РАБ.НФА.FUNC_LIB.TempSTR[1]=Val;
 РАБ.НФА.FUNC_LIB.TempDAT[1]=dd1;
 РАБ.НФА.FUNC_LIB.TempDAT[2]=dd2;
end;

Proc УстановитьСрок(Field:String; Iter:Integer; Val:String);
 if Field="ФактСрокЭк" : состОС[Iter].ФактСрокЭк=Val;
 |  Field="СрокНовИсп" : состОС[Iter].СрокНовИсп=Val;
 fi;
end;

Proc Сроки(Field:String; Iter:Integer);
 СчитатьСрок(Field, Iter);
 РАБ.НФА.FUNC_LIB.TempLOG[1]=False;
 РАБ.НФА.FUNC_LIB.TempINT[1]=4; -- 1 - 'День'; 2 - 'Месяц'; 3 - 'Год'; 4 - 'Год + Месяц'; 5 - 'Год + Месяц + День'
 РАБ.НФА.FUNC_LIB.ИмяБланка=GetActiveBlankName;
 OpenBlank("РАБ.ВСПОМ.ПРОМЕЖУТОКВРЕМЕНИ", True);
 УстановитьСрок(Field, Iter, РАБ.НФА.FUNC_LIB.TempSTR[1]);
 ClearVariable(РАБ.НФА.FUNC_LIB.TempSTR); ClearVariable(РАБ.НФА.FUNC_LIB.ИмяБланка);
end;

Func МаскаГРОС(ss:String) :String;
 if ss='101.01': ^'ГРОС.13*';
 |  ss='101.02': ^'ГРОС.11*';
 |  ss='101.03': ^'ГРОС.12*';
 |  ss='101.04': ^'ГРОС.14*';
 |  ss='101.05': ^'ГРОС.15*';
 |  ss='101.06': ^'ГРОС.16*|ГРОС.17*|ГРОС.18*|ГРОС.19*';
 |  ss='101.07': ^'';
-- |  ss='101.08': ^'';
 |  ss='101.08': ^'ГРОС.19*';
 |  ss='102.00': ^'ГРОС.2?*';
 fi;
end;

Func ПризнакКонстанта(МаскаДляВыбора:String) :String;
var nn :Integer;
var mask, tmp: String;
 nn=0;
 Try for Sign mask=МаскаДляВыбора do tmp=mask; nn=nn+1; if nn=2: Break; fi; od; Except end;
 if nn=1: ^tmp;  -- признак=константа
 |  nn=0: ^" ";  -- признаков нет вообще
 |  True: ^"" ;  -- признаков больше одного
 fi;
end;

Func ВзятьСрокАмортГруппы(НомерГруппы:Integer):String;
 if НомерГруппы= 1: ^"2 года";
 |  НомерГруппы= 2: ^"3 года";
 |  НомерГруппы= 3: ^"5 лет";
 |  НомерГруппы= 4: ^"7 лет";
 |  НомерГруппы= 5: ^"10 лет";
 |  НомерГруппы= 6: ^"15 лет";
 |  НомерГруппы= 7: ^"20 лет";
 |  НомерГруппы= 8: ^"25 лет";
 |  НомерГруппы= 9: ^"30 лет";
 |  НомерГруппы=10: ^"100 лет или более";
 |  True: ^"";
 fi;
end;

Proc ИнициализироватьУсловия(дляПРИХОДА:Logical);
 ClearVariable(УслДЕБ); ClearVariable(УслКРЕ); ClearVariable(УслАНА);

 if дляПРИХОДА:

   УслДЕБ[1] = "(*.?.101.?4.310|*.?.101.?5.310|*.?.101.?6.310|*.?.101.?8.310)&???.????.???????.???.?.???.??.???";
   УслКРЕ[1] ="(*.304.04.310|*.106.?1.310)&???.????.???????.???.?.???.??.???|00|(*.14?|*.15?|*.180|*.172)&???.?.??.?????.??.????.?.401.10.???";
   УслАНА[1] = "";

   УслДЕБ[2] = "???.????.???????.???.?.102.??.320";
   УслКРЕ[2] ="(*.304.04.320|*.106.32.?20)&???.????.???????.???.?.???.??.???|00|(*.14?|*.15?|*.180|*.172)&???.?.??.?????.??.????.?.401.10.???";
   УслАНА[2] = "";

   УслДЕБ[3] = "???.??.??.??.??.??.????.?.103.??.330";
   УслКРЕ[3] = "???.??.??.??.??.??.????.?.106.13.?30|00";
   УслАНА[3] = "";

   УслДЕБ[4] = "ЗАБ.??.101.?4|ЗАБ.??.101.?5|ЗАБ.??.101.?6|ЗАБ.??.101.?8|ЗАБ.??.102.??";
   УслКРЕ[4] = "ЗАБАЛАНС";
   УслАНА[4] = "";

 else

   УслДЕБ[1] = "(???.????.???????.???.?.???.??.???&(*.104.??.410|*2.109.??.271|*.304.04.310|*.401.2?.24?|*.401.2?.25?|*.401.2?.27?))|(???.?.??.?????.??.????.?.???.??.???&(*.401.1?.17?|*.401.1?.180))";
   УслКРЕ[1] = "(*.?.101.?4.410|*.?.101.?5.410|*.?.101.?6.410|*.?.101.?8.410)&???.????.???????.???.?.???.??.???";
   УслАНА[1] = "";

   УслДЕБ[2] = "(???.????.???????.???.?.???.??.???&(*.304.04.320|*2.109.??.271|*.401.2?.24?|*.401.2?.25?|*.401.2?.27?))|(???.?.??.?????.??.????.?.???.??.???&(*.401.1?.17?|*.401.1?.180))";
   УслКРЕ[2] = "???.????.???????.???.?.102.??.420";
   УслАНА[2] = "";

   УслДЕБ[3] = "(???.????.???????.???.?.???.??.???&(*.304.04.340|*.?.401.2?.24?|*2.109.??.272|*.?.401.2?.25?|*.?.401.2?.27?))|(???.??.??.??.??.??.????.?.???.??.???&(*.?.401.1?.17?|*.?.401.1?.180))";
   УслКРЕ[3] = "???.????.???????.???.?.105.3?.440";
   УслАНА[3] = "";

   УслДЕБ[4] = "ЗАБАЛАНС";
   УслКРЕ[4] = "ЗАБ.??.101.??|ЗАБ.??.102.??|ЗАБ.??.105.??";
   УслАНА[4] = "";

 fi;
end;

Func TemplateSaveOK :Logical; -- проверка правильности ввода данных
 ^True;
end;

Func СохранитьИзменения :Logical;
var qq :Integer;
var OK :Logical;
 OK=False;
-- if Защита: ^True; fi;
 if TemplateSaveOK:
   OK=True;
   qq=0;
   if CurrentState=CrdusInserted:
     qq=EnqOkCancel('Необходимо сохранить сделанные изменения.'+Chr(13)+
		    'Сохранить?', mtConfirmation);
     if qq=cmOK     : EditorApply;
     |	qq=cmCancel : OK=False;
     fi;
   |  CurrentState=CrdusModified :
     qq=EnqYesNoCancel('Необходимо сохранить сделанные изменения.'+Chr(13)+
		       'Сохранить?', mtConfirmation);
     if qq=cmYes    : EditorApply;
     |	qq=cmNo     : EditorCancel;
     |	qq=cmCancel : OK=False;
     fi;
   fi;
 fi;
 ^OK;
end;

Func LastNumCard(Card:String; Field:String) :Integer;
var RO, num, res :Integer;
 res=0;
 RO=OpenWorkArea(Card, Field);
 Try
   num=Records(RO);
   res=if(num>0, GetFieldI(RO, num, Field), 0);
 Finally
   CloseWorkArea(RO);
 end;
 ^res;
end;

2-- События полей
Func Field_onEnter(Field:String; Iter:Integer) :Logical;
var nn :Integer;
 if Match(Field, 'A?'): ДобавитьУдалитьСтроки(Field, Iter, True) ; ^False;
 |  Match(Field, 'D?'): ДобавитьУдалитьСтроки(Field, Iter, False); ^False;
 fi;
 if Field="Учреждение"	or Field="ОКПОучреж" or Field="АдресУчреж" or Field="БанкУчреж"
			 : nn=0; ClearVariable(Buf);
			   Buf[1]='"Собственные" реквизиты'; 
			   Buf[2]='Сторонние организации';
			   nn=Alternate("Выберите тип контрагента", Buf, -1);
			   if nn<>0: ВыборКонтрагента(True , if(nn=1, True, False), False, NIL); fi;
			   ^False;
 |  Field="Исполнитель" or Field="ОКПОИспол" or Field="АдресИспол" or Field="БанкИспол"
			 : nn=0; ClearVariable(Buf);
			   Buf[1]='Сторонние организации'; 
			   Buf[2]='"Собственные" реквизиты';
			   nn=Alternate("Выберите тип контрагента", Buf, -1);
			   if nn<>0: ВыборКонтрагента(False, if(nn=2, True, False), False, NIL); fi;
			   ^False;
 |  Field="АмортГруппа"  : nn=0; ClearVariable(Buf);
			   Buf[1]=" 1 группа - все недолговечное имущество со сроком полезного использования от 1 года до 2 лет включительно";
			   Buf[2]=" 2 группа - имущество со сроком полезного использования свыше 2 лет до 3 лет включительно";
			   Buf[3]=" 3 группа - имущество со сроком полезного использования свыше 3 лет до 5 лет включительно";
			   Buf[4]=" 4 группа - имущество со сроком полезного использования свыше 5 лет до 7 лет включительно";
			   Buf[5]=" 5 группа - имущество со сроком полезного использования свыше 7 лет до 10 лет включительно";
			   Buf[6]=" 6 группа - имущество со сроком полезного использования свыше 10 лет до 15 лет включительно";
			   Buf[7]=" 7 группа - имущество со сроком полезного использования свыше 15 лет до 20 лет включительно";
			   Buf[8]=" 8 группа - имущество со сроком полезного использования свыше 20 лет до 25 лет включительно";
			   Buf[9]=" 9 группа - имущество со сроком полезного использования свыше 25 лет до 30 лет включительно";
			  Buf[10]="10 группа - имущество со сроком полезного использования свыше 30 лет";
			   nn=Alternate("Выберите группу амортизации", Buf, -1);
			   if nn<>0: состОС[Iter].АмортГруппа=nn; fi;
			   ^False;
 |  Field="ВидДокОсн"	 : nn=0; ClearVariable(Buf);
			   Buf[1]="Приказ      ";
			   Buf[2]="Распоряжение"; 
			   Buf[3]="Договор     ";
			   nn=Alternate("Выберите основание для составления акта", Buf, -1);
			   if nn<>0: ВидДокОсн=nn; fi;
			   ^False;
 |  Field="ГодВыпуска"	 : состОС[Iter].ГодВыпуска=ВыборДаты(состОС[Iter].ГодВыпуска); ^False;
 |  Field="ФактСрокЭк"	 : Сроки(Field, Iter); ^False;
 |  Field="СрокНовИсп"	 : Сроки(Field, Iter); ^False;
 |  Field="МетодИзноса"  : nn=0; ClearVariable(Buf);
			   Buf[1]="Линейный метод   (утвержден НК РФ)";
			   Buf[2]="Нелинейный метод (утвержден НК РФ)";
			   Buf[3]="Метод уменьшаемого остатка";
			   Buf[4]="Метод списания стоимости по сумме чисел лет срока полезного использования";
			   Buf[5]="Метод списания стоимости пропорционально объему продукции (работ)";
			   Buf[6]="100% начислено амортизации";
			   if УчЗаб:
			   Buf[7]="Не начисляется";
			   fi;
			   nn=Alternate("Выберите метод амортизации (износа)", Buf, -1);
			   if nn<>0: состОС[Iter].МетодИзноса=Buf[nn]; fi;
			   ^False;
 |  Field="ДолПредКом" or Field="ФИОПредКом"
			 : ВыборКомиссии; ^False;
 |  Field="ДолПредКом_2" or Field="ФИОПредКом_2"
			 : ВыборКомиссии_2; ^False;
 |  Field="Кн1" 	 : ВыборДоверенности; ^False;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer);
 if Field="Учреждение"	or Field="ОКПОучреж" or Field="АдресУчреж" or Field="БанкУчреж" :
   if Учреждение="" : ОКПОучреж=""; АдресУчреж=""; БанкУчреж=""; fi;
 |  Field="Исполнитель" or Field="ОКПОИспол" or Field="АдресИспол" or Field="БанкИспол" :
   if Исполнитель="": ОКПОИспол=""; АдресИспол=""; БанкИспол=""; fi;
 |  Field="ДолПредКом"									:
   if ДолПредКом="" : ФИОПредКом=""; ClearVariable(Комиссия); fi;
 |  Field="ФИОПредКом"									:
   if ФИОПредКом="" : ДолПредКом=""; ClearVariable(Комиссия); fi;
 fi;
end;

Func Field_OnValidateN(Field:String; Iter:Integer; Value:Numeric): Logical;
var Lim :Numeric;
 if Value<0: Message("Нельзя вводить отрицательное число.", mtError); ^False; fi;
 if Field="Доля":
   Lim=Доля100П-ДоляСобств[Iter].Доля;
   if (Lim+Value)>100: Message("Общая доля собственности ["+Str((Lim+Value),2)+"] превышает 100%!", mtError); ^False; fi;
 fi;
 ^True;
end;

Func Field_OnValidateI(Field:String; Iter:Integer; Value:Integer): Logical;
 if Value<0: Message("Нельзя вводить отрицательное число.", mtError); ^False; fi;
 ^True;
end;

Func Сотрудники_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var REC :Record;
var стрФИО, стрДОЛ, стрТАБ, name, tmp :String;
 Template.HideEditor(False);
 name=asString(Template.Field); tmp=""; стрФИО=""; стрДОЛ=""; стрТАБ="";
 Try tmp=GetVariableS(name); Except ^Cur; end;
 REC=OpenCardFile("СОТРУДНИКИ", "", SignToRecord(tmp), crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 стрДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
 стрФИО=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ")+" "+GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 стрТАБ=GetCardFieldS("СОТРУДНИКИ", REC, "ПРИЗНАК");
 if name="ФИОРУКучреж"	: ФИОРУКучреж =стрФИО; ДолжнРУКучреж=стрДОЛ;
 |  name="ДолжнРУКучреж": ФИОРУКучреж =стрФИО; ДолжнРУКучреж=стрДОЛ;
 |  name="ФИОРУКиспол"	: ФИОРУКиспол =стрФИО; ДолжнРУКиспол=стрДОЛ;
 |  name="ДолжнРУКиспол": ФИОРУКиспол =стрФИО; ДолжнРУКиспол=стрДОЛ;
 |  name="ФИОМОЛСдал"	: ФИОМОЛСдал  =стрФИО; ДолжнМОЛСдал =стрДОЛ; ТабНомМОЛСдал=стрТАБ;
 |  name="ДолжнМОЛСдал" : ФИОМОЛСдал  =стрФИО; ДолжнМОЛСдал =стрДОЛ; ТабНомМОЛСдал=стрТАБ;
 |  name="ТабНомМОЛСдал": ФИОМОЛСдал  =стрФИО; ДолжнМОЛСдал =стрДОЛ; ТабНомМОЛСдал=стрТАБ;
 |  name="ФИОПрин"	: ФИОПрин     =стрФИО; ДолжнПрин    =стрДОЛ;
 |  name="ДолжнПрин"	: ФИОПрин     =стрФИО; ДолжнПрин    =стрДОЛ;
 |  name="ФИОМОЛПрин"	: ФИОМОЛПрин  =стрФИО; ДолжнМОЛПрин =стрДОЛ; ТабНомМОЛПрин=стрТАБ;
 |  name="ДолжнМОЛПрин" : ФИОМОЛПрин  =стрФИО; ДолжнМОЛПрин =стрДОЛ; ТабНомМОЛПрин=стрТАБ;
 |  name="ТабНомМОЛПрин": ФИОМОЛПрин  =стрФИО; ДолжнМОЛПрин =стрДОЛ; ТабНомМОЛПрин=стрТАБ;
 |  name="ФИОГлБухСдал" : ФИОГлБухСдал=стрФИО;
 |  name="ФИОГлБухПрин" : ФИОГлБухПрин=стрФИО;
 fi;
 ^"";
end;

Func ПО_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var кодПО, наимПО, tmp, name :String;
 Template.HideEditor(False);
 name=asString(Template.Field);
 tmp=AnaElection("П.*"); if tmp="": ^Cur; fi;
 кодПО=tmp; НаимПО=if(Name_A(кодПО)<>"" and Name_A(кодПО)<>" ", Name_A(кодПО), кодПО);
 if name="ПОучреж"     :      ПОучреж=наимПО; КодПОучреж=кодПО;
 |  name="КодПОучреж"  :      ПОучреж=наимПО; КодПОучреж=кодПО;
 |  name="ПОиспол"     :      ПОиспол=наимПО; КодПОиспол=кодПО;
 |  name="КодПОиспол"  :      ПОиспол=наимПО; КодПОиспол=кодПО;
 |  name="МестоОбъекта": МестоОбъекта=наимПО;
 fi;
 ^"";
end;

Func Счет_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var tmp, name :String;
 Template.HideEditor(False);
 name=asString(Template.Field);
 if name="СчетУНФА_":
   tmp=AccountElection(МаскаСЧ); 
   if tmp="": ^Cur; fi; 
   if Match(tmp, "???.????.???????.???.?.10?.??.3??")	: tmp=SubStr(tmp, 1, 30)+"???";
   |  Match(tmp, "???.??.??.??.??.??.????.?.10?.??.3??"): tmp=SubStr(tmp, 1, 33)+"???";
   |  Match(tmp, "ЗАБ.??.10?.??")			: tmp=tmp;
   else tmp="";
   fi;
   СчетУНФА=tmp; 
 fi;
 ^"";
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 УслАН, tmp, name, Фильтр, tmp1, tmp2 :String;
var REC, rr :Record;
var RO, k, j :Integer;
 Template.HideEditor(False);
 name=asString(Template.Field);
 if КодАнаУНФА="":
   Message("Не указан код учета НФА!", mtWarning);
   Template.Field="КодАнаУНФА";
   ^Cur;
 fi;
 УслАН=МаскаГРОС(SubStr(КодАнаУНФА, 5, 6));
 if УслАН<>"":
   tmp=ПризнакКонстанта(УслАН);
   if tmp="" : tmp=AnaElection(УслАН); fi;
   if tmp="" : ^""; fi;
   if tmp<>"": tmp=SubStr(tmp, 6, 2);  fi;
 fi;
 Фильтр="ФТР_РАЗД='"+SubStr(tmp, 1, 2)+"'";
 tmp1=""; rr=NIL;
 if name="КОДОКОФ":
   tmp=SubStr(КОДОКОФ, 4, 7);
   if КОДОКОФ<>"" and Length(tmp)=7:
     RO=OpenWorkArea("РПО_ОКОФ", "", "1=0");
     Try
       for j=1 to 7 do
	 tmp1=" and Match(ФТР_КОДА, '"+SubStr(tmp, 1, 7-j+1)+RepStr("?", j-1)+"')";
	 tmp2=Фильтр+tmp1;
	 SetFilter(RO, tmp2);
	 k=Records(RO);
	 if k>0: if j=1 and k=1: rr=GetRecordKey(RO, 1); tmp1=""; fi; Фильтр=Фильтр+tmp1; Break; fi;
       od;
     Finally
       CloseWorkArea(RO);
     end;
   fi;
 fi;
 REC=OpenCardFile(PlanVar("НФА")+"\Картотеки\"+"ВыборРПО_ОКОФ.bro", Фильтр, rr, crdRecordOnly);
 if REC=NIL: ^""; fi;
 k=Int(GetCardFieldS("РПО_ОКОФ", REC, "АМОРТ_ГР"));
 if k>0:
   АМОРТГРУППА=k;
   if ДАТАПРИНБУХ>1.1.100: СОСТОС[1].СРОКНОВИСП=ВзятьСрокАмортГруппы(k); fi;
   КОДОКОФ=GetCardFieldS("РПО_ОКОФ", REC, "КОД_ОКОФ");
 fi;
 ^"";
end;

Func ВзятьДанныеКонтрагента(ANA:String; mode:String; Наше:Logical) :String;
var res, t1, t2, tmp :String;
var REC, REB :Record;
var ROK, ROB, num :Integer;
 res="";
 if Up(SubStr(ANA, 1, 2))<>"К." and Наше=False: ^""; fi;
 ROK=OpenWorkArea("КОНТРАГЕНТ", "", "1=0");
 Try
   if Наше:
     SetFilter(ROK, "НАШЕ");
     num=Records(ROK);
     if num<1: REC=NIL;
     |	num=1: REC=GetRecordKey(ROK, 1);
     |	num>1: REC=GetRecordKey(ROK, 1);
	       SetFilter(ROK, "НАШЕ and РПО_УМОЛЧАНИЕ");
	       if Records(ROK)>0: REC=GetRecordKey(ROK, 1); fi;
     fi;
   else
     REC=SignToRecord(ANA, False);
   fi;
   if REC=NIL: ^""; fi;
   SetFilter(ROK, "Ukey="+RecordToString(REC));
   if mode="КИМЯ": res=GetFieldS(ROK, 1, "КОРИМЯ");
   |  mode="ОКПО": res=GetFieldS(ROK, 1, "ОКПО");
   |  mode="АДРС": tmp=GetFieldS(ROK, 1, "ЮРАДРЕС");
		   t1=GetFieldS(ROK, 1, "ТЕЛЕФОН"); t1=if(t1="", "", "тел. "+t1);
		   t2=GetFieldS(ROK, 1, "ФАКС");    t2=if(t2="", "", t2+" (факс)");
		   if tmp<>"": tmp=tmp+"; "+t1; else tmp=t1; fi;
		   if tmp<>"": tmp=tmp+"; "+t2; else tmp=t2; fi;
		   res=tmp;
   |  mode="БАНК": ROB=OpenWorkArea("БАНК_СЧЕТА", "", "КОНТРАГЕНТ="+RecordToString(REC));
		   Try
		     num=Records(ROB);
		     if num<1: REB=NIL;
		     |	num=1: REB=GetRecordKey(ROB, 1);
		     |	num>1: REB=GetRecordKey(ROB, 1);
			       SetFilter(ROB, "УМОЛЧАНИЕ and КОНТРАГЕНТ="+RecordToString(REC));
			       if Records(ROB)>0: REB=GetRecordKey(ROB, 1); fi;
		     fi;
		     if REB=NIL: ^""; fi;
		     SetFilter(ROB, "Ukey="+RecordToString(REB));
		     res="р/с: "+GetFieldS(ROB, 1, "РСЧЕТ")+" в "+GetFieldS(ROB, 1, "БАНК")+", "+GetFieldS(ROB, 1, "ГОРОД")+", "+
			 "к/с: "+GetFieldS(ROB, 1, "КСЧЕТ")+", БИК "+GetFieldS(ROB, 1, "БИК");
		   Finally
		     CloseWorkArea(ROB);
		   end;
   |  mode="ФРУК": res=GetFieldS(ROK, 1, "ФИОРУК");
   |  mode="ДРУК": res=GetFieldS(ROK, 1, "ДОЛЖНРУК");
   |  mode="ФКАС": res=GetFieldS(ROK, 1, "ФИОКАСС");
   |  mode="ДКАС": res=GetFieldS(ROK, 1, "ДОЛЖНКАСС");
   |  mode="ФБУХ": res=GetFieldS(ROK, 1, "ФИОБУХ");
   |  mode="ДБУХ": res=GetFieldS(ROK, 1, "ДОЛЖНБУХ");
   fi;
 Finally
   CloseWorkArea(ROK);
 end;
 ^res;
end;
Func ВзятьСчетАморт(СЧНФА:String) :String;
var tmp :String;
 if Match(СЧНФА, "???.????.???????.???.?.???.??.???")=False: ^""; fi;
 tmp=SubStr(СЧНФА, 24, 3);
-- if tmp="101": if Name_S(SubStr(СЧНФА, 1, 30)+if(Приход, "310", "410"))=" ": ^""; fi;
-- |  tmp="102": if Name_S(SubStr(СЧНФА, 1, 30)+if(Приход, "320", "420"))=" ": ^""; fi;
-- fi;
 if tmp="101":tmp=SubStr(СЧНФА, 28, 2);^"*.104."+tmp+".410";

  | tmp="102":tmp=SubStr(СЧНФА, 28, 2);^"*.104.39.420";
 fi;
 ^"";
end;

Func ВзятьАмортГруппу(aИНВRO:Integer; aКОДИНВ:String; aНФАRO:Integer; aКОДНФА:String; aДПУ:Date) :Integer;
var amgrИНВ, amgrНФА, ppинв, ppнфа, hh, pp :Integer;
var RECинв, RECнфа :Record;
 amgrИНВ=0; amgrНФА=0;
 if aИНВRO>0 and Up(WorkAreaCardFile(aИНВRO))="РПО_ИНВКАРТ_ОС":
   RECинв=SignToRecord(aКОДИНВ, False);
   if RECинв<>NIL:
     ppинв=GetRecordNumber(aИНВRO, RECинв);
     if ppинв>0: Try amgrИНВ=GetFieldI(aИНВRO, ppинв, "АМОРТ_ГРУП"); Except amgrИНВ=0; end; fi;
   fi;
 fi;
 if amgrИНВ=0:
   if aНФАRO>0 and Up(WorkAreaCardFile(aНФАRO))="РПО_НФА":
     ClearVariable(Buf);
     if aДПУ>31.12.2008: hh=3; Buf[1]=" 09"; Buf[2]="	"; Buf[3]=" 02";
     |	aДПУ<01.01.2007: hh=1; Buf[1]=" 02";
     else		 hh=2; Buf[1]="   "; Buf[2]=" 02";
     fi;
     RECнфа=SignToRecord(aКОДНФА, False);
     if RECнфа<>NIL:
       ppнфа=GetRecordNumber(aНФАRO, RECнфа);
       if ppнфа>0:
	 for pp=1 to hh do if amgrНФА=0: Try amgrНФА=GetFieldI(aНФАRO, ppнфа, "КЛГРУПП"+Trim(Buf[pp])); Except amgrНФА=0; end; fi; od;
       fi;
     fi;
   fi;
 fi;
 ^if(amgrИНВ>0, amgrИНВ, amgrНФА);
end;

Func ОбновлениеАктовПриход :Logical;
var ROднфа, ROсотр, ROснфа, ROинвк, num, len, kk, jj, ii, xx, LastNum, pN, lN :Integer;
var CRDднфа, CRDсотр, CRDснфа, CRDинвк, ANA, КОДНФА, КОДИНВ, КОДСЧТ, КОДВЕД, Value, tmp :String;
var ДЕБКНТ, КРЕКНТ, ДЕБМОЛ, КРЕМОЛ, ДЕБПДР, КРЕПДР :String;
var OK, Режим, Work :Logical;
var dBT, dET, ddd, dd_tmp :Date;
var Sum1, Sum2 :Numeric;
var REC :Record;
 OK=False;
 CRDднфа="РПО_ОПЕРАЦИИДНФА";
 CRDсотр="СОТРУДНИКИ";
 CRDснфа="РПО_НФА";
 CRDинвк="РПО_ИНВКАРТ_ОС";
 REC=IntegerToRecord(ДНФАID);
 if REC<>NIL: OK=RecordExists(CRDднфа, REC); fi;
 if not OK: Message("Не найдена ссылка на операцию движения НФА.^MРасчет невозможен!", mtError); ^False; fi;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(3, "Считывание информации операции движения НФА ...");
 ROднфа=OpenWorkArea(CRDднфа, "", "Ukey="+RecordToString(REC));
 ROсотр=OpenWorkArea(CRDсотр, "", "1=0");
 ROснфа=OpenWorkArea(CRDснфа, "", "1=0");
 ROинвк=OpenWorkArea(CRDинвк, "", "1=0");
 Try
   if Records(ROднфа)=1:
     ProgressPos(1);
     Refresh(False);
     ProgressPos(2);
     ИнициализироватьУсловия(True);
     dBT=GetFieldD(ROднфа, 1, "ДАТОПЕР");
     dET=dBT+1;
     len=LengthOfArray(УслАНА);
     ANA=МаскаСЧ+"{НФА.*&ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"}";
     ClearVariable(НФА_ИНВ_COD); ClearVariable(НФА_ИНВ_СУМ); ClearVariable(НФА_ИНВ_КОЛ); ClearVariable(ДОПАНА);
     ProgressPos(3);
     ДЕБКНТ=""; КРЕКНТ=""; ДЕБМОЛ=""; КРЕМОЛ=""; ДЕБПДР=""; КРЕПДР="";
     -- Отбираем комбинации НФА с ИНВ и запоминаем дополнительную информацию
     for Transaction kk=ANA, dBT, dET do
       Work=False;
       КОДСЧТ=TransDeb(kk);
       Sum1=TransSum(kk);
       Sum2=TransSum(kk, "КОЛ");
       for ii=1 to len do
	 OK=True;
	 if УслАНА[ii]<>"":
	   OK=False;
	   for jj=1 to TransSignCount(kk) do
	     OK=РАБ.НФА.FUNC_LIB.ПризнакСоотвМаске(TransSignName(kk, jj), УслАНА[ii]);
	     if OK: Break; fi;
	   od;
	 fi;
	 OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(КОДСЧТ,	  УслДЕБ[ii]));
	 OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(TransCre(kk), УслКРЕ[ii]));
	 if OK: Work=True; Break; fi;
       od;
       if Work:
	 КОДНФА=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "НФА", True));
	 КОДИНВ=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "УЧН", True));
	 if flgБезУЧН and КОДИНВ="": КОДИНВ="УЧН.#@#@#"; fi;
	 if КОДНФА<>"" and КОДИНВ<>"":
	   if Match(КОДСЧТ, "???.????.???????.???.?.10?.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
	   |  Match(КОДСЧТ, "???.??.??.??.??.??.????.?.101.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 33)+"???";
	   |  Match(КОДСЧТ, "ЗАБ.??.10?.??")			   : if flgУчтЗАБ: КОДСЧТ=КОДСЧТ; else КОДСЧТ=""; fi;
	   else КОДСЧТ="";
	   fi;
	   if КОДСЧТ<>"":
	     Value=КОДНФА+"|"+КОДИНВ+"|"+КОДСЧТ+"|"+if(Sum2>0.00, Str(Sum1/Sum2, 2), "0.00");
	     jj=SearchInArray(НФА_ИНВ_COD, Value, True, 1);
	     if jj<1:
	       ii=InsertInArraySort(НФА_ИНВ_COD, Value);
	       InsertInArray(НФА_ИНВ_СУМ, ii, Sum1);
	       InsertInArray(НФА_ИНВ_КОЛ, ii, Sum2);
	       InsertInArray(ДОПАНА, ii, "");
	     else
	       НФА_ИНВ_СУМ[jj]=НФА_ИНВ_СУМ[jj]+Sum1;
	       НФА_ИНВ_КОЛ[jj]=НФА_ИНВ_КОЛ[jj]+Sum2;
	     fi;
	     -- Вставляем дополнительную аналитику
	     if ДЕБКНТ="": ДЕБКНТ=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "К",   True )); fi;
	     if КРЕКНТ="": КРЕКНТ=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "К",   False)); fi;
	     if ДЕБМОЛ="": ДЕБМОЛ=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "МОЛ", True )); fi;
	     if КРЕМОЛ="": КРЕМОЛ=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "МОЛ", False)); fi;
	     if ДЕБПДР="": ДЕБПДР=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "П",   True )); fi;
	     if КРЕПДР="": КРЕПДР=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "П",   False)); fi;
	   fi; --КОДСЧТ<>""
	   dd_tmp=РАБ.НФА.B01.ВзятьДУЧЕТ(КОДНФА,КОДИНВ);
	   if ДАТАПРИНБУХ=1.1.100: ДАТАПРИНБУХ=dd_tmp; else if dd_tmp<ДАТАПРИНБУХ: ДАТАПРИНБУХ=dd_tmp; fi; fi;
	 fi; --КОДНФА<>"" and КОДИНВ<>""
       fi; --Work
     end; -- Transaction
     len=LengthOfArray(НФА_ИНВ_COD);
     if len=0: Message("НФА для создания акта^Mо приеме-передаче групп объектов основных средств (кроме  зданий, сооружений)^Mне найдено!", mtWarning); ^False; fi;
     -- Ищем последние инвентарные номера
     ClearVariable(ИНВ_MSK); ClearVariable(ИНВ_INI); ClearVariable(ИНВ_NUM);
     ShowProgress(len, "Поиск последнего инвентарного номера...");
     kk=0;
     for ii=1 to len do
       ProgressPos(ii);
       КОДНФА=ExtractWord(1, НФА_ИНВ_COD[ii], "|");
       КОДСЧТ=ExtractWord(3, НФА_ИНВ_COD[ii], "|");
       if Match(КОДСЧТ, "???.????.???????.???.?.101.??.???"):
	 tmp=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.МаскаВедИнвНомер(КОДСЧТ, КОДНФА);
	 if SearchInArray(ИНВ_MSK, tmp, True, 1)<0:
	   kk=InsertInArraySort(ИНВ_MSK, tmp);
	   pN=Pos("?", tmp);
	   lN=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.ДлинаНумерации;
	   InsertInArray(ИНВ_INI, kk, Str(pN)+"|"+Str(lN));
	   SetFilter(ROинвк, "Match(ИНВ_ВЕД,'"+tmp+"')");
	   num=Records(ROинвк);
	   if num>0:
	     ClearVariable(BufI);
	     for jj=1 to num do tmp=GetFieldS(ROинвк, jj, "ИНВ_ВЕД"); BufI[jj]=Int(SubStr(tmp, pN, lN)); od;
	     SortArray(BufI, True);
	     InsertInArray(ИНВ_NUM, kk, BufI[num]+1);
	     ClearVariable(BufI);
	   else
	     InsertInArray(ИНВ_NUM, kk, 1);
	   fi;
	 fi;
       fi;
     od;
     -- Заполняем информацию НАЧАЛО
     -- Заполняем акт
     ShowProgress(5, "Заполняем акт...");
     ProgressPos(1);
     КОДФОРМЫ="ОКУД_0306031";
     if ДАТААКТА=1.1.100: ДАТААКТА=dBT; fi;
     jj=LastNumCard("РПО_АКТЫ_УНФА", "НОМЕРАКТА")+1;
     if НОМЕРАКТА=0: НОМЕРАКТА=jj; БУМНОМЕР=Str(jj); fi;
     -- МЫ
     ProgressPos(2);
     if Trim(УЧРЕЖДЕНИЕ)="":
       УЧРЕЖДЕНИЕ=ВзятьДанныеКонтрагента("", "КИМЯ", True);
	ОКПОУЧРЕЖ=ВзятьДанныеКонтрагента("", "ОКПО", True);
     else
       if Trim(ОКПОУЧРЕЖ)="":  ОКПОУЧРЕЖ=ВзятьДанныеКонтрагента("", "ОКПО", True); fi;
     fi;
     if Trim(АДРЕСУЧРЕЖ)="" : АДРЕСУЧРЕЖ=ВзятьДанныеКонтрагента("", "АДРС", True); fi;
     if Trim(БАНКУЧРЕЖ)=""  :  БАНКУЧРЕЖ=ВзятьДанныеКонтрагента("", "БАНК", True); fi;
     if Trim(ПОУЧРЕЖ)=""    : tmp=ДЕБПДР; КОДПОУЧРЕЖ=tmp; ПОУЧРЕЖ=if(Trim(Name_A(tmp))<>"", Name_A(tmp), tmp); fi;
     -- Исполнитель
     ProgressPos(3);
     if Trim(ИСПОЛНИТЕЛЬ)="":
       tmp=КРЕКНТ;
       ИСПОЛНИТЕЛЬ=ВзятьДанныеКонтрагента(tmp, "КИМЯ", False);
	 ОКПОИСПОЛ=ВзятьДанныеКонтрагента(tmp, "ОКПО", False);
     fi;
     if Trim(АДРЕСИСПОЛ)="" : tmp=КРЕКНТ; АДРЕСИСПОЛ=ВзятьДанныеКонтрагента(tmp, "АДРС", False); fi;
     if Trim(БАНКИСПОЛ)=""  : tmp=КРЕКНТ;  БАНКИСПОЛ=ВзятьДанныеКонтрагента(tmp, "БАНК", False); fi;
     if Trim(ПОИСПОЛ)=""    : tmp=КРЕПДР; КОДПОИСПОЛ=tmp; ПОИСПОЛ=if(Trim(Name_A(tmp))<>"", Name_A(tmp), tmp); fi;
     ProgressPos(4);
     -- Подписи
     if Trim(ФИОРУКУЧРЕЖ)="":
	 ФИОРУКУЧРЕЖ=ВзятьДанныеКонтрагента("", "ФРУК", True);
       ДОЛЖНРУКУЧРЕЖ=ВзятьДанныеКонтрагента("", "ДРУК", True);
     fi;
     if ДАТАПОДРУК=1.1.100: ДАТАПОДРУК=dBT; fi;
     if Trim(ФИОГЛБУХПРИН)="": ФИОГЛБУХПРИН=ВзятьДанныеКонтрагента("", "ФБУХ", True); fi;
     if Trim(ФИОРУКИСПОЛ)="":
	 tmp=КРЕКНТ;
	 ФИОРУКИСПОЛ=ВзятьДанныеКонтрагента(tmp, "ФРУК", False);
       ДОЛЖНРУКИСПОЛ=ВзятьДанныеКонтрагента(tmp, "ДРУК", False);
     fi;
     if ДАТАПОДИСПОЛ=1.1.100: ДАТАПОДИСПОЛ=dBT; fi;
     if Trim(ФИОГЛБУХСДАЛ)="": tmp=КРЕКНТ; ФИОГЛБУХСДАЛ=ВзятьДанныеКонтрагента(tmp, "ФБУХ", False); fi;
     -- МОЛ
     ProgressPos(5);
     tmp=ДЕБМОЛ;
     REC=SignToRecord(tmp, False);
     if REC<>NIL:
       SetFilter(ROсотр, "Ukey="+RecordToString(REC));
       if Records(ROсотр)=1:
	  ДОЛЖНМОЛПРИН = GetFieldS(ROсотр, 1, "ДОЛЖНОСТЬ.ДОЛЖ");
	      tmp = GetFieldS(ROсотр, 1, "ИНИЦИАЛЫ");
	    Value = GetFieldS(ROсотр, 1, "ФАМИЛИЯ");
	    ФИОМОЛПРИН = if(Value="", GetFieldS(ROсотр, 1, "ФИОТ"), Value+" "+if(tmp<>"..", tmp, ""));
	 ТАБНОММОЛПРИН = GetFieldS(ROсотр, 1, "ПРИЗНАК");
	 if ДАТАМОЛПРИН=1.1.100: ДАТАМОЛПРИН=dBT; fi;
	 if Trim(ДОЛЖНПРИН)="" : ДОЛЖНПРИН = ДОЛЖНМОЛПРИН; fi;
	 if Trim(ФИОПРИН)=""   :   ФИОПРИН =   ФИОМОЛПРИН; fi;
	 if    ДАТАПРИН=1.1.100:    ДАТАПРИН=dBT; fi;
       fi;
     fi;
     -- ***************
     -- ***************
     -- **	     **
     -- **  ТАБЛИЦА  **
     -- **	     **
     -- ***************
     -- ***************
     ClearVariable(состОС);
     SetFilter(ROинвк, "");
     SetFilter(ROснфа, "");
     LastNum=LastNumCard(CRDинвк, "Номер");
     for ii=1 to len do
       kk=InsertFrame(состОС, ii);
       КОДНФА=ExtractWord(1, НФА_ИНВ_COD[ii], "|");
       КОДИНВ=ExtractWord(2, НФА_ИНВ_COD[ii], "|");
       КОДСЧТ=ExtractWord(3, НФА_ИНВ_COD[ii], "|");
       Value="";
       КОДВЕД="";
       ddd=1.1.100;
       ShowProgress(len, "Обработка НФА с кодом "+Trim(SubStr(КОДНФА, 5, 255))+if(КОДИНВ<>"УЧН.#@#@#", " и инвентарным номером "+Trim(SubStr(КОДИНВ, 5, 255)), " и без инвентарного номера")+"...");
       ProgressPos(ii);
       состОС[ii].ОС	   = КОДНФА;
       состОС[ii].НАИМЕНОС = if(Trim(Name_A(КОДНФА))<>"", Name_A(КОДНФА), КОДНФА);
       if КОДИНВ<>"УЧН.#@#@#":
	 состОС[ii].ИНВНОМЕР = КОДИНВ;
	 Value="ИНВВЕД."+КОДНФА+"."+КОДИНВ;
	 if Trim(Name_A(Value))="":
	   BeginChanging(ROинвк);
	   Try
	     REC=SignToRecord(Value, False);
	     OK=False; Work=False; xx=0;
	     if REC<>NIL: xx=GetRecordNumber(ROинвк, REC); Work=LockRecord(ROинвк, xx, 0); else xx=InsertRecord(ROинвк); Work=True; fi;
	     if Work:
	       if Match(КОДИНВ, "УЧН.?????"):
		 ANA=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.МаскаВедИнвНомер(КОДСЧТ, КОДНФА);
		 jj=SearchInArray(ИНВ_MSK, ANA);
		 if jj>0:
		   pN=Int(ExtractWord(1, ИНВ_INI[jj], "|"));
		   lN=Int(ExtractWord(2, ИНВ_INI[jj], "|"));
		   num=lN-Length(Str(ИНВ_NUM[jj]));
		   tmp=RepStr("0", num)+Str(ИНВ_NUM[jj]);
		   ANA=Delete(ANA, pN, lN);
		   ANA=Insert(tmp, ANA, pN);
		   КОДВЕД=ANA; --Ведомственный номер по умолчанию
		   OK=True;
		 fi;
	       else
		 КОДВЕД=Trim(SubStr(КОДИНВ, Length(GetAnaGlossary(КОДИНВ))+2, 255)); --Старый присвоенный инвентарный номер
	       fi;
	       xx=PutFieldS(ROинвк, xx, "ИНВ",	   Trim(SubStr(КОДИНВ, Length(GetAnaGlossary(КОДИНВ))+2, 255)));
	       xx=PutFieldS(ROинвк, xx, "НФА",	   КОДНФА);
	       xx=PutFieldS(ROинвк, xx, "СЧЕТНФА", КОДСЧТ);
	       xx=PutFieldS(ROинвк, xx, "ИНВ_ВЕД", КОДВЕД);
	       LastNum=LastNum+1;
	       xx=PutFieldI(ROинвк, xx, "НОМЕР",    LastNum);
	       xx=PutFieldS(ROинвк, xx, "НОМЕРБУМ", Str(LastNum));
	       xx=PutFieldD(ROинвк, xx, "DD",	    dBT);
	       if OK: ИНВ_NUM[jj]=ИНВ_NUM[jj]+1; fi;
	     fi;
	     EndChanging(ROинвк);
	   Except
	     CancelChanging(ROинвк);
	   end;
	   состОС[ii].ИНВНОМЕРВЕД = КОДВЕД;
	 else
	   состОС[ii].ИНВНОМЕРВЕД = Trim(Name_A(Value)); --Ведомственный номер уже присвоен
	 fi;
  --	   состОС[ii].ДатаВвЭксп  = Раб.СТР.MinDebDat2(РАБ.НФА.B01.ВзятьДЭКСПЛ(КОДНФА, КОДИНВ), dBT);
	 состОС[ii].ДатаВвЭксп=Раб.НФА.B01.ВзятьДЭКСПЛ(КОДНФА,КОДИНВ);
	 состОС[ii].ГодВыпуска	= РАБ.НФА.B01.ПолеПоПризнакуД(Value,'ДАТА_ИЗГ');
	 if состОС[ii].ГодВыпуска = 1.1.100: состОС[ii].ГодВыпуска  = dBT; fi;
	 состОС[ii].ЗавНомер	= РАБ.НФА.B01.ПолеПоПризнакуС(tmp,'ЗАВОД_НОМ');
	 ddd=Раб.СТР.MinDebDat2(РАБ.НФА.B01.ВзятьДУЧЕТ(КОДНФА, КОДИНВ),состОС[ii].ДатаВвЭксп);
       fi;
       --
       Sum1=0.00; Sum2=0.00;
       if КОДИНВ<>"УЧН.#@#@#": Sum1=Saldo(КОДСЧТ+"{"+КОДНФА+"&"+КОДИНВ+"}", dET); else Sum1=НФА_ИНВ_СУМ[ii]; fi;
       состОС[ii].БАЛАНССТОИМ = Sum1;
       состОС[ii].ПОКВСЕГО    = Sum1;
--	 состОС[ii].ПОКВСЕГО	= Round(состОС[ii].ПОКСТОИМ*НФА_ИНВ_КОЛ[ii], 2);
       состОС[ii].ПОКСТОИМ    = if(НФА_ИНВ_КОЛ[ii]>0.00, Round(НФА_ИНВ_СУМ[ii]/НФА_ИНВ_КОЛ[ii], 2), 0.00);
       --
       tmp=ВзятьСчетАморт(КОДСЧТ);
       if tmp<>"" and КОДИНВ<>"УЧН.#@#@#": Sum2=Abs(Saldo(tmp+"{"+КОДНФА+"&"+КОДИНВ+"}", dET)); else Sum2=0.00; fi;
       состОС[ii].СУМНАЧАМОРТ=Sum2;
       состОС[ii].ОСТСТОИМ=Abs(Sum1-Sum2);
       --
       if ddd=1.1.100: ddd=dBT; fi;
       if состОС[ii].ПОКСТОИМ <  Общ_Пер('ОС_100',  ddd) and состОС[ii].ПОКСТОИМ > Общ_Пер('ОС_РАСХ', ddd) and Sum2>0.00: состОС[ii].МЕТОДИЗНОСА="100% начислено амортизации";
       |  состОС[ii].ПОКСТОИМ <= Общ_Пер('ОС_РАСХ', ddd):								  состОС[ii].МЕТОДИЗНОСА="Не начисляется";
       else состОС[ii].МЕТОДИЗНОСА = "";
       fi;
       --
       num = ВзятьАмортГруппу(ROинвк, Value, ROснфа, КОДНФА, ddd);
       if num>0 and состОС[ii].МЕТОДИЗНОСА = "":
	 состОС[ii].АМОРТГРУППА = num;
	 состОС[ii].СРОКНОВИСП	= ВзятьСрокАмортГруппы(num);
	 состОС[ii].МЕТОДИЗНОСА = "Линейный метод   (утвержден НК РФ)";
       fi;
     od;
     -- Заполняем акт КОНЕЦ
   fi; --Records(CRDднфа)=1:
 Finally
   CloseWorkArea(ROинвк);
   CloseWorkArea(ROснфа);
   CloseWorkArea(ROсотр);
   CloseWorkArea(ROднфа);
   CloseProgress;
   ToggleAutorefresh(Режим);
 end;
 ClearVariable(NN);
 ^True;
end;

Func ВзятьДатуВводвЭксплуатЖурОст(СЧ26:String; КОДНФА:String; КОДИНВ:String; ddBeg:Date; ddEnd:Date) :Date;
var x, RO, OA, i, num :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;
 ANA=СЧ26+"/00"+"{"+КОДНФА+"&"+КОДИНВ+"}";
 sumTurn=Turn(ANA, ddBeg, ddEnd);
-- for Transaction x=ANA, ddBeg, ddEnd, Reverse do
 for Transaction x=ANA, ddBeg, ddEnd  do
   REC=TransRecord(x);
   if TransCardFile(x)="РПО_ОСТ_НФА" and REC<>NIL then 
     i=ПроводНомерПризнака(x,'ММДД.');
     if i>0:ss=ПроводИмяПризн(x,i);
	i=ПроводНомерПризнака(x,'ГГ.');
	if i>0:-- собираем dd
	   ss=ВыделитьСлово(3,ss,'.')+'.'+ВыделитьСлово(2,ss,'.')+'.';
	   ss=ss+ВыделитьСлово(2,ПроводИмяПризн(x,i),'.');
	   dd=Строкувдату(ss);
	 | true:ss='';
	fi;
     fi;
     if длина(ss)>1:
	^dd;
     fi;
     RO=OpenWorkArea("РПО_ОСТ_НФА", "", "UKey="+RecordToString(REC));
     Try
       if Records(RO)=1:
	 OA=OpenArray(RO, 1, "ПОЗИЦИИОС", "", "Match(СЧНФА, '"+СЧ26+"') and НФА='"+КОДНФА+"' and УЧНОМ='"+КОДИНВ+"'");
	 num=Records(OA);
	 if num>0:
	   for i=1 to num do
	     sumBase=GetFieldN(OA, i, "СУМНФА");
	     if sumTurn=sumBase: 
	       dd1=GetFieldD(OA, i, "ДЭКСПЛ");
	       dd2=GetFieldD(OA, i, "ДУЧЕТ");
	       if dd1<dd2 and dd1>1.1.1900: dd=dd1;
	       |  dd1>dd2 and dd2>1.1.1900: dd=dd2;
	       else dd=1.1.100;
	       fi;
	       if dd<>1.1.100: OK=True; Break; fi;
	     fi;
	   od;
	 fi;
	 CloseWorkArea(OA);
       fi;
     Finally
       CloseWorkArea(RO);
     end;

     if OK: Break; fi;
   fi;
 od;
 if dd<1.1.1800:
   ANA='+'+СЧ26+"/*&~"+СЧ26+"{"+КОДНФА+"&"+КОДИНВ+"&ГГ.*&ММДД.*}";  -- отработать принятие к учету нового ОС и б/у, для нового - дата проводки, а для б/у?
   for Transaction x=ANA, ddBeg, ddEnd	do
     i=ПроводНомерПризнака(x,'ММДД.');
     if i>0:ss=ПроводИмяПризн(x,i);
	i=ПроводНомерПризнака(x,'ГГ.');
	if i>0:-- собираем dd
	   ss=ВыделитьСлово(3,ss,'.')+'.'+ВыделитьСлово(2,ss,'.')+'.';
	   ss=ss+ВыделитьСлово(2,ПроводИмяПризн(x,i),'.');
	   dd=Строкувдату(ss);
	 | true:ss='';
	fi;
     fi;
     if длина(ss)>1:
	^dd;
     fi;
   od;
 fi;

 if dd<1.1.1800:
   ANA='+'+СЧ26+"/*&~"+СЧ26+"{"+КОДНФА+"&"+КОДИНВ+"}";	-- отработать принятие к учету нового ОС и б/у, для нового - дата проводки, а для б/у?
   for Transaction x=ANA, ddBeg, ddEnd	do
     dd=TransDate(x);
   od;
 fi;

 ^dd;
end;

Func ОбновлениеАктовРасход :Logical;
var REC :Record;
var dBT, dET, dd ,ddd, dd_tmp :Date;
var ROднфа, ROсотр, ROснфа, ROинвк, num, len, k, y, j, i, x, LastNum ,wa_control,rs:Integer;
var pN, lN :Integer;
var Sum1, Sum2 :Numeric;
var CRDсотр, CRDснфа, CRDинвк, УслПР, КОДНФА, КОДИНВ, СЧК, tmp, tmp2, ВЕД, v1 ,УслАнПров:String;
var OK, Режим, Work ,ll:Logical;
var ДНФАID_16,ss :s;

var RecWrk: Record;
var BlnWrk,CrdWrk,fielddate: String;

 if CRD<>'' and RECCRD<>0:
    CrdWrk=CRD;
    RECWrk=IntegerToRecord(Abs(RECCRD));
    blnWrk=BLNCRD;
    fielddate  = РАБ.БЮДЖЕТ2005.ПолеДатыПроводкиКартотеки(CrdWrk);
    if fielddate="": fielddate = 'ДАТАОПЕР'; fi;
  | true:
    CrdWrk="РПО_ОПЕРАЦИИДНФА";
    RECWrk=IntegerToRecord(Abs(ДНФАID));
    blnWrk="НФА.ЖУР.ОПЕРАЦИИДНФА";
    fielddate='ДАТОПЕР';
 fi;
 ДНФАID_16 = Str16(RecordToInteger(RecWRK));

 OK=False;
 CRDсотр="СОТРУДНИКИ"; CRDснфа="РПО_НФА"; CRDинвк="РПО_ИНВКАРТ_ОС";

 if RECWrk<>NIL: OK=RecordExists(CrdWrk, RECWrk); fi;
 if OK=False: Message("Не найдена ссылка на операцию движения НФА.^MРасчет невозможен!", mtError); ^False; fi;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ROднфа=OpenWorkArea(CrdWrk, "", "Ukey="+RecordToString(RECWrk));
 ROсотр=OpenWorkArea(CRDсотр, "", "1=0");
 ROснфа=OpenWorkArea(CRDснфа, "", "1=0");
 ROинвк=OpenWorkArea(CRDинвк, "", "1=0");
 ShowProgress(3, "Считывание информации операции движения НФА ...");
 Try
   ProgressPos(1);
   Refresh(False);
   ProgressPos(2);
   ИнициализироватьУсловия(False);
   dBT=GetFieldD(ROднфа, 1, fielddate);
   dET=dBT+1;
   len=LengthOfArray(УслАНА);
   if CrdWrk='РПО_НФА_СПРАВКА':
      wa_control=OpenWorkArea('РПО_НФА_СПРАВКА_ПРОВОДКИ','','НФА_СПРАВКА="'+GetFieldS(ROднфа, 1, "НФА_СПРАВКА")+'"');
      rs=records(wa_control);
      УслАнПров='{НФА.*';
      УслАнПров=Раб.НФА.B01.ab(УслАнПров,'&',GetFieldS(ROднфа, 1, "МХЭ_ОТККОД_ОБЩ"));
      УслАнПров=Раб.НФА.B01.ab(УслАнПров,'&',GetFieldS(ROднфа, 1, "МОЛ_ОТККОД"));
      ss=GetFieldS(ROднфа, 1, "ДОП_АН_КОД");
      ss=Раб.СТР.ЗаменаПодстрокиВсе(ss,'  ',' ');
      ss=Раб.СТР.ЗаменаПодстрокиВсе(ss,' ','&');
      УслАнПров=Раб.НФА.B01.ab(УслАнПров,'&',ss);
      УслАнПров=Раб.НФА.B01.ab(УслАнПров,'&','НФА_СПРАВКА.'+str(GetFieldI(ROднфа, 1, "СПОСОБ_РАСЧЕТА")))+"}";
      УслПР=МаскаСЧ+УслАнПров;
    | true: УслПР=МаскаСЧ+"{НФА.*&ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"}";
   fi;
   ClearVariable(НФА_ИНВ_COD); ClearVariable(НФА_ИНВ_СУМ); ClearVariable(НФА_ИНВ_КОЛ); ClearVariable(ДОПАНА);
   ProgressPos(3);
   -- Отбираем комбинации НФА с ИНВ и запоминаем дополнительную информацию
   for Transaction k=УслПР, dBT, dET do
     ll=true;
     if wa_control<>0:ll=GetRecordNumber(wa_control,TransRecord(k))>0;fi;
     if ll:
	Work=False;
	СЧК=TransCre(k);
	for y=1 to len do
	  OK=True;
	  if УслАНА[y]<>"":
		 OK=False;
		 j=TransSignCount(k);
		 for i=1 to j do
		   OK=РАБ.НФА.FUNC_LIB.ПризнакСоотвМаске(TransSignName(k, i), УслАНА[y]);
		   if OK: Break; fi;
		 od;
	  fi;
	  if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(TransDeb(k), УслДЕБ[y]); fi;
	  if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, УслКРЕ[y]); fi;
	  if OK: Work=True; Break; fi;
	od;
	if Work:
	  КОДНФА=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "НФА", False));
	  КОДИНВ=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "УЧН", False));
	  if УчЗаб and КОДИНВ="":КОДИНВ='УЧН.ЗАБ';fi;
	  if КОДНФА<>"" and КОДИНВ<>"":
		 if Match(СЧК, "???.????.???????.???.?.10?.??.???")   : СЧК=SubStr(СЧК, 1, 30)+"???";
		 |  Match(СЧК, "???.??.??.??.??.??.????.?.10?.??.???"): СЧК=SubStr(СЧК, 1, 33)+"???";
		 |  Match(СЧК, "ЗАБ.??.10?.??") 		      : СЧК=СЧК;
		 else СЧК="";
		 fi;
		 if СЧК<>"":
		   tmp=КОДНФА+"|"+КОДИНВ+"|"+СЧК;
		   j=SearchInArray(НФА_ИНВ_COD, tmp, True, 1);
		   if j<1:
		      AddInArray(НФА_ИНВ_COD, True, False, tmp);
		      -- Вставляем дополнительную аналитику
		      j=SearchInArray(НФА_ИНВ_COD, tmp, True, 1);
		      tmp="";
--			tmp=РАБ.НФА.FUNC_LIB.Объединить(tmp, "0_1"+РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П", False), "|");
--			tmp=РАБ.НФА.FUNC_LIB.Объединить(tmp, "0_1"+SubStr(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", False), 3, 255), "|");
--			tmp=РАБ.НФА.FUNC_LIB.Объединить(tmp, "1_0"+РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П", True), "|");
--			tmp=РАБ.НФА.FUNC_LIB.Объединить(tmp, "1_0"+РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "К", True), "|");
		      InsertInArray(ДОПАНА, j, tmp);
		      InsertInArray(НФА_ИНВ_СУМ, j, TransSum(k));
		      InsertInArray(НФА_ИНВ_КОЛ, j, TransSum(k, "КОЛ"));
		    | true:
		      НФА_ИНВ_СУМ[j]=НФА_ИНВ_СУМ[j]+TransSum(k);
		      НФА_ИНВ_КОЛ[j]=НФА_ИНВ_КОЛ[j]+TransSum(k, "КОЛ");
		   fi;
		 fi;
	    dd_tmp=РАБ.НФА.B01.ВзятьДУЧЕТ(КОДНФА,КОДИНВ);
	    if ДАТАПРИНБУХ=1.1.100: ДАТАПРИНБУХ=dd_tmp; else if dd_tmp<ДАТАПРИНБУХ: ДАТАПРИНБУХ=dd_tmp; fi; fi;
	  fi;
	fi;
     fi;
   end; -- Transaction




--   УслПР=МаскаСЧ+"{НФА.*&ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"}";
----   УслПР=МаскаСЧ+"{НФА.*&ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"&НФА.101.04.Б_179_03&УЧН.00006}";
--   ClearVariable(НФА_ИНВ_COD); ClearVariable(НФА_ИНВ_СУМ); ClearVariable(НФА_ИНВ_КОЛ); ClearVariable(ДОПАНА);
--   ProgressPos(3);
--   -- Отбираем комбинации НФА с ИНВ и запоминаем дополнительную информацию
--   for Transaction k=УслПР, dBT, dET do
--     Work=False;
--     СЧК=TransCre(k);
--     for y=1 to len do
--	 OK=True;
--	 if УслАНА[y]<>"":
--	   OK=False;
--	   j=TransSignCount(k);
--	   for i=1 to j do
--	     OK=РАБ.НФА.FUNC_LIB.ПризнакСоотвМаске(TransSignName(k, i), УслАНА[y]);
--	     if OK: Break; fi;
--	   od;
--	 fi;
--	 if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(TransDeb(k), УслДЕБ[y]); fi;
--	 if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, УслКРЕ[y]); fi;
--	 if OK: Work=True; Break; fi;
--     od;
--     if Work:
--	 КОДНФА=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "НФА", False));
--	 КОДИНВ=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "УЧН", False));
--	 if УчЗаб and КОДИНВ="":КОДИНВ='УЧН.ЗАБ';fi;
--	 if КОДНФА<>"" and КОДИНВ<>"":
--	   if Match(СЧК, "???.????.???????.???.?.10?.??.???")	: СЧК=SubStr(СЧК, 1, 30)+"???";
--	   |  Match(СЧК, "???.??.??.??.??.??.????.?.10?.??.???"): СЧК=SubStr(СЧК, 1, 33)+"???";
--	   |  Match(СЧК, "ЗАБ.??.10?.??")			: СЧК=СЧК;
--	   else СЧК="";
--	   fi;
--	   if СЧК<>"":
--	     tmp=КОДНФА+"|"+КОДИНВ+"|"+СЧК;
--	     j=SearchInArray(НФА_ИНВ_COD, tmp, True, 1);
--	     if j<1:
--		AddInArray(НФА_ИНВ_COD, True, False, tmp);
--		-- Вставляем дополнительную аналитику
--		j=SearchInArray(НФА_ИНВ_COD, tmp, True, 1);
--		tmp="";
--		tmp=РАБ.НФА.FUNC_LIB.Объединить(tmp, "0_1"+РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П", False), "|");
--		tmp=РАБ.НФА.FUNC_LIB.Объединить(tmp, "0_1"+SubStr(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", False), 3, 255), "|");
--		tmp=РАБ.НФА.FUNC_LIB.Объединить(tmp, "1_0"+РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П", True), "|");
--		tmp=РАБ.НФА.FUNC_LIB.Объединить(tmp, "1_0"+РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "К", True), "|");
--		InsertInArray(ДОПАНА, j, tmp);
--		InsertInArray(НФА_ИНВ_СУМ, j, TransSum(k));
--		InsertInArray(НФА_ИНВ_КОЛ, j, TransSum(k, "КОЛ"));
--	      | true:
--		НФА_ИНВ_СУМ[j]=НФА_ИНВ_СУМ[j]+TransSum(k);
--		НФА_ИНВ_КОЛ[j]=НФА_ИНВ_КОЛ[j]+TransSum(k, "КОЛ");
--	     fi;
--	   fi;
--	 fi;
--     fi;
--   end; -- Transaction
   len=LengthOfArray(НФА_ИНВ_COD);
   if len=0: Message("НФА для создания акта^Mо приеме-передаче групп объектов основных средств (кроме  зданий, сооружений)^Mне найдено!", mtWarning); ^False; fi;
--   -- Ищем последние инвентарные номера
--   ClearVariable(ИНВ_MSK); ClearVariable(ИНВ_INI); ClearVariable(ИНВ_NUM);
--   ShowProgress(len, "Поиск последнего инвентарного номера...");
--   k=0;
--   for i=1 to len do
--     ProgressPos(i);
--     КОДНФА=ExtractWord(1, НФА_ИНВ_COD[i], "|");
--	  СЧД=ExtractWord(3, НФА_ИНВ_COD[i], "|");
--     tmp=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.МаскаВедИнвНомер(СЧД, КОДНФА);
--     if SearchInArray(ИНВ_MSK, tmp, True, 1)<0:
--	 k=InsertInArraySort(ИНВ_MSK, tmp);
--	 pN=Pos("?", tmp);
--	 lN=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.ДлинаНумерации;
--	 InsertInArray(ИНВ_INI, k, Str(pN)+"|"+Str(lN));
--	 SetFilter(ROинвк, "Match(ИНВ_ВЕД,'"+tmp+"')");
--	 num=Records(ROинвк);
--	 if num>0:
--	   ClearVariable(BufI);
--	   for j=1 to num do tmp=GetFieldS(ROинвк, j, "ИНВ_ВЕД"); BufI[j]=Int(SubStr(tmp, pN, lN)); od;
--	   SortArray(BufI, True);
--	   InsertInArray(ИНВ_NUM, k, BufI[num]+1);
--	   ClearVariable(BufI);
--	 else
--	   InsertInArray(ИНВ_NUM, k, 1);
--	 fi;
--     fi;
--   od;
--   -- Заполняем информацию НАЧАЛО
   -- Заполняем акт
   ShowProgress(5, "Заполняем акт...");
   ProgressPos(1);
   КОДФОРМЫ="ОКУД_0306031";
   if ДАТААКТА=1.1.100: ДАТААКТА=dBT; fi;
   y=LastNumCard("РПО_АКТЫ_УНФА", "НОМЕРАКТА")+1;
   if НОМЕРАКТА=0: НОМЕРАКТА=y; БУМНОМЕР=Str(y); fi;
   -- МЫ
   ProgressPos(2);
   if ИСПОЛНИТЕЛЬ="" or ИСПОЛНИТЕЛЬ=" ":
     ИСПОЛНИТЕЛЬ=ВзятьДанныеКонтрагента("", "КИМЯ", True);
     ОКПОиспол=ВзятьДанныеКонтрагента("", "ОКПО", True);
   else
     if ОКПОиспол<>"" or ОКПОиспол<>" ":  ОКПОиспол=ВзятьДанныеКонтрагента("", "ОКПО", True); fi;
   fi;
   if АДРЕСИСПОЛ="" or АДРЕСИСПОЛ=" ": АДРЕСИСПОЛ=ВзятьДанныеКонтрагента("", "АДРС", True); fi;
   if БАНКИСПОЛ="" or БАНКИСПОЛ=" "  : БАНКИСПОЛ=ВзятьДанныеКонтрагента("", "БАНК", True); fi;
   if ПОИСПОЛ="" or ПОИСПОЛ=" ":
     j=SearchInArray(Buf, "0_1П.", False, 1);
     if j>0: tmp=SubStr(ExtractWord(j, ДОПАНА[i], "|"), 4, 255); else tmp=""; fi;
     КОДПОИСПОЛ=tmp;
     ПОИСПОЛ=if(Name_A(tmp)<>"" and Name_A(tmp)<>" ", Name_A(tmp), tmp);
   fi;
   -- Исполнитель
   ProgressPos(3);
   j=SearchInArray(Buf, "1_0К.", False, 1);
   if j>0: tmp2=SubStr(ExtractWord(j, ДОПАНА[i], "|"), 4, 255); else tmp2=""; fi; -- получаем код контрагента
   if УЧРЕЖДЕНИЕ="" or УЧРЕЖДЕНИЕ=" ":
      УЧРЕЖДЕНИЕ=ВзятьДанныеКонтрагента(tmp2, "КИМЯ", False);
      ОКПОУЧРЕЖ=ВзятьДанныеКонтрагента(tmp2, "ОКПО", False);
   fi;
   if АДРЕСУЧРЕЖ="" or АДРЕСУЧРЕЖ=" ": АДРЕСУЧРЕЖ=ВзятьДанныеКонтрагента(tmp2, "АДРС", False); fi;
   if БАНКУЧРЕЖ="" or БАНКУЧРЕЖ=" "  : БАНКУЧРЕЖ=ВзятьДанныеКонтрагента(tmp2, "БАНК", False);  fi;
   if ПОУЧРЕЖ="" or ПОУЧРЕЖ=" ":
     j=SearchInArray(Buf, "1_0П.", False, 1);
     if j>0: tmp=SubStr(ExtractWord(j, ДОПАНА[i], "|"), 4, 255); else tmp=""; fi;
     КОДПОУЧРЕЖ=tmp;
     ПОУЧРЕЖ=if(Name_A(tmp)<>"" and Name_A(tmp)<>" ", Name_A(tmp), tmp);
   fi;
   ProgressPos(4);
   -- Подписи
   if ФИОРУКИСПОЛ="" or ФИОРУКИСПОЛ=" ":
     ФИОРУКИСПОЛ  =ВзятьДанныеКонтрагента("", "ФРУК", True);
     ДОЛЖНРУКИСПОЛ=ВзятьДанныеКонтрагента("", "ДРУК", True);
   fi;
   if ДАТАПОДИСПОЛ=1.1.100: ДАТАПОДИСПОЛ=dBT; fi;
   if ФИОГЛБУХСДАЛ="" or ФИОГЛБУХСДАЛ=" ": ФИОГЛБУХСДАЛ=ВзятьДанныеКонтрагента("", "ФБУХ", True); fi;

   if ФИОРУКУЧРЕЖ="" or ФИОРУКУЧРЕЖ=" ":
     ФИОРУКУЧРЕЖ  =ВзятьДанныеКонтрагента(tmp2, "ФРУК", False);
     ДОЛЖНРУКУЧРЕЖ=ВзятьДанныеКонтрагента(tmp2, "ДРУК", False);
   fi;
   if ДАТАПОДРУК=1.1.100: ДАТАПОДРУК=dBT; fi;
   if ФИОГЛБУХПРИН="" or ФИОГЛБУХПРИН=" ": ФИОГЛБУХПРИН=ВзятьДанныеКонтрагента(tmp2, "ФБУХ", False); fi;

   -- МОЛ
   ProgressPos(5);
   j=SearchInArray(Buf, "0_1Л.", False, 1);
   if j>0: tmp="МОЛ"+SubStr(ExtractWord(j, ДОПАНА[i], "|"), 5, 255); else tmp=""; fi;
   REC=SignToRecord(tmp, False);
   if REC<>NIL:
     SetFilter(ROсотр, "Ukey="+RecordToString(REC));
     ДОЛЖНМОЛСДАЛ =GetFieldS(ROсотр, 1, "ДОЛЖНОСТЬ.ДОЛЖ");
     ФИОМОЛСДАЛ   =GetFieldS(ROсотр, 1, "ФАМИЛИЯ")+" "+GetFieldS(ROсотр, 1, "ИНИЦИАЛЫ");
     ТАБНОММОЛСДАЛ=GetFieldS(ROсотр, 1, "ПРИЗНАК");
     if ДАТАМОЛСДАЛ=1.1.100: ДАТАМОЛСДАЛ=dBT; fi;
   fi;
   -- Таблица
   ClearVariable(состОС);
   SetFilter(ROинвк, "");
   SetFilter(ROснфа, "");
   LastNum=LastNumCard(CRDинвк, "Номер");
   for i=1 to len do
     y=InsertFrame(состОС, i);
     КОДНФА=ExtractWord(1, НФА_ИНВ_COD[i], "|");
     КОДИНВ=ExtractWord(2, НФА_ИНВ_COD[i], "|");
	СЧК=ExtractWord(3, НФА_ИНВ_COD[i], "|");
     ShowProgress(len, "Обработка НФА с кодом "+SubStr(КОДНФА, 5, 255)+" и инвентарным номером "+SubStr(КОДИНВ, 5, 255)+"...");
     ProgressPos(i);
     ClearVariable(Buf);
     j=WordsCount(ДОПАНА[i], "|");
     for y=1 to j do Buf[y]=SubStr(ExtractWord(y, ДОПАНА[i], "|"), 1, 5); od;
     состОС[i].ОС      =КОДНФА;
     состОС[i].НАИМЕНОС=if(Name_A(КОДНФА)<>"" and Name_A(КОДНФА)<>" ", Name_A(КОДНФА), КОДНФА);
     состОС[i].ИНВНОМЕР=КОДИНВ;
     tmp="ИНВВЕД."+КОДНФА+"."+КОДИНВ;
     ВЕД=Name_A(tmp); v1="";
     if КОДИНВ<>'УЧН.ЗАБ':
     if ВЕД=" " or ВЕД="":
       BeginChanging(ROинвк);
       Try
	 REC=SignToRecord(tmp, False);
	 OK=False; Work=False;
	 if REC<>NIL:
	   x=GetRecordNumber(ROинвк, REC);
	   Work=LockRecord(ROинвк, x, 0);
	 else
	   x=InsertRecord(ROинвк);
	   Work=True;
	 fi;
	 if Work:
	   if Match(КОДИНВ, "УЧН.?????"):
	     tmp=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.МаскаВедИнвНомер(СЧК, КОДНФА);
	     j=SearchInArray(ИНВ_MSK, tmp);
	     if j>0:
	       pN=Int(ExtractWord(1, ИНВ_INI[j], "|"));
	       lN=Int(ExtractWord(2, ИНВ_INI[j], "|"));
	       num=lN-Length(Str(ИНВ_NUM[j]));
	       tmp2=RepStr("0", num)+Str(ИНВ_NUM[j]);
	       tmp=Delete(tmp, pN, lN);
	       tmp=Insert(tmp2, tmp, pN);
	       v1=tmp; --Ведомственный номер по умолчанию
	       OK=True;
	     fi;
	   else
	     v1=SubStr(КОДИНВ, Length(GetAnaGlossary(КОДИНВ))+2, 255); --Старый присвоенный инвентарный номер
	   fi;
	   y=PutFieldS(ROинвк, x, "ИНВ",     SubStr(КОДИНВ, Length(GetAnaGlossary(КОДИНВ))+2, 255));
	   y=PutFieldS(ROинвк, x, "НФА",     КОДНФА);
	   y=PutFieldS(ROинвк, x, "СЧЕТНФА", СЧК);
	   y=PutFieldS(ROинвк, x, "ИНВ_ВЕД", v1);
	   LastNum=LastNum+1;
	   y=PutFieldI(ROинвк, x, "НОМЕР",    LastNum);
	   y=PutFieldS(ROинвк, x, "НОМЕРБУМ", Str(LastNum));
	   y=PutFieldD(ROинвк, x, "DD",       dBT);
	   if OK: ИНВ_NUM[j]=ИНВ_NUM[j]+1; fi;
	 fi;
	 EndChanging(ROинвк);
       Except
	 CancelChanging(ROинвк);
       end;
--	 состОС[i].ДатаВвЭксп=Раб.НФА.B01.2ПолеПоПризнаку0Д(tmp,'ДАТ_ВЭКСП');
--	 состОС[i].ГодВыпуска=Раб.НФА.B01.2ПолеПоПризнаку0Д(tmp,'ДАТА_ИЗГ');

       состОС[i].ИНВНОМЕРВЕД=v1;
     else
       состОС[i].ИНВНОМЕРВЕД=ВЕД; --Ведомственный номер уже присвоен
--	 состОС[i].ДатаВвЭксп=Раб.СТР.MinDebDat2(Раб.НФА.B01.ВзятьДЭКСПЛ(КОДНФА,КОДИНВ),dBT);--Раб.НФА.B01.2ПолеПоПризнаку0Д(tmp,'ДАТ_ВЭКСП');
       состОС[i].ДатаВвЭксп=Раб.НФА.B01.ВзятьДЭКСПЛ(КОДНФА,КОДИНВ);
       состОС[i].ГодВыпуска=Раб.НФА.B01.2ПолеПоПризнаку0Д(tmp,'ДАТА_ИЗГ');
       состОС[i].ЗавНомер  =Раб.НФА.B01.2ПолеПоПризнаку0С(tmp,'ЗАВОД_НОМ');
     fi;
--     if состОС[i].ДатаВвЭксп=1.1.100:
--	  dd=ВзятьДатуВводвЭксплуатЖурОст(СЧК, КОДНФА, КОДИНВ, 1.1.100, dBT);
--	  состОС[i].ГодВыпуска=dd;
--	  состОС[i].ДатаВвЭксп=dd;
--     fi;
     fi;
     REC=SignToRecord(КОДНФА, False);
     if REC<>NIL:
       x=GetRecordNumber(ROснфа, REC);
       num=GetFieldI(ROснфа, x, "КЛГРУПП");
       состОС[i].АМОРТГРУППА=num;
       состОС[i].СРОКНОВИСП=ВзятьСрокАмортГруппы(num);
       состОС[i].МЕТОДИЗНОСА="Линейный метод   (утвержден НК РФ)";
     fi;
     Sum1=0;
     if КОДИНВ<>'УЧН.ЗАБ':
	Sum1=Saldo(СЧК+"{"+КОДНФА+"&"+КОДИНВ+"}", dBT);
	ddd=Раб.СТР.MinDebDat2(Раб.НФА.B01.ВзятьДУЧЕТ(КОДНФА,КОДИНВ),состОС[i].ДатаВвЭксп);
	if НФА_ИНВ_СУМ[i]/НФА_ИНВ_КОЛ[i]<Общ_Пер('ОС_100',ddd):
	  состОС[i].МЕТОДИЗНОСА="100% начислено амортизации";
	fi;
      | true:Sum1=НФА_ИНВ_СУМ[i];
	состОС[i].НАИМЕНОС=состОС[i].НАИМЕНОС+' ('+str(НФА_ИНВ_КОЛ[i],Точность(КОДНФА))+'ед. - '+СЧК+')';
	состОС[i].МЕТОДИЗНОСА="Не начисляется";
--	| true:Sum1=Round(НФА_ИНВ_СУМ[i]/НФА_ИНВ_КОЛ[i], 2);
     fi;
     состОС[i].БАЛАНССТОИМ=Sum1;
     состОС[i].ПОКСТОИМ=if(НФА_ИНВ_КОЛ[i]>0, Round(НФА_ИНВ_СУМ[i]/НФА_ИНВ_КОЛ[i], 2), 0);
     состОС[i].ПОКВСЕГО=НФА_ИНВ_СУМ[i];
--     состОС[i].ПОКВСЕГО=Round(состОС[i].ПОКСТОИМ*НФА_ИНВ_КОЛ[i], 2);
     tmp=ВзятьСчетАморт(СЧК);
     if tmp<>"": Try Sum2=Abs(Saldo(tmp+"{"+КОДНФА+"&"+КОДИНВ+"}", dBT)); Except Sum2=0; end; else Sum2=0; fi;
     состОС[i].СУМНАЧАМОРТ=Sum2;
     состОС[i].ОСТСТОИМ=Abs(Sum1-Sum2);
     -- Заполняем акт КОНЕЦ
     if состОС[i].ОСТСТОИМ>0.00 and состОС[i].ОСТСТОИМ<состОС[i].БАЛАНССТОИМ:
       if состОС[i].ДатаВвЭксп=1.1.100:
	  dd=ВзятьДатуВводвЭксплуатЖурОст(СЧК, КОДНФА, КОДИНВ, 1.1.100, dBT);
	  состОС[i].ГодВыпуска=dd;
	  состОС[i].ДатаВвЭксп=dd;
       fi;
     fi;

   od;
   ДатаСписБух=dbt;
 Finally
   CloseProgress;
   CloseWorkArea(ROинвк);
   CloseWorkArea(ROснфа);
   CloseWorkArea(ROсотр);
   CloseWorkArea(ROднфа);
   if CrdWrk='РПО_НФА_СПРАВКА':
      CloseWorkArea(wa_control);
   fi;
   ToggleAutorefresh(Режим);
 end;
 ClearVariable(NN);
 ^True;
end;

Proc ИнициализироватьУсловияВыпИзв;

 ClearVariable(УслДЕБ); ClearVariable(УслКРЕ); ClearVariable(УслАНА);

 УслДЕБ[1] = "???.????.???????.???.?.304.04.310";
 УслКРЕ[1] = "???.????.???????.???.?.101.??.410|???.????.???????.???.?.106.?1.410";
 УслАНА[1] = "";

 УслДЕБ[2] = "???.????.???????.???.?.304.04.340";
 УслКРЕ[2] = "???.????.???????.???.?.105.??.440|???.????.???????.???.?.106.34.440";
 УслАНА[2] = "";

end;

Func ОбновлениеАктаВыпИзв :Logical;
var CRDсотр, CRDснфа, ДНФАID_16, УслПР, КОДНФА, КОДМОЛ, КОДПБС, СЧТКОД, tmp1, tmp2, Value :String;
var ROднфа, ROсотр, len, kk, jj, ii :Integer;
var OK, Режим :Logical;
var dBT, dET :Date;
var REC :Record;

var RecWrk: Record;
var BlnWrk,CrdWrk,fielddate: String;

 CRDсотр="СОТРУДНИКИ"; CRDснфа="РПО_НФА";
 if CRD<>'' and RECCRD<>0:
    CrdWrk=CRD;
    RECWrk=IntegerToRecord(Abs(RECCRD));
    blnWrk=BLNCRD;
    fielddate  = РАБ.БЮДЖЕТ2005.ПолеДатыПроводкиКартотеки(CrdWrk);
    if fielddate="": fielddate = 'ДАТАОПЕР'; fi;
  | true:
    CrdWrk="РПО_ОПЕРАЦИИДНФА";
    RECWrk=IntegerToRecord(Abs(ДНФАID));
    blnWrk="НФА.ЖУР.ОПЕРАЦИИДНФА";
    fielddate='ДАТОПЕР';
 fi;
 ДНФАID_16 = Str16(RecordToInteger(RecWRK));
 OK=False;
 if RECWrk<>NIL: OK=RecordExists(CrdWrk, RECWrk); fi;
 if OK=False: Message("Не найдена ссылка на операцию движения НФА.^MРасчет невозможен!", mtError); ^False; fi;

 Refresh(False);

 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ROднфа=OpenWorkArea(CrdWrk, "", "Ukey="+RecordToString(RECWrk));
 ROсотр=OpenWorkArea(CRDсотр, "", "1=0");
 ShowProgress(3, "Считывание информации операции движения НФА ...");
 Try
   ProgressPos(1);
   ИнициализироватьУсловияВыпИзв;
   dBT=GetFieldD(ROднфа, 1, fielddate);
   dET=dBT+1;
   УслПР="*.?.304.04.???{НФА.*&ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"}";
   ClearVariable(НФА_ИНВ_COD); ClearVariable(НФА_ИНВ_СУМ); ClearVariable(НФА_ИНВ_КОЛ); ClearVariable(ДОПАНА);
   ProgressPos(2);
   len=LengthOfArray(УслДЕБ);
   -- Отбираем комбинации НФА с ИНВ и запоминаем дополнительную информацию
   КОДМОЛ=""; КОДПБС="";
   for Transaction kk=УслПР, dBT, dET do
     СЧТКОД=TransCre(kk);
     OK=False;
     for ii=1 to len do
       OK=True;
       if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(TransDeb(kk), УслДЕБ[ii]); fi;
       if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧТКОД,       УслКРЕ[ii]); fi;
       if OK: Break; fi;
     od;
     if OK:
       КОДНФА=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "НФА", False));
	 tmp1=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "МОЛ", False));
	 tmp2=Trim(РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "ПБС", True));
	 if КОДМОЛ="": КОДМОЛ=tmp1; fi;
	 if КОДПБС="": КОДПБС=tmp2; fi;
       if КОДНФА<>"":
	 if Match(СЧТКОД, "???.????.???????.???.?.10?.??.???"): СЧТКОД=SubStr(СЧТКОД, 1, 30)+"???"; else СЧТКОД=""; fi;
	 if СЧТКОД<>"" and КОДМОЛ=tmp1 and КОДПБС=tmp2:
	   Value=КОДНФА+"#"+СЧТКОД;
	   ii=SearchInArray(НФА_ИНВ_COD, Value, True, 1);
	   if ii<0:
	     jj=InsertInArraySort(НФА_ИНВ_COD, Value);
	     InsertInArray(НФА_ИНВ_СУМ, jj, TransSum(kk));
	     InsertInArray(НФА_ИНВ_КОЛ, jj, TransSum(kk, "КОЛ"));
	   else
	     НФА_ИНВ_СУМ[ii]=НФА_ИНВ_СУМ[ii]+TransSum(kk);
	     НФА_ИНВ_КОЛ[ii]=НФА_ИНВ_КОЛ[ii]+TransSum(kk, "КОЛ");
	   fi;
	 fi;
       fi;
     fi;
   end; -- Transaction
   ProgressPos(3);
   len=LengthOfArray(НФА_ИНВ_COD);
   if len=0: Message("НФА для создания акта^Mо приеме-передаче групп объектов основных средств (кроме  зданий, сооружений)^Mне найдено!", mtWarning); ^False; fi;
   -- Заполняем акт
   ShowProgress(5, "Заполняем акт...");
   ProgressPos(1);
   КОДФОРМЫ="ОКУД_0306031";
   ДАТАПРИНБУХ=dBT;
   if ДАТААКТА=1.1.100: ДАТААКТА=dBT; fi;
   ii=LastNumCard("РПО_АКТЫ_УНФА", "НОМЕРАКТА")+1;
   if НОМЕРАКТА=0: НОМЕРАКТА=ii; БУМНОМЕР=Str(ii); fi;
   -- МЫ
   ProgressPos(2);
   if ИСПОЛНИТЕЛЬ="" or ИСПОЛНИТЕЛЬ=" ":
     ИСПОЛНИТЕЛЬ=ВзятьДанныеКонтрагента("", "КИМЯ", True);
       ОКПОиспол=ВзятьДанныеКонтрагента("", "ОКПО", True);
   else
     if ОКПОиспол<>"" or ОКПОиспол<>" ":  ОКПОиспол=ВзятьДанныеКонтрагента("", "ОКПО", True); fi;
   fi;
   if АДРЕСИСПОЛ="" or АДРЕСИСПОЛ=" " : АДРЕСИСПОЛ=ВзятьДанныеКонтрагента("", "АДРС", True); fi;
   if БАНКИСПОЛ=" " or БАНКИСПОЛ=" "  :  БАНКИСПОЛ=ВзятьДанныеКонтрагента("", "БАНК", True); fi;
   -- Исполнитель
   ProgressPos(3);
   Value="К."+Trim(SubStr(КОДПБС, 5, 255));
   if УЧРЕЖДЕНИЕ="" or УЧРЕЖДЕНИЕ=" ":
      УЧРЕЖДЕНИЕ=ВзятьДанныеКонтрагента(Value, "КИМЯ", False);
       ОКПОУЧРЕЖ=ВзятьДанныеКонтрагента(Value, "ОКПО", False);
   fi;
   if АДРЕСУЧРЕЖ="" or АДРЕСУЧРЕЖ=" ": АДРЕСУЧРЕЖ=ВзятьДанныеКонтрагента(Value, "АДРС", False); fi;
   if БАНКУЧРЕЖ="" or БАНКУЧРЕЖ=" "  :	БАНКУЧРЕЖ=ВзятьДанныеКонтрагента(Value, "БАНК", False); fi;
   ProgressPos(4);
   -- Подписи
   if ФИОРУКИСПОЛ="" or ФИОРУКИСПОЛ=" ":
     ФИОРУКИСПОЛ  =ВзятьДанныеКонтрагента("", "ФРУК", True);
     ДОЛЖНРУКИСПОЛ=ВзятьДанныеКонтрагента("", "ДРУК", True);
   fi;
   if ДАТАПОДИСПОЛ=1.1.100: ДАТАПОДИСПОЛ=dBT; fi;
   if ФИОГЛБУХСДАЛ="" or ФИОГЛБУХСДАЛ=" ": ФИОГЛБУХСДАЛ=ВзятьДанныеКонтрагента("", "ФБУХ", True); fi;

   if ФИОРУКУЧРЕЖ="" or ФИОРУКУЧРЕЖ=" ":
     ФИОРУКУЧРЕЖ  =ВзятьДанныеКонтрагента(Value, "ФРУК", False);
     ДОЛЖНРУКУЧРЕЖ=ВзятьДанныеКонтрагента(Value, "ДРУК", False);
   fi;
   if ДАТАПОДРУК=1.1.100: ДАТАПОДРУК=dBT; fi;
   if ФИОГЛБУХПРИН="" or ФИОГЛБУХПРИН=" ": ФИОГЛБУХПРИН=ВзятьДанныеКонтрагента(Value, "ФБУХ", False); fi;

   -- МОЛ
   ProgressPos(5);
   REC=SignToRecord(КОДМОЛ, False);
   if REC<>NIL:
     SetFilter(ROсотр, "Ukey="+RecordToString(REC));
     ДОЛЖНМОЛСДАЛ =GetFieldS(ROсотр, 1, "ДОЛЖНОСТЬ.ДОЛЖ");
     ФИОМОЛСДАЛ   =GetFieldS(ROсотр, 1, "ФАМИЛИЯ")+" "+GetFieldS(ROсотр, 1, "ИНИЦИАЛЫ");
     ТАБНОММОЛСДАЛ=GetFieldS(ROсотр, 1, "ПРИЗНАК");
     if ДАТАМОЛСДАЛ=1.1.100: ДАТАМОЛСДАЛ=dBT; fi;
   fi;
   -- Таблица
   ClearVariable(состОС);
   ShowProgress(len, "Работаем...");
   for ii=1 to len do
     jj=InsertFrame(состОС, ii);
     КОДНФА=ExtractWord(1, НФА_ИНВ_COD[ii], "#");
     СЧТКОД=ExtractWord(2, НФА_ИНВ_COD[ii], "#");
     ProgressPos(ii);
     состОС[jj].ОС	    = КОДНФА;
     состОС[jj].НАИМЕНОС    = if(Name_A(КОДНФА)<>"" and Name_A(КОДНФА)<>" ", Name_A(КОДНФА), КОДНФА);
     состОС[jj].НАИМЕНОС    = состОС[jj].НАИМЕНОС+' ('+Str(НФА_ИНВ_КОЛ[ii], Точность(КОДНФА))+'ед.)';
     состОС[jj].ИНВНОМЕР    = "";
     состОС[jj].ИНВНОМЕРВЕД = "";
     состОС[jj].ДатаВвЭксп  = 1.1.100;
     состОС[jj].ГодВыпуска  = 1.1.100;
     состОС[jj].ЗавНомер    = "";
     состОС[jj].БАЛАНССТОИМ = НФА_ИНВ_СУМ[ii];
     состОС[jj].ПОКСТОИМ    = if(НФА_ИНВ_КОЛ[ii]>0, Round(НФА_ИНВ_СУМ[ii]/НФА_ИНВ_КОЛ[ii], 2), 0);
     состОС[jj].ПОКВСЕГО    = НФА_ИНВ_СУМ[ii];
     состОС[jj].СУМНАЧАМОРТ = 0.00;
     состОС[jj].ОСТСТОИМ    = НФА_ИНВ_СУМ[ii];
     -- Заполняем акт КОНЕЦ
   od;
   ДатаСписБух=dbt;
 Finally
   CloseProgress;
   CloseWorkArea(ROсотр);
   CloseWorkArea(ROднфа);
   ToggleAutorefresh(Режим);
 end;
 ClearVariable(NN);
 ^True;
end;

Proc ПриНажатии(Sender: String);
var num :Numeric;
 if Sender='ВниманиеОбъект': ВниманиеНапоминать=(Вопрос('Предупреждение',ВниманиеСТР,'Ok;Напомнить',тсПредупреждение)=2);
 |  Sender='КнРасчет':	     
   ClearVariable(Buf);
   Buf[1]="Приход основных средств";
   Buf[2]="Расход основных средств";
   Buf[3]="Выписанные извещения ЦС";
   num=Alternate("Выберите действие...", Buf, -1, 1, 12);
   if num=1: if ОбновлениеАктовПриход: Message("Обновление акта (актов) на приход успешно завершено!", mtInformation); fi;
   |  num=2: if ОбновлениеАктовРасход: Message("Обновление акта (актов) на расход успешно завершено!", mtInformation); fi;
   |  num=3: if ОбновлениеАктаВыпИзв:  Message("Обновление акта для ЦС успешно завершено!", mtInformation); fi;
   else Exit;
   fi;
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- _При открытии шаблона
 EnableCommands(False, cmDublRec);
 РАБ.НФА.АКТЫ.Template_OnOpen(Create);
 First=True;
end;

Proc Template_AfterOpen(Create:Logical); -- при открытии шаблона
 if First: 
   Очистить;
   if ТекущееСостояние=КартСостВставлена or ДНФАID=0:
      ВниманиеСТР='Данный документ сформирован не из журнала операций с НФА!'+chr(13)+
		  '[Расчет] будет производится неверно';
      if ВниманиеНапоминать:
	 ВниманиеНапоминать=not (Вопрос('Предупреждение',ВниманиеСТР,'Ok;Не напоминать',тсПредупреждение)=2);
      fi;
    | true:ВниманиеСТР='';
   fi;
   if ВниманиеСТР<>'':
       ВниманиеОбъект.Виден=true;
       ВниманиеОбъект.Подсказка=ВниманиеСТР;
    | true:ВниманиеОбъект.Виден=false;
   fi;
   ВнешнийВид_ВключаемБезУЧН(flgБезУЧН);
 fi;
 First=False;
end;

Proc Template_onClose(Destroy:Logical); -- _При закытии бланка
 Очистить;
 NewRECbln='';
end;
--
Proc Template_onRead; -- _При считывании шаблона
 if recCurrent<>nil:
    if recCurrent<>Current:
       recCurrent=Current(recCurrent);
    fi;
    recCurrent=nil;
 fi;

 РАБ.НФА.АКТЫ.Template_onRead;
 if First=False:
   Очистить;
   if ТекущееСостояние=КартСостВставлена or ДНФАID=0:
      ВниманиеСТР='Данный документ сформирован не из журнала операций с НФА!'+chr(13)+
		  '[Расчет] будет производится неверно';
      if ВниманиеНапоминать:
	 ВниманиеНапоминать=not (Вопрос('Предупреждение',ВниманиеСТР,'Ok;Не напоминать',тсПредупреждение)=2);
      fi;
    | true:ВниманиеСТР='';
   fi;
   if ВниманиеСТР<>'':
       ВниманиеОбъект.Виден=true;
       ВниманиеОбъект.Подсказка=ВниманиеСТР;
    | true:ВниманиеОбъект.Виден=false;
   fi;
   ВнешнийВид_ВключаемБезУЧН(flgБезУЧН);
 fi;
end;

Func Template_OnValidate: Logical; -- _При проверке шаблона
 -- Проверка на правильность заполнения
 ^True;
end;

Функ СчетУНФА_ПриПроверке(Поле: Строка; Итер: Целое; Знач: s):l;
  СчетУНФА=Знач;
  Возврат true ;
end;

Proc cb_БезУЧН_OnChange(Sender: String);
 ВнешнийВид_ВключаемБезУЧН(flgБезУЧН);
end;


КОНЕЦ