БЛАНКСШАБЛОНОМ "Накладная-наряд", РЕДАКТОР РПО_НАКЛ_НАРЯД;

btnOkey:Object;
btnExit:Object;
btnUpdt:Object;

Настр:Object;
S1:Object; S3:Object; S5:Object; S7:Object; S9 :Object; S11:Object; S13:Object; S15:Object; S17:Object; S19:Object;
S2:Object; S4:Object; S6:Object; S8:Object; S10:Object; S12:Object; S14:Object; S16:Object; S18:Object;
var numSecTmpl:Integer=19;
var VOCПолуч  :String="К.*|ПБС.*|РБС.*"; --маска справочников получателей

cbЗащитить:Object;
lblWarning:Object;
btnПереход:Object;
cb_Настройки:Object;

2-- Переменные и массивы шаблона
var AA		   :String="+";
var DD		   :String="-";
var recCurrent	   :Record;
var NewREC	   :Logical=(CurrentState=crdusInserted);
var First	   :Logical;
var SelfCRD	   :String="РПО_НАКЛ_НАРЯД";
var SelfBln	   :String="НФА.ДОКУМЕНТЫ.НАКЛАДНЫЕ.НАКЛ_НАРЯД";
var НастрGUID	   :String;
var flgНастройки   :Logical;
var ФИКСЦЕНА	   :Logical;
var ТОЧН	   :Integer;
var ТОЧНЭКРАН	   :Logical;
var НАДООТПУЩ	   :Logical=[False];
var ПОЛННАИМ	   :Logical;
var СВОРАЧУЧН	   :Logical;

var BufField[]	   :String;
var BufClrFo[]	   :Integer;
var BufClrBg[]	   :Integer;

var TBL_NPP[]	   :Integer=[$];
var TBL_DIA[]	   :String;
var TBLННФА1[]	   :String=Trim(Name_A(Позиции[$].TBLКНФА))+if(TBL_DIA[$]<>"", " ["+TBL_DIA[$]+"]", "");
var итгКОЛН	   :Numeric=SumOfArray(Позиции[].TBLКОЛН);
var итгКОЛО	   :Numeric=SumOfArray(Позиции[].TBLКОЛО);
var итгСУММ	   :Numeric=SumOfArray(Позиции[].TBLСУММ);
var ИтогоПроп	   :String=Slo_(Позиции, "ДОКНАИМ");

var Buf[]	   :String;

var LSTНФА[]	   :String;
var LSTСУМ[]	   :Numeric;
var LSTКОЛ[]	   :Numeric;
var LSTDIA[]	   :String;
var УслДЕБ[]	   :String;
var УслКРЕ[]	   :String;


Proc НастройкаОтчета(toSave:Logical);

 if НастрGUID="" or toSave: НастрGUID=GetGUID; fi;
 if РАБ.НАСТР.НАЧАТЬ(SelfBln, 0, 0, "", НастрGUID):
   РАБ.НАСТР.ДОБАВИТЬ("ФИКСЦЕНА"  , "L");
   РАБ.НАСТР.ДОБАВИТЬ("ТОЧН"	  , "I");
   РАБ.НАСТР.ДОБАВИТЬ("ТОЧНЭКРАН" , "L");
   РАБ.НАСТР.ДОБАВИТЬ("НАДООТПУЩ" , "L");
   РАБ.НАСТР.ДОБАВИТЬ("ПОЛННАИМ"  , "L");
   РАБ.НАСТР.ДОБАВИТЬ("СВОРАЧУЧН" , "L");
   if toSave:
     РАБ.НАСТР.СОХРАНИТЬ;
   else
     НастрGUID=РАБ.НАСТР.ЗАГРУЗИТЬ("", "");
     if НастрGUID="": if ProcExists("ВосстановитьНастройкиПоУмолчанию_OnClick"): ExecuteProc("ВосстановитьНастройкиПоУмолчанию_OnClick", -1, -1, False); fi; fi;
   fi;
 fi;

end;

Proc ОчиститьПриРасчете;
 ClearVariable(LSTНФА);
 ClearVariable(LSTСУМ);
 ClearVariable(LSTКОЛ);
 ClearVariable(LSTDIA);
end;

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(TBL_NPP);
 ClearVariable(TBL_DIA);
 ClearVariable(TBLННФА1);
 ОчиститьПриРасчете;
 ClearVariable(УслДЕБ);
 ClearVariable(УслКРЕ);
end;

Proc ОчисткаОтчета;
 ClearVariable(Позиции);
 Очистить;
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="ДАТ_ДОК": ^ДАТ_ДОК;
 fi;
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var name :String;
var Iter :Integer;
 name=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if name="ДАТ_ДОК": ДАТ_ДОК=Value;
 fi;
end;

Proc ПрименитьТочность(Mask:String);
 S12.Cell(1, 6, CellFormat, Mask);
 S12.Cell(1, 7, CellFormat, Mask);
 S12.Cell(1, 8, CellFormat, Mask);
 S13.Cell(1, 3, CellFormat, Mask);
 S13.Cell(1, 4, CellFormat, Mask);
end;

Func УстановитьТочность(OldVal:Integer) :Integer;
var nn, i :Integer;
var Mask :String;
 ClearVariable(Buf); nn=0;
 for i=1 to 8 do Buf[i]="знаков после запятой - "+Str(i+1); od;
 nn=Alternate("Настройте точность вычислений...", Buf, -1, Точн-1, 12);
 if nn=0: ^OldVal; fi;
 Mask=",##0.00"+RepStr("#", nn-1)+";;-";
 if ТочнЭкран: ПрименитьТочность(Mask); else ПрименитьТочность(",###.##;;"); fi;
 ^(nn+1);
