БЛАНКСШАБЛОНОМ [07.11.2005] "Универсальный отчет по расходом МОЛа [208 счет]";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
-- Секции
СекцОбщая :Object; СекцУслов :Object; СекцДата    :Object;
СекцТаблЗ :Object; СекцТаблР :Object; СекцТаблИ :Object;
СекцТаблРдет :Object;
-- Объекты
btnРасчет:Object; Bevel1:Object; Bevel2:Object; Bevel3:Object;
cbБюджет :Object; cbДоходы :Object; cbЦелевые:Object;
cbУчетОст:Object; cbУчетОбо:Object; cbОстНП  :Object; cbОстКП  :Object;
cbУч_М_НП:Object; cbУч_М_КП:Object; cbУч_М_ОБ:Object;
cbУч_Р_НП:Object; cbУч_Р_КП:Object; cbУч_Р_ОБ:Object;
cbУч_Б_НП:Object; cbУч_Б_КП:Object; cbУч_Б_ОБ:Object;
cbКоманд :Object;
cbРасходы401_20:Object;
--
fБюджет  :Logical; fДоходы  :Logical; fЦелевые :Logical;
fУчетОст :Logical; fУчетОбо :Logical; fОстНП   :Logical; fОстКП   :Logical;
fУч_М_НП :Logical; fУч_М_КП :Logical; fУч_М_ОБ :Logical;
fУч_Р_НП :Logical; fУч_Р_КП :Logical; fУч_Р_ОБ :Logical;
fУч_Б_НП :Logical; fУч_Б_КП :Logical; fУч_Б_ОБ :Logical;
fКоманд  :Logical;
fРасходы401_20:Logical=[False];
--
Flag_onEnter  :Logical;
Строки        :Integer;
СтрокиДет     :Integer;
ДатНач        :Date;
ДатКон        :Date;
-- Данные по умолчанию
var УМ_ссчСУТ    :String;   var УМ_СЧ208    :String;   var УМ_КОСГУ_СУТ   :String;   var УМ_СПРАВрасх:String;
var УМ_ссчТРН    :String;   var УМ_сч208Д   :String;   var УМ_КОСГУ_ТРН   :String;
var УМ_ссчКВР    :String;   var УМ_сч208К   :String;   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;

var Вид_П     :Integer=[0];
var ТипОтчета :Integer=[0];
var ТипОтчета_:Integer=ТипОтчета;

Func ФорматИМЯ(name:String) :String;
 if ТипОтчета>0 and ТипОтчета<8: ^(РАБ.УПП.LIB.FormatAna(name, Вид_П, "наименования нет", "-"));
 |  ТипОтчета=8            :     ^(РАБ.УПП.LIB.FormatAccFull(name, Вид_П, "наименования нет", "-"));
 else ^name;
 fi;
end;

var ИМЯ[]    :String=ФорматИМЯ(АНА[$]);
var OldDate  :Date;
var ИтогоНП  :Numeric=SumOfArray(СумНП, if(fКоманд, СтрокиДет, Строки));
var ИтогоД   :Numeric=SumOfArray(СумД , if(fКоманд, СтрокиДет, Строки));
var ИтогоК   :Numeric=SumOfArray(СумК , if(fКоманд, СтрокиДет, Строки));
var ИтогоКП  :Numeric=SumOfArray(СумКП, if(fКоманд, СтрокиДет, Строки));
var ИтогоЛ   :Numeric=SumOfArray(СумЛ,  if(fКоманд, СтрокиДет, Строки));
--
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 отчКОСГУ_  :String=отчКОСГУ  ;
var отчПЕРИОД :String; var отчПЕРИОД_ :String=отчПЕРИОД ;
var отчСЧЕТ   :String; var отчСЧЕТ_   :String=отчСЧЕТ   ;
var отчАНА    :String;
var отчАНАold :String;
-- Для детализированного отчета
СумНПсут[]:Numeric; СумДсут[]:Numeric; СумКсут[]:Numeric; СумКПсут[]:Numeric; СумЛсут[]:Numeric;
СумНПтрн[]:Numeric; СумДтрн[]:Numeric; СумКтрн[]:Numeric; СумКПтрн[]:Numeric; СумЛтрн[]:Numeric;
СумНПквр[]:Numeric; СумДквр[]:Numeric; СумКквр[]:Numeric; СумКПквр[]:Numeric; СумЛквр[]:Numeric;
--
var СумНПком[]:Numeric=СумНПсут[$]+СумНПтрн[$]+СумНПквр[$];
var СумНПпрч[]:Numeric=СумНП[$]-СумНПком[$];
var СумДком[] :Numeric=СумДсут[$]+СумДтрн[$]+СумДквр[$];
var СумДпрч[] :Numeric=СумД[$]-СумДком[$];
var СумКком[] :Numeric=СумКсут[$]+СумКтрн[$]+СумКквр[$];
var СумКпрч[] :Numeric=СумК[$]-СумКком[$];
var СумКПком[]:Numeric=СумКПсут[$]+СумКПтрн[$]+СумКПквр[$];
var СумКПпрч[]:Numeric=СумКП[$]-СумКПком[$];
var СумЛком[] :Numeric=СумЛсут[$]+СумЛтрн[$]+СумЛквр[$];
var СумЛпрч[] :Numeric=СумЛ[$]-СумЛком[$];

2-- Общие процедуры и функции
Proc ОчиститьОтчет;
 ClearVariable(АНА);
 ClearVariable(СумНП); ClearVariable(СумД);
 ClearVariable(СумКП); ClearVariable(СумК);
 ClearVariable(СумЛ);
end;

Proc ОчиститьТаблицу;
 ClearVariable(Строки);
end;

