БЛАНКСШАБЛОНОМ [03.11.2005] "Отчет по выданным авансам (должники)";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
-- Секции
СекцОбщая:Object; СекцТаблЗ:Object; СекцТаблР:Object; СекцТаблИ:Object;
btnРасчет:Object; cbКоманд:Object; cbДолжн:Object; cbДПА:Object; cbДоДПА:Object;
Строки	      :Integer;
ДатНач	      :Date;
ДатКон	      :Date;
Команд	      :Logical=[True];
Должн	      :Logical=[True];
ДПА	      :Logical=[True];
ДоДПА	      :Logical=[True];
var кнЗкр     :String="Закрыть";
var Пользов   :String;
var N[]       :String=Str($);
var Buf[]     :String;

МОЛ[]	      :String;
СумНП[]       :Numeric;
СумД[]	      :Numeric;
СумК[]	      :Numeric;
СумКП[]       :Numeric;
ДатПол[]      :Date; -- получение
ДатПог[]      :Date; -- погашение
Тел[]	      :String;

Func Заголовок(fК:Logical; fД:Logical) :String;
var tmp :String;
 tmp="";
 tmp=if(fК, "ОТЧЕТ ПО ВЫДАННЫМ АВАНСАМ - КОМАНДИРОВКИ.", "ОТЧЕТ ПО ВЫДАННЫМ АВАНСАМ - ПРОЧИЙ РАСХОД.");
 tmp=if(fД, tmp+Chr(13)+"(ДОЛЖНИКИ)", tmp);
 ^tmp;
end;

var СумКП_[]	:Numeric=СумКП[$];
var Title    :String=Заголовок(Команд, Должн);
var Вид_МОЛ    :Integer;
var ФИО[]    :String=РАБ.УПП.LIB.FormatAna(МОЛ[$], Вид_МОЛ, "наименования нет", "-");
var ДПогАванса	  :Date;
var OldDate    :Date;
var ИтогоНП    :Numeric=SumOfArray(СумНП, Строки);
var ИтогоД    :Numeric=SumOfArray(СумД , Строки);
var ИтогоК    :Numeric=SumOfArray(СумК , Строки);
var ИтогоКП    :Numeric=SumOfArray(СумКП, Строки);
-- Данные по умолчанию
var УМ_СЧ208	:String;
var УМ_ссчСУТ	 :String;
var УМ_ссчТРН	 :String;
var УМ_ссчКВР	 :String;
var УМ_сч208Д	 :String;
var УМ_сч208К	 :String;
var УМ_СПРАВрасх:String;

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

Proc Очистить;
 ClearVariable(N); ClearVariable(Buf); ClearVariable(ФИО); ClearVariable(СумКП_);
end;

Proc ValidateSection;
var Flag :Logical;
 if Строки<1: Flag=False; else Flag=True; fi;
 СекцТаблЗ.Visible=Flag;
 СекцТаблР.Visible=Flag;
 СекцТаблИ.Visible=Flag;
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;

Func ТелефонМОЛа(REC:Record) :String;
var t1, t2, out :String;
 out="";
 if REC<>NIL:
   t1=GetCardFieldS("СОТРУДНИКИ", REC, "ТЕЛЕФОНРАБОЧИЙ");
   t2=GetCardFieldS("СОТРУДНИКИ", REC, "ТЕЛЕФОНДОМАШНИЙ");
   if t1<>"": out="раб. - "+t1; fi;
   if t2<>"": out=out+if(t1<>"",Chr(13),"")+"дом. - "+t2; fi;
 fi;
 ^out;
end;

Func ПоследняяДатаПолученияАвансаСтарый(Призн:String; МаскаСЧ:String; КонДата:Date) :Date;
var t, k, j :Integer;
var dd :Date;
var ANA, tmp, прим, ГГ, МД :String;
 dd=1.1.100;
 ДПогАванса=dd;
 for transaction t=МаскаСЧ, dd, КонДата, Reverse do
   ANA=TransSigns(t);
   if Match(ANA, Призн):
     dd=TransDate(t);
     прим=TransComment(t);
     k=Pos("ДатаГашенияАванса:", прим); -- в примечание заранее вставляем дату
     if k>0: Try ДПогАванса=StringToDate(SubStr(прим, k+18, 10)); Except end; Break; fi;
     if k=0:
       j=0;
       j=ПроводНомерПризнака(t, 'ММДД.');
       if j>0: 
	 ANA=ПроводИмяПризн(t, j);
	 tmp=GetAnaGlossary(ANA);
	 j=Length(tmp)+2;
	 МД=SubStr(ANA, j, Length(ANA));
       fi;
       j=0;
       j=ПроводНомерПризнака(t, 'ГГ.');
       if j>0: 
	 ANA=ПроводИмяПризн(t, j);
	 tmp=GetAnaGlossary(ANA);
	 j=Length(tmp)+2;
	 ГГ=SubStr(ANA, j, Length(ANA));
       fi;
       Try if Length(МД)=5: ДПогАванса=Dat(Int(SubStr(МД, 4, 2)), Int(SubStr(МД, 1, 2)), Int(ГГ)); fi; Except end;
     fi;
     Break;
   fi;
 od;
 ^dd;
