БЛАНКСШАБЛОНОМ [07.11.2005] "Отчет по остаткам лимитов";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
-- Секции
СекцОбщая :Object; СекцУслов :Object;
СекцТаблЗ :Object; СекцТаблР :Object; СекцТаблИ :Object;
-- Объекты
btnРасчет:Object; Bevel1:Object; Bevel2:Object;
cbУчетОст:Object; cbУчетОбо:Object;
cbУч_М_КП:Object; cbУч_М_ОБ:Object;
cbУч_Р_КП:Object; cbУч_Р_ОБ:Object;
cbУч_Б_КП:Object; cbУч_Б_ОБ:Object;
--
fУчетОст :Logical; fУчетОбо :Logical;
fУч_М_КП :Logical; fУч_М_ОБ :Logical;
fУч_Р_КП :Logical; fУч_Р_ОБ :Logical;
fУч_Б_КП :Logical; fУч_Б_ОБ :Logical;
--
Flag_onEnter :Logical;
Строки	     :Integer;
ДатОтч	     :Date;
-- Данные по умолчанию
var УМ_СПРАВрасх :String;
--
var кнЗкр    :String="Закрыть";
var Пользов  :String;
var Расш     :String="&";
var N[]      :String=Str($);
var Buf[]    :String;
var BufMsk[] :String;
var BufStr[] :String;

АНА[]	     :String;
СумЛИМп[]    :Numeric;
СумЛИМт[]    :Numeric;
СумРТ[]      :Numeric;
СумРГ[]      :Numeric;
СумПА[]      :Numeric;
СумНА[]      :Numeric;
СумОСТ[]     :Numeric;

var Вид_П    :Integer=[0];
var ТипОтчета :Integer=[0];
var ТипОтчета_:Integer=ТипОтчета;
var ИМЯ[]    :String=РАБ.УПП.LIB.FormatAna(АНА[$], Вид_П, "наименования нет", "-");
var OldDate  :Date;
var ИтогоЛИМп:Numeric=SumOfArray(СумЛИМп, Строки);
var ИтогоЛИМт:Numeric=SumOfArray(СумЛИМт, Строки);
var ИтогоРТ  :Numeric=SumOfArray(СумРТ , Строки);
var ИтогоРГ  :Numeric=SumOfArray(СумРГ , Строки);
var ИтогоПА  :Numeric=SumOfArray(СумПА , Строки);
var ИтогоНА  :Numeric=SumOfArray(СумНА , Строки);
var ИтогоОСТ :Numeric=SumOfArray(СумОСТ, Строки);
--
var Title     :String=if(ТипОтчета=0, "Выберите вид отчета!", "");
var отчППЛАН  :String; var отчППЛАН_  :String=отчППЛАН	;
var отчРАСХ   :String; var отчРАСХ_   :String=отчРАСХ	;
var отчФКР    :String; var отчФКР_    :String=отчФКР	  ;
var отчКОСГУ  :String; var отчКОСГУ_  :String=отчКОСГУ	;
var отчПЕРИОД :String; var отчПЕРИОД_ :String=отчПЕРИОД ;
var отчАНА    :String;
var отчАНАold :String;

2-- Общие процедуры и функции
Proc ОчиститьТаблицу;
 ClearVariable(СумЛИМп); ClearVariable(СумРТ); ClearVariable(АНА);
 ClearVariable(СумЛИМт); ClearVariable(СумРГ);
 ClearVariable(СумОСТ);  ClearVariable(СумПА);
 ClearVariable(Строки);  ClearVariable(СумНА);
end;

Proc Очистить;
 ClearVariable(N);   ClearVariable(BufMsk); ClearVariable(ИМЯ);
 ClearVariable(Buf); ClearVariable(BufStr);
end;

Proc ValidateSectionОтчет;
var Flag :Logical;
 if Строки<1: Flag=False; else Flag=True; fi;
 СекцТаблЗ.Visible=Flag;
 СекцТаблР.Visible=Flag;
 СекцТаблИ.Visible=Flag;