Proc ОчиститьТаблицуДет;
 ClearVariable(СумНПсут); ClearVariable(СумДсут); ClearVariable(СумКсут); ClearVariable(СумКПсут); ClearVariable(СумЛсут);
 ClearVariable(СумНПтрн); ClearVariable(СумДтрн); ClearVariable(СумКтрн); ClearVariable(СумКПтрн); ClearVariable(СумЛтрн);
 ClearVariable(СумНПквр); ClearVariable(СумДквр); ClearVariable(СумКквр); ClearVariable(СумКПквр); ClearVariable(СумЛквр);
 ClearVariable(СтрокиДет);
end;

Proc Очистить;
 ClearVariable(N);   ClearVariable(BufMsk); ClearVariable(ИМЯ);
 ClearVariable(Buf); ClearVariable(BufStr);
 ClearVariable(СумНПком); ClearVariable(СумКПком);
 ClearVariable(СумНПпрч); ClearVariable(СумКПпрч);
 ClearVariable(СумДком);  ClearVariable(СумКком); ClearVariable(СумЛком);
 ClearVariable(СумДпрч);  ClearVariable(СумКпрч); ClearVariable(СумЛпрч);
end;

Proc ValidateSectionОтчет;
 if Строки<1 and СтрокиДет<1:
   СекцТаблЗ.Visible=False;
   СекцТаблИ.Visible=False;
   ОчиститьТаблицу;
   ОчиститьТаблицуДет;
   ОчиститьОтчет;
   Очистить;
 else
   СекцТаблЗ.Visible=True;
   СекцТаблИ.Visible=True;
 fi;
 if Строки>0    and fКоманд=False: ОчиститьТаблицуДет; СекцТаблР.Visible=True;    else СекцТаблР.Visible=False;    fi;
 if СтрокиДет>0 and fКоманд=True:  ОчиститьТаблицу;    СекцТаблРдет.Visible=True; else СекцТаблРдет.Visible=False; fi;
end;

Proc ValidateSection;
var Flag :Logical;
 if ТипОтчета>0: Flag=True; else Flag=False; fi;
 СекцУслов.Visible=Flag;
  СекцДата.Visible=Flag;
 btnРасчет.Visible=Flag; Bevel1.Visible=Flag; Bevel2.Visible=Flag; Bevel3.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;
 cbУч_Р_НП.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;
 cbРасходы401_20.Visible=Flag;
 if Flag=False: ClearVariable(Строки); ClearVariable(СтрокиДет); fi;
 ValidateSectionОтчет;
 if ТипОтчета>0 and ТипОтчета<6 and Flag: Flag=True; else Flag=False; fi;
 if Flag=False: fКоманд=False; fi;
 cbКоманд.Enabled=Flag;
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="ДатНач": ^ДатНач;
 |  name="ДатКон": ^ДатКон;
 fi;
end;

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

Func ПроверкаДат :Logical;
 if ДатНач <1.1.100: Message('Не задана дата начала периода!',      mtWarning); Template.Field="ДатНач"; ^False; fi;
 if ДатКон<=1.1.100: Message('Не задана дата окончания периода!', mtWarning); Template.Field="ДатКон"; ^False; fi;
 if ДатНач>ДатКон:
   Message('Дата начала "'+DateToString(ДатНач)+'" периода позже даты окончания периода "'+DateToString(ДатКон)+'"!'
       +Chr(13)+'Необходимо скорректировать даты!', mtError);
   Template.Field="ДатНач"; ^False;
 fi;
 ^True;
end;

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

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

Func МаскаСчетаДляФильтра(ИФД:Integer; ДК:String) :String;
var msk :String;
 if ДК=" ": ДК=""; fi;
 if ДК<>"" and ДК<>"+" and ДК<>"-": ^""; fi;
 msk="";
 if ИФД=  1: msk=ДК+"*.1."+УМ_СЧ208+".??.???";
 |  ИФД= 10: msk=ДК+"*.2."+УМ_СЧ208+".??.???";
 |  ИФД=100: msk=ДК+"*.3."+УМ_СЧ208+".??.???";
 |  ИФД= 11: msk=ДК+"*.1."+УМ_СЧ208+".??.???"+"|"+"*.2."+УМ_СЧ208+".??.???";
 |  ИФД=101: msk=ДК+"*.1."+УМ_СЧ208+".??.???"+"|"+"*.3."+УМ_СЧ208+".??.???";
 |  ИФД=110: msk=ДК+"*.2."+УМ_СЧ208+".??.???"+"|"+"*.3."+УМ_СЧ208+".??.???";
 |  ИФД=111: msk=ДК+"*.?."+УМ_СЧ208+".??.???";
 fi;
 ^msk;
end;

Func МаскаСчетаДляФильтраРасходы401_20(ИФД:Integer; ДК:String) :String;
var msk :String;
 if ДК=" ": ДК=""; fi;
 if ДК<>"" and ДК<>"+" and ДК<>"-": ^""; fi;
 msk="";
 if ИФД=  1: msk=ДК+"*.1.401.20.???";
 |  ИФД= 10: msk=ДК+"*.2.401.20.???";
 |  ИФД=100: msk=ДК+"*.3.401.20.???";
 |  ИФД= 11: msk=ДК+"*.1.401.20.???"+"|"+"*.2.401.20.???";
 |  ИФД=101: msk=ДК+"*.1.401.20.???"+"|"+"*.3.401.20.???";
 |  ИФД=110: msk=ДК+"*.2.401.20.???"+"|"+"*.3.401.20.???";
 |  ИФД=111: msk=ДК+"*.?.401.20.???";
 fi;
 ^msk;
end;