end;

Proc ТочностьКакНаЭкране;
 if ТочнЭкран: ПрименитьТочность(",###.##"+RepStr("#", Точн-2)+";;"); else ПрименитьТочность(",###.##;;"); fi;
end;

Proc Iter_Validation;
var nn :Integer;
 if Позиции<1: Try nn=InsertFrame(Позиции, 1); Except end; fi;
end;

Proc УдалитьПустые;
var nn :Integer;
 nn=1;
 while nn<=Позиции do if Позиции[nn].TBLКНФА="": Try DeleteFrame(Позиции, nn); Except end; else nn=nn+1; fi; od;
 Iter_Validation;
end;

Func TemplateSaveOK :Logical;
 ^True;
end;

Proc ЦветаПолей;
var nn, len, sysTxt, sysObj :Integer;
 sysTxt=РАБ.ЦВЕТА.GetColor("coBtnText");
 sysObj=РАБ.ЦВЕТА.GetColor("coBtnFace");
 ClearVariable(BufField); ClearVariable(BufClrBg); ClearVariable(BufClrFo);
 nn=InsertInArraySort(BufField,"ОРГ_НАИМЕН");	 InsertInArray(BufClrBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ДАТ_ДОК");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НОМ_БУМ");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"МХЭ_ИМЯ");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПОЛУЧ_ИМЯ");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"АДРЕС");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ОСНОВАНИЕ");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"TBL_NKU");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"TBL_КБК");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"TBLННФА1");	 InsertInArray(BufClrBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"TBLЕДИЗ");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"TBLКОЛН");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"TBLКОЛО");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"TBLЦЕНА");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"TBLСУММ");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"AA");		 InsertInArray(BufClrBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"DD");		 InsertInArray(BufClrBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"ДЛЖ_РУК");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ДЛЖ_БУХ");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ФИО_РУК");	 InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ФИО_БУХ");	 InsertInArray(BufClrBg,nn,coAqua);
 len=LengthOfArray(BufField);
 for nn=1 to len do
   if BufClrBg[nn]=coTeal: BufClrFo[nn]=coWhite;
   |  BufClrBg[nn]=sysObj: BufClrFo[nn]=sysTxt;
   |  True:		   BufClrFo[nn]=coBlack;
   fi;
 od;
end;

Proc ТолькоЧтение(Flag:Logical);
var kk, ii, jj, rk, ck, цвFont, цвBack, pp :Integer;
var Value :String;
var Obj :Object;
var ТЧ :Logical;
 if numSecTmpl>0:
   ShowProgress(numSecTmpl, "Обработка данных...");
   Try
     for kk=1 to numSecTmpl do
       ProgressPos(kk);
       if FindObject("S"+Str(kk), Obj):
	 rk=asInteger(Obj.RowsCount);
	 ck=asInteger(Obj.ColsCount);
	 for ii=1 to rk do
	   for jj=1 to ck do
	     Value=Up(asString(Obj.Cell(ii, jj, CellContents, ""))); pp=SearchInArray(BufField, Value, True);
	     if pp>0:
	       if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=BufClrFo[pp]; цвBack=BufClrBg[pp]; ТЧ=False; fi;
	       Obj.Cell(ii, jj, CellFontColor, цвFont);
	       Obj.Cell(ii, jj, CellBgColor,   цвBack);
	       Obj.Cell(ii, jj, CellReadOnly,  ТЧ);
	     fi;
	   od;
	 od;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 fi;
 btnOkey.Enabled = not Flag;
 btnUpdt.Enabled = not Flag;
end;

Proc СформированИзДНФА;
var OK :Logical;
var REC :Record;
var CRD_ :s;
 OK=False; REC=NIL;
 if ДНФАID>0: REC=IntegerToRecord(ДНФАID); CRD_='РПО_ОПЕРАЦИИДНФА';fi;
 if RECCRD>0: REC=IntegerToRecord(RECCRD); CRD_=CRD		  ;fi;
 if REC<>NIL: 
   OK=RecordExists(CRD_, REC);
 fi;
 btnUpdt.Enabled=OK;
 lblWarning.Visible=not(OK);
 btnПереход.Visible=OK;
end;

Proc СинронизацияЗаписи;
var num, ii :Integer;
 num=Позиции;
 if num>0: for ii=1 to num do Позиции[ii].TBLННФА=TBLННФА1[ii]; od; fi;
end;

Proc СчитатьПериод;
var num, ii :Integer;
var Value :String;
 num=Позиции;
 if num>0:
   ClearVariable(TBL_DIA);
   for ii=1 to num do
     Value=SubStr(Позиции[ii].TBLННФА, Length(Позиции[ii].TBLННФА)-5, 6);
     if Match(Value, "[????]"): TBL_DIA[ii]=SubStr(Value, 2, 4); else TBL_DIA[ii]=""; fi;
   od;
 fi;
end;