end;

Proc ValidateSection;
var Flag :Logical;
 if ТипОтчета>0: Flag=True; else Flag=False; fi;
 СекцУслов.Visible=Flag;
 btnРасчет.Visible=Flag; Bevel1.Visible=Flag; Bevel2.Visible=Flag;
 cbУчетОст.Visible=Flag; cbУчетОбо.Visible=Flag;
 cbУч_М_КП.Visible=Flag; cbУч_М_ОБ.Visible=Flag;
 cbУч_Р_КП.Visible=Flag; cbУч_Р_ОБ.Visible=Flag;
 cbУч_Б_КП.Visible=Flag; cbУч_Б_ОБ.Visible=Flag;
 if not(Flag): ClearVariable(Строки); fi;
 ValidateSectionОтчет;
end;

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

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;
 name=AsString(Template.Field);
 if name="ДатОтч": ^ДатОтч;
 fi;
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var name :String;
 name=AsString(Template.Field);
 if name="ДатОтч": ДатОтч=Value;
 fi;
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 СчитатьЗначенияПоУмолчанию;
var REC :Record;
 REC=ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР.КлючЗаписиАктивныхНастроек;
 if REC<>NIL: 
   УМ_СПРАВрасх=GetCardFieldS("РПО_ПОДОТЧ_НАСТР", REC, "СПРАВ");
 fi;
end;

Func ПроверкаДат :Logical;
 if ДатОтч<=1.1.100:
   Message('Не задана дата построения отчета!', mtWarning);
   Template.Field="ДатОтч";
   ^False;
 fi;
 ^True;
end;

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

Func СправочникОтчета(ТипОтч:Integer) :String;
 if ТипОтч=1 : ^"П_ЛИМ";
 |  ТипОтч=2 : ^УМ_СПРАВрасх;
 |  ТипОтч=3 : ^"ФКР";
 |  ТипОтч=4 : ^"КОСГУ";
 |  ТипОтч=5 : ^"ПЕРИОД";
 fi;
 ^"";
end;

Proc Расчет;
var Путь, УслАН, VOC, tmp :String;
var Res, sumОСТ, sumОБО :Numeric;
var i, k :Integer;
var Отч1 :Report;
var f1, f2, f3, Выводить :Logical;
 СчитатьЗначенияПоУмолчанию;
 if not(ПроверкаЗначенийПоУмолчанию): Exit; fi;
 if not(ПроверкаДат): Exit; fi;
 Путь=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ\Подотчет.lst";
 if not(ExistFile(Путь)): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
 Очистить; ОчиститьТаблицу;
 УслАН="";
 УслАН=Объединить(УслАН, if(отчППЛАН <>"", "(", "")+отчППЛАН +if(отчППЛАН <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчРАСХ  <>"", "(", "")+отчРАСХ  +if(отчРАСХ  <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчФКР   <>"", "(", "")+отчФКР   +if(отчФКР   <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчКОСГУ <>"", "(", "")+отчКОСГУ +if(отчКОСГУ <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчПЕРИОД<>"", "(", "")+отчПЕРИОД+if(отчПЕРИОД<>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчАНА   <>"", "(", "")+отчАНА   +if(отчАНА   <>"", ")", ""), "&");
