БЛАНКСШАБЛОНОМ [27.10.2005] "Установка лимитов расходов", РЕДАКТОР РПО_ПОДОТЧ_ЛИМИТ;
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
-- Секции
СекцОбщая:Object; СекцЛимитыЗ:Object; СекцЛимиты:Object; СекцЛимитыИ:Object; СекцHelpMsg:Object;
-- Объекты
cbПроводить:Object; cbClosedModFob:Object; cbFlagLФКР:Object; cbFlagLКОСГУ:Object; cbFlagLСТАТЬЯ:Object; cbFlagLПЕРИОД:Object;
var NewREC	   :Logical=(CurrentState=crdusInserted);
var SelfCRD	   :String="РПО_ПОДОТЧ_ЛИМИТ";
var FlagLФКР	   :Logical=[True];
var FlagLКОСГУ	   :Logical=[True];
var FlagLСТАТЬЯ    :Logical=[True];
var FlagLПЕРИОД    :Logical=[True];
-- Данные по умолчанию обязательные
var УМ_USE_ПЕРИОД  :Logical;
var УМ_СПРАВрасх   :String;
-- Данные по умолчанию прочие
var УМ_ИФД	   :String;   var УМ_СТ_РАСХ	 :String;
var УМ_ФКР	   :String;   var УМ_ТЕК_ПЕРИОД  :Integer;
--
var кнОК	   :String="ОК";
var кнНастр	   :String="Настройка";
var кнЗкр	   :String="Закрыть";
var ПО_ИМЯ	   :String=if(Name_A("П_ЛИМ."+ПО_Л_КОД)<>"" and Name_A("П_ЛИМ."+ПО_Л_КОД)<>" ",Name_A("П_ЛИМ."+ПО_Л_КОД), ПО_Л_КОД);
var HelpMsg	   :String;
var ВСЕ 	   :String="ВСЕ столбцы";
var ВидТАБЛ1	   :Integer=[1];
var ВидТАБЛ2	   :Integer=[0];
var ВидТАБЛ3	   :Integer=[0];
var F:String="+"; var A:String="+"; var D:String="-"; var K:String="=";
var N[] 	   :String=Str($);
var Buf[]	   :String;
var ИФД_[]	   :String=if(Позиции[$].ИФД="1":"Бюджет"|Позиции[$].ИФД="2":"Доходы","");
var ФКР_ИМЯ[]	   :String=РАБ.УПП.LIB.FormatAna("ФКР."+Позиции[$].ФКР,     ВидТАБЛ1, "наименования нет", "-");
var КОСГУ_ИМЯ[]    :String=РАБ.УПП.LIB.FormatAna("КОСГУ."+Позиции[$].КОСГУ, ВидТАБЛ2, "наименования нет", "-");
var СТ_ИМЯ[]	   :String=РАБ.УПП.LIB.FormatAna(УМ_СПРАВрасх+"."+Позиции[$].СТАТЬЯ, ВидТАБЛ3, "наименования нет", "-");
var Итого_Л	   :Numeric=SumOfArray(Позиции[].Сумма_Л);
var ГГ[]	   :String=if(Позиции[$].ПЕРИОД<>"" and ValidSign(Позиции[$].ПЕРИОД), SubStr(Позиции[$].ПЕРИОД,  8, 4), "");
var КВ[]	   :String=if(Позиции[$].ПЕРИОД<>"" and ValidSign(Позиции[$].ПЕРИОД), SubStr(Позиции[$].ПЕРИОД, 13, 1), "");
var Пользов	   :String;
--
var ИменаСекций[]  :String;
var BufField[]	   :String;
var BufColorBg[]   :Integer;
var BufColorFo[]   :Integer;

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