Proc ВзятьРеквизиты(ПолноеНАИМ:Logical; Auto:Logical);
var REC, SaveREC :Record;
var RO, num :Integer;
 if Auto:
   if Trim(ОРГ_НАИМЕН)="":
     if ОРГ_REC<>"": Try SaveREC=StringToRecord(ОРГ_REC); Except SaveREC=NIL; end; fi;
     RO=OpenWorkArea("КОНТРАГЕНТ", "", "НАШЕ");
     Try
       num=Records(RO);
       if num<1: REC=NIL;
       |  num=1: REC=GetRecordKey(RO, 1);
       |  num>1: REC=GetRecordKey(RO, 1);
		 SetFilter(RO, "НАШЕ and РПО_УМОЛЧАНИЕ");
		 if Records(RO)>0: REC=GetRecordKey(RO, 1); fi;
       fi;
       if REC=NIL and saveREC<>NIL: REC=saveREC; fi;
       if REC<>NIL:
	 SetFilter(RO, "UKey="+RecordToString(REC));
	 if Records(RO)=1:
	    ОРГ_НАИМЕН = if(ПолноеНАИМ, GetFieldS(RO, 1, "ПОЛНИМЯ"), GetFieldS(RO, 1, "КОРИМЯ"));
	    ОРГ_ОКПО   = GetFieldS(RO, 1, "ОКПО");
	    ОРГ_REC    = RecordToString(REC);
	    ДЛЖ_РУК    = GetFieldS(RO, 1, "ДОЛЖНРУК");
	    ФИО_РУК    = GetFieldS(RO, 1, "ФИОРУК");
	    REC_РУК    = RecordToString(GetFieldR(RO, 1, "РУКОВОДИТЕЛЬ"));
	    ДЛЖ_БУХ    = GetFieldS(RO, 1, "ДОЛЖНБУХ");
	    ФИО_БУХ    = GetFieldS(RO, 1, "ФИОБУХ");
	    REC_БУХ    = RecordToString(GetFieldR(RO, 1, "БУХГАЛТЕР"));
	 fi;
       fi;
     Finally
       CloseWorkArea(RO);
     end;
   fi;
 else
   REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", saveREC, crdRecordOnly);
   if REC=NIL: Exit; fi;
   RO=OpenWorkArea("КОНТРАГЕНТ", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       ОРГ_НАИМЕН = if(ПолноеНАИМ, GetFieldS(RO, 1, "ПОЛНИМЯ"), GetFieldS(RO, 1, "КОРИМЯ"));
       ОРГ_ОКПО   = GetFieldS(RO, 1, "ОКПО");
       ОРГ_REC	  = RecordToString(REC);
       ДЛЖ_РУК	  = GetFieldS(RO, 1, "ДОЛЖНРУК");
       ФИО_РУК	  = GetFieldS(RO, 1, "ФИОРУК");
       REC_РУК	  = RecordToString(GetFieldR(RO, 1, "РУКОВОДИТЕЛЬ"));
       ДЛЖ_БУХ	  = GetFieldS(RO, 1, "ДОЛЖНБУХ");
       ФИО_БУХ	  = GetFieldS(RO, 1, "ФИОБУХ");
       REC_БУХ	  = RecordToString(GetFieldR(RO, 1, "БУХГАЛТЕР"));
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Func ВзятьИмяJDFпоCRD(CRDfile:String) :String;
var num, ii :Integer;
var NameJDF :String;
 if ExistsCardFile(CRDfile):
   num=JournalsCount;
   if num>0:
     for ii=1 to num do
       NameJDF=JournalName(ii);
       if JournalType(NameJDF)="КАРТ": if Up(JournalCardfile(NameJDF))=Up(CRDfile): ^NameJDF; fi; fi;
     od;
   fi;
 fi;
 ^"";
end;

Func ПолеДатыПроводкиКартотеки(CRDname:String) :String;
var aFile, xx, aa, bb, jj :Integer;
var RES, JDFфайл, Value :String;
 RES="";
 JDFфайл=ВзятьИмяJDFпоCRD(CRDname);
 if JDFфайл<>"": -- нашли имя JDF файла
   ClearVariable(Buf);
   xx=GetCardFileFields(CRDname, Buf, mtlDATE);
   if xx>0: -- массив не пустой
     aFile=TextFileOpenRead(JDFфайл);
     Try
       Try
	 while not TextFileEndOfFile(aFile) do
	   Value=Up(TextFileReadLn(aFile));
	   if (Pos("КАРТОТЕКА", Value)>0 or Pos("CARDFILE", Value)>0) and Pos(Up(CRDname), Value)>0:
	     aa=Pos("(", Value);
	     Value=SubStr(Value, aa+1, Length(Value)-aa);
	     bb=WordsCount(Value, ",");
	     if bb>0 and xx>0:
	       Value=ExtractWord(1, Value, ",");
	       jj=SearchInArray(Buf, Value, False, 1);
	       if jj>0: RES=Value; Break; fi;
	     fi;
	   fi;
	 od;
       Except
	 TextFileClose(aFile);
	 ^"";
       end;
     Finally
       TextFileClose(aFile);
     end;
   fi;
 fi;
 ^RES;
end;

Proc ИнициализироватьУсловияОбновления;
var jj :Integer;
 jj=0; 
 ClearVariable(УслДЕБ);
 ClearVariable(УслКРЕ);
 jj=jj+1;
 УслДЕБ[jj]="((*.106.?4.?40|*.304.04.340|*.401.20.24?|*.401.20.25?|*.401.20.272)&???.????.???????.???.?.???.??.???)|((*.401.10.17?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)|00";
 УслКРЕ[jj]="???.????.???????.???.?.105.??.440";
 jj=jj+1;
 УслДЕБ[jj]="((*.106.?1.?10|*.304.04.310|*.401.20.24?|*.401.20.25?|*.401.20.271)&???.????.???????.???.?.???.??.???)|((*.401.10.17?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)|00";
 УслКРЕ[jj]="???.????.???????.???.?.101.??.410";
 jj=jj+1;
 УслДЕБ[jj]="ЗАБАЛАНС|00Z";
 УслКРЕ[jj]="ЗАБ.??.10?.??";
 jj=jj+1;
 УслДЕБ[jj]="((*.304.04.340|*.401.20.24?|*.401.20.25?|*.401.20.272)&???.????.???????.???.?.???.??.???)|((*.401.10.17?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)|00";
 УслКРЕ[jj]="???.????.???????.???.?.106.??.440";
 jj=jj+1;
 УслДЕБ[jj]="((*.304.04.310|*.401.20.24?|*.401.20.25?|*.401.20.271)&???.????.???????.???.?.???.??.???)|((*.401.10.17?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)|00";
 УслКРЕ[jj]="???.????.???????.???.?.106.??.410";
end;

Func ОбновитьНакладную :Logical;
var КОДНФА, СЧТНФА, КОДУЧН, КОДМХЭ, КОДПОДР, ПОЛЧКНТ, ПОЛЧПБС, ПОЛЧРБС, SПЕРИОД :String;
var CRDwork, Value, FieldДО, ID16, FtrTrans, tmp1, tmp2,SКОСГУ :String;
var RO, num, kk, ii, jj, pp :Integer;
var OK, Режим, Work :Logical;
var SUM, KOL :Numeric;
var dBT, dET :Date;
var REC :Record;

 Refresh(False);
 if CRD<>"" and RECCRD<>0 : REC=IntegerToRecord(RECCRD); ID16=Str16(RECCRD); CRDwork = CRD		 ;
 | True:		    REC=IntegerToRecord(ДНФАID); ID16=Str16(ДНФАID); CRDwork = "РПО_ОПЕРАЦИИДНФА";
 fi;
 if CRDwork<>"РПО_ОПЕРАЦИИДНФА": FieldДО=ПолеДатыПроводкиКартотеки(CRDwork); else FieldДО='ДАТОПЕР'; fi;
 if FieldДО="": Message("Не найдено поле даты операции в картотеке '"+CRDwork+"'.^MРасчет невозможен!", mtError); ^False; fi;
 OK=False;
 if REC<>NIL: OK=RecordExists(CRDwork, REC); fi;
 if not OK: Message("Не найдена ссылка на операцию движения НФА.^MРасчет невозможен!", mtError); ^False; fi;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Подготовка ...");
 RO=OpenWorkArea(CRDwork, "", "Ukey="+RecordToString(REC));
 Try
   dBT=GetFieldD(RO, 1, FieldДО);
   dET=dBT+1;
   FtrTrans = "(*.101.*|*.105.*|*.106.*)&(???.????.???????.???.?.???.??.???|ЗАБ.??.???.??)";
   FtrTrans = FtrTrans+"{ДНФАID."+ID16+"}";
   ОчиститьПриРасчете;
   ИнициализироватьУсловияОбновления;
   num=0;
   for Transaction kk=FtrTrans, dBT, dET do num=num+1; od;
   ShowProgress(num, "Считывание информации операции движения НФА...");
   num=LengthOfArray(УслДЕБ);
   КОДМХЭ=""; ПОЛЧКНТ=""; ПОЛЧПБС=""; ПОЛЧРБС=""; КОДПОДР="";
   for Transaction kk=FtrTrans, dBT, dET do
     КОДНФА=""; SПЕРИОД="";
     ProgressPos(kk);
     if TransCardFile(kk)=CRDwork:
       tmp1=TransDeb(kk);
       tmp2=TransCre(kk);
       if ПОЛЧКНТ="": ПОЛЧКНТ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "К",       True); fi;
       if ПОЛЧПБС="": ПОЛЧПБС=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "ПБС",     True); fi;
       if ПОЛЧРБС="": ПОЛЧРБС=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "РБС",     True); fi;
       if КОДПОДР="": КОДПОДР=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "П",       True); fi;
       if КОДПОДР="": КОДПОДР=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "П",      False); fi;
       if SПЕРИОД="": SПЕРИОД=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "ПЕРИОД", False); fi;
       if SПЕРИОД="": SПЕРИОД=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "ПЕРИОД",  True); fi;