-- УслАН="";
-- УслАН=Объединить(УслАН, отчППЛАН  , "&");
-- УслАН=Объединить(УслАН, отчРАСХ   , "&");
-- УслАН=Объединить(УслАН, отчФКР    , "&");
-- УслАН=Объединить(УслАН, отчКОСГУ  , "&");
-- УслАН=Объединить(УслАН, отчПЕРИОД , "&");
-- УслАН=Объединить(УслАН, отчАНА    , "&");
 Try Res=Saldo("ЛИМ_ЗАДАН"+"{"+УслАН+"}",1.1.100); Except Raise; Exit; end;
 VOC=СправочникОтчета(ТипОтчета);
 if not(AutoRefresh): RefreshAna; fi;
 Отч1=RepOpen(Путь+"|ЛИМ_ЗАДАН", "ЛИМ_ЗАДАН", УслАН, 1.1.100, ДатОтч+1, "", VOC);
 i=0; k=0;
 RepReset(Отч1);
 ShowProgress(RepRowsCount(Отч1), "Обработка данных...");
 Try
   while RepNext(Отч1) do
     k=k+1;
     ProgressPos(k);
     sumОБО=RepTurn(Отч1, отчСверн);
     sumОСТ=RepSaldoF(Отч1, отчСверн);
     Выводить=True;
     if fУчетОбо:
       f1=False; if fУч_М_ОБ: if sumОБО<0: f1=True; fi; fi;
       f2=False; if fУч_Р_ОБ: if sumОБО=0: f2=True; fi; fi;
       f3=False; if fУч_Б_ОБ: if sumОБО>0: f3=True; fi; fi;
       Выводить=(f1 or f2 or f3);
     fi;
     if Выводить:
       if fУчетОст:
	 f1=False; if fУч_М_КП: if sumОСТ<0: f1=True; fi; fi;
	 f2=False; if fУч_Р_КП: if sumОСТ=0: f2=True; fi; fi;
	 f3=False; if fУч_Б_КП: if sumОСТ>0: f3=True; fi; fi;
	 Выводить=(f1 or f2 or f3);
       fi;
     fi;
     if Выводить:
	 i=i+1;
       АНА[i]=RepIdent(Отч1);
       tmp=Объединить(УслАН, if(АНА[i]="", "(~"+VOC+".*)", АНА[i]), "&");
      СумЛИМп[i]=Saldo("ЛИМ_ЗАДАН"+"{"+tmp+"}", Dat(1,1,Year(ДатОтч)));
      СумЛИМт[i]=RepTurn(Отч1, отчДеб)-СумЛИМп[i];
	СумРТ[i]=Turn("-ЛИМ_ИСПОЛ"+"{"+tmp+"}", ДатОтч, ДатОтч+1);
	СумРГ[i]=Turn("-ЛИМ_ИСПОЛ"+"{"+tmp+"}", Dat(1,1,Year(ДатОтч)), ДатОтч+1);
	СумПА[i]=Turn("+ЛИМ_ИСПОЛ"+"{"+tmp+"}", Dat(1,1,Year(ДатОтч)), ДатОтч+1);
	СумНА[i]=Saldo("ЛИМ_ИСПОЛ"+"{"+tmp+"}", ДатОтч+1);
       СумОСТ[i]=sumОСТ;
     fi;
   end;
 Finally
   Отч1=RepClose(Отч1);
   CloseProgress;
 end;
 Строки=LengthOfArray(АНА);
 if Строки<1: Message("Нет данных для отчета!^MПопробуйте изменить параметры отчета!", mtInformation); fi;
 ValidateSectionОтчет;
end;

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

Func ВхожденийНет(ANA:String; MSK:String) :Logical;
 ^(Pos(ANA, MSK)=0);
end;

