--
--
-- Разработка бланка: ТБ.БЮДЖЕТ
БЛАНКСШАБЛОНОМ "Отчет: реестр участков";

2--0 2Общие настроечные переменные
var Фокус      :String="";
var PAnaCRD    :String="ТББ_ЗЕМЛЯ_КАРТ";
var DefMaskVOC :String="РКН.*";
var def_КБК    :String="188.0302.0840049.851"; --дефолтное КБК
var ValidDate  :Date=1.1.1900;

-- 2Объекты
btnClose    :Object;
btnReport   :Object;
sТБЛЗАГ     :Object;
sТБЛДАН     :Object;
sТБЛSRT     :Object;
sТБЛПД1     :Object;
sТБЛПД2     :Object;
sТБЛПД3     :Object;
var Позиции :Integer;

2--0 2Переменные
var УЧТГОД     :Integer;
var УЧТГОДold  :Integer; -- для запоминания и возвратов
var УЧР_НАИМ   :String;
var УЧР_КОДП   :Record;
var ДЛЖИСП     :String;
var ФИОИСП     :String;
var ИСПREC     :Record;
var ДАТИСП     :Date;

var Flag_onEnter   :Logical;

2--0 2Массивы
var NNN[]     :Integer=$;  --N п/п
var Buf[]     :String;
--
var тSRTCOL[] :String;   --сортировочный столбец
var тФГУнмн[] :String;   --полное наименование федерального государственного учреждения
var тСРФкод[] :String;   --субъект Российской Федерации (код)
var тСРФнмн[] :String;   --субъект Российской Федерации (наименование)
var тАТОнмн[] :String;   --наименование административно-территориального образования
var тПЧТорт[] :String;   --почтовый ориентир
var тКадНом[] :String;   --кадастровый номер
var тКатЗем[] :String;   --категория земель
var тРзрИсп[] :String;   --разрешенное использование
var тВидПрв[] :String;   --вид права
var тДолПрв[] :Numeric;  --доля в праве (%)
var тПрвДок[] :String;   --правоустанавливающий документ на земельный участок
var тКадПст[] :String;   --кадастровый паспорт или выписка из ГКН и (или) ЕГРП
var тSQRобщ[] :Numeric;  --площадь, кв.м. общая
var тSQRдол[] :Numeric;  --площадь, кв.м. приходящаяся на долю в праве
var тКадЦен[] :Numeric;  --удельный показатель кадастровой стоимости земель, руб. за кв.м.
var тКадСтм[] :Numeric;  --кадастровая стоимость земельного участка
var тСтвНал[] :Numeric;  --ставка налога (%)
var тСумНал[] :Numeric;  --сумма начисления налога за год
var тКфцСтм[] :Numeric;  --коэффициент стоимости для начисления налога
var тДатПрУ[] :Date;     --дата принятия к учету земельного участка
var тУчтКБК[] :String;   --учетное КБК

var итгКадСтм :Numeric=SumOfArray(тКадСтм, Позиции);
var итгСумНал :Numeric=SumOfArray(тСумНал, Позиции);
2--0 2Процедуры и функции

Proc ОчиститьТаблицу;
 ClearVariable(Позиции);
 ClearVariable(NNN);
 ClearVariable(тФГУнмн);
 ClearVariable(тСРФкод);
 ClearVariable(тСРФнмн);
 ClearVariable(тАТОнмн);
 ClearVariable(тПЧТорт);
 ClearVariable(тКадНом);
 ClearVariable(тКатЗем);
 ClearVariable(тРзрИсп);
 ClearVariable(тВидПрв);
 ClearVariable(тДолПрв);
 ClearVariable(тПрвДок);
 ClearVariable(тКадПст);
 ClearVariable(тSQRобщ);
 ClearVariable(тSQRдол);
 ClearVariable(тКадЦен);
 ClearVariable(тКадСтм);
 ClearVariable(тСтвНал);
 ClearVariable(тСумНал);
 ClearVariable(тКфцСтм);
 ClearVariable(тДатПрУ);
 ClearVariable(тУчтКБК);
end;

Proc Очистить;
 ClearVariable(Buf);
 ОчиститьТаблицу;
end;

Func ВыборДаты(srcDate:Date) :Date;
var memDate :Date;
 if srcDate>1.1.100: memDate=Calendar(srcDate); else memDate=Calendar(ToDay); fi;
 if not memDate<=1.1.100: ^memDate; else ^srcDate; fi;
end;

Func GetDate :Date;  -- считываем в заданном поле дату
var nameField :String;
var iterFrame :Integer;
 nameField= asString(Template.Field);
 iterFrame=asInteger(Template.Frame);
 if nameField="ДАТИСП" : ^ДАТИСП;
 fi;
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var nameField :String;
var iterFrame :Integer;
 nameField= asString(Template.Field);
 iterFrame=asInteger(Template.Frame);
 if nameField="ДАТИСП" : ДАТИСП=Value;
 fi;
end;