end;

Func ПоследняяДатаПолученияАванса(МаскаСЧ:String; МаскаАН:String; КонДата:Date) :Date;
var t, k, j :Integer;
var dd, ДПолАванса :Date;
var Усл, ANA, tmp, прим, ГГ, МД :String;
 dd=1.1.100; ДПолАванса=dd; ДПогАванса=dd;
 Усл=МаскаСЧ+"{"+МаскаАН+"}";
 for transaction t=Усл, dd, КонДата, Reverse do
   if ДПолАванса=1.1.100: ДПолАванса=TransDate(t); fi;
   dd=TransDate(t);
   прим=TransComment(t);
   k=Pos("ДатаГашенияАванса:", прим); -- в примечание заранее вставляем дату
   if k>0: Try ДПогАванса=StringToDate(SubStr(прим, k+18, 10)); Except end; Break; fi;
   if k=0:
     j=0;
     j=ПроводНомерПризнака(t, 'ММДД.');
     if j>0:
       ANA=ПроводИмяПризн(t, j);
       tmp=GetAnaGlossary(ANA);
       j=Length(tmp)+2;
       МД=SubStr(ANA, j, Length(ANA));
     fi;
     j=0;
     j=ПроводНомерПризнака(t, 'ГГ.');
     if j>0:
       ANA=ПроводИмяПризн(t, j);
       tmp=GetAnaGlossary(ANA);
       j=Length(tmp)+2;
       ГГ=SubStr(ANA, j, Length(ANA));
     fi;
     Try if Length(МД)=5: ДПогАванса=Dat(Int(SubStr(МД, 4, 2)), Int(SubStr(МД, 1, 2)), Int(ГГ)); fi; Except end;
   fi;
   if ДПогАванса<>1.1.100: 
      if ДПА: ДПолАванса=TransDate(t); fi;
      Break;
   fi;
 od;
 ^ДПолАванса;
end;

Proc СчитатьЗначенияПоУмолчанию;
var REC :Record;
 REC=ДОКУМЕНТЫ.ПОДОТЧЕТ.НАСТР.КлючЗаписиАктивныхНастроек;
 if REC<>NIL: 
   УМ_СЧ208    =GetCardFieldS("РПО_ПОДОТЧ_НАСТР", REC, "СЧ_ПО" );
   УМ_ссчСУТ   =GetCardFieldS("РПО_ПОДОТЧ_НАСТР", REC, "СЧ_СУТ");
   УМ_ссчТРН   =GetCardFieldS("РПО_ПОДОТЧ_НАСТР", REC, "СЧ_ТРН");
   УМ_ссчКВР   =GetCardFieldS("РПО_ПОДОТЧ_НАСТР", REC, "СЧ_КВР");
   УМ_сч208Д   =GetCardFieldS("РПО_ПОДОТЧ_НАСТР", REC, "СЧ_ПО_Д");
   УМ_сч208К   =GetCardFieldS("РПО_ПОДОТЧ_НАСТР", REC, "СЧ_ПО_К");
   УМ_СПРАВрасх=GetCardFieldS("РПО_ПОДОТЧ_НАСТР", REC, "СПРАВ");
 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;