Proc Расчет;
var Путь, УслСЧ, УслАН, VOC, ОтчИМЯ, tmp :String;
var Res, sumНП, sumКП, sumОБ :Numeric;
var ИФД, i, k :Integer;
var Отч1 :Report;
var f1, f2, f3, Выводить :Logical;
var УслСЧд, УслСЧк, tmp1, tmp2, tmp3 :String;
 СчитатьЗначенияПоУмолчанию;
 if not(ПроверкаЗначенийПоУмолчанию): Exit; fi;
 if not(ПроверкаДат): Exit; fi;
 Путь=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ\Подотчет.lst";
 if not(ExistFile(Путь)): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
 if not(fБюджет or fДоходы or fЦелевые):
   tmp="Не выбрано условие по отбору счетов!"+Chr(13)+
       "поставте галочки для нужных вам по отчету условиям:"+Chr(13)+
       "Бюджет"+Chr(13)+
       "Предпринимательская деятельность"+Chr(13)+
       "Целевые средства";
   Message(tmp, mtWarning);
   Template.Object="cbБюджет";
   Exit;
 fi;
 Очистить; ОчиститьТаблицу; ОчиститьТаблицуДет;
 if отчСЧЕТ<>"": 
   УслСЧ=отчСЧЕТ; 
 else 
   ИФД=0;
   if fБюджет  : ИФД=ИФД+  1; fi;
   if fДоходы  : ИФД=ИФД+ 10; fi;
   if fЦелевые : ИФД=ИФД+100; fi;
   if fРасходы401_20:
     УслСЧ=МаскаСчетаДляФильтраРасходы401_20(ИФД, "");
   else
     УслСЧ=МаскаСчетаДляФильтра(ИФД, "");
   fi;
   if fКоманд:
     if fРасходы401_20:
       УслСЧд=МаскаСчетаДляФильтраРасходы401_20(ИФД, "+");
       УслСЧк=МаскаСчетаДляФильтраРасходы401_20(ИФД, "-");
     else
       УслСЧд=МаскаСчетаДляФильтра(ИФД, "+");
       УслСЧк=МаскаСчетаДляФильтра(ИФД, "-");
     fi;
   else
     УслСЧд=""; УслСЧк="";
   fi;
 fi;
-- УслАН="";
-- УслАН=Объединить(УслАН, отчППЛАН  , "&");
-- УслАН=Объединить(УслАН, отчПФАКТ  , "&");
-- УслАН=Объединить(УслАН, отчМОЛ    , "&");
-- УслАН=Объединить(УслАН, отчРАСХ   , "&");
-- УслАН=Объединить(УслАН, отчФКР    , "&");
-- УслАН=Объединить(УслАН, отчКОСГУ  , "&");
-- УслАН=Объединить(УслАН, отчПЕРИОД , "&");
-- УслАН=Объединить(УслАН, отчАНА    , "&");
 УслАН="";
 УслАН=Объединить(УслАН, if(отчППЛАН <>"", "(", "")+отчППЛАН +if(отчППЛАН <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчПФАКТ <>"", "(", "")+отчПФАКТ +if(отчПФАКТ <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчМОЛ   <>"", "(", "")+отчМОЛ   +if(отчМОЛ   <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчРАСХ  <>"", "(", "")+отчРАСХ  +if(отчРАСХ  <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчФКР   <>"", "(", "")+отчФКР   +if(отчФКР   <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчКОСГУ <>"", "(", "")+отчКОСГУ +if(отчКОСГУ <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчПЕРИОД<>"", "(", "")+отчПЕРИОД+if(отчПЕРИОД<>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчАНА   <>"", "(", "")+отчАНА   +if(отчАНА   <>"", ")", ""), "&");
 Try Res=Saldo(УслСЧ+"{"+УслАН+"}",1.1.100); Except Raise; Exit; end;
 if ТипОтчета>0 and ТипОтчета<8: VOC=СправочникОтчета(ТипОтчета); ОтчИМЯ=Путь+"|ВСЕ_по_признакам";
 |  ТипОтчета=8:  VOC=""; ОтчИМЯ=Путь+"|По_счетам";
 |  ТипОтчета=9:  VOC=""; ОтчИМЯ=Путь+"|ПО_месячно";
 |  ТипОтчета=10: VOC=""; ОтчИМЯ=Путь+"|Еженедельно";
 fi;
 if not(AutoRefresh): RefreshAna; fi;
 Отч1=RepOpen(ОтчИМЯ, УслСЧ, УслАН, ДатНач, ДатКон+1, "", VOC);
 i=0; k=0;
 RepReset(Отч1);
 ShowProgress(RepRowsCount(Отч1), "Обработка данных...");
 Try
   while RepNext(Отч1) do
     k=k+1;
     ProgressPos(k);
     sumНП=RepSaldoS(Отч1, отчСверн);
     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УчетОст:
     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;
       fi;
     fi;
     if Выводить:
       i=i+1;
       АНА[i]   = RepIdent(Отч1);
       СумНП[i] = sumНП;
       СумД[i]  = RepTurn(Отч1, отчДеб);
       СумК[i]  = RepTurn(Отч1, отчКре);
       СумКП[i] = sumКП;
       tmp=Объединить(УслАН, if(АНА[i]="", "(~"+VOC+".*)", АНА[i]), "&");