Func СформироватьАналитику(Iter:Integer; УчитФКР:Logical; УчитКОСГУ:Logical; УчитСТАТЬЯ:Logical; УчитПериод:Logical) :String;
var ANA :String;
 ANA="";
 ANA=Объединить(ANA, "П_ЛИМ."+ПО_Л_КОД, "&");
 if УчитФКР   : ANA=Объединить(ANA,	      "ФКР."+Позиции[Iter].ФКР	 , "&"); fi;
 if УчитКОСГУ : ANA=Объединить(ANA,	    "КОСГУ."+Позиции[Iter].КОСГУ , "&"); fi;
 if УчитСТАТЬЯ: ANA=Объединить(ANA, УМ_СПРАВрасх+"."+Позиции[Iter].СТАТЬЯ, "&"); fi;
 if УчитПЕРИОД: ANA=Объединить(ANA,		     Позиции[Iter].ПЕРИОД, "&"); fi;
 ^ANA;
end;

Func ОстатокЛИМИТА(Iter:Integer; УчитФКР:Logical; УчитКОСГУ:Logical; УчитСТАТЬЯ:Logical; УчитПЕРИОД:Logical) :Numeric;
var OST, st, sv :Numeric;
var ANAo, ANAt :String;
 OST=0;
 ANAo=СформироватьАналитику(Iter, УчитФКР, УчитКОСГУ, УчитСТАТЬЯ, УчитПЕРИОД);
 if ANAo="": ^0; fi;
 ANAt="{"+if(ANAo="","",ANAo+"&ТИТУЛ")+"}";
 ANAo="{"+ANAo+"}";
 st=Saldo("ЛИМ_ЗАДАН"+ANAt, ДатОпер+1);
 sv=Saldo("ЛИМ_ЗАДАН"+ANAo, ДатОпер+1);
 if Позиции[Iter].ТИТ_СТ: OST=st; else OST=sv-st; fi;
 ^OST;
end;

var ОСТ_ЛИМ[] :Numeric=ОстатокЛИМИТА($, FlagLФКР, FlagLКОСГУ, FlagLСТАТЬЯ, FlagLПЕРИОД);