Proc Расчет;
var Путь, СЧ, СЧД, aМОЛ :String;
var SumD, SumK, SumOst :Numeric;
var i, k :Integer;
var Отч1 :Report;
var REC :Record;
var dПОЛ, dГАШ :Date;
 if not(ПроверкаДат): Exit; fi;
 СчитатьЗначенияПоУмолчанию;
 if not(ПроверкаЗначенийПоУмолчанию): Exit; fi;
 if КОМАНД:
   СЧ ="*.?."+УМ_СЧ208+"."+УМ_ссчСУТ+".???"+"|"+"*.?."+УМ_СЧ208+"."+УМ_ссчТРН+".???"+"|"+"*.?."+УМ_СЧ208+"."+УМ_ссчКВР+".???";
   СЧД="*.?."+УМ_СЧ208+"."+УМ_ссчСУТ+"."+УМ_сч208Д+"|"+"*.?."+УМ_СЧ208+"."+УМ_ссчТРН+"."+УМ_сч208Д+"|"+"*.?."+УМ_СЧ208+"."+УМ_ссчКВР+"."+УМ_сч208Д;
 else
   СЧ ="*.?."+УМ_СЧ208+".??.???";
   СЧД="*.?."+УМ_СЧ208+".??."+УМ_сч208Д;
 fi;
 Очистить; ОчиститьТаблицу;
 Путь=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ\Подотчет.lst";
 if not(AutoRefresh): RefreshAna; fi;
 Отч1=RepOpen(Путь+"|По_признакам", СЧ, if(КОМАНД, "КОМАНД", ""), ДатНач, ДатКон+1, "", "МОЛ");
 i=0; k=0;
 RepReset(Отч1);
 ShowProgress(RepRowsCount(Отч1), "Обработка данных...");
 Try
   while RepNext(Отч1) do
     k=k+1;
     ProgressPos(k);
     dПОЛ=1.1.100; dГАШ=dПОЛ;
     SumD=RepTurn(Отч1, отчДеб);
     SumK=RepTurn(Отч1, отчКре);
     SumOst=RepSaldoF(Отч1, отчСверн);
     if (ДОЛЖН=False and (SumD<>0 or SumK<>0 or SumOst<>0)) or (ДОЛЖН=True and SumOst>0):
       aМОЛ=RepIdent(Отч1);
       --dПОЛ=ПоследняяДатаПолученияАвансаСтарый("*"+aМОЛ+"*", СЧД, ДатКон+1);
       dПОЛ=ПоследняяДатаПолученияАванса(СЧД, aМОЛ, ДатКон+1);
       dГАШ=ДПогАванса;
       if ДатКон>=dГАШ:
	  i=i+1;
	  МОЛ[i]=aМОЛ;
	  ДатПол[i]=dПОЛ;
	  ДатПог[i]=dГАШ;
	  СумНП[i]=RepSaldoS(Отч1, отчСверн);
	  СумД[i] =SumD;
	  СумК[i] =SumK;
	  СумКП[i]=SumOst;
	  REC=SignToRecord(МОЛ[i], False);
	  Тел[i]=ТелефонМОЛа(REC);
       fi;
     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;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
 if Field="кнЗкр"   : Close; ^False;
 |  Field="Вид_МОЛ" : Вид_МОЛ=ВыборВидаТаблицы(Вид_МОЛ); ^False;
 |  Field="ДатНач"  : OldDate=ДатНач;
 |  Field="ДатКон"  : OldDate=ДатКон;
 fi;
 ^True;
end; 

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="ДатНач":
   if ДатНач<>OldDate:
     if ОтменитьИзмененияУсловийОтчета: ДатНач=OldDate; fi;
     ValidateSection;
   fi;
 |  Field="ДатКон":
   if ДатКон<>OldDate:
     if ОтменитьИзмененияУсловийОтчета: ДатКон=OldDate; fi;
     ValidateSection;
   fi;
 fi;
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 ПутьVAR, Путь, МаскаСЧ, МаскаАН :String;
var nn :Integer;
 Template.HideEditor(False);
 if not(ПроверкаДат): ^""; fi;
 СчитатьЗначенияПоУмолчанию;
 if not(ПроверкаЗначенийПоУмолчанию): ^""; fi;
 ClearVariable(Buf);
 Buf[1]="Детализация суммы по счетам";
 Buf[2]="Детализация суммы по проводкам";
 Buf[3]="Детализация суммы по подразделениям (план)";
 Buf[4]="Детализация суммы по подразделениям (факт)";
 Buf[5]="Детализация суммы по ФКР";
 Buf[6]="Детализация суммы по КОСГУ";
 Buf[7]="Детализация суммы по статьям расходов";
 nn=Alternate("Выберите вид детализации...", Buf, -1, -1, 12);
 if nn=0: ^""; fi;
 ПутьVAR=PlanVar("ПОДОТЧ")+"\ОТЧЕТЫ";
 Путь=ПутьVAR+"\Подотчет.lst";
 if not(AutoRefresh): RefreshAna; fi;
 if КОМАНД:
   МаскаСЧ="*.?."+УМ_СЧ208+"."+УМ_ссчСУТ+".???"+"|"+"*.?."+УМ_СЧ208+"."+УМ_ссчТРН+".???"+"|"+"*.?."+УМ_СЧ208+"."+УМ_ссчКВР+".???";
   МаскаАН=МОЛ[Row]+"&КОМАНД";
 else
   МаскаСЧ="*.?."+УМ_СЧ208+".??.???";
   МаскаАН=МОЛ[Row];
 fi;
 if nn=1: Report(Путь+"|По_счетам",	ДатНач, ДатКон+1, МаскаСЧ, МаскаАН);
 |  nn=2: Report(Путь+"|По_проводкам",	   ДатНач, ДатКон+1, МаскаСЧ, МаскаАН);
 |  nn=3: Report(Путь+"|П_ЛИМ_по_признакам", ДатНач, ДатКон+1, МаскаСЧ, МаскаАН);
 |  nn=4: Report(Путь+"|П_по_признакам"    , ДатНач, ДатКон+1, МаскаСЧ, МаскаАН);
 |  nn=5: Report(Путь+"|ФКР_по_признакам"  , ДатНач, ДатКон+1, МаскаСЧ, МаскаАН);
 |  nn=6: Report(Путь+"|КОСГУ_по_признакам", ДатНач, ДатКон+1, МаскаСЧ, МаскаАН);