Func ВыборФильтраОтбораАналитики(Voc:String; cVal:String; Sep:String) :String;
var VALUE, tmp, ANA :String;
var ВыбранаМаска, f1, f2 :Logical;
var i, num1, num2 :Integer;
 ВыбранаМаска=False;
 cVal=Up(cVal);
 if not(ПроверкаЗначенийПоУмолчанию): ^cVal; fi;
 VALUE=Up(AnaElection(Voc, False, True));
 if VALUE="": ^cVal; fi;
 if SubStr(VALUE, Length(VALUE), 1)=".": VALUE=VALUE+"*"; tmp=SubStr(VALUE, 1, Length(VALUE)-2); ВыбранаМаска=True; else tmp=VALUE; fi;
 if cVal="" or (ВыбранаМаска and (WordsCount(VALUE, ".")<3)): ^VALUE; fi;
 ClearVariable(Buf); ClearVariable(BufMsk); ClearVariable(BufStr);
 num1=WordsCount(cVal, Sep);
 for i=1 to num1 do
   ANA=ExtractWord(i, cVal, Sep);
   if Pos("*", ANA)>0: InsertInArraySort(BufMsk, ANA); else InsertInArraySort(BufStr, ANA); fi;
 od;
 num1=LengthOfArray(BufMsk);
 num2=LengthOfArray(BufStr);
 if ВыбранаМаска:
   InsertInArraySort(Buf, VALUE);
   if num1>0:
     for i=1 to num1 do
       f1=Match(VALUE, BufMsk[i]);
       f2=ВхожденийНет(tmp, BufMsk[i]);
       if not(f1) and f2: InsertInArraySort(Buf, BufMsk[i]); fi;
     od;
   fi;
   if num2>0:
     for i=1 to num2 do 
       f1=Match(BufStr[i], VALUE);
       f2=ВхожденийНет(BufStr[i], VALUE);
       if not(f1) and f2: InsertInArraySort(Buf, BufStr[i]); fi;
     od;
   fi;
 else
   if num1>0:
     for i=1 to num1 do 
       f1=Match(VALUE, BufMsk[i]);
       if not(f1): InsertInArraySort(Buf, BufMsk[i]); fi;
     od;
   fi;
   if num2>0:
     CopyArray(BufStr, Buf, 1, LengthOfArray(Buf)+1);
   fi;
   SortArray(Buf, True);
   num1=SearchInArray(Buf, VALUE, True, 1);
   if num1=-1: InsertInArraySort(Buf, VALUE); fi;
 fi;
 num1=LengthOfArray(Buf);
 ANA="";
 for i=1 to num1 do ANA=Объединить(ANA, Buf[i], Sep); od;
 ^ANA;
end;

Func Оператор :String;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="И";
 Buf[2]="ИЛИ";
 Buf[3]="И ИСКЛЮЧИТЬ";
 nn=Alternate("Выбор оператора",Buf, 20, 1, 12);
 if nn=1: ^"&";
   |nn=2: ^"|";
   |nn=3: ^"&~";
 fi;
 ^"";
end;

Proc РасшифровкаПозиции(Iter:Integer);
var Fatal :Numeric;
var nn, RES :Integer;
var ПутьVAR, Путь, УслАН, ОтчИМЯ, VOC :String;
 СчитатьЗначенияПоУмолчанию;
 if not(ПроверкаЗначенийПоУмолчанию): Exit; fi;
 if not(ПроверкаДат): Exit; fi;
 ClearVariable(Buf); ClearVariable(BufStr);
 Buf[1]="Детализация суммы по подразделениям";
 BufStr[1]="1";
 Buf[2]="Детализация суммы по статьям расхода";
 BufStr[2]="2";
 Buf[3]="Детализация суммы по ФКР";
 BufStr[3]="3";
 Buf[4]="Детализация суммы по КОСГУ";
 BufStr[4]="4";
 Buf[5]="Детализация суммы по периодам";
 BufStr[5]="5";
 DeleteFromArray(Buf,	 ТипОтчета);
 DeleteFromArray(BufStr, ТипОтчета);
 InsertInArray(Buf   , 1, "Детализация суммы по проводкам");
 InsertInArray(BufStr, 1, "0");
 nn=LengthOfArray(Buf)+1;
 InsertInArray(Buf   , nn, "Детализация суммы по месяцам");
 InsertInArray(BufStr, nn, "100");
 nn=0;
 nn=Alternate("Выберите вид детализации...", Buf, -1, -1, 12);
 if nn=0: Exit; fi;
 ПутьVAR=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ";