--       СумЛ[i]  = Saldo("ЛИМ_ЗАДАН"+"{"+АНА[i]+"}", ДатКон+1);
       СумЛ[i]  = Saldo("ЛИМ_ЗАДАН"+"{"+tmp+"}", ДатКон+1);
       --
       if fКоманд:
         tmp=Объединить(УслАН, if(АНА[i]="", "(~"+VOC+".*)", АНА[i]), "&");
         tmp1=Объединить(tmp, "КОСГУ."+УМ_КОСГУ_СУТ, "&");
         tmp2=Объединить(tmp, "КОСГУ."+УМ_КОСГУ_ТРН, "&");
         tmp3=Объединить(tmp, "КОСГУ."+УМ_КОСГУ_КВР, "&");
         СумНПсут[i]=Saldo(УслСЧ+"{"+tmp1+"}", ДатНач);
         СумКПсут[i]=Saldo(УслСЧ+"{"+tmp1+"}", ДатКон+1);
         СумНПтрн[i]=Saldo(УслСЧ+"{"+tmp2+"}", ДатНач);
         СумКПтрн[i]=Saldo(УслСЧ+"{"+tmp2+"}", ДатКон+1);
         СумНПквр[i]=Saldo(УслСЧ+"{"+tmp3+"}", ДатНач);
         СумКПквр[i]=Saldo(УслСЧ+"{"+tmp3+"}", ДатКон+1);
         СумДсут[i]=Deb(Turn(УслСЧд+"{"+tmp1+"}", ДатНач, ДатКон+1));
         СумДтрн[i]=Deb(Turn(УслСЧд+"{"+tmp2+"}", ДатНач, ДатКон+1));
         СумДквр[i]=Deb(Turn(УслСЧд+"{"+tmp3+"}", ДатНач, ДатКон+1));
         СумКсут[i]=Cre(Turn(УслСЧк+"{"+tmp1+"}", ДатНач, ДатКон+1));
         СумКтрн[i]=Cre(Turn(УслСЧк+"{"+tmp2+"}", ДатНач, ДатКон+1));
         СумКквр[i]=Cre(Turn(УслСЧк+"{"+tmp3+"}", ДатНач, ДатКон+1));
         СумЛсут[i]=Saldo("ЛИМ_ЗАДАН"+"{"+tmp1+"}", ДатКон+1);
         СумЛтрн[i]=Saldo("ЛИМ_ЗАДАН"+"{"+tmp2+"}", ДатКон+1);
         СумЛквр[i]=Saldo("ЛИМ_ЗАДАН"+"{"+tmp3+"}", ДатКон+1);
       fi;
     fi;
   end;
 Finally
   Отч1=RepClose(Отч1);
   CloseProgress;
 end;
 k=0;
 k=LengthOfArray(АНА);
 if fКоманд: СтрокиДет=k; else Строки=k; fi;
 if Строки<1 and СтрокиДет<1: Message("Нет данных для отчета!^MПопробуйте изменить параметры отчета!", mtInformation); fi;
 ValidateSectionОтчет;
end;

Func ОтменитьИзмененияУсловийОтчета(ДетКом:Logical) :Logical;
var F :Logical;
var q :Integer;
 F=False;
-- if (ДетКом=False and Строки>0) or (ДетКом=True and СтрокиДет>0):
 if Строки>0 or СтрокиДет>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 ВыборФильтраОтбораСчетов(cVal:String; Sep:String) :String;