--	 if SКОСГУ="": SКОСГУ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "КОСГУ", False); fi;
--	 if SКОСГУ="": SКОСГУ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "КОСГУ",  True); fi;
       Work=False;
       for ii=1 to num do -- num=LengthOfArray(УслДЕБ)
	 OK=True;
	 if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(tmp1, УслДЕБ[ii]); fi; -- условия по счетам
	 if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(tmp2, УслКРЕ[ii]); fi; -- условия по счетам
	 if OK: Work=True; Break; fi;
       od;
       if Work:
	 if Match(TransQuantSign(kk),"НФА.???.??.*"): КОДНФА=TransQuantSign(kk); else КОДНФА=""; fi;
	 --
	 SКОСГУ='';
	 if Match(tmp2, "???.????.???????.???.?.10?.??.???"): СЧТНФА=SubStr(tmp2, 1, 30)+"???";
	    SКОСГУ=SubStr(tmp2, 31, 3);
	    if Match(SКОСГУ, "4??"):
	       SКОСГУ='3'+SubStr(SКОСГУ, 2, 2);
	    fi;
	 |  Match(tmp2, "ЗАБ.??.10?.??"):		      СЧТНФА=tmp2;
	 else СЧТНФА="";
	 fi;
	 if СЧТНФА<>"" and КОДНФА<>"":
	   КОДУЧН="";
	   if КОДМХЭ="": КОДМХЭ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "М", False);  fi;
	   if not СВОРАЧУЧН:
	     if КОДУЧН="": КОДУЧН=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "УЧН", False);	fi;
	     if КОДУЧН="": КОДУЧН=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "УЧН",	True); fi;
	   fi;
	   SUM=TransSum(kk);
	   KOL=TransSum(kk, "КОЛ");
	   Value=КОДНФА+"@"+if(КОДУЧН="", " ", КОДУЧН)+"@"+СЧТНФА;
	   jj=SearchInArray(LSTНФА, Value, True, 1);
	   if jj>0:
	     LSTСУМ[jj]=LSTСУМ[jj]+SUM;
	     LSTКОЛ[jj]=LSTКОЛ[jj]+KOL;
	   else
	     pp=InsertInArraySort(LSTНФА, Value);
	     InsertInArray(LSTСУМ, pp, SUM);
	     InsertInArray(LSTКОЛ, pp, KOL);
	     InsertInArray(LSTDIA, pp, trim(SПЕРИОД+' '+SКОСГУ));
	   fi;
	 fi;
       fi;
     fi;
   end; -- Transaction
   --
   num=LengthOfArray(LSTНФА);
   if num=0: Message("НФА для создания наряда не найдено!", mtWarning); ^False; fi;
   if Точн=0: Точн=4; fi;
   ClearVariable(Позиции);
   ClearVariable(TBL_NPP);
   ClearVariable(TBLННФА1);
   --
   ДАТ_ДОК=dBT;
   if НОМ_ДОК=0: НОМ_ДОК=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМ_ДОК", "ДАТ_ДОК", "Ukey<>"+RecordToString(Current), if(ДАТ_ДОК>1.1.2000, ДАТ_ДОК, ToDay)); fi;
   if НОМ_БУМ="": НОМ_БУМ=Str(НОМ_ДОК); fi;
   --
   ВзятьРеквизиты(ПолнНаим, True);
   --
   --Value=Name_A(КОДПОДР);
   --if Value<>" ": ПДР_НАИМ=if(Trim(Value)="", КОДПОДР, Value); ПДР_КОД=КОДПОДР; fi;
   --
   Value=Name_A(КОДМХЭ);
   if Value<>" ": МХЭ_ИМЯ =if(Trim(Value)="", КОДМХЭ, Value);  МХЭ_КОД=КОДМХЭ;	fi;
   --
   tmp1="";