2-- Общие процедуры и функции
Proc СчитатьЗначенияПоУмолчанию;
var REC :Record;
var RO :Integer;
 REC=ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР.КлючЗаписиАктивныхНастроек;
 if REC<>NIL:
   RO=OpenWorkArea("РПО_ПОДОТЧ_НАСТР", "", "Ukey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       -- Обязательные
       УМ_СПРАВрасх  = GetFieldS(RO, 1, "СПРАВ"      );
       УМ_USE_ПЕРИОД = GetFieldL(RO, 1, "USE_ПЕРИОД" );
       -- Прочие
       УМ_ИФД	     = GetFieldS(RO, 1, "ИФД"	     ); --Источник финансирования деятельности по умолчанию
       УМ_ФКР	     = GetFieldS(RO, 1, "ФКР"	     ); --Функциональная классификация расходов по умолчанию
       УМ_СТ_РАСХ    = GetFieldS(RO, 1, "СТ_РАСХ"    ); --Статья расходов по умолчанию
       УМ_ТЕК_ПЕРИОД = GetFieldI(RO, 1, "ТЕК_ПЕРИОД" ); --Текущий период по умолчанию
     fi 							;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Func ПроверкаЗначенийПоУмолчанию :Logical;
 if УМ_СПРАВрасх="":
   Message("Ошибка считывания ключевых настроек!^MПроверьте картотеку настроек подсистемы.", mtError);
   ^False;
 fi;
 ^True;
end;

Proc Очистить;
 ClearVariable(N); ClearVariable(Buf); ClearVariable(ИФД_);
 ClearVariable(ФКР_ИМЯ); ClearVariable(КОСГУ_ИМЯ); ClearVariable(СТ_ИМЯ);
 ClearVariable(ГГ); ClearVariable(КВ);
 ClearVariable(ОСТ_ЛИМ);
end;

Proc УдалитьПустыеСтроки;
var nn :Integer;
 nn=1;
 while nn<=Позиции do 
   if Позиции[nn].ФКР="" and Позиции[nn].КОСГУ="" and Позиции[nn].СУММА_Л=0: 
     Try DeleteFrame(Позиции, nn); Except end; else nn=nn+1;
   fi;
 od;
 if Позиции>0: Template.Frame=1; else Template.Field="F"; fi;
end;

Proc ПрисвоитьУмолчания(Iter:Integer);
var tmp :String;
 Позиции[Iter].ИФД=УМ_ИФД;
 if УМ_ФКР<>"":     Позиции[Iter].ФКР=УМ_ФКР; fi;
 if УМ_СТ_РАСХ<>"": Позиции[Iter].СТАТЬЯ=УМ_СТ_РАСХ; fi;
 if УМ_USE_ПЕРИОД:
   if УМ_ТЕК_ПЕРИОД=1: tmp="кв"; 
   |  УМ_ТЕК_ПЕРИОД=2: tmp="гг";
   else tmp="";
   fi;
   if tmp<>"": Позиции[Iter].ПЕРИОД=РАБ.УПП.LIB.ВзятьПериодПоДате(ДАТОПЕР, tmp); fi;
 fi;
end;

Proc Iter_Validation;
var nn :Integer;
 if Позиции<1: Try nn=InsertFrame(Позиции, 1); ПрисвоитьУмолчания(nn); Except end; fi;
end;

Func TemplateSaveOK :Logical; -- проверка правильности ввода данных
var len, i :Integer;
 if ДАТОПЕР=1.1.100 : Message('Не введена дата операции!', mtWarning); Template.Field="ДАТОПЕР";  ^False; fi;
 if ПО_Л_КОД=""     : Message('Не выбрано подразделение!', mtWarning); Template.Field="ПО_Л_КОД"; ^False; fi;
 УдалитьПустыеСтроки;
 if Позиции<1: 
   Message('Нет ненулевых проводок!', mtWarning);
   Iter_Validation;
   Template.Field="F";
   ^False;
 fi;
 len=Позиции;
 for i=1 to len do
   if Позиции[i].ИФД=""    : Message('Не выбран Источник Финансирования деятельности!', mtWarning);	Template.Field="ИФД_";	    Template.Frame=i; ^False; fi;
   if Позиции[i].ФКР=""    : Message('Не выбрана Функциональная Классификация Расходов!', mtWarning);	Template.Field="ФКР_ИМЯ";   Template.Frame=i; ^False; fi;
   if Позиции[i].КОСГУ=""  : Message('Не выбран КОСГУ!', mtWarning);					Template.Field="КОСГУ_ИМЯ"; Template.Frame=i; ^False; fi;
   if Позиции[i].СТАТЬЯ="" : Message('Не выбрана статья расходов!', mtWarning); 			Template.Field="СТ_ИМЯ";    Template.Frame=i; ^False; fi;
   if УМ_USE_ПЕРИОД:
     if Позиции[i].ПЕРИОД="" : Message('Не выбран период, на который устанавливается лимит!', mtWarning); Template.Field="ГГ";	    Template.Frame=i; ^False; fi;
   fi;
   if Позиции[i].СУММА_Л=0 : Message('Не задана сумма лимита!', mtWarning);				Template.Field="СУММА_Л";   Template.Frame=i; ^False; fi;
 od;
 ^True;
end;

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

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

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

Func ВыборИФД(StoreИФД:String) :String;
var nn:Integer;
 ClearVariable(Buf);
 Buf[1]="Бюджетная деятельность";
 Buf[2]="Приносящая доход деятельность";
 Buf[3]="Очистить значение";
 nn=Alternate("Выберите источник финансирования деятельности", Buf, -1, Int(StoreИФД), 12);
 if nn=0: ^StoreИФД; fi;
 if nn=3: ^""; else ^Str(nn); fi;
end;

Func ВыборЭКР(StoreЭКР:String) :String;
var i, k :Integer;
var tmp :String;
 ClearVariable(Buf);
 i=0; k=0;
 for Sign tmp=Раб.Бюджет2005.МаскаРасхКОСГУ+"|"+"КОСГУ.000", Sort do
   i=i+1;
   Buf[i]=SubStr(tmp,7,255)+" --"+Name_A(tmp);
   if StoreЭКР=SubStr(Buf[i],1,3): k=i; fi;
 od;
 i=0;
 i=Alternate("ЭКР", Buf, -1, k, 12);
 if i=0: ^""; fi;
 tmp=SubStr(Buf[i], 1, Pos(" --", Buf[i])-1);
 ^tmp;
end;

Proc ПоказатьТаблицу;
var Flag :Logical;
 Flag=False;
 if ДатОпер=1.1.100  and ПО_Л_КОД=""  : HelpMsg="Для установки лимитов необходимо выбрать дату операции и подразделение"; fi;
 if ДатОпер=1.1.100  and ПО_Л_КОД<>"" : HelpMsg="Для установки лимитов необходимо выбрать дату операции"; fi;
 if ДатОпер<>1.1.100 and ПО_Л_КОД=""  : HelpMsg="Для установки лимитов необходимо выбрать подразделение"; fi;
 if ДатОпер>1.1.100  and ПО_Л_КОД<>"" : Flag=True; fi;
 if Flag: УдалитьПустыеСтроки; Iter_Validation; fi;
 СекцЛимитыЗ.Visible=Flag;
 СекцЛимиты.Visible=Flag;
 СекцЛимитыИ.Visible=Flag;
 СекцHelpMsg.Visible=not(Flag);
end;

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

Proc СформироватьПроводки(ПровестиПроводки:Logical);
-- перед формированием проводок ОБЯЗАТЕЛЬНО должна быть произведена проверка на ошибки
var i, k, len :Integer;
var АНА_ОПЕР :String;
 ClearVariable(БУХ_ПРОВОДКИ);
 if ПровестиПроводки:
   len=Позиции;
   if len>0: -- на всякий случай
     k=0;
     ShowProgress(len, "Формирование проводок...");
     Try
       for i=1 to len do
	 ProgressPos(i);
	 -- Формируем аналитику операции
	 АНА_ОПЕР="";
	 АНА_ОПЕР=Объединить(АНА_ОПЕР,			"П_ЛИМ."+ПО_Л_КОД, " ");
	 АНА_ОПЕР=Объединить(АНА_ОПЕР,		    "ФКР."+Позиции[i].ФКР, " ");
	 АНА_ОПЕР=Объединить(АНА_ОПЕР,		"КОСГУ."+Позиции[i].КОСГУ, " ");
	 АНА_ОПЕР=Объединить(АНА_ОПЕР, УМ_СПРАВрасх+"."+Позиции[i].СТАТЬЯ, " ");
	 АНА_ОПЕР=Объединить(АНА_ОПЕР,			Позиции[i].ПЕРИОД, " ");
	 АНА_ОПЕР=Объединить(АНА_ОПЕР,if(Позиции[i].ТИТ_СТ, "ТИТУЛ",  ""), " ");
	 k=k+1;
	 k=InsertFrame(БУХ_ПРОВОДКИ,k);
	 БУХ_ПРОВОДКИ[k].СУМ_П=Позиции[i].СУММА_Л;
	 БУХ_ПРОВОДКИ[k].ДЕБ_П="ЛИМ_ЗАДАН";
	 БУХ_ПРОВОДКИ[k].КРЕ_П="ЗАБАЛАНС";
	 БУХ_ПРОВОДКИ[k].АНА_П=АНА_ОПЕР;
	 БУХ_ПРОВОДКИ[k].КОМ_П="задан лимит";
       od;
     Finally
       CloseProgress;
     end;
   fi;
 fi;
end;

Proc ВнешнийВид;
 if not(УМ_USE_ПЕРИОД): FlagLПЕРИОД=False; fi;
 cbFlagLПЕРИОД.Enabled=УМ_USE_ПЕРИОД;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
var tmp :String;
var nn, old :Integer;
var Flag :Logical;
var REC :Record;
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 if not(ПроверкаЗначенийПоУмолчанию): ^False; fi;
 if Field="кнОк"      : EditorApply; Close; ^False;
 |  Field="кнНастр"   : REC=ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР.КлючЗаписиАктивныхНастроек;
			OpenBlank("ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР", True, REC);
			СчитатьЗначенияПоУмолчанию;
			ВнешнийВид;
			^False;
 |  Field="кнЗкр"     : EditorCancel; Close; ^False;
 |  Field="F"	      : Try nn=InsertFrame(Позиции, 1); Except end;
			ПрисвоитьУмолчания(nn);
			Template.Field="N";
			Template.Frame=nn;
			^False;
 |  Field="A"	      : Try nn=InsertFrame(Позиции, Iter+1); Except end;
			ПрисвоитьУмолчания(nn);
			Template.Field="N";
			Template.Frame=nn;
			^False;
 |  Field="D"	      : if EnqOkCancel("Вы уверены что хотите удалить данную строчку?", mtConfirmation)=cmOk:
			  Try
			    DeleteFrame(Позиции, Iter);
			    if Позиции>0: Iter=if(Iter>1,Iter-1,1); Template.Frame=Iter; else Template.Field="F"; fi;
			  Except end;
			fi;
			^False;
 |  Field="K"	      : old=Iter;
			Try nn=InsertFrame(Позиции, old+1); Except Raise; end;
			Позиции[nn].ИФД      = Позиции[old].ИФД      ;
			Позиции[nn].ФКР      = Позиции[old].ФКР      ;
			Позиции[nn].КОСГУ    = Позиции[old].КОСГУ    ;
			Позиции[nn].СТАТЬЯ   = Позиции[old].СТАТЬЯ   ;
			Позиции[nn].ТИТ_СТ   = Позиции[old].ТИТ_СТ   ;
			Позиции[nn].ПЕРИОД   = Позиции[old].ПЕРИОД   ;
			Template.Field="N";
			Template.Frame=nn;
			^False;
 |  Field="ПО_Л_КОД"  : tmp=AnaElection('П_ЛИМ.*', False, False, ПО_Л_КОД);
			if tmp="": ^False; fi;
			ПО_Л_КОД=SubStr(tmp, 7, 255);
			ПоказатьТаблицу;
			^False;
 |  Field="ВСЕ"       : nn=ВыборВидаТаблицы(-1); if nn>=0: ВидТАБЛ1=nn; ВидТАБЛ2=nn; ВидТАБЛ3=nn; fi; ^False;
 |  Field="ВидТАБЛ1"  : ВидТАБЛ1=ВыборВидаТаблицы(ВидТАБЛ1); ^False;
 |  Field="ВидТАБЛ2"  : ВидТАБЛ2=ВыборВидаТаблицы(ВидТАБЛ2); ^False;
 |  Field="ВидТАБЛ3"  : ВидТАБЛ3=ВыборВидаТаблицы(ВидТАБЛ3); ^False;
 |  Field="ИФД_"      : Позиции[Iter].ИФД=ВыборИФД(Позиции[Iter].ИФД);
			tmp=Позиции[Iter].ИФД;
			Flag=Match(Позиции[Iter].ФКР, "???.0000.0000000.000");
			if tmp="1": if Flag: Позиции[Iter].ФКР=""; fi;
			|  tmp="2" or tmp="3": if not(Flag): Позиции[Iter].ФКР=""; fi;
			else Позиции[Iter].ФКР="";
			fi;
			^False;
 |  Field="ФКР_ИМЯ"   : if Позиции[Iter].ИФД="": Message("Сначала выберите источник финансирования", mtWarning); Template.Field="ИФД_"; Template.Frame=Iter; ^False; fi;
			if Позиции[Iter].ИФД="1":			   tmp=AnaElection("ФКР!&~ФКР.???.????.0000000.000!", False, False, "ФКР."+Позиции[Iter].ФКР);
			|  Позиции[Iter].ИФД="2" or Позиции[Iter].ИФД="3": tmp=AnaElection("ФКР.???.0000.0000000.000!",       False, False, "ФКР."+Позиции[Iter].ФКР);
			fi;
			if tmp="": ^False; fi;
			Позиции[Iter].ФКР=SubStr(tmp, 5, 255);
			^False;
 |  Field="КОСГУ_ИМЯ" : tmp=ВыборЭКР(Позиции[Iter].КОСГУ);
			if tmp="": ^False; fi;
			Позиции[Iter].КОСГУ=tmp;
			^False;
 |  Field="СТ_ИМЯ"    : tmp=AnaElection(УМ_СПРАВрасх, False, False, УМ_СПРАВрасх+"."+Позиции[Iter].СТАТЬЯ);
			if tmp="": ^False; fi;
			Позиции[Iter].СТАТЬЯ=SubStr(tmp, Length(GetAnaGlossary(tmp))+2, 255);
			^False;
 |  Field="ТИТ_СТ"    : Позиции[Iter].ТИТ_СТ=not(Позиции[Iter].ТИТ_СТ); ^False;
 |  Field="ГГ" or Field="КВ"
		      : tmp=AnaElection('ПЕРИОД.????.?', False, True, Позиции[Iter].ПЕРИОД);
			if tmp<>"":
			  if Match(tmp,"ПЕРИОД."): tmp=""; fi;
			  if Match(tmp,"ПЕРИОД.????."): tmp=SubStr(tmp,1,Length(tmp)-1); fi;
			  Позиции[Iter].ПЕРИОД=tmp;
			fi;
			^False;
 fi;
 ^True;
end; 

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="ДатОпер"   : ПоказатьТаблицу;
 |  Field="ПО_Л_КОД"  : ПоказатьТаблицу;
 |  Field="ИФД"       : if Позиции[Iter].ИФД="": Позиции[Iter].ФКР=""; fi;
 |  Field="ФКР_ИМЯ"   : Позиции[Iter].ФКР="";
 |  Field="КОСГУ_ИМЯ" : Позиции[Iter].КОСГУ="";
 |  Field="СТ_ИМЯ"    : Позиции[Iter].СТАТЬЯ="";
 |  Field="ГГ"	      : Позиции[Iter].ПЕРИОД="";
 |  Field="КВ"	      : Позиции[Iter].ПЕРИОД="";
 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;
 Template.HideEditor(False);
 Позиции[Row].СУММА_Л=Calculator(Позиции[Row].СУММА_Л);
 ^"";
end;

Func Расшифровка_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Путь :String;
var dd1 :Date;
 Template.HideEditor(False);
 Путь=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ\Подотчет.lst";
 dd1=Dat(1, if(Mon(ДАТОПЕР)>6,7,1), Year(ДАТОПЕР)-1);
 Report(Путь+"|Отчет по использованию ЛИМИТов", dd1, ДАТОПЕР+1, "ЛИМ_ЗАДАН", "П_ЛИМ."+ПО_Л_КОД);
 ^"";
end;

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

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

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

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var Цв :Integer;
var tmp :String;
 if GetScheme="": cbClosedModFob.Visible=False; else cbClosedModFob.Visible=True; fi;
 EnableCommands(False, cmDublRec);
 Цв=РАБ.УПП.LIB.Цвет(236, 233, 216);
 СекцОбщая.Cell(2, 2, CellBgColor, Цв);
 СекцОбщая.Cell(2, 4, CellBgColor, Цв);
 СекцОбщая.Cell(2, 7, CellBgColor, Цв);
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("ПОДОТЧ")+"\Настройки\","RPO_STD_000.cfg"); -- стандартная настройка
 ЦветаПолей(Цв);
 tmp=UserName(AliasName("РПО_ПОДОТЧ_ЛИМИТ"));
 Пользов=if(tmp<>"", "Пользователь - "+tmp, "Пользователь локальной версии");
end;

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

Proc Template_onRead; -- при считывании шаблона
 Очистить;
 if NewREC: Проводить=False; fi;
 СчитатьЗначенияПоУмолчанию;
 ВнешнийВид;
 Iter_Validation;
 ТолькоЧтение(Проводить);
 ПоказатьТаблицу; 
 Template.Field="кнЗкр";
end;

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

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

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