var VALUE, tmp :String;
var i, num, ИФД :Integer;
 if not(ПроверкаЗначенийПоУмолчанию): ^cVal; fi;
 if not(fБюджет or fДоходы or fЦелевые):
   tmp="Не выбрано условие по отбору счетов!"+Chr(13)+
       "поставте галочки для нужных вам по отчету условиям:"+Chr(13)+
       "Бюджет"+Chr(13)+
       "Предпринимательская деятельность"+Chr(13)+
       "Целевые средства";
   Message(tmp, mtWarning);
   Template.Object="cbБюджет";
   ^cVal;
 fi;
 ИФД=0;
 if fБюджет  : ИФД=ИФД+  1; fi;
 if fДоходы  : ИФД=ИФД+ 10; fi;
 if fЦелевые : ИФД=ИФД+100; fi;
 VALUE=AccountElection(МаскаСчетаДляФильтра(ИФД, ""), True, "");
 if VALUE="": ^cVal; fi;
 if Match(VALUE,"???."):
   if ИФД=  1: VALUE=VALUE+"????.???????.???.1."+УМ_СЧ208+".??.???";
   |  ИФД= 10: VALUE=VALUE+"????.???????.???.2."+УМ_СЧ208+".??.???";
   |  ИФД=100: VALUE=VALUE+"????.???????.???.3."+УМ_СЧ208+".??.???";
   |  ИФД= 11: VALUE=VALUE+"????.???????.???.1."+УМ_СЧ208+".??.???"+"|"+VALUE+"????.???????.???.2."+УМ_СЧ208+".??.???";
   |  ИФД=101: VALUE=VALUE+"????.???????.???.1."+УМ_СЧ208+".??.???"+"|"+VALUE+"????.???????.???.3."+УМ_СЧ208+".??.???";
   |  ИФД=110: VALUE=VALUE+"????.???????.???.2."+УМ_СЧ208+".??.???"+"|"+VALUE+"????.???????.???.3."+УМ_СЧ208+".??.???";
   |  ИФД=111: VALUE=VALUE+"????.???????.???.?."+УМ_СЧ208+".??.???";
   fi;
 |  Match(VALUE,"???.????."):
   if ИФД=  1: VALUE=VALUE+    "???????.???.1."+УМ_СЧ208+".??.???";
   |  ИФД= 10: VALUE=VALUE+    "???????.???.2."+УМ_СЧ208+".??.???";
   |  ИФД=100: VALUE=VALUE+    "???????.???.3."+УМ_СЧ208+".??.???";
   |  ИФД= 11: VALUE=VALUE+    "???????.???.1."+УМ_СЧ208+".??.???"+"|"+VALUE+       "???????.???.2."+УМ_СЧ208+".??.???";
   |  ИФД=101: VALUE=VALUE+    "???????.???.1."+УМ_СЧ208+".??.???"+"|"+VALUE+       "???????.???.3."+УМ_СЧ208+".??.???";
   |  ИФД=110: VALUE=VALUE+    "???????.???.2."+УМ_СЧ208+".??.???"+"|"+VALUE+       "???????.???.3."+УМ_СЧ208+".??.???";
   |  ИФД=111: VALUE=VALUE+    "???????.???.?."+УМ_СЧ208+".??.???";
   fi;
 |  Match(VALUE,"???.????.???????."):     
   if ИФД=  1: VALUE=VALUE+        "???.1."+УМ_СЧ208+".??.???";
   |  ИФД= 10: VALUE=VALUE+        "???.2."+УМ_СЧ208+".??.???";
   |  ИФД=100: VALUE=VALUE+        "???.3."+УМ_СЧ208+".??.???";
   |  ИФД= 11: VALUE=VALUE+        "???.1."+УМ_СЧ208+".??.???"+"|"+VALUE+           "???.2."+УМ_СЧ208+".??.???";
   |  ИФД=101: VALUE=VALUE+        "???.1."+УМ_СЧ208+".??.???"+"|"+VALUE+           "???.3."+УМ_СЧ208+".??.???";
   |  ИФД=110: VALUE=VALUE+        "???.2."+УМ_СЧ208+".??.???"+"|"+VALUE+           "???.3."+УМ_СЧ208+".??.???";
   |  ИФД=111: VALUE=VALUE+        "???.?."+УМ_СЧ208+".??.???";
   fi;
 |  Match(VALUE,"???.????.???????.???."): 
           VALUE=VALUE+            "?."+УМ_СЧ208+".??.???";
   if ИФД=  1: VALUE=VALUE+            "1."+УМ_СЧ208+".??.???";
   |  ИФД= 10: VALUE=VALUE+            "2."+УМ_СЧ208+".??.???";
   |  ИФД=100: VALUE=VALUE+            "3."+УМ_СЧ208+".??.???";
   |  ИФД= 11: VALUE=VALUE+            "1."+УМ_СЧ208+".??.???"+"|"+VALUE+               "2."+УМ_СЧ208+".??.???";
   |  ИФД=101: VALUE=VALUE+            "1."+УМ_СЧ208+".??.???"+"|"+VALUE+               "3."+УМ_СЧ208+".??.???";
   |  ИФД=110: VALUE=VALUE+            "2."+УМ_СЧ208+".??.???"+"|"+VALUE+               "3."+УМ_СЧ208+".??.???";
   |  ИФД=111: VALUE=VALUE+            "?."+УМ_СЧ208+".??.???";
   fi;
 |  Match(VALUE,"???.????.???????.???.?."):            VALUE=VALUE+УМ_СЧ208+".??.???";
 |  Match(VALUE,"???.????.???????.???.?.???."):        VALUE=VALUE+          "??.???";
 |  Match(VALUE,"???.????.???????.???.?.???.??."):     VALUE=VALUE+           "???";
 |  Match(VALUE,"???.????.???????.???.?.???.??.???."): VALUE=SubStr(VALUE, 1, Length(VALUE)-1);
 fi;
 ClearVariable(Buf); ClearVariable(BufStr);
 num=WordsCount(cVal, Sep);
 for i=1 to num do InsertInArraySort(BufStr, ExtractWord(i, cVal, Sep)); od;
 num=LengthOfArray(BufStr);
 if num>0:
   for i=1 to num do
     if not(Match(VALUE, BufStr[i])) and not(Match(BufStr[i], VALUE)): InsertInArraySort(Buf, BufStr[i]); fi;
   od;
 fi;
 if SearchInArray(Buf, VALUE, True, 1)=-1: InsertInArraySort(Buf, VALUE); fi;
 num=LengthOfArray(Buf);
 tmp="";
 for i=1 to num do tmp=Объединить(tmp, Buf[i], Sep); od;
 ^tmp;
end;