-- |  nn=7:
--   Путь=ПутьVAR+"\Статья.lst";
--   if ExistFile(Путь): DeleteFile(Путь); fi;
--   Путь=ПутьVAR+"\ОТЧЕТЫ~\Статья.lst";
--   if not(ExistFile(Путь)): Message("Файл-отчет по статьям расходов отсутствует!", mtError); ^""; fi;
--   Try CopyFile(Путь, ПутьVAR); Except Raise; ^""; end;
--   Путь=ПутьVAR+"\Статья.lst";
--   if not(ExistFile(Путь)): Message("Файл-отчет по статьям расходов отсутствует!", mtError); ^""; fi;
--   WriteLn(Путь, "StrAnaGroup="+УМ_СПРАВрасх, True);
--   Try
--     Report(Путь+"|Отчет по аналитике", ДатНач, ДатКон+1, МаскаСЧ, МаскаАН);
--   Except
--     Message("Ошибка создания отчета по статьям расхода!", mtError); ^"";
--   end;
 |  nn=7:
   Путь=ПутьVAR+"\Статья.lst";
   if ExistFile(Путь): DeleteFile(Путь); fi;
   if РАБ.УПП.LIB.СоздатьФайлОтчетСтрокиПоПризнакам("Статья", ПутьVAR, "Отчет по аналитике", МаскаСЧ, МаскаАН, True, False, УМ_СПРАВрасх):
     Try
       Report(Путь+"|Отчет по аналитике", ДатНач, ДатКон+1, МаскаСЧ, МаскаАН);
     Except
       Message("Ошибка создания отчета по статьям расхода!", mtError); ^"";
     end;
   else
     Message("Файл-отчет по статьям расходов отсутствует!", mtError); ^"";
   fi;
 fi;
 ^"";
end;  

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

Proc cbКоманд_onChange(Sender:String);
var Flag, Old :Logical;
 Old=not(КОМАНД); -- предыдущий статус
 Flag=КОМАНД; -- текущий статус
 if ОтменитьИзмененияУсловийОтчета: Flag=Old; fi;
 ValidateSection;
 КОМАНД=Flag;
 cbКоманд.State=Flag;
end;

Proc cbДолжн_onChange(Sender:String);
var Flag, Old :Logical;
 Old=not(ДОЛЖН); -- предыдущий статус
 Flag=ДОЛЖН; -- текущий статус
 if ОтменитьИзмененияУсловийОтчета: Flag=Old; fi;
 ValidateSection;
 ДОЛЖН=Flag;
 cbДолжн.State=Flag;
end;

Proc cbДоДПА_onChange(Sender:String);
var Flag, Old :Logical;
 Old=not(ДоДПА); -- предыдущий статус
 Flag=ДоДПА; -- текущий статус
 if ОтменитьИзмененияУсловийОтчета: Flag=Old; fi;
 ValidateSection;
 ДоДПА=Flag;
 cbДоДПА.State=Flag;
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); -- после открытия шаблона
 Очистить;
 ValidateSection;
 if ДатКон=1.1.100: ДатКон=ToDay; fi;
 СчитатьЗначенияПоУмолчанию;
 Template.Field="кнЗкр";
end;

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

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