--   if tmp1="": tmp1=ПОЛЧРБС; fi;
   if tmp1="": tmp1=ПОЛЧПБС; fi;
   if tmp1="": tmp1=ПОЛЧКНТ; fi;
   Value=Name_A(tmp1);
   if Value<>" ": ПОЛУЧ_ИМЯ=if(Trim(Value)="", tmp1, Value); ПОЛУЧ_КОД=tmp1; fi;
   --  Основная таблица
   for ii=1 to num do
     КОДНФА=Trim(ExtractWord(1, LSTНФА[ii], "@"));
     КОДУЧН=Trim(ExtractWord(2, LSTНФА[ii], "@"));
     СЧТНФА=Trim(ExtractWord(3, LSTНФА[ii], "@"));
     if Match(СЧТНФА, "???.????.???????.???.?.10?.??.???"): Value=SubStr(СЧТНФА, 1, 20);
	if выделитьслово(2,LSTDIA[ii],' ')<>'':
	   Value=Value+' '+выделитьслово(2,LSTDIA[ii],' ');
	fi;
     |	Match(СЧТНФА, "ЗАБ.??.10?.??"): 		    Value="Забаланс";
     else Value="";
     fi;
     LSTDIA[ii]=выделитьслово(1,LSTDIA[ii],' ');
     pp=InsertFrame(Позиции, ii);
     Позиции[pp].TBL_КБК=Value;
     Позиции[pp].TBLКНФА=КОДНФА;
     if Match(КОДНФА, "НФА.10?.??.*"): Позиции[pp].TBL_NKU=Lo(ExtractWord(WordsCount(КОДНФА, "."), КОДНФА, ".")); fi;
     if Match(LSTDIA[pp], "ПЕРИОД.????*"): TBL_DIA[pp]=SubStr(LSTDIA[pp], 8, 4); else TBL_DIA[pp]=""; fi;
     Позиции[pp].TBLУЧНИ=КОДУЧН;
     REC=SignToRecord(КОДНФА, False);
     if REC<>NIL: Позиции[pp].TBLЕДИЗ=Lo(GetCardFieldS("РПО_НФА", REC, "ЕДИЗМ")); else Позиции[pp].TBLЕДИЗ=Lo(Unit(КОДНФА)); fi;
     Позиции[pp].TBLКОЛН=LSTКОЛ[ii];
     if НадоОтпущ: Позиции[pp].TBLКОЛО=Позиции[pp].TBLКОЛН; fi;
     Позиции[pp].TBLСУММ=LSTСУМ[ii];
     Позиции[pp].TBLЦЕНА=Round(LSTСУМ[ii]/LSTКОЛ[ii], Точн);
   od;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
   ToggleAutorefresh(Режим);
 end;
 ТочностьКакНаЭкране;
 ^True;
end;

Proc ВыборНФА(Iter:Integer; OnExit:Logical);
var OldCODE, NewCODE, ANA :String;
 OldCODE=Up(Позиции[Iter].TBLКНФА);
 if OnExit: NewCODE=""; else ANA=Up(AnaElection("НФА.10?.??.*", False, False, OldCODE));  if ANA="": Exit; else NewCODE=ANA; fi; fi;
 if NewCODE<>OldCODE:
   Позиции[Iter].TBLКНФА=NewCODE;
   if NewCODE="": Позиции[Iter].TBL_NKU=""; else if Match(ANA, "НФА.10?.??.*"): Позиции[Iter].TBL_NKU=Lo(ExtractWord(WordsCount(ANA, "."), ANA, ".")); fi; fi;
 fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