Proc ValidateSectionInit;
var Flag :Logical;
 Flag=if(Позиции>0, True, False);
 sТБЛЗАГ.Visible=Flag;
 sТБЛДАН.Visible=Flag;
 sТБЛПД1.Visible=Flag;
 sТБЛПД2.Visible=Flag;
 sТБЛПД3.Visible=Flag;
end;

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

Proc Расчет_Выполнить;
var RO, OA, Iter, len, ii, num, kk :Integer;
var WD1, WD2, ddP, ddS :Date;
var Delta :Numeric;
var Value :String;
var Work :Logical;

 if УЧТГОД<Year(ValidDate):
   Message("Предварительно необходимо выбрать учетный год.", mtWarning);
   Template.Field="УЧТГОД";
   Exit;
 fi;
 Refresh(False);
 WD1=Dat(1, 1, УЧТГОД);
 WD2=Dat(1, 1, УЧТГОД+1);
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea(PAnaCRD, "АПРИЗН", "");
 Try
   len=Records(RO);
   if len>0:
     Iter=0;
     ShowProgress(len, "Обработка карточек земельных участков.");
     ОчиститьТаблицу;
     for ii=1 to len do
       ProgressPos(ii);
       Value=ExtractWord(1, DefMaskVOC, ".")+"."+GetFieldS(RO, ii, "АПРИЗН");
       Work=if(Name_A(Value)=" ", False, True);
       if Work:
         ddP=GetFieldD(RO, ii, "ДОТКК");
         ddS=GetFieldD(RO, ii, "ДЗАКК");
         if Work: if ddP>ValidDate and ddP>=WD2: Work=False; fi; fi;
         if Work: if ddS>ValidDate and ddS< WD1: Work=False; fi; fi;
       fi;
       if Work:
         -- считаем коэффициент пересчет если год неполный, если год полный коэффициент 1
         kk=0;
         if not ddS>ValidDate:
            if ddP>=WD1 and ddP<WD2: kk=12-Mon(ddP)+1; fi;
         |      ddS>ValidDate:
            if ddS>=WD1 and ddS<WD2:
              if ddP>=WD1 and ddP<WD2: kk=Mon(ddS)-Mon(ddP)+1; else kk=Mon(ddP); fi;
            fi;
         fi;
         if kk>0 and kk<12: Delta=Round(kk/12, 8); else Delta=1; fi;
         -- считываем нужную инфу
         OA=OpenArray(RO, ii, "ЦЕНА", "ДАТИЗМ", "ДАТИЗМ<"+DateToString(WD1));
         num=Records(OA);
         if num>0:

           Iter=Iter+1;
           тФГУнмн[Iter]=Trim(GetFieldS(RO, ii, "ПНАИМЕНФГУ"));
           тСРФкод[Iter]=Trim(GetFieldS(RO, ii, "СУБЪЕКТКОД"));
           тСРФнмн[Iter]=Trim(GetFieldS(RO, ii, "СУБЪЕКТНМН"));
           тАТОнмн[Iter]=Trim(GetFieldS(RO, ii, "ТЕРРИТОРИЯ"));
           тПЧТорт[Iter]=Trim(GetFieldS(RO, ii, "ПОЧТААДРЕС"));
           тКадНом[Iter]=Trim(GetFieldS(RO, ii, "НОМКАДАСТР"));
           тВидПрв[Iter]=Trim(GetFieldS(RO, ii, "ВИДЮПРАВА"));
           тПрвДок[Iter]=Trim(GetFieldS(RO, ii, "ЮРПРАВОDOC"));
           тКадПст[Iter]=Trim(GetFieldS(RO, ii, "ЗЕМПАСПОРТ"));
           тКатЗем[Iter]=Trim(GetFieldS(OA, num, "КТГЗЕМ"));
           тРзрИсп[Iter]=Trim(GetFieldS(OA, num, "РАЗИСП"));
           тДолПрв[Iter]=GetFieldN(OA, num, "ДОЛЯПР");
           тSQRобщ[Iter]=GetFieldN(OA, num, "SQRОБЩ");
           тSQRдол[Iter]=GetFieldN(OA, num, "SQRДОЛ");
           тКадЦен[Iter]=GetFieldN(OA, num, "ЦЕНИЗМ");
           тКадСтм[Iter]=GetFieldN(OA, num, "СУМИЗМ");
           тСтвНал[Iter]=GetFieldN(OA, num, "СТАВКА");
           тКфцСтм[Iter]=Delta;
           тДатПрУ[Iter]=ddP;
           Value=Trim(GetFieldS(RO, ii, "КБК_УЧЕТА"));
           if not Match(Value, "???.????.???????.???"): Value=def_КБК; fi;
           тУчтКБК[Iter]=Value;
           тСумНал[Iter]=Round((тКадСтм[Iter]*тСтвНал[Iter]/100)*Delta, if(УЧТГОД<2014, 2, 0)); -- корректировка базы налога
           тSRTCOL[Iter]=тСРФкод[Iter]+"#"+тПЧТорт[Iter];
         fi; --num>0:
         CloseWorkArea(OA);
       fi; --Work
     od;
   else
     Message("Аналитическая картотека земельных участков пустая", mtError);
     Exit;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
   ClearVariable(NNN);
   Позиции=LengthOfArray(тКадНом);
   SortSection("sТБЛSRT", "тSRTCOL", True, False);
   ValidateSectionInit;
 end;