Func ВыборФильтраОтбораСчетовРасходы401_01(cVal:String; Sep:String) :String;
var VALUE, tmp :String;
var i, num, ИФД :Integer;
 if not(ПроверкаЗначенийПоУмолчанию): ^cVal; fi;
 if not(fБюджет or fДоходы or fЦелевые):
   tmp="Не выбрано условие по отбору счетов!"+Chr(13)+
       "поставте галочки для нужных вам по отчету условиям:"+Chr(13)+
       "Бюджет"+Chr(13)+
       "Предпринимательская деятельность"+Chr(13)+
       "Целевые средства";
   Message(tmp, mtWarning);
   Template.Object="cbБюджет";
   ^cVal;
 fi;
 ИФД=0;
 if fБюджет  : ИФД=ИФД+  1; fi;
 if fДоходы  : ИФД=ИФД+ 10; fi;
 if fЦелевые : ИФД=ИФД+100; fi;
 VALUE=AccountElection(МаскаСчетаДляФильтраРасходы401_20(ИФД, ""), True, "");
 if VALUE="": ^cVal; fi;
 if Match(VALUE,"???."):
   if ИФД=  1: VALUE=VALUE+"????.???????.???.1.401.20.???";
   |  ИФД= 10: VALUE=VALUE+"????.???????.???.2.401.20.???";
   |  ИФД=100: VALUE=VALUE+"????.???????.???.3.401.20.???";
   |  ИФД= 11: VALUE=VALUE+"????.???????.???.1.401.20.???"+"|"+VALUE+"????.???????.???.2.401.20.???";
   |  ИФД=101: VALUE=VALUE+"????.???????.???.1.401.20.???"+"|"+VALUE+"????.???????.???.3.401.20.???";
   |  ИФД=110: VALUE=VALUE+"????.???????.???.2.401.20.???"+"|"+VALUE+"????.???????.???.3.401.20.???";
   |  ИФД=111: VALUE=VALUE+"????.???????.???.?.401.20.???";
   fi;
 |  Match(VALUE,"???.????."):
   if ИФД=  1: VALUE=VALUE+     "???????.???.1.401.20.???";
   |  ИФД= 10: VALUE=VALUE+     "???????.???.2.401.20.???";
   |  ИФД=100: VALUE=VALUE+     "???????.???.3.401.20.???";
   |  ИФД= 11: VALUE=VALUE+     "???????.???.1.401.20.???"+"|"+VALUE+     "???????.???.2.401.20.???";
   |  ИФД=101: VALUE=VALUE+     "???????.???.1.401.20.???"+"|"+VALUE+     "???????.???.3.401.20.???";
   |  ИФД=110: VALUE=VALUE+     "???????.???.2.401.20.???"+"|"+VALUE+     "???????.???.3.401.20.???";
   |  ИФД=111: VALUE=VALUE+     "???????.???.?.401.20.???";
   fi;
 |  Match(VALUE,"???.????.???????."):
   if ИФД=  1: VALUE=VALUE+             "???.1.401.20.???";
   |  ИФД= 10: VALUE=VALUE+             "???.2.401.20.???";
   |  ИФД=100: VALUE=VALUE+             "???.3.401.20.???";
   |  ИФД= 11: VALUE=VALUE+             "???.1.401.20.???"+"|"+VALUE+             "???.2.401.20.???";
   |  ИФД=101: VALUE=VALUE+             "???.1.401.20.???"+"|"+VALUE+             "???.3.401.20.???";
   |  ИФД=110: VALUE=VALUE+             "???.2.401.20.???"+"|"+VALUE+             "???.3.401.20.???";
   |  ИФД=111: VALUE=VALUE+             "???.?.401.20.???";
   fi;
 |  Match(VALUE,"???.????.???????.???."):
               VALUE=VALUE+                 "?.401.20.???";
   if ИФД=  1: VALUE=VALUE+                 "1.401.20.???";
   |  ИФД= 10: VALUE=VALUE+                 "2.401.20.???";
   |  ИФД=100: VALUE=VALUE+                 "3.401.20.???";
   |  ИФД= 11: VALUE=VALUE+                 "1.401.20.???"+"|"+VALUE+                 "2.401.20.???";
   |  ИФД=101: VALUE=VALUE+                 "1.401.20.???"+"|"+VALUE+                 "3.401.20.???";
   |  ИФД=110: VALUE=VALUE+                 "2.401.20.???"+"|"+VALUE+                 "3.401.20.???";
   |  ИФД=111: VALUE=VALUE+                 "?.401.20.???";
   fi;
 |  Match(VALUE,"???.????.???????.???.?."):            VALUE=VALUE+"401.20.???";
 |  Match(VALUE,"???.????.???????.???.?.???."):        VALUE=VALUE+    "20.???";
 |  Match(VALUE,"???.????.???????.???.?.???.??."):     VALUE=VALUE+       "???";
 |  Match(VALUE,"???.????.???????.???.?.???.??.???."): VALUE=SubStr(VALUE, 1, Length(VALUE)-1);
 fi;
 ClearVariable(Buf); ClearVariable(BufStr);
 num=WordsCount(cVal, Sep);
 for i=1 to num do InsertInArraySort(BufStr, ExtractWord(i, cVal, Sep)); od;
 num=LengthOfArray(BufStr);
 if num>0:
   for i=1 to num do
     if not(Match(VALUE, BufStr[i])) and not(Match(BufStr[i], VALUE)): InsertInArraySort(Buf, BufStr[i]); fi;
   od;
 fi;
 if SearchInArray(Buf, VALUE, True, 1)=-1: InsertInArraySort(Buf, VALUE); fi;
 num=LengthOfArray(Buf);
 tmp="";
 for i=1 to num do tmp=Объединить(tmp, Buf[i], Sep); od;
 ^tmp;
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;
var ДН, ДК :Date;
 СчитатьЗначенияПоУмолчанию;
 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";
 Buf[6]="Детализация суммы по КОСГУ";
 BufStr[6]="6";
 Buf[7]="Детализация суммы по периодам";
 BufStr[7]="7";
 Buf[8]="Детализация суммы по счетам";
 BufStr[8]="8";
 if not(ТипОтчета=9 or ТипОтчета=10):
   Buf[9]="Детализация суммы по месяцам";
   BufStr[9]="9";
   Buf[10]="Детализация суммы по неделям";
   BufStr[10]="10";
   DeleteFromArray(Buf,    ТипОтчета);
   DeleteFromArray(BufStr, ТипОтчета);
 fi;
 InsertInArray(Buf   , 1, "Детализация суммы по проводкам");
 InsertInArray(BufStr, 1, "0");
 nn=Alternate("Выберите вид детализации...", Buf, -1, -1, 12);
 if nn=0: Exit; fi;
 ПутьVAR=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ";
 if отчСЧЕТ<>"": 
   УслСЧ=отчСЧЕТ; 
 else 
   ИФД=0;
   if fБюджет  : ИФД=ИФД+  1; fi;
   if fДоходы  : ИФД=ИФД+ 10; fi;
   if fЦелевые : ИФД=ИФД+100; fi;
   if fРасходы401_20:
     УслСЧ=МаскаСчетаДляФильтраРасходы401_20(ИФД, "");
   else
     УслСЧ=МаскаСчетаДляФильтра(ИФД, "");
   fi;
 fi;