var nn :Integer;
 if Field="ТОЧН"       : Точн=УстановитьТочность(Точн); ТочностьКакНаЭкране; ^False;
 |  Field="AA"	       : Try nn=InsertFrame(Позиции, Iter+1); Except end; ^False;
 |  Field="DD"	       : if EnqOkCancel("Вы уверены что хотите удалить данную строчку?", mtConfirmation)=cmOk: Try DeleteFrame(Позиции, Iter); Iter_Validation; Except end; fi; ^False;
 |  Field="ОРГ_НАИМЕН" : ВзятьРеквизиты(ПолнНаим, False); ^False;
 |  Field="ФИКСЦЕНА"   : ФИКСЦЕНА  = not ФИКСЦЕНА;  ^False;
 |  Field="ПОЛННАИМ"   : ПОЛННАИМ  = not ПОЛННАИМ;  ^False;
 |  Field="ТОЧНЭКРАН"  : ТОЧНЭКРАН = not ТОЧНЭКРАН; ТочностьКакНаЭкране; ^False;
 |  Field="НАДООТПУЩ"  : НАДООТПУЩ = not НАДООТПУЩ; ^False;
 |  Field="TBLННФА1"   : ВыборНФА(Iter, False); ^False;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="ОРГ_НАИМЕН" : if ОРГ_НАИМЕН="": ОРГ_ОКПО=""; ОРГ_REC=""; fi;
 |  Field="ТОЧН"       : if ТОЧН=0: ТОЧН=4; fi;
 |  Field="TBLКОЛН"    : if Позиции[Iter].TBLКОЛН<Позиции[Iter].TBLКОЛО: Позиции[Iter].TBLКОЛН=Позиции[Iter].TBLКОЛО; fi;
 |  Field="TBLКОЛО"    :
			 if ФиксЦена:
			   Позиции[Iter].TBLСУММ=Round(Позиции[Iter].TBLКОЛО*Позиции[Iter].TBLЦЕНА, Точн);
			 else
			   Позиции[Iter].TBLЦЕНА=Round(Позиции[Iter].TBLСУММ/Позиции[Iter].TBLКОЛО, Точн);
			 fi;
 |  Field="TBLЦЕНА"    :
			 if Позиции[Iter].TBLКОЛО=0: Позиции[Iter].TBLКОЛО=1; fi;
			 Позиции[Iter].TBLСУММ=Round(Позиции[Iter].TBLКОЛО*Позиции[Iter].TBLЦЕНА, Точн);
 |  Field="TBLСУММ"    :
			 if ФиксЦена:
			   if Позиции[Iter].TBLЦЕНА=0: Позиции[Iter].TBLЦЕНА=Позиции[Iter].TBLСУММ; fi;
			   Позиции[Iter].TBLКОЛО=Round(Позиции[Iter].TBLСУММ/Позиции[Iter].TBLЦЕНА, Точн);
			 else
			   if Позиции[Iter].TBLКОЛО=0: Позиции[Iter].TBLКОЛО=1; fi;
			   Позиции[Iter].TBLЦЕНА=Round(Позиции[Iter].TBLСУММ/Позиции[Iter].TBLКОЛО, Точн);
			 fi;
 |  Field="МХЭ_ИМЯ"    : if МХЭ_ИМЯ="": МХЭ_КОД=""; fi;
 |  Field="ФИО_РУК"    : if ФИО_РУК="": ДЛЖ_РУК=""; fi;
 |  Field="ФИО_БУХ"    : if ФИО_БУХ="": ДЛЖ_БУХ=""; fi;
 |  Field="ТОЧНЭКРАН"  : ТочностьКакНаЭкране;
 |  Field="TBLННФА1"   : ВыборНФА(Iter, True);
 fi;
end;

Func Field_OnValidateN(Field:String; Iter:Integer; Value:Numeric): Logical;
 if Value<0 : Message('Нельзя вводить отрицательное число.', mtError); ^False; fi;
 if Field="TBLКОЛН":
		     if Value<Позиции[Iter].TBLКОЛО:
		       Message("Затребованное количество^Mне должно быть меньше отпущенного!", mtWarning);
		       ^False;
		     fi;
		     if Позиции[Iter].TBLКОЛО=0: Позиции[Iter].TBLКОЛО=Value; fi;
 |  Field="TBLКОЛО":
		     if ФиксЦена:
		       Позиции[Iter].TBLСУММ=Round(Value*Позиции[Iter].TBLЦЕНА, Точн);
		     else
		       Позиции[Iter].TBLЦЕНА=Round(Позиции[Iter].TBLСУММ/Value, Точн);
		     fi;
 |  Field="TBLЦЕНА":
		     if Позиции[Iter].TBLКОЛО=0: Позиции[Iter].TBLКОЛО=1; fi;
		     Позиции[Iter].TBLСУММ=Round(Позиции[Iter].TBLКОЛО*Value, Точн);
 |  Field="TBLСУММ":
		     if ФиксЦена:
		       if Позиции[Iter].TBLЦЕНА=0: Позиции[Iter].TBLЦЕНА=Value; fi;
		       Позиции[Iter].TBLКОЛО=Round(Value/Позиции[Iter].TBLЦЕНА, Точн);
		     else
		       if Позиции[Iter].TBLКОЛО=0: Позиции[Iter].TBLКОЛО=1; fi;
		       Позиции[Iter].TBLЦЕНА=Round(Value/Позиции[Iter].TBLКОЛО, Точн);
		     fi;
 fi;
 ^True;
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, SaveREC :Record;
var FieldName, СТРФИО, СТРДОЛ, tmp1, tmp2 :String;
 Template.HideEditor(False);
 if not AutoRefresh: RefreshAna; fi;
 FieldName=asString(Template.Field);
 if FieldName="ДЛЖ_РУК" or FieldName="ФИО_РУК": if REC_РУК<>"": Try SaveREC=StringToRecord(REC_РУК); Except SaveREC=NIL; end; fi;
 |  FieldName="ДЛЖ_БУХ" or FieldName="ФИО_БУХ": if REC_БУХ<>"": Try SaveREC=StringToRecord(REC_БУХ); Except SaveREC=NIL; end; fi;
 fi;
 REC=OpenCardFile("СОТРУДНИКИ", "", SaveREC, crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 tmp1=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
 СТРФИО=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp1<>"..", tmp1, ""));
 Try СТРДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ"); Except СТРДОЛ=""; end;
 if FieldName="ДЛЖ_РУК": ДЛЖ_РУК=СТРДОЛ; ФИО_РУК=СТРФИО; REC_РУК=RecordToString(REC);
 |  FieldName="ФИО_РУК": ДЛЖ_РУК=СТРДОЛ; ФИО_РУК=СТРФИО; REC_РУК=RecordToString(REC);
 |  FieldName="ДЛЖ_БУХ": ДЛЖ_БУХ=СТРДОЛ; ФИО_БУХ=СТРФИО; REC_БУХ=RecordToString(REC);
 |  FieldName="ФИО_БУХ": ДЛЖ_БУХ=СТРДОЛ; ФИО_БУХ=СТРФИО; REC_БУХ=RecordToString(REC);
 fi;
 ^"";