-- УслАН="";
-- УслАН=Объединить(УслАН, отчППЛАН  , "&");
-- УслАН=Объединить(УслАН, отчРАСХ   , "&");
-- УслАН=Объединить(УслАН, отчФКР    , "&");
-- УслАН=Объединить(УслАН, отчКОСГУ  , "&");
-- УслАН=Объединить(УслАН, отчПЕРИОД , "&");
-- УслАН=Объединить(УслАН, отчАНА    , "&");
 УслАН="";
 УслАН=Объединить(УслАН, if(отчППЛАН <>"", "(", "")+отчППЛАН +if(отчППЛАН <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчРАСХ  <>"", "(", "")+отчРАСХ  +if(отчРАСХ  <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчФКР   <>"", "(", "")+отчФКР   +if(отчФКР   <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчКОСГУ <>"", "(", "")+отчКОСГУ +if(отчКОСГУ <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчПЕРИОД<>"", "(", "")+отчПЕРИОД+if(отчПЕРИОД<>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчАНА   <>"", "(", "")+отчАНА   +if(отчАНА   <>"", ")", ""), "&");
 Try Fatal=Saldo("ЛИМ_ЗАДАН"+"{"+УслАН+"}",1.1.100); Except Raise; Exit; end;
 RES=Int(BufStr[nn]);
 ОтчИМЯ=""; VOC="";
 if RES=0   : ОтчИМЯ=ПутьVAR+"\Подотчет.lst"+"|ЛИМ_по_проводкам";
 |  RES=1   : ОтчИМЯ=ПутьVAR+"\ОтчЗаб.lst" +"|Аналитика по забалансу"; VOC="П_ЛИМ";
 |  RES=2   : ОтчИМЯ=ПутьVAR+"\ОтчЗаб.lst" +"|Аналитика по забалансу"; VOC=УМ_СПРАВрасх;
 |  RES=3   : ОтчИМЯ=ПутьVAR+"\ОтчЗаб.lst" +"|Аналитика по забалансу"; VOC="ФКР";
 |  RES=4   : ОтчИМЯ=ПутьVAR+"\ОтчЗаб.lst" +"|Аналитика по забалансу"; VOC="КОСГУ";
 |  RES=5   : ОтчИМЯ=ПутьVAR+"\ОтчЗаб.lst" +"|Аналитика по забалансу"; VOC="ПЕРИОД";
 |  RES=100 : ОтчИМЯ=ПутьVAR+"\Подотчет.lst"+"|ЛИМ_по_месячно";
 fi;
 if not(AutoRefresh): RefreshAna; fi;
 if RES>0 and RES<6:
--   Путь=ПутьVAR+"\ОтчЗаб.lst";
--   if ExistFile(Путь): DeleteFile(Путь); fi;
--   Путь=ПутьVAR+"\ОТЧЕТЫ~\ОтчЗаб.lst";
--   if not(ExistFile(Путь)): Message("Файл-отчет детализации отсутствует!", mtError); Exit; fi;
--   Try CopyFile(Путь, ПутьVAR); Except Raise; Exit; end;
--   Путь=ПутьVAR+"\ОтчЗаб.lst";
--   if not(ExistFile(Путь)): Message("Файл-отчет детализации отсутствует!", mtError); Exit; fi;
--   WriteLn(Путь, "StrAnaGroup="+VOC, True);
   Путь=ПутьVAR+"\ОтчЗаб.lst";
   if ExistFile(Путь): DeleteFile(Путь); fi;
   if РАБ.УПП.LIB.СоздатьФайлОтчетСтрокиПоПризнакам("ОтчЗаб", ПутьVAR, "Аналитика по забалансу", "ЛИМ_ЗАДАН", УслАН, False, True, VOC)=False:
     Message("Файл-отчет детализации отсутствует!", mtError);
     Exit;
   fi;
 fi;
 УслАН=Объединить(УслАН, АНА[Iter], "&");
 Try
   Report(ОтчИМЯ, 1.1.100, ДатОтч+1, "ЛИМ_ЗАДАН", УслАН);
 Except
   Message("Ошибка создания детализированного отчета!", mtError);
   Exit;
 end;
 ClearVariable(Buf); ClearVariable(BufStr);
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
var StoreANA :String;
var StoreREP, nn :Integer;
 СчитатьЗначенияПоУмолчанию;
 Flag_onEnter=False;
 if Field="кнЗкр"      : Close; ^False;
 |  Field="Вид_П"      : Вид_П=ВыборВидаТаблицы(Вид_П); ^False;
 |  Field="ДатОтч"     : OldDate=ДатОтч;
 |  Field="Расш"       : РасшифровкаПозиции(Iter); ^False;
 |  Field="отчППЛАН_"  : StoreANA=отчППЛАН  ; 
			 отчППЛАН  = ВыборФильтраОтбораАналитики("П_ЛИМ.*"	 , отчППЛАН  , "|");
			 if отчППЛАН <>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчППЛАН =StoreANA; fi; fi;
			 ^False;
 |  Field="отчРАСХ_"   : StoreANA=отчРАСХ   ; 
			 отчРАСХ   = ВыборФильтраОтбораАналитики(УМ_СПРАВрасх+".*" , отчРАСХ   , "|");
			 if отчРАСХ  <>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчРАСХ  =StoreANA; fi; fi;
			 ^False;
 |  Field="отчФКР_"    : StoreANA=отчФКР    ; 
			 отчФКР    = ВыборФильтраОтбораАналитики("ФКР.*"       , отчФКР    , "|");
			 if отчФКР   <>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчФКР   =StoreANA; fi; fi;
			 ^False;
 |  Field="отчКОСГУ_"  : StoreANA=отчКОСГУ  ; 
			 отчКОСГУ  = ВыборФильтраОтбораАналитики("КОСГУ.*"	 , отчКОСГУ  , "|");
			 if отчКОСГУ <>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчКОСГУ =StoreANA; fi; fi;
			 ^False;
 |  Field="отчПЕРИОД_" : StoreANA=отчПЕРИОД ; 
			 отчПЕРИОД = ВыборФильтраОтбораАналитики("ПЕРИОД.*"	  , отчПЕРИОД , "|");
			 if отчПЕРИОД<>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчПЕРИОД=StoreANA; fi; fi;
			 ^False;
 |  Field="ТипОтчета_" : StoreRep=ТипОтчета;
			 ClearVariable(Buf);
			 Buf[1]="Отчет по подразделениям";
			 Buf[2]="Отчет по статьям расхода";
			 Buf[3]="Отчет по ФКР";
			 Buf[4]="Отчет по КОСГУ";
			 Buf[5]="Отчет по периодам";
			 nn=Alternate("Выберите тип отчета", Buf, -1, 1, 12);
			 if nn<>0: ТипОтчета=nn; fi;
			 if ТипОтчета<>StoreRep: if ОтменитьИзмененияУсловийОтчета: ТипОтчета=StoreRep; fi; fi;
			 ValidateSection;
			 ^False;
 |  Field="отчАНА"     : отчАНАold=отчАНА; Flag_onEnter=True; ^True;
 fi;
 ^True;
end; 

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
var StoreANA :String;
var StoreREP :Integer;
 if Field="ДатОтч":
   if ДатОтч<>OldDate:
     if ОтменитьИзмененияУсловийОтчета: ДатОтч=OldDate; fi;
   fi;
 |  Field="отчППЛАН_"  : StoreANA=отчППЛАН ; 
			 отчППЛАН =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчППЛАН	  , "|");
			 if отчППЛАН <>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчППЛАН =StoreANA; fi; fi;
 |  Field="отчРАСХ_"   : StoreANA=отчРАСХ  ; 
			 отчРАСХ  =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчРАСХ	 , "|");
			 if отчРАСХ  <>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчРАСХ  =StoreANA; fi; fi;
 |  Field="отчФКР_"    : StoreANA=отчФКР   ; 
			 отчФКР   =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчФКР	, "|");
			 if отчФКР   <>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчФКР   =StoreANA; fi; fi;
 |  Field="отчКОСГУ_"  : StoreANA=отчКОСГУ ; 
			 отчКОСГУ =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчКОСГУ	  , "|");
			 if отчКОСГУ <>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчКОСГУ =StoreANA; fi; fi;
 |  Field="отчПЕРИОД_" : StoreANA=отчПЕРИОД; 
			 отчПЕРИОД=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчПЕРИОД , "|");
			 if отчПЕРИОД<>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчПЕРИОД=StoreANA; fi; fi;
 |  Field="отчАНА"     : if Flag_onEnter=True  and отчАНА<>отчАНАold: if ОтменитьИзмененияУсловийОтчета: отчАНА=отчАНАold; fi; fi;
			 if Flag_onEnter=False and отчАНА="":	      if ОтменитьИзмененияУсловийОтчета: отчАНА=отчАНАold; fi; fi;
 |  Field="ТипОтчета_" : StoreREP=ТипОтчета; 
			 if ОтменитьИзмененияУсловийОтчета: ТипОтчета=StoreREP; else ТипОтчета=0; fi;
			 ValidateSection;
			 Exit;
 fi;
 ValidateSectionОтчет;
 Flag_onEnter=False;