-- УслАН="";
-- УслАН=Объединить(УслАН, отчППЛАН  , "&");
-- УслАН=Объединить(УслАН, отчПФАКТ  , "&");
-- УслАН=Объединить(УслАН, отчМОЛ    , "&");
-- УслАН=Объединить(УслАН, отчРАСХ   , "&");
-- УслАН=Объединить(УслАН, отчФКР    , "&");
-- УслАН=Объединить(УслАН, отчКОСГУ  , "&");
-- УслАН=Объединить(УслАН, отчПЕРИОД , "&");
---- УслАН=Объединить(УслАН, отчСЧЕТ   , "&");
-- УслАН=Объединить(УслАН, отчАНА    , "&");
 УслАН="";
 УслАН=Объединить(УслАН, if(отчППЛАН <>"", "(", "")+отчППЛАН +if(отчППЛАН <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, if(отчПФАКТ <>"", "(", "")+отчПФАКТ +if(отчПФАКТ <>"", ")", ""), "&");
 УслАН=Объединить(УслАН, 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=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=6  : ОтчИМЯ=ПутьVAR+"\Статья.lst"+"|Отчет по аналитике"; VOC="КОСГУ";
 |  RES=7  : ОтчИМЯ=ПутьVAR+"\Статья.lst"+"|Отчет по аналитике"; VOC="ПЕРИОД";
 |  RES=8  : ОтчИМЯ=ПутьVAR+"\Подотчет.lst"+"|По_счетам";
 |  RES=9  : ОтчИМЯ=ПутьVAR+"\Подотчет.lst"+"|ПО_месячно";
 |  RES=10 : ОтчИМЯ=ПутьVAR+"\Подотчет.lst"+"|Еженедельно";
 |  RES=0  : ОтчИМЯ=ПутьVAR+"\Подотчет.lst"+"|По_проводкам";
 fi;
 if not(AutoRefresh): RefreshAna; fi;
 if RES>0 and RES<8:
--   Путь=Путь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, "Отчет по аналитике", УслСЧ, УслАН, True, False, VOC)=False:
     Message("Файл-отчет детализации отсутствует!", mtError);
     Exit;
   fi;
 fi;
 if not(ТипОтчета=9 or ТипОтчета=10): УслАН=Объединить(УслАН, АНА[Iter], "&"); fi;
 if ТипОтчета=9 : ДН=StringToDate(АНА[Iter]); ДК=AddMon(ДН, 1);
 |  ТипОтчета=10: ДН=StringToDate(АНА[Iter]); ДК=ДН+7;
 else ДН=ДатНач; ДК=ДатКон+1;
 fi;
 Try
   Report(ОтчИМЯ, ДН, ДК, УслСЧ, УслАН);
 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="ДатКон"     : OldDate=ДатКон;
 |  Field="Расш"       : РасшифровкаПозиции(Iter); ^False;
 |  Field="отчППЛАН_"  : StoreANA=отчППЛАН  ; 
                         отчППЛАН  = ВыборФильтраОтбораАналитики("П_ЛИМ.*"       , отчППЛАН  , "|");
                         if отчППЛАН <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчППЛАН =StoreANA; fi; fi;
                         ^False;
 |  Field="отчПФАКТ_"  : StoreANA=отчПФАКТ  ; 
                         отчПФАКТ  = ВыборФильтраОтбораАналитики("П.*"           , отчПФАКТ  , "|");
                         if отчПФАКТ <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчПФАКТ =StoreANA; fi; fi;
                         ^False;
 |  Field="отчМОЛ_"    : StoreANA=отчМОЛ    ; 
                         отчМОЛ    = ВыборФильтраОтбораАналитики("МОЛ.*"       , отчМОЛ    , "|");
                         if отчМОЛ   <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчМОЛ   =StoreANA; fi; fi;
                         ^False;
 |  Field="отчРАСХ_"   : StoreANA=отчРАСХ   ; 
                         отчРАСХ   = ВыборФильтраОтбораАналитики(УМ_СПРАВрасх+".*" , отчРАСХ   , "|");
                         if отчРАСХ  <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчРАСХ  =StoreANA; fi; fi;
                         ^False;
 |  Field="отчФКР_"    : StoreANA=отчФКР    ; 
                         отчФКР    = ВыборФильтраОтбораАналитики("ФКР.*"       , отчФКР    , "|");
                         if отчФКР   <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчФКР   =StoreANA; fi; fi;
                         ^False;
 |  Field="отчКОСГУ_"  : StoreANA=отчКОСГУ  ; 
                         отчКОСГУ  = ВыборФильтраОтбораАналитики("КОСГУ.*"       , отчКОСГУ  , "|");
                         if отчКОСГУ <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчКОСГУ =StoreANA; fi; fi;
                         ^False;
 |  Field="отчПЕРИОД_" : StoreANA=отчПЕРИОД ; 
                         отчПЕРИОД = ВыборФильтраОтбораАналитики("ПЕРИОД.*"       , отчПЕРИОД , "|");
                         if отчПЕРИОД<>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчПЕРИОД=StoreANA; fi; fi;
                         ^False;
 |  Field="отчСЧЕТ_"   : StoreANA=отчСЧЕТ   ; 
                         if fРасходы401_20:
                           отчСЧЕТ=ВыборФильтраОтбораСчетовРасходы401_01(отчСЧЕТ, "|");
                         else
                           отчСЧЕТ=ВыборФильтраОтбораСчетов(отчСЧЕТ, "|");
                         fi;
                         if отчСЧЕТ  <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчСЧЕТ  =StoreANA; fi; fi;
                         ^False;
 |  Field="ТипОтчета_" : StoreRep=ТипОтчета;
                         ClearVariable(Buf);
                         Buf[1]="Отчет по подразделениям (плановый расход)";
                         Buf[2]="Отчет по подразделениям (фактический расход)";
                         Buf[3]="Отчет по материально ответственным лицам";
                         Buf[4]="Отчет по статьям расхода";
                         Buf[5]="Отчет по ФКР";
                         Buf[6]="Отчет по КОСГУ";
                         Buf[7]="Отчет по периодам";
                         Buf[8]="Отчет по счетам";
                         Buf[9]="По месячный отчет";
                         Buf[10]="Еженедельный отчет";
                         nn=Alternate("Выберите тип отчета", Buf, -1, 1, 12);
                         if nn<>0: ТипОтчета=nn; fi;
                         if ТипОтчета<>StoreRep: if ОтменитьИзмененияУсловийОтчета(fКоманд): ТипОтчета=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 ОтменитьИзмененияУсловийОтчета(fКоманд): ДатНач=OldDate; fi; fi;
 |  Field="ДатКон": if ДатКон<>OldDate: if ОтменитьИзмененияУсловийОтчета(fКоманд): ДатКон=OldDate; fi; fi;
 |  Field="отчППЛАН_"  : StoreANA=отчППЛАН ; 
                         отчППЛАН =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчППЛАН    , "|");
                         if отчППЛАН <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчППЛАН =StoreANA; fi; fi;
 |  Field="отчПФАКТ_"  : StoreANA=отчПФАКТ ; 
                         отчПФАКТ =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчПФАКТ    , "|");
                         if отчПФАКТ <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчПФАКТ =StoreANA; fi; fi;
 |  Field="отчМОЛ_"    : StoreANA=отчМОЛ   ; 
                         отчМОЛ   =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчМОЛ    , "|");
                         if отчМОЛ   <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчМОЛ   =StoreANA; fi; fi;
 |  Field="отчРАСХ_"   : StoreANA=отчРАСХ  ; 
                         отчРАСХ  =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчРАСХ    , "|");
                         if отчРАСХ  <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчРАСХ  =StoreANA; fi; fi;
 |  Field="отчФКР_"    : StoreANA=отчФКР   ; 
                         отчФКР   =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчФКР    , "|");
                         if отчФКР   <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчФКР   =StoreANA; fi; fi;
 |  Field="отчКОСГУ_"  : StoreANA=отчКОСГУ ; 
                         отчКОСГУ =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчКОСГУ    , "|");
                         if отчКОСГУ <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчКОСГУ =StoreANA; fi; fi;
 |  Field="отчПЕРИОД_" : StoreANA=отчПЕРИОД; 
                         отчПЕРИОД=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчПЕРИОД , "|");
                         if отчПЕРИОД<>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчПЕРИОД=StoreANA; fi; fi;
 |  Field="отчСЧЕТ_"   : StoreANA=отчСЧЕТ  ; 
                         отчСЧЕТ  =РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(отчСЧЕТ    , "|");
                         if отчСЧЕТ  <>StoreANA: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчСЧЕТ  =StoreANA;  fi; fi;
 |  Field="отчАНА"     : if Flag_onEnter=True  and отчАНА<>отчАНАold: if ОтменитьИзмененияУсловийОтчета(fКоманд): отчАНА=отчАНАold; fi; fi;
                         if Flag_onEnter=False and отчАНА="":         if ОтменитьИзмененияУсловийОтчета(fКоманд): отчАНА=отчАНАold; fi; fi;
 |  Field="ТипОтчета_" : StoreREP=ТипОтчета; 
                         if ОтменитьИзмененияУсловийОтчета(fКоманд): ТипОтчета=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 ОтменитьИзмененияУсловийОтчета(fКоманд): 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 ОтменитьИзмененияУсловийОтчета(fКоманд): отчАНА=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 РазрешенУчетУсловийОстатков(Разрешено:Logical);
 cbОстНП.Enabled=Разрешено;
 cbОстКП.Enabled=Разрешено;
 if Разрешено:
   РазрешенУчетОстатковНачало(fОстНП);
   РазрешенУчетОстатковКонец( fОстКП);
 | True:
   РазрешенУчетОстатковНачало(Разрешено);
   РазрешенУчетОстатковКонец( Разрешено);
 fi;