end;

Func АДРЕС_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var num :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 Buf[1]="на месте по доверенности";
 Buf[2]="железнодорожным транспортом";
 num=Alternate("Отправка по адресу", Buf, -1, 1, 12);
 if num>0: АДРЕС=Buf[num]; fi;
 ^"";
end;

Func Место_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ANA :String;
 Template.HideEditor(False);
 RefreshAna;
 ANA=AnaElection("М.*", False, False, МХЭ_КОД);
 if ANA="": ^""; fi;
 МХЭ_КОД=ANA;
 МХЭ_ИМЯ=Trim(Name_A(МХЭ_КОД));
 --if МХЭ_ИМЯ<>"": МХЭ_ИМЯ=МХЭ_ИМЯ+" ["+МХЭ_КОД+"]"; else МХЭ_ИМЯ=МХЭ_КОД; fi;
 if МХЭ_ИМЯ="": МХЭ_ИМЯ=МХЭ_КОД; fi;
 ^"";
end;

Func Номер_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
 НОМ_ДОК=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМ_ДОК", "ДАТ_ДОК", "Ukey<>"+RecordToString(Current), if(ДАТ_ДОК>1.1.2000, ДАТ_ДОК, ToDay));
 НОМ_БУМ=Str(НОМ_ДОК);
 ^"";
end;

Func Выбор_ЕдИзм(PrevValue:String) :String;
var num :Integer;
 ClearVariable(Buf);
 Buf[01]="ШТ--ШТУКА";
 Buf[02]="КГ--КИЛОГРАММ";
 Buf[03]="Л--ЛИТР";
 Buf[04]="Г--ГРАММ";
 Buf[05]="М--МЕТР";
 Buf[06]="КОМПЛ--КОМПЛЕКТ";
 Buf[07]="НАБОР--НАБОР";
 Buf[08]="РУЛ--РУЛОН";
 Buf[09]="ПОГ М--ПОГОННЫЙ МЕТР";
 Buf[10]="УПАК--УПАКОВКА";
 num=AlternateTree("Частые ед.изм.", Buf, -1, 1, 12, "#", "КОД", "Наименование", -1, False);
 if num>0: ^SubStr(Buf[num], 1, Pos("--", Buf[num])-1); else ^PrevValue; fi;
end;

Func ЕдИзм_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Iter :Integer;
 Template.HideEditor(False);
 Iter=asInteger(Template.Frame);
 Позиции[Iter].TBLЕДИЗ=Выбор_ЕдИзм(Позиции[Iter].TBLЕДИЗ);
 ^"";
end;

Func Контр_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ANA :String;
 Template.HideEditor(False);
 RefreshAna;
 ANA=AnaElection(VOCПолуч, False, False, ПОЛУЧ_КОД);
 if ANA="": ^""; fi;
 ПОЛУЧ_КОД=ANA;
 ПОЛУЧ_ИМЯ=Trim(Name_A(ПОЛУЧ_КОД));
 --if ПОЛУЧ_ИМЯ<>"": ПОЛУЧ_ИМЯ=ПОЛУЧ_ИМЯ+" ["+ПОЛУЧ_КОД+"]"; else ПОЛУЧ_ИМЯ=ПОЛУЧ_КОД; fi;
 if ПОЛУЧ_ИМЯ="": ПОЛУЧ_ИМЯ=ПОЛУЧ_КОД; fi;
 ^"";
end;

Func КБК_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Iter :Integer;
var MaskAcc, Value :String;
 Template.HideEditor(False);
 Iter=asInteger(Template.Frame);
 MaskAcc="*.?.106.??.???|*.?.304.04.3??";
 РАБ.БЮДЖЕТ2005.РежимМаски="?";
 if Match(Позиции[Iter].TBL_КБК, "???.????.???????.???.?.???.??.???"): РАБ.УПП.КБК2005.StoreКБК=Позиции[Iter].TBL_КБК; fi;
 Value=Trim(РАБ.УПП.КБК2005.ВыборКБКиерарх2005(MaskAcc, "КР", False));
 if Value="": ^Cur; fi;
 Позиции[Iter].TBL_КБК=Value;
 ^"";
end;