end;

Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var dd, ddSave : Date;
 Template.HideEditor(False);
 ddSave=GetDate;
 dd=ВыборДаты(ddSave);
 if dd<>ddSave:
   if ОтменитьИзмененияУсловийОтчета: dd=ddSave; fi;
   ValidateSectionОтчет;
 fi;
 SetDate(dd);
 ^"";
end;

Func ДопАналитика_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var StoreANA, tmp :String;
 Template.HideEditor(False);
 StoreANA=отчАНА;
 tmp=Up(AnaElection(""));
 if tmp="": ^Cur; fi;
 if отчАНА="": 
   отчАНА=tmp; 
 else 
   if Pos(tmp, Up(отчАНА))=0: отчАНА=Раб.Бюджет2005.Объединить(отчАНА, tmp, Оператор); fi;
 fi;
 if tmp<>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчАНА=StoreANA; fi; ValidateSectionОтчет; fi;
 отчАНАold=отчАНА;
 ^Cur;
end;

Func Field_OnValidateS(Field:String; Iter:Integer; Value:String) :Logical;
var Res :Numeric;
 if Field="отчАНА": Try Res=Saldo("{"+Value+"}",1.1.100); Except Raise; ^False; end; fi;
 ^True;
end;

2-- События объектов
Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnРасчет": Расчет; fi;
end;

Proc РазрешенУчетУсловийОстатков(Разрешено:Logical);
 cbУч_М_КП.Enabled=Разрешено;
 cbУч_Р_КП.Enabled=Разрешено;
 cbУч_Б_КП.Enabled=Разрешено;
end;

Proc РазрешенУчетУсловийОборотов(Разрешено:Logical);
 cbУч_М_ОБ.Enabled=Разрешено;
 cbУч_Р_ОБ.Enabled=Разрешено;
 cbУч_Б_ОБ.Enabled=Разрешено;
end;

Proc Флаги_onChange(Sender:String);
var Flag, Old, Work :Logical;
var tmp :String;
var ОбъектИмя :Object;
 Work=False;
 if FindObject(Sender, ОбъектИмя): Work=True; fi;
 if Work:
   tmp="f"+SubStr(Sender, 3, Length(Sender)); -- вычисляем имя переменной
   Flag=GetVariableL(tmp); -- текущий статус;
   Old=not(Flag); -- предыдущий статус
   if ОтменитьИзмененияУсловийОтчета: Flag=Old; fi;
   PutVariableL(tmp, Flag);
   ОбъектИмя.State=Flag;
   if Flag<>Old:
     if Sender="cbУчетОст": РазрешенУчетУсловийОстатков(fУчетОст);
     |	Sender="cbУчетОбо": РазрешенУчетУсловийОборотов(fУчетОбо);
     fi;
   fi;
   ValidateSectionОтчет;
 fi;
end;  

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

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
 Очистить;
 if ДатОтч=1.1.100: ДатОтч=ToDay; fi;
 РазрешенУчетУсловийОстатков(fУчетОст);
 РазрешенУчетУсловийОборотов(fУчетОбо);
 СчитатьЗначенияПоУмолчанию;
 ValidateSection;
 Template.Field="кнЗкр";
end;

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

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