end;

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

Proc ВнешнийВид(Flag:Logical);
var j, i1, i2, цвFont, цвBack :Integer;
var ТЧ :Logical;
 if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coWhite; цвBack=coTeal; ТЧ=False; fi;
 j=3; i1=8; i2=10;
 СЕКЦУСЛОВ.Cell(i1, j, CellFontColor, цвFont); СЕКЦУСЛОВ.Cell(i1, j, CellBgColor, цвBack); СЕКЦУСЛОВ.Cell(i1, j, CellReadOnly, ТЧ);
 СЕКЦУСЛОВ.Cell(i2, j, CellFontColor, цвFont); СЕКЦУСЛОВ.Cell(i2, j, CellBgColor, цвBack); СЕКЦУСЛОВ.Cell(i2, j, CellReadOnly, ТЧ);
 if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coBlack; цвBack=coAqua; ТЧ=False; fi;
 j=3; i1=11;
 СЕКЦУСЛОВ.Cell(i1, j, CellFontColor, цвFont); СЕКЦУСЛОВ.Cell(i1, j, CellBgColor, цвBack); СЕКЦУСЛОВ.Cell(i1, j, CellReadOnly, ТЧ); СЕКЦУСЛОВ.Cell(i1, j, CellLookup, not(ТЧ));
 if Flag: отчКОСГУ=""; отчСЧЕТ=""; отчАНА=""; fi;
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): Flag=Old; fi;
   PutVariableL(tmp, Flag);
   ОбъектИмя.State=Flag;
   if Flag<>Old:
     if Sender="cbБюджет" or Sender="cbДоходы" or Sender="cbЦелевые": отчСЧЕТ="";
     |  Sender="cbУчетОст": РазрешенУчетУсловийОстатков(fУчетОст);
     |  Sender="cbУчетОбо": РазрешенУчетУсловийОборотов(fУчетОбо);
     |  Sender="cbОстНП"  : РазрешенУчетОстатковНачало(fОстНП);
     |  Sender="cbОстКП"  : РазрешенУчетОстатковКонец(fОстКП);
     |  Sender="cbКоманд" : ВнешнийВид(fКоманд);
     |  Sender="cbРасходы401_20" : отчСЧЕТ="";
     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;
 ВнешнийВид(fКоманд);
 fРасходы401_20=False;
 fЦелевые=False;
 cbЦелевые.State=fЦелевые;  cbЦелевые.Enabled=False;
 Template.Field="кнЗкр";
end;

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

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