2-- События объектов
Proc cbЗащита_onChange(Sender:String);
var Flag, SaveOK :Logical;
var qq :Integer;
 if Защита=False:
    SaveOK=True; -- если защита 'снимается' значит проверка данных уже производилась
    qq=EnqOkCancel("Вы действительно хотите снять защиту^M от изменений у данного документа?", mtConfirmation);
    if qq=cmCancel: Flag=True; else Flag=False; fi;
   else
    SaveOK=TemplateSaveOK;
    Flag=SaveOK;
 fi;
 Защита=Flag; cbЗащитить.State=Защита;
 ТолькоЧтение(Flag);
 if not(SaveOK): Exit; fi; -- Избегаем двойных сообщений
 EditorApply;
end;

Proc btnOnClick(Sender:String); -- объекты при нажатии
var REC :Record;
var OK :Logical;
var CRD_, blnCRD_ :String;
 if Sender="btnOkey":	  EditorApply; Close;
 |  Sender="btnExit":	  if not Защита: EditorCancel; fi; Close;
 |  Sender="btnUpdt":	  if ОбновитьНакладную: Message("Обновление накладной успешно завершено!", mtInformation); fi;
 |  Sender="btnПереход":
			  if ДНФАID>0: REC=IntegerToRecord(ДНФАID); CRD_='РПО_ОПЕРАЦИИДНФА';blnCRD_="НФА.ЖУР.ОПЕРАЦИИДНФА";fi;
			  if RECCRD>0: REC=IntegerToRecord(RECCRD); CRD_=CRD		   ;blnCRD_=BLNCRD		  ;fi;
			  OK=False;
			  if REC<>NIL: OK=RecordExists(CRD_, REC); fi;
			  if OK: OpenBlank(blnCRD_, False, REC); fi;
 fi;
end;

Proc cb_Настройки_OnChange(Sender:String);
var Flag :Logical;

 Flag = not flgНастройки;

    btnOkey.Visible = Flag;
    btnExit.Visible = Flag;
    btnUpdt.Visible = Flag;
 cbЗащитить.Visible = Flag;

 S2.Visible = Flag;   S11.Visible = Flag;
 S3.Visible = Flag;   S12.Visible = Flag;
 S4.Visible = Flag;   S13.Visible = Flag;
 S5.Visible = Flag;   S14.Visible = Flag;
 S6.Visible = Flag;   S15.Visible = Flag;
 S7.Visible = Flag;   S16.Visible = Flag;
 S8.Visible = Flag;   S17.Visible = Flag;
 S9.Visible = Flag;   S18.Visible = Flag;
S10.Visible = Flag;   S19.Visible = Flag;

 if flgНастройки:
   btnПереход.Visible = False;
   lblWarning.Visible = False;
 else
   СформированИзДНФА;
 fi;

 if Flag: НастройкаОтчета(False); else НастройкаОтчета(True); fi;

end;

Proc ВосстановитьНастройкиПоУмолчанию_OnClick(Row:Integer; Col:Integer; Double:Logical);
var msg :String;

 if Позиции>0 and Позиции[1].TBLКНФА<>"": msg=Chr(13)+"Данные наряда будут утеряны."; else msg=""; fi;
 if Row>0 and Col>0:
   if EnqOkCancel("Будет восстановлена настройка по умолчанию."+msg+Chr(13)+"Продолжить?", mtWarning)=cmCancel: Exit; fi;
 fi;

 -- Восстановление настройки счетов
 ФИКСЦЕНА  = True;
 ТОЧН	   = 4;
 ТОЧНЭКРАН = True;
 НАДООТПУЩ = False;
 ПОЛННАИМ  = False;
 СВОРАЧУЧН = True;

 ОчисткаОтчета;
 Iter_Validation;

 if Row>0 and Col>0: Message("Стандарная настройка восстановлена", mtInformation); fi;

end;

Proc Инициализация_Бланка;
 НастройкаОтчета(False);
 flgНастройки=False;
 Iter_Validation;
 ТолькоЧтение(Защита);
 ПрименитьТочность(",###.##"+RepStr("#", ТОЧН-2)+";;");
 СформированИзДНФА;
 СчитатьПериод;
 if ОРГ_НАИМЕН="": ВзятьРеквизиты(ПолнНаим, True); fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 EnableCommands(False, cmDublRec);
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("НФА")+"\Настройки\","tbb_накл_наряд_001.cfg");
 ЦветаПолей;
 First=True;
end;

Proc Template_AfterOpen(Create:Logical); -- при открытии шаблона
 if First:
   if NewREC:
     ДАТ_ДОК=ToDay;
     НОМ_ДОК=РАБ.НФА.FUNC_LIB.NextNumToDate(SelfCRD, "НОМ_ДОК", "ДАТ_ДОК", 1.1.100);
     НОМ_БУМ=Str(НОМ_ДОК);
     ЗАЩИТА=False;
   fi;
   Инициализация_Бланка;
 fi;
 First=False;
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 ClearVariable(BufField); ClearVariable(BufClrBg); ClearVariable(BufClrFo);
 Очистить;
 if CurrentState=CrdusUndefined: Destroy=True; fi;
end;

Proc Template_onRead; -- при считывании шаблона
 if recCurrent<>NIL: if recCurrent<>Current: recCurrent=Current(recCurrent); fi; recCurrent=NIL; fi;
 Очистить;
 if First=False:
   if NewREC:
     ДАТ_ДОК=ToDay;
     НОМ_ДОК=РАБ.НФА.FUNC_LIB.NextNumToDate(SelfCRD, "НОМ_ДОК", "ДАТ_ДОК", ДАТ_ДОК);
     НОМ_БУМ=Str(НОМ_ДОК);
     ЗАЩИТА=False;
   fi;
   Инициализация_Бланка;
 fi;
 flgНастройки=False;
 ExecuteProc("cb_Настройки_OnChange", "");
 Template.Object="btnClose";
end;

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

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

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