end;

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

2-- События клеток
Func Field_onEnter(nameField:String; iterFrame:Integer): Logical; -- на входе в клетку
 Flag_onEnter=False;
 if nameField="УЧТГОД"  : УЧТГОДold=УЧТГОД; Flag_onEnter=True; ^True;
 fi;
 ^True;
end;

Proc Field_onExit(nameField:String; iterFrame:Integer); -- на выходе из клетки
 if nameField="УЧР_НАИМ" : if УЧР_НАИМ="" : УЧР_КОДП = NIL; fi;
 |  nameField="ФИОИСП"   : if ФИОИСП=""   : ДЛЖИСП="";    fi;
 |  nameField="УЧТГОД"   : if Flag_onEnter and УЧТГОД<>УЧТГОДold: if ОтменитьИзмененияУсловийОтчета: УЧТГОД=УЧТГОДold; fi; fi; if УЧТГОД=0: УЧТГОД=УЧТГОДold; fi;
 fi;
 Flag_onEnter=False;
end;

Func Field_OnValidateI(Field:String; Iter:Integer; Value:Integer): Logical;
 if Value<0: Message("Нельзя вводить отрицательное число.", mtError); ^False; fi;
 if Field="УЧТГОД":
   if Value<2000 or Value>2100: Message("Учетный год задан вне допустимого диапазона [2000-2100 гг.]", mtError); ^False; fi;
   УЧТГОДold=Value;
 fi;
 ^True;
end;

Func Год_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ii, StoreVal, ResultVal :Integer;
var FieldName :String;
 Template.HideEditor(False);
 FieldName=AsString(Template.Field);
 if not VariableExists(FieldName): Message("Не найдена переменная!", mtError); ^Cur; fi;
 Try ResultVal=GetVariableI(FieldName); Except ^Cur; end;
 StoreVal=ResultVal;
 ClearVariable(Buf);
 ii=0;
 for ii=1 to 5 do Buf[ii]=Str(Year(ToDay)+ii-4); od;
 ii=Alternate("Учетный год", Buf, 20, 4-(Year(ToDay)-ResultVal), 12);
 if ii=0: ^Cur; fi;
 ResultVal=Int(Buf[ii]);
 if ResultVal<>StoreVal: if ОтменитьИзмененияУсловийОтчета: ResultVal=StoreVal; fi; fi;
 PutVariableI(FieldName, ResultVal);
 УЧТГОДold=ResultVal;
 ^"";
end;

Func Дата_ПростойВыбор_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
 SetDate(ВыборДаты(GetDate));
 ^"";
end;

Func ВзятьРеквизиты_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
 ВзятьРеквизиты(УЧР_КОДП, False);
 ^"";
end;

Func Сотрудники_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var REC :Record;
var FieldName, СТРФИО, СТРДОЛ, tmp1, tmp2 :String;
 Template.HideEditor(False);
 if not AutoRefresh: RefreshAna; fi;
 FieldName=asString(Template.Field);
 REC=OpenCardFile("СОТРУДНИКИ", "", ИСПREC, crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 tmp1=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
 СТРФИО=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp1<>"..", tmp1, ""));
 Try СТРДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ"); Except СТРДОЛ=""; end;
 if FieldName="ФИОИСП": ФИОИСП=СТРФИО; ДЛЖИСП=СТРДОЛ; ИСПREC=REC;
 |  FieldName="ДЛЖИСП": ФИОИСП=СТРФИО; ДЛЖИСП=СТРДОЛ; ИСПREC=REC;
 fi;
 ^"";
end;

2-- События объектов
Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnClose"  : Close;
 |  Sender="btnReport" : Расчет_Выполнить;
 fi;
end;

Proc CopyCfgPrn(Cfg:String);
var OK :Logical;
 OK=ExistFile(РАБ.БЮДЖЕТ2005.Контроль2Слэш(PlanVar("INI")+"\"+Cfg));
 if OK: 
   Try 
     DeleteFile(РАБ.БЮДЖЕТ2005.Контроль2Слэш(PlanVar("INI")+"\"+Cfg));
     РАБ.НАСТР_ПЕЧАТЬ.CreateCfg(PlanVar('Общие')+'\Настройки\', Cfg);
   Except
   end;
 else
   РАБ.НАСТР_ПЕЧАТЬ.CreateCfg(PlanVar('Общие')+'\Настройки\', Cfg);
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 CopyCfgPrn("ТББ_STD_Album10_000.cfg");
end;

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
 Очистить;
 ValidateSectionInit;
 if Mon(ToDay)=1: УЧТГОД=Year(ToDay)-1; else УЧТГОД=Year(ToDay); fi;
 УЧТГОДold=УЧТГОД;
 if УЧР_НАИМ="": ВзятьРеквизиты(УЧР_КОДП, True); fi;
 Template.Field="Фокус";
end;

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

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