--
--
-- Разработка бланка: ТБ.БЮДЖЕТ
БЛАНКСШАБЛОНОМ "Аналитическая карточка земельных участков", РЕДАКТОР ТББ_ЗЕМЛЯ_КАРТ;

2--0 2Общие настроечные переменные
btnService     :Object;
var def_Ставка :Numeric=0.3;                   --дефолтная ставка налога в %
var def_КБК    :String="188.0302.0840049.851"; --дефолтное КБК
var DefMaskACC :String="*.1.303.13.???";
var DefMaskVOC :String="РКН.*";
var ValidDate  :Date=1.1.1900;
--
var ФокусО     :String="";
var ФокусЗ     :String="";
var ФокусИ     :String="";
var ФокусК     :String="";
var ФокусЭ     :String="";
var ФокусН     :String="";
var SelfCRD    :String="ТББ_ЗЕМЛЯ_КАРТ";

2--0 2Кнопки
currКнопка  :Integer=[1];
var кнпМ01  :String="Земельный участок";
var кнпМ02  :String="Сведения об ИМНС";
var кнпМ03  :String="Кадастровая стоимость";
var кнпМ04  :String="Электронная копия документов (сканирование)";
var кнпМ05  :String="Движение по налогу";
var кнпК01  :String="Добавить";
var кнпК02  :String="Удалить »";

var СканГЭК2  :String="Сканировать";
var ОбновГЭК2 :String="Обновить";
var ГЭК2вPDF  :String="Выгрузить в PDF";
var УдалГЭК2  :String="Удалить ГЭК";

-- 2Объекты
btnClose      :Object;
cb_Защита     :Object;
cb_CRDClosed  :Object;
cb_НеПровИМНС :Object;

МенюСекц   :Object;
ОСек1      :Object;
ОСек2      :Object;
ЗЕМ01      :Object; -- Сведения о земельном участке
ЗЕМ02      :Object; -- Сведения о земельном участке
ЗЕМ03      :Object; -- Сведения о земельном участке
ЗЕМ04      :Object; -- Сведения о земельном участке
ЗЕМ05      :Object; -- Сведения о земельном участке
ЗЕМ06      :Object; -- Сведения о земельном участке
ЗЕМ07      :Object; -- Сведения о земельном участке
ИНС01      :Object; -- Данные о налоговой инспекции
ИНС02      :Object; -- Данные о налоговой инспекции
ИНС03      :Object; -- Данные о налоговой инспекции
КАД01      :Object; -- Кадастровая стоимость
КАД02      :Object; -- Кадастровая стоимость
КАД03      :Object; -- Кадастровая стоимость
КАД04      :Object; -- Кадастровая стоимость
КАД05      :Object; -- Кадастровая стоимость
ЭКД01      :Object; -- Электронная копия документов (сканирование)
ЭКД02      :Object; -- Электронная копия документов (сканирование)
ЭКД03      :Object; -- Электронная копия документов (сканирование)
ЭКД04      :Object; -- Электронная копия документов (сканирование)
ЭКД05      :Object; -- Электронная копия документов (сканирование)
НАЛ01      :Object; -- Сведения об уплате и начислении земельного налога
НАЛ02      :Object; -- Сведения об уплате и начислении земельного налога
НАЛ03      :Object; -- Сведения об уплате и начислении земельного налога
var mЗЕМ0  :Integer=7;
var mИНС0  :Integer=3;
var mКАД0  :Integer=5;
var mЭКД0  :Integer=5;
var mНАЛ0  :Integer=3;

2--0 2Переменные
var recCurrent     :Record;
var NewREC         :Logical=(CurrentState=crdusInserted);
var First          :Logical;

var Д_ИЗМ :Date;    --Дата изменения кадастровой стоимости
var С_ИЗМ :Numeric; --Новая кадастровая стоимость
var Т_ИЗМ :Numeric; --Новая налоговая ставка

var АПРИЗН_   :String=АПРИЗН;
var АПРИЗНК   :String=if(NewREC, "", АПРИЗН);
var АПРИЗНР   :String=if(NewREC, "", ПОЧТААДРЕС);
var FlagEdit  :Logical=[False];
var ГОДУЧТ    :Integer;
var ГОДУЧТ_   :Integer=ГОДУЧТ;

var нлгСУМГОД :Numeric;
var нлг1КВНАЧ :Numeric;
var нлг2КВНАЧ :Numeric;
var нлг3КВНАЧ :Numeric;
var нлг4КВНАЧ :Numeric;
var нлгПРЧНАЧ :Numeric;
var нлг1КВОПЛ :Numeric;
var нлг2КВОПЛ :Numeric;
var нлг3КВОПЛ :Numeric;
var нлг4КВОПЛ :Numeric;
var нлгПРЧОПЛ :Numeric;
var нлгИТГНАЧ :Numeric=нлг1КВНАЧ+нлг2КВНАЧ+нлг3КВНАЧ+нлг4КВНАЧ+нлгПРЧНАЧ;
var нлгИТГОПЛ :Numeric=нлг1КВОПЛ+нлг2КВОПЛ+нлг3КВОПЛ+нлг4КВОПЛ+нлгПРЧОПЛ;
var нлгОСТНАЧ :Numeric=нлгСУМГОД-нлгИТГНАЧ;
var нлгОСТОПЛ :Numeric=нлгСУМГОД-нлгИТГОПЛ;

2--0 2Массивы
var Buf[]    :String;
var Txt[]    :String;
var arrStr[] :String;
var arrTxt[] :String;

var ЦЕНА_Позиции  :Integer;
var ЦЕНА_DATREG[] :String;  --дата регистрации изменения стоимости
var ЦЕНА_ДАТИЗМ[] :Date;    --дата, начало действия  показателя
var ЦЕНА_СТАВКА[] :Numeric; --ставка налога, %
var ЦЕНА_ЦЕНИЗМ[] :Numeric; --удельный показатель кадастровой стоимости земель, руб. за кв.м.
var ЦЕНА_SQRОБЩ[] :Numeric; --(справочно) площадь, кв.м. - общая
var ЦЕНА_ДОЛЯПР[] :Numeric; --(справочно) доля в праве (%)
var ЦЕНА_SQRДОЛ[] :Numeric; --(справочно) площадь, кв.м. - приходящаяся на долю в праве
var ЦЕНА_СУМИЗМ[] :Numeric; --(справочно) кадастровая стоимость земельного участка
var ЦЕНА_КТГЗЕМ[] :String;  --(справочно) категория земель
var ЦЕНА_РАЗИСП[] :String;  --(справочно) разрешенное использование

    ПутьPDF       :String;
var ГЭК2_Позиции  :Integer;
var NN[]          :Integer=$;
var ГЭК2Дата[]    :Date;
var ГЭК2Лист[]    :String;
var ГЭК2Кмнт[]    :String;
var ГЭК2CU[]      :String;
var ГЭК2MU[]      :String;
var ГЭК2Rec[]     :Record;

var ЦенаФлаг       :Logical=if(ЦЕНА_Позиции>0, True, False);
var ИменаСекций[]  :String;
var BufField[]     :String;
var BufColorBg[]   :Integer;
var BufColorFo[]   :Integer;

2--0 2Процедуры и функции

Proc ОчиститьПозиции_ЦЕНА;
 ClearVariable(ЦЕНА_Позиции);
 ClearVariable(ЦЕНА_DATREG);
 ClearVariable(ЦЕНА_ДАТИЗМ);
 ClearVariable(ЦЕНА_СТАВКА);
 ClearVariable(ЦЕНА_ЦЕНИЗМ);
 ClearVariable(ЦЕНА_SQRОБЩ);
 ClearVariable(ЦЕНА_ДОЛЯПР);
 ClearVariable(ЦЕНА_SQRДОЛ);
 ClearVariable(ЦЕНА_СУМИЗМ);
 ClearVariable(ЦЕНА_КТГЗЕМ);
 ClearVariable(ЦЕНА_РАЗИСП);
 --
 ClearVariable(Д_ИЗМ);
 ClearVariable(С_ИЗМ);
 ClearVariable(Т_ИЗМ);
end;

Proc Очистить_ОтчетПоНалогу;
 нлгСУМГОД=0.00;
 нлг1КВНАЧ=0.00;
 нлг2КВНАЧ=0.00;
 нлг3КВНАЧ=0.00;
 нлг4КВНАЧ=0.00;
 нлгПРЧНАЧ=0.00;
 нлг1КВОПЛ=0.00;
 нлг2КВОПЛ=0.00;
 нлг3КВОПЛ=0.00;
 нлг4КВОПЛ=0.00;
 нлгПРЧОПЛ=0.00;
end;

Proc Очистить_ОтчетПоНалогу_2;
 ГОДУЧТ=0;
 Очистить_ОтчетПоНалогу;
end;

Proc Очистить_ГЭК2;
 ClearVariable(ГЭК2_Позиции);
 ClearVariable(NN);
 ClearVariable(ГЭК2Дата);
 ClearVariable(ГЭК2Лист);
 ClearVariable(ГЭК2Кмнт);
 ClearVariable(ГЭК2CU);
 ClearVariable(ГЭК2MU);
 ClearVariable(ГЭК2Rec);
end;

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(arrStr);
 ClearVariable(arrTxt);
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="ДОТКК" : ^ДОТКК;
 |  nameField="ДЗАКК" : ^ДЗАКК;
 |  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;
 |  nameField="ДЗАКК" : ДЗАКК=Value;
 |  nameField="Д_ИЗМ" : Д_ИЗМ=Value;
 fi;
end;

Proc СекцииНастр(NameObj:String; Видимо:Logical);
var GotoField :String;
var ii, len :Integer;
var Work :Logical;
var Obj :Object;
 if NameObj="ЗЕМ0": GotoField="ФокусЗ"; len=mЗЕМ0; Work=True;
 |  NameObj="ИНС0": GotoField="ФокусИ"; len=mИНС0; Work=True;
 |  NameObj="КАД0": GotoField="ФокусК"; len=mКАД0; Work=True;
 |  NameObj="ЭКД0": GotoField="ФокусЭ"; len=mЭКД0; Work=True;
 |  NameObj="НАЛ0": GotoField="ФокусН"; len=mНАЛ0; Work=True;
 else Work=False;
 fi;
 if Work:
   for ii=1 to len do
     if FindObject(NameObj+Str(ii), Obj): Obj.Visible=Видимо; fi;
   od;
   if Видимо: Template.Field=GotoField; fi;
 fi;
end;

Proc ВидимостьОтчетныхТаблиц_Меню(TV1:Logical; TV2:Logical; TV3:Logical; TV4:Logical; TV5:Logical);
var sysTxt, sysShd :Integer;
 sysTxt=РАБ.ЦВЕТА.GetColor("coBtnText");
 sysShd=РАБ.ЦВЕТА.GetColor("coBtnShadow");
 МенюСекц.Cell(3, 3, CellFontColor, if(TV1, sysTxt, sysShd));
 МенюСекц.Cell(3, 5, CellFontColor, if(TV2, sysTxt, sysShd));
 МенюСекц.Cell(3, 7, CellFontColor, if(TV3, sysTxt, sysShd));
 МенюСекц.Cell(5, 3, CellFontColor, if(TV4, sysTxt, sysShd));
 МенюСекц.Cell(5, 7, CellFontColor, if(TV5, sysTxt, sysShd));
end;

Proc ВидимостьОтчетныхТаблиц_Work(p1v:Logical; p2v:Logical; p3v:Logical; p4v:Logical; p5v:Logical);
 СекцииНастр("ЗЕМ0", p1v);
 СекцииНастр("ИНС0", p2v);
 СекцииНастр("КАД0", p3v);
 СекцииНастр("ЭКД0", p4v);
 СекцииНастр("НАЛ0", p5v);
 ВидимостьОтчетныхТаблиц_Меню(p1v, p2v, p3v, p4v, p5v);
end;

Proc СчитатьПозиции_ЦЕНА;
var ii :Integer;
 if not (ЦЕНА_Позиции>0 and ЦЕНА_Позиции=LengthOfArray(ЦЕНА_DATREG) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_ДАТИЗМ) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_СТАВКА) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_ЦЕНИЗМ) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_SQRОБЩ) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_ДОЛЯПР) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_SQRДОЛ) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_СУМИЗМ) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_КТГЗЕМ) and
                            ЦЕНА_Позиции=LengthOfArray(ЦЕНА_РАЗИСП)):
   ОчиститьПозиции_ЦЕНА;
   if ЦЕНА>0:
     ЦЕНА_Позиции=ЦЕНА;
     for ii=1 to ЦЕНА_Позиции do
       ЦЕНА_DATREG[ii] = ЦЕНА[ii].DATREG;
       ЦЕНА_ДАТИЗМ[ii] = ЦЕНА[ii].ДАТИЗМ;
       ЦЕНА_СТАВКА[ii] = ЦЕНА[ii].СТАВКА;
       ЦЕНА_ЦЕНИЗМ[ii] = ЦЕНА[ii].ЦЕНИЗМ;
       ЦЕНА_SQRОБЩ[ii] = ЦЕНА[ii].SQRОБЩ;
       ЦЕНА_ДОЛЯПР[ii] = ЦЕНА[ii].ДОЛЯПР;
       ЦЕНА_SQRДОЛ[ii] = ЦЕНА[ii].SQRДОЛ;
       ЦЕНА_СУМИЗМ[ii] = ЦЕНА[ii].СУМИЗМ;
       ЦЕНА_КТГЗЕМ[ii] = ЦЕНА[ii].КТГЗЕМ;
       ЦЕНА_РАЗИСП[ii] = ЦЕНА[ii].РАЗИСП;
     od;
     SortSection(ЦЕНА_Позиции, "ЦЕНА_ДАТИЗМ", True);
   fi;
 fi;
-- if ЦЕНА_Позиции>0:
--   КАД04.Cell(1, 2, CellFontColor, if(Защита, coBlack,       РАБ.ЦВЕТА.GetColor("coBtnText")));
--   КАД04.Cell(1, 2, CellBgColor,   if(Защита, coTransparent, РАБ.ЦВЕТА.GetColor("coBtnFace")));
--   КАД04.Cell(1, 2, CellReadOnly,  Защита);
-- fi;
end;

Proc РасчетГЭК2;
var RO, num, ii, k1, k2 :Integer;
var isNet :Logical;
var REC: Record;
 if not currКнопка=4: Exit; fi;
 isNet=РАБ.БЮДЖЕТ2005.Сетевая;
 Очистить_ГЭК2;
 ShowProgress(0, "Обновление данных...");
 RO=OpenWorkArea("РПО_СКАН_ДОК", "ДАТА", "ДОК='"+SelfCRD+"' and ЗАПИСЬ="+Str(RecordToInteger(Current)));
 Try
   num=Records(RO);
   if num>0:
     ShowProgress(num, "Обновление данных...");
     for ii=1 to num do
       ProgressPos(ii);
       REC=GetRecordKey(RO, ii);
       k1=РАБ.ВСПОМ.СКАНЕР.ЧитатьГЭК( "РПО_СКАН_ДОК", RecordToInteger(REC), "jpg", True);
       k2=РАБ.ВСПОМ.ФАЙЛЫ.ПоказСписок("РПО_СКАН_ДОК", RecordToInteger(REC), "", "", "", "", "", "", 0);
       if not k1=0 or not k2=0:
         InsertFrame(ГЭК2_Позиции, ГЭК2_Позиции+1);
         ГЭК2Дата[ГЭК2_Позиции]=GetFieldD(RO, ii, "ДАТА");
         ГЭК2Лист[ГЭК2_Позиции]=Str(k1)+" / "+Str(k2);
         ГЭК2Кмнт[ГЭК2_Позиции]=GetFieldS(RO, ii, "КМНТ");
         ГЭК2CU[ГЭК2_Позиции]=DateToString(GetFieldD(RO, ii, "CreateTime"))+if(isNet, " "+GetFieldS(RO, ii, "CreatedUser") , "");
         ГЭК2MU[ГЭК2_Позиции]=DateToString(GetFieldD(RO, ii, "UpdateTime"))+if(isNet, " "+GetFieldS(RO, ii, "ModifiedUser"), "");
         ГЭК2Rec[ГЭК2_Позиции]=REC;
       fi;
     od;
   fi;
 Finally
  CloseWorkArea(RO);
  CloseProgress;
 end;
end;

Proc ValidateSectionInit;
 if not (currКнопка>0 and currКнопка<6): currКнопка=1; fi;
 if currКнопка=1: ВидимостьОтчетныхТаблиц_Work(True , False, False, False, False);
 |  currКнопка=2: ВидимостьОтчетныхТаблиц_Work(False, True , False, False, False);
 |  currКнопка=3: ВидимостьОтчетныхТаблиц_Work(False, False, True , False, False);
 |  currКнопка=4: ВидимостьОтчетныхТаблиц_Work(False, False, False, True , False);
 |  currКнопка=5: ВидимостьОтчетныхТаблиц_Work(False, False, False, False, True );
 else             ВидимостьОтчетныхТаблиц_Work(False, False, False, False, False);
 fi;
 РасчетГЭК2;
 СчитатьПозиции_ЦЕНА;
end;

Func TimeToHMSstring_adv(valTime:Integer; valSep:String) :String;
var ihh, imm, icc :Integer;
var shh, smm, scc :String;
 shh=''; smm=''; scc='';
 ihh=Int(Trunc(valTime/3600));
 imm=Int(Trunc((valTime-ihh*3600)/60));
 icc=valTime-ihh*3600-imm*60;
 shh=Format("%.2d", ihh);
 smm=Format("%.2d", imm);
 scc=Format("%.2d", icc);
 ^(shh+valSep+smm+valSep+scc);
end;

Func ПроверитьЗаполнениеСправочныхПолей :Logical;
var Value :String;
var num, ii :Integer;
 ClearVariable(Buf);
 if Trim(КТГ_ЗЕМЕЛЬ)="": AddInArray(Buf, False, False, "КТГ_ЗЕМЕЛЬ"); fi;
 if Trim(ИСПОЛЬ_ВИД)="": AddInArray(Buf, False, False, "ИСПОЛЬ_ВИД"); fi;
 if not ДОЛЯПРАВА>0.00:  AddInArray(Buf, False, False, "ДОЛЯПРАВА");  fi;
 if not SQUAREОБЩ>0.00:  AddInArray(Buf, False, False, "SQUAREОБЩ");  fi;
 if not SQUAREДОЛ>0.00:  AddInArray(Buf, False, False, "SQUAREДОЛ");  fi;
 num=LengthOfArray(Buf);
 if num>0:
   Value="Для сохранения данных необходимо заполнить следующие справочные поля:";
   for ii=1 to num do
     if Buf[ii]="КТГ_ЗЕМЕЛЬ" : Value=Value+"^M'Категория земель'";
     |  Buf[ii]="ИСПОЛЬ_ВИД" : Value=Value+"^M'Разрешенное использование'";
     |  Buf[ii]="ДОЛЯПРАВА"  : Value=Value+"^M'Вид права'";
     |  Buf[ii]="SQUAREОБЩ"  : Value=Value+"^M'Площадь, кв.м. - общая'";
     |  Buf[ii]="SQUAREДОЛ"  : Value=Value+"^M'Площадь, кв.м. - приходящаяся на долю в праве'";
     fi;
   od;
   Message(Value, mtWarning);
   ВидимостьОтчетныхТаблиц_Work(True , False, False, False, False);
   currКнопка=1;
   Template.Field=Buf[1];
   ^False;
 fi;
 ^True;
end;

Func ПроверитьЗаполнениеОбязательныхПолей :Logical;
var Value :String;
var num, ii :Integer;
 ClearVariable(Buf);
 if not Д_ИЗМ>ValidDate: AddInArray(Buf, False, False, "Д_ИЗМ"); fi;
 if not С_ИЗМ>0.00:      AddInArray(Buf, False, False, "С_ИЗМ"); fi;
 if not Т_ИЗМ>0.00:      AddInArray(Buf, False, False, "Т_ИЗМ"); fi;
 num=LengthOfArray(Buf);
 if num>0:
   Value="Не заполнены следующие обязательные поля:";
   for ii=1 to num do
     if Buf[ii]="Д_ИЗМ" : Value=Value+"^M'Дата, начало действия показателя'";
     |  Buf[ii]="С_ИЗМ" : Value=Value+"^M'Удельный показатель кадастровой стоимости земель'";
     |  Buf[ii]="Т_ИЗМ" : Value=Value+"^M'Ставка налога'";
     fi;
   od;
   Message(Value, mtWarning);
   Template.Field=Buf[1];
   ^False;
 fi;
 ^True;
end;

Proc ДобавитьСтоимость;
var num, ii :Integer;
var Value :String;
var SUM :Numeric;
 if not Защита:
   if ПроверитьЗаполнениеСправочныхПолей:
     if ПроверитьЗаполнениеОбязательныхПолей:
       if ЦЕНА_Позиции>0:
         num=SearchInArray(ЦЕНА_ДАТИЗМ, Д_ИЗМ, False, 1);
         if num>0:
           Message("За данное число '"+DateToString(Д_ИЗМ)+"'^Mуже есть сохраненная запись.^M^MУдалите строчку для внесения новых данных^Mили измените дату.", mtWarning);
           Template.Field="ЦЕНА_ДАТИЗМ";
           Template.Frame=num;
           Exit;
         fi;
       fi;
       num=InsertInArraySort(ЦЕНА_ДАТИЗМ, Д_ИЗМ);
       if num>0:
         InsertInArray(ЦЕНА_DATREG, num, DateToString(ToDay)+" "+TimeToHMSstring_adv(Time, ":"));
         InsertInArray(ЦЕНА_СТАВКА, num, Т_ИЗМ);
         InsertInArray(ЦЕНА_ЦЕНИЗМ, num, С_ИЗМ);
         InsertInArray(ЦЕНА_SQRОБЩ, num, SQUAREОБЩ);
         InsertInArray(ЦЕНА_ДОЛЯПР, num, ДОЛЯПРАВА);
         SUM=SQUAREОБЩ*ДОЛЯПРАВА/100;
         if Round(SUM, 2)<>Round(SQUAREДОЛ, 2): SQUAREДОЛ=SUM; fi;
         InsertInArray(ЦЕНА_SQRДОЛ, num, SQUAREДОЛ);
         SUM=С_ИЗМ*SQUAREДОЛ;
         InsertInArray(ЦЕНА_СУМИЗМ, num, SUM);
         InsertInArray(ЦЕНА_КТГЗЕМ, num, КТГ_ЗЕМЕЛЬ);
         InsertInArray(ЦЕНА_РАЗИСП, num, ИСПОЛЬ_ВИД);
         ЦЕНА_Позиции=LengthOfArray(ЦЕНА_ДАТИЗМ);
         ЦЕНА_UPDATE=ЦЕНА_UPDATE; -- для обновления статуса редактирования подтаблицы
       fi;
     fi;
   fi;
 fi;
end;

Proc УдалитьСтоимость(Iter:Integer);
var num :Integer;
 if not Защита:
   num=EnqOkCancel("Стоимость на "+Str(ЦЕНА_СУМИЗМ[Iter], 2)+" руб. от  "+DateToString(ЦЕНА_ДАТИЗМ[Iter])+".^MВы действительно хотите удалить данную строчку?", mtWarning);
   if num=cmOK:
     DeleteFromArray(ЦЕНА_ДАТИЗМ, Iter);
     DeleteFromArray(ЦЕНА_DATREG, Iter);
     DeleteFromArray(ЦЕНА_СТАВКА, Iter);
     DeleteFromArray(ЦЕНА_ЦЕНИЗМ, Iter);
     DeleteFromArray(ЦЕНА_SQRОБЩ, Iter);
     DeleteFromArray(ЦЕНА_ДОЛЯПР, Iter);
     DeleteFromArray(ЦЕНА_SQRДОЛ, Iter);
     DeleteFromArray(ЦЕНА_СУМИЗМ, Iter);
     DeleteFromArray(ЦЕНА_КТГЗЕМ, Iter);
     DeleteFromArray(ЦЕНА_РАЗИСП, Iter);
     ЦЕНА_Позиции=LengthOfArray(ЦЕНА_ДАТИЗМ);
     ЦЕНА_UPDATE=ЦЕНА_UPDATE; -- для обновления статуса редактирования подтаблицы
   fi;
 fi;
end;

Proc СинхроКадастроваяСтоимость(Flag:Logical);
var ii, num :Integer;
var OK :Logical;
 if not Flag:
   if 2ЦЕНА_Позиции=0 and ЦЕНА>00: -- удалили ВСЕ существующие позиции из таблицы
     ClearVariable(Цена);
     ОчиститьПозиции_ЦЕНА;
   |  2ЦЕНА_Позиции>0 and ЦЕНА=00: -- добавили новые позиции в пустую таблицу
     for ii=1 to ЦЕНА_Позиции do
       num=InsertFrame(ЦЕНА, ЦЕНА+1);
       ЦЕНА[num].ДАТИЗМ=ЦЕНА_ДАТИЗМ[ii];
       ЦЕНА[num].DATREG=ЦЕНА_DATREG[ii];
       ЦЕНА[num].СТАВКА=ЦЕНА_СТАВКА[ii];
       ЦЕНА[num].ЦЕНИЗМ=ЦЕНА_ЦЕНИЗМ[ii];
       ЦЕНА[num].SQRОБЩ=ЦЕНА_SQRОБЩ[ii];
       ЦЕНА[num].ДОЛЯПР=ЦЕНА_ДОЛЯПР[ii];
       ЦЕНА[num].SQRДОЛ=ЦЕНА_SQRДОЛ[ii];
       ЦЕНА[num].СУМИЗМ=ЦЕНА_СУМИЗМ[ii];
       ЦЕНА[num].КТГЗЕМ=ЦЕНА_КТГЗЕМ[ii];
       ЦЕНА[num].РАЗИСП=ЦЕНА_РАЗИСП[ii];
     od;
   |  2ЦЕНА_Позиции>0 and ЦЕНА>00: -- отредактировали уже имеющиеся позиции
     if _ЦЕНА_Позиции>ЦЕНА.:
       OK=True;
       for ii=1 to (ЦЕНА_Позиции-ЦЕНА) do
         Try num=InsertFrame(ЦЕНА, ЦЕНА+1); Except OK=False; end;
       od;
       if OK:
         for ii=1 to ЦЕНА_Позиции do
           ЦЕНА[ii].ДАТИЗМ=ЦЕНА_ДАТИЗМ[ii];
           ЦЕНА[ii].DATREG=ЦЕНА_DATREG[ii];
           ЦЕНА[ii].СТАВКА=ЦЕНА_СТАВКА[ii];
           ЦЕНА[ii].ЦЕНИЗМ=ЦЕНА_ЦЕНИЗМ[ii];
           ЦЕНА[ii].SQRОБЩ=ЦЕНА_SQRОБЩ[ii];
           ЦЕНА[ii].ДОЛЯПР=ЦЕНА_ДОЛЯПР[ii];
           ЦЕНА[ii].SQRДОЛ=ЦЕНА_SQRДОЛ[ii];
           ЦЕНА[ii].СУМИЗМ=ЦЕНА_СУМИЗМ[ii];
           ЦЕНА[ii].КТГЗЕМ=ЦЕНА_КТГЗЕМ[ii];
           ЦЕНА[ii].РАЗИСП=ЦЕНА_РАЗИСП[ii];
         od;
       fi;
     |  _ЦЕНА_Позиции<ЦЕНА.:
       OK=True;
       num=ЦЕНА-ЦЕНА_Позиции;
       while num>0 do
         Try DeleteFrame(ЦЕНА, ЦЕНА); Except OK=False; end;
         num=num-1;
       od;
       if OK:
         for ii=1 to ЦЕНА_Позиции do
           ЦЕНА[ii].ДАТИЗМ=ЦЕНА_ДАТИЗМ[ii];
           ЦЕНА[ii].DATREG=ЦЕНА_DATREG[ii];
           ЦЕНА[ii].СТАВКА=ЦЕНА_СТАВКА[ii];
           ЦЕНА[ii].ЦЕНИЗМ=ЦЕНА_ЦЕНИЗМ[ii];
           ЦЕНА[ii].SQRОБЩ=ЦЕНА_SQRОБЩ[ii];
           ЦЕНА[ii].ДОЛЯПР=ЦЕНА_ДОЛЯПР[ii];
           ЦЕНА[ii].SQRДОЛ=ЦЕНА_SQRДОЛ[ii];
           ЦЕНА[ii].СУМИЗМ=ЦЕНА_СУМИЗМ[ii];
           ЦЕНА[ii].КТГЗЕМ=ЦЕНА_КТГЗЕМ[ii];
           ЦЕНА[ii].РАЗИСП=ЦЕНА_РАЗИСП[ii];
         od;
       fi;
     |  _ЦЕНА_Позиции=ЦЕНА.:
       -- проверяем изменения
       for ii=1 to ЦЕНА_Позиции do
         if ЦЕНА[ii].ДАТИЗМ=ЦЕНА_ДАТИЗМ[ii] and ЦЕНА[ii].DATREG=ЦЕНА_DATREG[ii] and ЦЕНА[ii].СТАВКА=ЦЕНА_СТАВКА[ii] and ЦЕНА[ii].ЦЕНИЗМ=ЦЕНА_ЦЕНИЗМ[ii] and ЦЕНА[ii].SQRОБЩ=ЦЕНА_SQRОБЩ[ii] and
            ЦЕНА[ii].ДОЛЯПР=ЦЕНА_ДОЛЯПР[ii] and ЦЕНА[ii].SQRДОЛ=ЦЕНА_SQRДОЛ[ii] and ЦЕНА[ii].СУМИЗМ=ЦЕНА_СУМИЗМ[ii] and ЦЕНА[ii].КТГЗЕМ=ЦЕНА_КТГЗЕМ[ii] and ЦЕНА[ii].РАЗИСП=ЦЕНА_РАЗИСП[ii]:
           OK=True;
         else
           OK=False;
         fi;
         if not OK:
           ЦЕНА[ii].ДАТИЗМ=ЦЕНА_ДАТИЗМ[ii];
           ЦЕНА[ii].DATREG=ЦЕНА_DATREG[ii];
           ЦЕНА[ii].СТАВКА=ЦЕНА_СТАВКА[ii];
           ЦЕНА[ii].ЦЕНИЗМ=ЦЕНА_ЦЕНИЗМ[ii];
           ЦЕНА[ii].SQRОБЩ=ЦЕНА_SQRОБЩ[ii];
           ЦЕНА[ii].ДОЛЯПР=ЦЕНА_ДОЛЯПР[ii];
           ЦЕНА[ii].SQRДОЛ=ЦЕНА_SQRДОЛ[ii];
           ЦЕНА[ii].СУМИЗМ=ЦЕНА_СУМИЗМ[ii];
           ЦЕНА[ii].КТГЗЕМ=ЦЕНА_КТГЗЕМ[ii];
           ЦЕНА[ii].РАЗИСП=ЦЕНА_РАЗИСП[ii];
         fi;
       od;
     fi;
   fi;
 fi;
end;

Func КБК_Выбор(OldValue:String) :String;
var NewValue :String;
 NewValue=Trim(РАБ.УПП.КБК2005.ВыборКБКиерарх2005(DefMaskACC, "КР", False));
 if NewValue="": ^OldValue; else ^NewValue; fi;
end;

Func УникальныйПризнак_Проверка(аПризнак:String; aField:String; аТекущая:Record) :Integer;
var RO, num :Integer;
 RO=OpenWorkArea(SelfCRD, "", aField+"='"+аПризнак+"'");
 Try
   num=Records(RO);
   if num>1: ^-1;
   |  num=1: if аТекущая<>GetRecordKey(RO, 1): ^-1; else ^1; fi;
   else ^1;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 ^0;
end;

Func ПроверкаЗаполненияПолей :Logical;
var num :Integer;
 ClearVariable(arrStr);
 ClearVariable(arrTxt);
 num=0;
 if not ДОТКК>ValidDate               : num=num+1; arrTxt[num]="Дата начала действия карточки";                                             arrStr[num]="ДОТКК";      fi;
 if CRDClosed:
   if not ДЗАКК>ValidDate                     : num=num+1; arrTxt[num]="Дата окончания действия карточки (стоит флаг 'Учет по карточке завершен')"; arrStr[num]="ДЗАКК"; fi;
   if     ДЗАКК>ValidDate and not ДОТКК<ДЗАКК : num=num+1; arrTxt[num]="Дата окончания действия карточки должна быть позже даты открытия карточки"; arrStr[num]="ДЗАКК"; fi;
 fi;
 if Trim(АПРИЗН)=""                   : num=num+1; arrTxt[num]="Аналитический признак";                                                     arrStr[num]="АПРИЗН_";    fi;
 if Trim(ПНАИМЕНФГУ)=""               : num=num+1; arrTxt[num]="Полное наименование федерального государственного учреждения";              arrStr[num]="ПНАИМЕНФГУ"; fi;
 if Trim(СУБЪЕКТКОД)=""               : num=num+1; arrTxt[num]="Субъект Российской Федерации - код";                                        arrStr[num]="СУБЪЕКТКОД"; fi;
 if Trim(СУБЪЕКТНМН)=""               : num=num+1; arrTxt[num]="Субъект Российской Федерации - наименование";                               arrStr[num]="СУБЪЕКТНМН"; fi;
 if Trim(ТЕРРИТОРИЯ)=""               : num=num+1; arrTxt[num]="Наименование административно-территориального образования";                 arrStr[num]="ТЕРРИТОРИЯ"; fi;
 if Trim(ПОЧТААДРЕС)=""               : num=num+1; arrTxt[num]="Почтовый ориентир";                                                         arrStr[num]="ПОЧТААДРЕС"; fi;
 if Trim(НОМКАДАСТР)=""               : num=num+1; arrTxt[num]="Кадастровый номер";                                                         arrStr[num]="НОМКАДАСТР"; fi;
 if Trim(КТГ_ЗЕМЕЛЬ)=""               : num=num+1; arrTxt[num]="Категория земель";                                                          arrStr[num]="КТГ_ЗЕМЕЛЬ"; fi;
 if Trim(ИСПОЛЬ_ВИД)=""               : num=num+1; arrTxt[num]="Разрешенное использование";                                                 arrStr[num]="ИСПОЛЬ_ВИД"; fi;
 if Trim(ВИДЮПРАВА)=""                : num=num+1; arrTxt[num]="Вид права";                                                                 arrStr[num]="ВИДЮПРАВА";  fi;
 if not ДОЛЯПРАВА>0.00                : num=num+1; arrTxt[num]="Доля в праве (%)";                                                          arrStr[num]="ДОЛЯПРАВА";  fi;
 if Trim(ЮРПРАВОDOC)=""               : num=num+1; arrTxt[num]="Правоустанавливающий документ на земельный участок";                        arrStr[num]="ЮРПРАВОDOC"; fi;
 if Trim(ЗЕМПАСПОРТ)=""               : num=num+1; arrTxt[num]="Кадастровый паспорт или выписка из ГКН и (или) ЕГРП";                       arrStr[num]="ЗЕМПАСПОРТ"; fi;
 if not КОЛ_УЧАСТ>0.00                : num=num+1; arrTxt[num]="Количество участков";                                                       arrStr[num]="КОЛ_УЧАСТ";  fi;
 if not SQUAREОБЩ>0.00                : num=num+1; arrTxt[num]="Площадь, кв.м. - общая";                                                    arrStr[num]="SQUAREОБЩ";  fi;
 if not SQUAREДОЛ>0.00                : num=num+1; arrTxt[num]="Площадь, кв.м. - приходящаяся на долю в праве";                             arrStr[num]="SQUAREДОЛ";  fi;
 if num>0:
   num=Alternate("Не заполнены следующие обязательные поля:", arrTxt, -1, 1, 12);
   if not num>0: num=1; fi;
   if currКнопка<>1: ВидимостьОтчетныхТаблиц_Work(True, False, False, False, False); currКнопка=1; fi;
   Template.Field=arrStr[num];
   ^False;
 fi;
 ^True;
end;

Func ПроверкаЗаполненияПолейИМНС :Logical;
var num :Integer;
 if not НеПровИМНС:
   ClearVariable(arrStr);
   ClearVariable(arrTxt);
   num=0;
   if ИМНС_REFК=NIL       : num=num+1; arrTxt[num]="Ссылка на запись в справочнике контрагент: наименование";  arrStr[num]="ИМНС_REFК.КОРИМЯ";  fi;
   if ИМНС_REFБ=NIL       : num=num+1; arrTxt[num]="Ссылка на запись в справочнике контрагент: банк";          arrStr[num]="ИМНС_REFБ.БАНКИМЯ"; fi;
   if Trim(НАЛ_ОКТМО)=""  : num=num+1; arrTxt[num]="Код ОКТМО";                                                arrStr[num]="НАЛ_ОКТМО";         fi;
   if Trim(НАЛ_ОЧЕРПЛ)="" : num=num+1; arrTxt[num]="Очередность платежа";                                      arrStr[num]="НАЛ_ОЧЕРПЛ";        fi;
   if Trim(НАЛ_СТАТУС)="" : num=num+1; arrTxt[num]="Статус налогоплательщика";                                 arrStr[num]="НАЛ_СТАТУС";        fi;
   if Trim(НАЛ_КБК)=""    : num=num+1; arrTxt[num]="Код по БК";                                                arrStr[num]="НАЛ_КБК";           fi;
   if Trim(НАЛ_ОСНПЛ)=""  : num=num+1; arrTxt[num]="Основание платежа";                                        arrStr[num]="НАЛ_ОСНПЛ";         fi;
   if Trim(НАЛ_ТИППЛ)=""  : num=num+1; arrTxt[num]="Тип платежа";                                              arrStr[num]="НАЛ_ТИППЛ";         fi;
   if num>0:
     num=Alternate("Не заполнены следующие обязательные поля:", arrTxt, -1, 1, 12);
     if not num>0: num=1; fi;
     if currКнопка<>2: ВидимостьОтчетныхТаблиц_Work(False, True, False, False, False); currКнопка=2; fi;
     Template.Field=arrStr[num];
     ^False;
   fi;
 fi;
 ^True;
end;

Func BlankToCRD_SaveOK :Logical;
var MsgTxt, TplFld, ANA :String;
var RefLnk :Integer;
var NoError :Logical;
var WD :Date;

 if not ПроверкаЗаполненияПолей:     ^False; fi;
 if not ПроверкаЗаполненияПолейИМНС: ^False; fi;
 NoError=True;
 if NoError: 
   if not УникальныйПризнак_Проверка(АПРИЗН, "АПРИЗН", Current)>0:
     MsgTxt="Признак '"+АПРИЗН+"' не уникален.";
     TplFld="АПРИЗН_";
     RefLnk=1;
     NoError=False;
   fi;
 fi;
 if NoError:
   if not ЦЕНА_Позиции>0:
     MsgTxt="Необходимо ввести первоначальные данные о кадастровой стоимости и ставке налога.";
     TplFld="Д_ИЗМ";
     RefLnk=3;
     NoError=False;
   fi;
 fi;
 if NoError:
   if ДЗАКК>ValidDate:
     ANA=ExtractWord(1, DefMaskVOC, ".")+"."+АПРИЗН;
     if SignUsed(ANA):
       WD=РАБ.УПП.LIB.ДатаПроводки(DefMaskACC, ANA, AddMon(ДЗАКК, +1), True);
       if not WD<ДЗАКК:
         MsgTxt="Дата закрытия карточки не должна быть раньше^Mпоследней операции (проводки) с объектом карточки";
         TplFld="ДЗАКК";
         RefLnk=1;
         NoError=False;
       fi;
     fi;
   fi;
 fi;
 if not NoError:
   Message(MsgTxt, mtError);
   if RefLnk=1: if currКнопка<>1: ВидимостьОтчетныхТаблиц_Work(True , False, False, False, False); currКнопка=1; fi;
   |  RefLnk=2: if currКнопка<>2: ВидимостьОтчетныхТаблиц_Work(False, True , False, False, False); currКнопка=2; fi;
   |  RefLnk=3: if currКнопка<>3: ВидимостьОтчетныхТаблиц_Work(False, False, True , False, False); currКнопка=3; СчитатьПозиции_ЦЕНА; fi;
   |  RefLnk=4: if currКнопка<>4: ВидимостьОтчетныхТаблиц_Work(False, False, False, True , False); currКнопка=4; fi;
   |  RefLnk=5: if currКнопка<>5: ВидимостьОтчетныхТаблиц_Work(False, False, False, False, True ); currКнопка=5; Очистить_ОтчетПоНалогу_2; fi;
   fi;
   Template.Field=TplFld;
   ^False;
 fi;

 ^True;
end;

Func Выбор_ИМНС(OldValue:Record) :Record;
var NewValue, REC :Record;
var RO, num :Integer;
var FTR :String;
 RO=OpenWorkArea("КОНТРАГЕНТ", "", "Up(ПРИЗНАК)='НАЛОГОВАЯ'");
 Try num=Records(RO); if num=1: REC=GetRecordKey(RO, 1); else REC=NIL; fi; Finally CloseWorkArea(RO); end;
 if REC<>NIL: FTR="GROUPDOC="+RecordToString(REC); else FTR=""; fi;
 NewValue=OpenCardFile("КОНТРАГЕНТ", FTR, OldValue, crdRecordOnly);
 if NewValue=NIL: ^OldValue; else ^NewValue; fi;
end;

Proc Выбор_БанкаИМНС(КодИМНС:Record);
var RO, num :Integer;
var RES :Record;
 if КодИМНС<>NIL:
   RES=NIL;
   RO=OpenWorkArea("БАНК_СЧЕТА", "", "КОНТРАГЕНТ="+RecordToString(КодИМНС));
   Try
     num=Records(RO);
     if num=1: RES=GetRecordKey(RO, 1); 
     |  num>1: RES=OpenCardFile("БАНК_СЧЕТА", "КОНТРАГЕНТ="+RecordToString(КодИМНС), ИМНС_REFБ, crdRecordOnly);
     else Message("Банковские реквизиты не найдены.", mtError);
     fi;
   Finally
     CloseWorkArea(RO);
   end;
   if RES<>NIL: ИМНС_REFБ=RES; fi;
 else
   Message("Предварительно выберите ИМНС.", mtWarning);
   Template.Field="ИМНС_REFК.КОРИМЯ";
 fi;
end;

Func Взять_БанкИМНС(КодИМНС:Record) :Record;
var RES :Record;
var RO :Integer;
 RES=NIL;
 if КодИМНС<>NIL:
   RO=OpenWorkArea("БАНК_СЧЕТА", "", "КОНТРАГЕНТ="+RecordToString(КодИМНС));
   Try
     if Records(RO)=1: RES=GetRecordKey(RO, 1); fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
 ^RES;
end;

Func Взять_Код_ОКТМО(КодИМНС:Record) :String;
 if КодИМНС<>NIL:
   if RecordExists("КОНТРАГЕНТ", КодИМНС):
     ^GetCardFieldS("КОНТРАГЕНТ", КодИМНС, "ОКТМО");
   fi;
 fi;
 ^"";
end;

Proc Выбор_ИМНС_Выполнить;
 ИМНС_REFК=Выбор_ИМНС(ИМНС_REFК);
 НАЛ_ОКТМО=Взять_Код_ОКТМО(ИМНС_REFК);
 ИМНС_REFБ=Взять_БанкИМНС(ИМНС_REFК);
end;

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

Proc Пересчет_ОтчетПоНалогу(aYear:Integer);
var RO, OA, num, kk :Integer;
var WD1, WD2, ddP, ddS :Date;
var ANA, KBK, MSK :String;
var Delta :Numeric;
var Work :Logical;
 Очистить_ОтчетПоНалогу;
 if aYear>Year(ValidDate):
   WD1=Dat(1, 1, aYear);
   WD2=Dat(1, 1, aYear+1);
   RO=OpenWorkArea(SelfCRD, "", "Ukey="+RecordToString(Current));
   Try
     if Records(RO)=1:
       Work=True;
       ANA=ExtractWord(1, DefMaskVOC, ".")+"."+GetFieldS(RO, 1, "АПРИЗН");
       KBK=Trim(GetFieldS(RO, 1, "КБК_УЧЕТА"));
       if not Match(KBK, "???.????.???????.???"): KBK=def_КБК; fi;
       ddP=GetFieldD(RO, 1, "ДОТКК");
       ddS=GetFieldD(RO, 1, "ДЗАКК");
       if Work: if ddP>ValidDate and ddP>=WD2: Work=False; fi; fi;
       if Work: if ddS>ValidDate and ddS< WD1: Work=False; 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, 1, "ЦЕНА", "ДАТИЗМ", "ДАТИЗМ<"+DateToString(WD1));
         num=Records(OA);
         if num>0:
           нлгСУМГОД=Round((GetFieldN(OA, num, "СУМИЗМ")*GetFieldN(OA, num, "СТАВКА")/100)*Delta, if(aYear<2014, 2, 0)); -- корректировка базы налога
         fi;
         CloseWorkArea(OA);

         if Name_S(KBK+".1.401.20.290")<>" " and Name_S(KBK+".1.303.13.730")<>" ": Work=True; else Work=False; fi;
         if Work:
           MSK="+"+KBK+".1.401.20.290/-"+KBK+".1.303.13.730 {"+ANA+"&ПЕРИОД."+Str(aYear)+".1}";
           Try нлг1КВНАЧ=Turn(MSK, WD1, WD2, "РУБ"); Except  нлг1КВНАЧ=0.00; end;
           MSK="+"+KBK+".1.401.20.290/-"+KBK+".1.303.13.730 {"+ANA+"&ПЕРИОД."+Str(aYear)+".2}";
           Try нлг2КВНАЧ=Turn(MSK, WD1, WD2, "РУБ"); Except  нлг2КВНАЧ=0.00; end;
           MSK="+"+KBK+".1.401.20.290/-"+KBK+".1.303.13.730 {"+ANA+"&ПЕРИОД."+Str(aYear)+".3}";
           Try нлг3КВНАЧ=Turn(MSK, WD1, WD2, "РУБ"); Except  нлг3КВНАЧ=0.00; end;
           MSK="+"+KBK+".1.401.20.290/-"+KBK+".1.303.13.730 {"+ANA+"&ПЕРИОД."+Str(aYear)+".4}";
           Try нлг4КВНАЧ=Turn(MSK, WD1, WD2, "РУБ"); Except  нлг4КВНАЧ=0.00; end;
           MSK="+"+KBK+".1.401.20.290/-"+KBK+".1.303.13.730 {"+ANA+"&(ПЕРИОД."+Str(aYear)+"!&~(ПЕРИОД."+Str(aYear)+".1|ПЕРИОД."+Str(aYear)+".2|ПЕРИОД."+Str(aYear)+".3|ПЕРИОД."+Str(aYear)+".4))}";
           Try нлгПРЧНАЧ=Turn(MSK, WD1, WD2, "РУБ"); Except  нлгПРЧНАЧ=0.00; end;
         fi;

         if Name_S(KBK+".1.303.13.830")<>" " and Name_S(KBK+".1.304.05.290")<>" ": Work=True; else Work=False; fi;
         if Work:
           MSK="+"+KBK+".1.303.13.830/-"+KBK+".1.304.05.290 {"+ANA+"&ПЕРИОД."+Str(aYear)+".1}";
           Try нлг1КВОПЛ=Turn(MSK, WD1, WD2, "РУБ"); Except нлг1КВОПЛ=0.00; end;
           MSK="+"+KBK+".1.303.13.830/-"+KBK+".1.304.05.290 {"+ANA+"&ПЕРИОД."+Str(aYear)+".2}";
           Try нлг2КВОПЛ=Turn(MSK, WD1, WD2, "РУБ"); Except нлг2КВОПЛ=0.00; end;
           MSK="+"+KBK+".1.303.13.830/-"+KBK+".1.304.05.290 {"+ANA+"&ПЕРИОД."+Str(aYear)+".3}";
           Try нлг3КВОПЛ=Turn(MSK, WD1, WD2, "РУБ"); Except нлг3КВОПЛ=0.00; end;
           MSK="+"+KBK+".1.303.13.830/-"+KBK+".1.304.05.290 {"+ANA+"&ПЕРИОД."+Str(aYear)+".4}";
           Try нлг4КВОПЛ=Turn(MSK, WD1, WD2, "РУБ"); Except нлг4КВОПЛ=0.00; end;
           MSK="+"+KBK+".1.303.13.830/-"+KBK+".1.304.05.290 {"+ANA+"&(ПЕРИОД."+Str(aYear)+"!&~(ПЕРИОД."+Str(aYear)+".1|ПЕРИОД."+Str(aYear)+".2|ПЕРИОД."+Str(aYear)+".3|ПЕРИОД."+Str(aYear)+".4))}";
           Try нлгПРЧОПЛ=Turn(MSK, WD1, WD2, "РУБ"); Except нлгПРЧОПЛ=0.00; end;
         fi;
       fi;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Proc ГодУчета_Выбор(OldValue:Integer; onExit:Logical);
var Путь, Value :String;
var NewValue, num, kk, NW :Integer;
var Отч1 :Report;
var SaveValue :Logical;
 SaveValue=False;
 if NewREC:
   Message("Это новая запись.^MОтчет невозможен.", mtWarning);
   Exit;
 fi;
 Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
 if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
 if onExit:
   NewValue=0;
 else
   ClearVariable(Buf);
   Отч1=RepOpen(Путь+"|По_признакам_БАЛиЗАБ", DefMaskACC, DefMaskVOC, 1.1.100, 1.1.2100, "", "ПЕРИОД");
   Try
     RepReset(Отч1);
     while RepNext(Отч1) do
       Value=RepIdent(Отч1);
       if Match(Value, "ПЕРИОД.????!"):
         Value=SubStr(Value, 8, 4);
         AddInArray(Buf, True, False, Value);
       fi;
     end;
   Finally
     Отч1=RepClose(Отч1);
   end;
   num=LengthOfArray(Buf);
   if num=1:
     NW=Int(Buf[1]);
   |  num>1:
     kk=Alternate("Выберите год учета", Buf, -1, 1, 12);
     if kk>0:
       NW=Int(Buf[kk]);
     fi;
   else
     Message("Корректо проведенных проводок^Mдля учета земли не обнаружено", mtWarning);
     Exit;
   fi;
   if NW>0: NewValue=NW; else NewValue=OldValue; fi;
 fi;
 if NewValue<>OldValue: if not ОтменитьИзмененияУсловийОтчетаНалога: SaveValue=True; fi; fi;
 if SaveValue:
   ГОДУЧТ=NewValue;
 fi;
 Пересчет_ОтчетПоНалогу(ГОДУЧТ);
end;

Func СканГЭК2_OnEnter(FieldName:String; Iter:Integer) :Logical;
var BlnName :String;
 if АПРИЗНК="": Message("Предварительно необходимо заполнить карточку"); ^False; fi;
 if Защита and FieldName="СканГЭК2": ^False; fi;
 if FieldName="СканГЭК2": EditorApply; fi;
 BlnName="РАБ.ВСПОМ.СКАН_ДОК";
 if ModalMode and isBlankOpen(BlnName): Message("Бланк электронной копии уже открыт.^MДля возврата закройте текущий бланк", mtWarning); ^False; fi;
 if isBlankOpen(BlnName): Close(BlnName); fi;
 ExecuteProc(BlnName+".Вызвать", Защита, ToDay, SelfCRD, Current, "Карточка РКН", АПРИЗНК, 1.1.100, ПОЧТААДРЕС, True, if(FieldName="СканГЭК2", NIL, ГЭК2Rec[Iter]));
 РасчетГЭК2;
 ^False;
end;

Func ОбновГЭК2_OnEnter(FieldName:String; Iter:Integer) :Logical;
 РасчетГЭК2;
 ^False;
end;

Func УдалГЭК2_OnEnter(FieldName:String; Iter:Integer) :Logical;
var Flag :Logical;
var ii :Integer;
 if ГЭК2_Позиции>0:
   if Защита and FieldName="УдалГЭК2": ^False; fi;
   if EnqOkCancel("Электронная копия первичных документов будет удалена.^MВы уверены?", mtWarning)=cmCancel: ^False; fi;
   РасчетГЭК2;
   EditorCancel;
   for ii=1 to ГЭК2_Позиции do
     Flag=ExecuteFuncL("РАБ.ВСПОМ.СКАН_ДОК.Стереть", ГЭК2Rec[ii]);
   od;
 fi;
 ^False;
end;

Func ГЭК2вPDF_OnEnter(FieldName:String; Iter:Integer) :Logical;
var FileName :String;
var num :Integer;
 РасчетГЭК2;
 if АПРИЗНК="": Message("Предварительно необходимо заполнить карточку"); ^False; fi;
 if not ГЭК2_Позиции>0: Message("Нет данных для формирования PDF"); ^False; fi;
 num=0;
 for Iter=1 to ГЭК2_Позиции do
   num=РАБ.ВСПОМ.СКАНЕР.ЧитатьГЭК("РПО_СКАН_ДОК", RecordToInteger(ГЭК2Rec[Iter]), "jpg", Iter=1);
 od;
 if num=0: Message("Нет данных для формирования PDF"); ^False; fi;
 if ПутьPDF="":
   if ChooseFolder(ПутьPDF, "Выберите папку для хранения PDF")=cmCancel: ^False; fi;
   FileName=ПутьPDF;
   ПутьPDF="";
 else
   FileName=ПутьPDF;
 fi;
 FileName=РАБ.БЮДЖЕТ2005.Контроль2Слэш(FileName+"\Карточка РКН "+АПРИЗНК+".pdf");
 if ExistFile(FileName):
   if EnqOkCancel("Файл "+FileName+" уже существет.^MПерезаписать?", mtWarning)=cmCancel: ^False; fi;
 fi;
 num=РАБ.ВСПОМ.СКАНЕР.JpegToPdf(FileName, False);
 if num=1:
   ExecuteProgram('"'+FileName+'"');
 else
   Message("Ошибка создания PDF файла ("+Str(num)+")", mtError);
 fi;
 ^False;
end;

Func ПутьPDF_OnEnter(FieldName: String; Iter: Integer): logical;
var num :Integer;
 if AsLogical(ЭКД02.Cell(4, 4, CellReadOnly, "")): -- проверять координаты (поле ПутьPDF)
   num=ChooseFolder(ПутьPDF, "Выберите папку для хранения PDF");
   ^False;
 fi;
 ^True;
end;

Func ПутьPDF_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var num :Integer;
 Template.HideEditor(False);
 num=ChooseFolder(ПутьPDF, "Выберите папку для хранения PDF");
 ^Cur;
end;

Func ГЭК2_onEnter(FieldName:String; Iter:Integer) :Logical;
 СканГЭК2_OnEnter(FieldName, Iter);
 ^False;
end;

Proc ГЭК2Field_OnClick(Row: Integer; Col: Integer; Double: Logical);
var FieldName :String;
var Iter :Integer;
var Flag :Logical;
 FieldName=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if Double:
   Flag=ExecuteFuncL(FieldName+"_onEnter", FieldName, Iter);
 fi;
end;

2-- События клеток
Func Field_onEnter(nameField:String; iterFrame:Integer): Logical; -- на входе в клетку
 if nameField="кнпМ01" : ВидимостьОтчетныхТаблиц_Work(True , False, False, False, False); currКнопка=1; ^False;
 |  nameField="кнпМ02" : ВидимостьОтчетныхТаблиц_Work(False, True , False, False, False); currКнопка=2; ^False;
 |  nameField="кнпМ03" : ВидимостьОтчетныхТаблиц_Work(False, False, True , False, False); currКнопка=3; СчитатьПозиции_ЦЕНА; ^False;
 |  nameField="кнпМ04" : ВидимостьОтчетныхТаблиц_Work(False, False, False, True , False); currКнопка=4; РасчетГЭК2; ^False;
 |  nameField="кнпМ05" : ВидимостьОтчетныхТаблиц_Work(False, False, False, False, True ); currКнопка=5; Очистить_ОтчетПоНалогу_2; ^False;
 |  nameField="кнпК01" : ДобавитьСтоимость; ^False;
 |  nameField="кнпК02" : УдалитьСтоимость(iterFrame); ^False;
 |  nameField="АПРИЗН_":
   if АПРИЗН<>"":
     if РАБ.УПП.LIB.ПризнакИспользуется("*", SelfCRD, Current):
       Message("Аналитический признак '"+АПРИЗН+"' используется в проводках."+Chr(13)+"Изменение невозможно!", mtError);
       ^False;
     fi;
   fi;
   FlagEdit=True;
 |  nameField="КБК_УЧЕТА"         : КБК_УЧЕТА= КБК_Выбор(КБК_УЧЕТА); ^False;
 |  nameField="ИМНС_REFК.КОРИМЯ"  : Выбор_ИМНС_Выполнить; ^False;
 |  nameField="ИМНС_REFБ.БАНКИМЯ" : Выбор_БанкаИМНС(ИМНС_REFК); ^False;
 |  nameField="ГОДУЧТ_"           : ГодУчета_Выбор(ГОДУЧТ, False); ^False;
 fi;
 ^True;
end;

Proc Пересчет(Field:String; SО:Numeric; SД:Numeric; PД:Numeric);
 if Field="ДОЛЯПРАВА":
   if PД>0.00:
     if SО>0.00 and SД>=0.00: SQUAREДОЛ=SО*PД/100;
     |  SО=0.00 and SД> 0.00: SQUAREОБЩ=SД*100/PД;
     fi;
   fi;
 |  Field="SQUAREОБЩ":
   if SО>0.00:
     if PД>0.00: SQUAREДОЛ=SО*PД/100;
     |  PД=0.00: ДОЛЯПРАВА=100; SQUAREДОЛ=SО;
     fi;
   fi;
 |  Field="SQUAREДОЛ":
   if SД>0.00:
     if PД>0.00: SQUAREОБЩ=SД*100/PД;
     |  PД=0.00: ДОЛЯПРАВА=100; SQUAREОБЩ=SД;
     fi;
   fi;
 fi;
end;

Proc Field_onExit(nameField:String; iterFrame:Integer); -- на выходе из клетки
 if nameField="ДОЛЯПРАВА": Пересчет(nameField, SQUAREОБЩ, SQUAREДОЛ, ДОЛЯПРАВА);
 |  nameField="SQUAREОБЩ": Пересчет(nameField, SQUAREОБЩ, SQUAREДОЛ, ДОЛЯПРАВА);
 |  nameField="SQUAREДОЛ": Пересчет(nameField, SQUAREОБЩ, SQUAREДОЛ, ДОЛЯПРАВА);
 |  nameField="АПРИЗН_":
   if FlagEdit: FlagEdit=False; Exit; fi;
   if АПРИЗН<>"":
     if РАБ.УПП.LIB.ПризнакИспользуется("*", SelfCRD, Current):
       Message("Аналитический признак '"+АПРИЗН+"' используется в проводках."+Chr(13)+"Удаление невозможно!", mtError);
       Exit;
     fi;
   fi;
   АПРИЗН="";
 |  nameField="ИМНС_REFК.КОРИМЯ" : if ИМНС_REFК=NIL: ИМНС_REFБ=NIL; fi;
 |  nameField="ГОДУЧТ_"          : ГодУчета_Выбор(ГОДУЧТ, True);
 fi;
end;

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

Func ЗаполнитьМассивДанныхПоПолю(srcField:String) :Integer;
var RO, num, ii, kk, numError :Integer;
var Value :String;
 numError=-1;
 ClearVariable(arrStr);
 if GetCardFileFields(SelfCRD, Buf, mtlSTRING)>0: SortArray(Buf); num=SearchInArray(Buf, srcField, True, 1); if not num>0: numError=1001; fi; fi;
 if not numError>0:
   RO=OpenWorkArea(SelfCRD, srcField, "");
   Try
     num=Records(RO);
     if num>0:
       for ii=1 to num do
         kk=GetCardFileFieldType(SelfCRD, srcField);
         if kk=mtlSTRING : Value=Trim(GetFieldS(RO, ii, srcField)); else Value=""; fi;
         if Value<>"": AddInArray(arrStr, True, False, Value); fi;
       od;
     else
       numError=1002;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
 num=LengthOfArray(arrStr);
 if num>0: ^num; else numError=1003; fi;
 if numError>0:
   if numError=1001: Message("Поле '"+srcField+"' не найдено в картотеке '"+SelfCRD+"'.", mtError);
   |  numError=1002: Message("Картотека '"+SelfCRD+"', для данной схемы доступа, пустая.", mtError);
   |  numError=1003: Message("По полю '"+srcField+"' в картотеке '"+SelfCRD+"'^Mзаписей не обнаружено.", mtWarning);
   else
      Message("Непредвиденная ошибка в картотеке '"+SelfCRD+"'.", mtError);
   fi;
   ^-1;
 fi;
end;

Func УжеВведенноеЗначение_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var nameField, NewValue, OldValue :String;
var len, num :Integer;
 Template.HideEditor(False);
 nameField=asString(Template.Field);
 NewValue="";
 OldValue=GetVariableS(nameField);
 len=ЗаполнитьМассивДанныхПоПолю(nameField);
 if len=1: NewValue=arrStr[1];
 |  len>1: num=Alternate("Выберите сохраненное значение", arrStr, -1, 1, 12); if num>0: NewValue=arrStr[num]; fi;
 fi;
 if NewValue<>"" and OldValue<>NewValue: PutVariableS(nameField, NewValue); fi;
 ^"";
end;

Func РасшифровкаСубъектаРФ(КОД:String) :String;
 if КОД="01": ^"Республика Адыгея";
 |  КОД="02": ^"Республика Башкортостан";
 |  КОД="03": ^"Республика Бурятия";
 |  КОД="04": ^"Республика Алтай";
 |  КОД="05": ^"Республика Дагестан";
 |  КОД="06": ^"Республика Ингушетия";
 |  КОД="07": ^"Кабардино-Балкарская республика";
 |  КОД="08": ^"Республика Калмыкия";
 |  КОД="09": ^"Карачаево-Черкесская республика";
 |  КОД="10": ^"Республика Карелия";
 |  КОД="11": ^"Республика Коми";
 |  КОД="12": ^"Республика Марий Эл";
 |  КОД="13": ^"Республика Мордовия";
 |  КОД="14": ^"Республика Саха (Якутия)";
 |  КОД="15": ^"Республика Северная Осетия - Алания";
 |  КОД="16": ^"Республика Татарстан";
 |  КОД="17": ^"Республика Тыва";
 |  КОД="18": ^"Удмуртская республика";
 |  КОД="19": ^"Республика Хакасия";
 |  КОД="20": ^"Чеченская республика";
 |  КОД="21": ^"Чувашская республика";
 |  КОД="22": ^"Алтайский край";
 |  КОД="23": ^"Краснодарский край";
 |  КОД="24": ^"Красноярский край";
 |  КОД="25": ^"Приморский край";
 |  КОД="26": ^"Ставропольский край";
 |  КОД="27": ^"Хабаровский край";
 |  КОД="28": ^"Амурская область";
 |  КОД="29": ^"Архангельская область";
 |  КОД="30": ^"Астраханская область";
 |  КОД="31": ^"Белгородская область";
 |  КОД="32": ^"Брянская область";
 |  КОД="33": ^"Владимирская область";
 |  КОД="34": ^"Волгоградская область";
 |  КОД="35": ^"Вологодская область";
 |  КОД="36": ^"Воронежская область";
 |  КОД="37": ^"Ивановская область";
 |  КОД="38": ^"Иркутская область";
 |  КОД="39": ^"Калининградская область";
 |  КОД="40": ^"Калужская область";
 |  КОД="41": ^"Камчатский край";
 |  КОД="42": ^"Кемеровская область";
 |  КОД="43": ^"Кировская область";
 |  КОД="44": ^"Костромская область";
 |  КОД="45": ^"Курганская область";
 |  КОД="46": ^"Курская область";
 |  КОД="47": ^"Ленинградская область";
 |  КОД="48": ^"Липецкая область";
 |  КОД="49": ^"Магаданская область";
 |  КОД="50": ^"Московская область";
 |  КОД="51": ^"Мурманская область";
 |  КОД="52": ^"Нижегородская область";
 |  КОД="53": ^"Новгородская область";
 |  КОД="54": ^"Новосибирская область";
 |  КОД="55": ^"Омская область";
 |  КОД="56": ^"Оренбургская область";
 |  КОД="57": ^"Орловская область";
 |  КОД="58": ^"Пензенская область";
 |  КОД="59": ^"Пермский край";
 |  КОД="60": ^"Псковская область";
 |  КОД="61": ^"Ростовская область";
 |  КОД="62": ^"Рязанская область";
 |  КОД="63": ^"Самарская область";
 |  КОД="64": ^"Саратовская область";
 |  КОД="65": ^"Сахалинская область";
 |  КОД="66": ^"Свердловская область";
 |  КОД="67": ^"Смоленская область";
 |  КОД="68": ^"Тамбовская область";
 |  КОД="69": ^"Тверская область";
 |  КОД="70": ^"Томская область";
 |  КОД="71": ^"Тульская область";
 |  КОД="72": ^"Тюменская область";
 |  КОД="73": ^"Ульяновская область";
 |  КОД="74": ^"Челябинская область";
 |  КОД="75": ^"Забайкальский край";
 |  КОД="76": ^"Ярославская область";
 |  КОД="77": ^"город Москва";
 |  КОД="78": ^"город Санкт-Петербург";
 |  КОД="79": ^"Еврейская автономная область";
 |  КОД="83": ^"Ненецкий автономный округ";
 |  КОД="86": ^"Ханты-Мансийский автономный округ - Югра";
 |  КОД="87": ^"Чукотский автономный округ";
 |  КОД="89": ^"Ямало-Ненецкий автономный округ";
 |  КОД="99": ^"Территории, находящиеся за пределами РФ и обслуживаемые Управлением режимных объектов МВД России, Байконур";
 else ^"";
 fi;
end;

Func Нал_ОчерПЛ_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var num :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 Buf[01]="01 - исполнительные документы по причинению вреда здоровью, жизни; алименты";
 Buf[02]="02 - исполнительные документы по выходным пособиям, оплате труда с работающими и бывшими работниками; выплата вознаграждений авторам за результаты интеллектуальной деятельности";
 Buf[03]="03 - платежные документы по оплате труда; поручения налоговых органов по налогам, сборам; поручения органов контроля по страховым взносам в гос. внебюджетные фонды (в предыдущей редакции указаны ПФР, ФСС, ФОМС)";
 Buf[04]="04 - другие исполнительные документы";
 Buf[05]="05 - остальные платежные документы в порядке календарной очереди";
 num=Alternate("Очередность платежа", Buf, -1, Int(НАЛ_ОЧЕРПЛ), 12);
 if num>0: НАЛ_ОЧЕРПЛ=Str(Int(SubStr(Buf[num], 1, 2))); fi;
 ^Cur;
end;

Func Нал_Статус_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var num, kk :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 ClearVariable(Txt);
 Txt[01]="01"; Buf[01]="01 - налогоплательщик (плательщик сборов) - юридическое лицо";
 Txt[02]="02"; Buf[02]="02 - налоговый агент";
 Txt[03]="06"; Buf[03]="06 - участник внешнеэкономической деятельности - юридическое лицо";
 Txt[04]="08"; Buf[04]="08 - плательщик - юридическое лицо (индивидуальный предприниматель), осуществляющее перевод денежных средств в уплату страховых взносов и иных платежей в бюджетную систему Российской Федерации";
 Txt[05]="09"; Buf[05]="09 - налогоплательщик (плательщик сборов) - индивидуальный предприниматель";
 Txt[06]="10"; Buf[06]="10 - налогоплательщик (плательщик сборов) - нотариус, занимающийся частной практикой";
 Txt[07]="11"; Buf[07]="11 - налогоплательщик (плательщик сборов) - адвокат, учредивший адвокатский кабинет";
 Txt[08]="12"; Buf[08]="12 - налогоплательщик (плательщик сборов) - глава крестьянского (фермерского) хозяйства";
 Txt[09]="13"; Buf[09]="13 - налогоплательщик (плательщик сборов) - иное физическое лицо - клиент банка (владелец счета)";
 Txt[10]="14"; Buf[10]="14 - налогоплательщик, производящий выплаты физическим лицам";
 Txt[11]="16"; Buf[11]="16 - участник внешнеэкономической деятельности - физическое лицо";
 Txt[12]="17"; Buf[12]="17 - участник внешнеэкономической деятельности - индивидуальный предприниматель";
 Txt[13]="19"; Buf[13]="19 - организации и их филиалы, составившие распоряжение о переводе денежных средств, удержанных из заработной платы (дохода) должника - физического лица в счет погашения задолженности по платежам в бюджетную систему РФ на основании исполнительного документа";
 Txt[14]="21"; Buf[14]="21 - ответственный участник консолидированной группы налогоплательщиков";
 Txt[15]="22"; Buf[15]="22 - участник консолидированной группы налогоплательщиков";
 Txt[16]="24"; Buf[16]="24 - плательщик - физическое лицо, осуществляющее перевод денежных средств в уплату страховых взносов и иных платежей в бюджетную систему Российской Федерации";
 if Нал_Статус<>"": kk=SearchInArray(Txt, Нал_Статус, False, 1); fi;
 if not kk>0: kk=1; fi;
 num=Alternate("Статус", Buf, -1, kk, 12);
 if num>0: Нал_Статус=Txt[num]; fi;
 ^Cur;
end;

Func Нал_КБК_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Value :String;
var num :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 Buf[01]="Уже введенные значения";
 Buf[02]="Выбрать КД из базы";
 Value="";
 num=Alternate("Выберите действие", Buf, -1, 1, 12);
 if num=1: Value=УжеВведенноеЗначение_onLookup(Sect, Row, Col, Cur);
 |  num=2: Value=РАБ.КБК.ВыбратьКД;
 fi;
 if Value<>"": Нал_КБК=Value; fi;
 ^Cur;
end;

Func Нал_ОснПл_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var num, kk :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 ClearVariable(Txt);
 Txt[01]="ТП"; Buf[01]="ТП - платежи текущего года";
 Txt[02]="ЗД"; Buf[02]="ЗД - добровольное погашение задолженности но истекшим налоговым, расчетным (отчетным) периодам при отсутствии требования налогового органа об уплате налогов (сборов)";
 Txt[03]="БФ"; Buf[03]="БФ - текущий платеж физлица - клиента банка (владельца счета), уплачиваемый со своего банковского счета";
 Txt[04]="ТР"; Buf[04]="ТР - погашение задолженности по требованию налогового органа об уплате налогов (сборов)";
 Txt[05]="РС"; Buf[05]="РС - погашение рассроченной задолженности";
 Txt[06]="ОТ"; Buf[06]="ОТ - погашение отсроченной задолженности";
 Txt[07]="РТ"; Buf[07]="РТ - погашение реструктурируемой задолженности";
 Txt[08]="ПБ"; Buf[08]="ПБ - погашение должником задолженности в ходе процедур, применяемых в деле о банкротстве";
 Txt[09]="ПР"; Buf[09]="ПР - погашение задолженности, приостановленной к взысканию";
 Txt[10]="АП"; Buf[10]="АП - погашение задолженности по акту проверки";
 Txt[11]="АР"; Buf[11]="АР - погашение задолженности но исполнительному документу";
 Txt[12]="ИН"; Buf[12]="ИН - погашение инвестиционного налогового кредита";
 Txt[13]="ТЛ"; Buf[13]="ТЛ - погашение учредителем (участником) должника, собственником имущества должника - унитарного предприятия или третьим лицом задолженности в ходе процедур, применяемых в деле о банкротстве";
 Txt[14]="ЗТ"; Buf[14]="ЗТ - погашение текущей задолженности в ходе процедур, применяемых в деле о банкротстве";
 Txt[15]="0";  Buf[15]="0  - при невозможности однозначно идентифицировать платеж";
 if Нал_ОснПл<>"": kk=SearchInArray(Txt, Нал_ОснПл, False, 1); fi;
 if not kk>0: kk=1; fi;
 num=Alternate("Основание платежа", Buf, -1, kk, 12);
 if num>0: Нал_ОснПл=Txt[num]; fi;
 ^Cur;
end;

Func Нал_ТипПл_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var num, kk :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 ClearVariable(Txt);
 Txt[01]="0";  Buf[01]="0 - уплата налогов, сборов, авансовых платежей, взносов, налоговых санкций, административных и иных штрафов, прочих платежей в налоговые органы, кроме пени и процентов (в налоговые органы); в остальных случаях (в таможенные органы)";
 Txt[02]="ПЕ"; Buf[02]="ПЕ - уплата пени (в налоговые и таможенные органы)";
 Txt[03]="ПЦ"; Buf[03]="ПЦ - уплата процентов (в налоговые органы)";
 Txt[04]="ШТ"; Buf[04]="ШТ - уплата штрафа (в таможенные органы)";
 Txt[05]="ЗД"; Buf[05]="ЗД - уплата в счет погашения задолженности (в таможенные органы)";
 if Нал_ТипПл<>"": kk=SearchInArray(Txt, Нал_ТипПл, False, 1); fi;
 if not kk>0: kk=1; fi;
 num=Alternate("Тип платежа", Buf, -1, kk, 12);
 if num>0: Нал_ТипПл=Txt[num]; fi;
 ^Cur;
end;

Func СформироватьПризнакПоКадастровомуНомеру(КН:String) :String;
var ii, len, intChars :Integer;
var RES, Chars :String;
 RES="";
 len=Length(КН);
 if len>0:
   for ii=1 to len do
     Chars=SubStr(КН, ii, 1);
     intChars=Ascii(Chars);
     if (intChars>= 48 and intChars<= 57) or  -- цифры
        (intChars>= 65 and intChars<= 90) or  -- латиница заглавные
        intChars=95 or                        -- нижнее подчеркивание
        (intChars>= 97 and intChars<=122) or  -- латиница строчные
        (intChars>=192 and intChars<=255):    -- национальный алфавит
           RES=RES+Chars; else RES=RES+"_";
     fi;
   od;
 fi;
 ^RES;
end;

Func СформироватьПризнак(valueКН:String; uMessage:Logical; аТекущая:Record) :String;
var kk, ii :Integer;
var RES, Value :String;
var Work :Logical;

 if Trim(valueКН)="":
   if uMessage: Message("Предварительно заполните кадастровый номер.", mtWarning); Template.Field="НОМКАДАСТР"; fi;
   ^" ";
 fi;
 Value=2СформироватьПризнакПоКадастровомуНомеру0(valueКН);
 if Value="":
   if uMessage: Message("Ошибка преобразования^Mнекорректных символов аналитического признака.", mtError); Template.Field="НОМКАДАСТР"; fi;
   ^" ";
 fi;
 if SubStr(Value, 1, 1)="_":
   if uMessage: Message("Аналитический признак^Mдолжен начинаться с буквы или цифры.", mtError); Template.Field="НОМКАДАСТР"; fi;
   ^" ";
 fi;

 RES="";
 kk=УникальныйПризнак_Проверка(Value, "АПРИЗН", аТекущая);
 if kk>0:
   RES=Value;
 else
   ii=0;
   Work=True;
   while Work do
     ii=ii+1;
     RES=Value+"_"+RepStr("0", ii);
     kk=УникальныйПризнак_Проверка(RES, "АПРИЗН", аТекущая);
     if kk>0: Work=False; fi;
     if Work and ii>10: ii=-1; Work=False; fi;
   od;
   if not ii>0:
     if uMessage: Message("Ошибка подбора уникального значения аналитического признака.", mtError); Template.Field="АПРИЗН"; fi;
     ^" ";
   fi;
 fi;
 ^Up(RES);

end;

Func АПРИЗН_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Value :String;
 Template.HideEditor(False);
 if АПРИЗН<>"":
   if РАБ.УПП.LIB.ПризнакИспользуется("*", SelfCRD, Current):
     Message("Аналитический признак '"+АПРИЗН+"' используется в проводках."+Chr(13)+"Изменение невозможно!", mtError);
     ^Cur;
   fi;
 fi;
 Value=СформироватьПризнак(НОМКАДАСТР, True, Current);
 if Value<>" ": АПРИЗН=Value; fi;
 ^Cur;
end;

Func Field_OnValidateS(Field:String; Iter:Integer; Value:String) :Logical;
var Flag :Logical;
var RES :String;
 if Field="СУБЪЕКТКОД": 
   if Value<>"": СУБЪЕКТНМН=РасшифровкаСубъектаРФ(Value); fi;
 |  Field="АПРИЗН_":
   FlagEdit=True;
   Flag=ValidSign(Value);
   if not Flag: РАБ.УПП.LIB.ПроверитьПризнак(Value); else АПРИЗН=Up(Value); fi;
   ^Flag;
 |  Field="НОМКАДАСТР":
   if АПРИЗН<>"": Flag=РАБ.УПП.LIB.ПризнакИспользуется("*", SelfCRD, Current); else Flag=False; fi;
   if not Flag:
     RES=СформироватьПризнак(Value, False, Current);
     if RES<>" ": АПРИЗН=RES; fi;
   fi;
 fi;
 ^True;
end;

Func Field_OnValidateN(Field:String; Iter:Integer; Value:Numeric) :Logical;
 if Value<0.00: Message('Нельзя вводить отрицательное число!', mtError); ^False; fi;
 if Field="ДОЛЯПРАВА": if not (Value>=0.00 and Value<=100.00): Message("'Доля в праве (%)' нужно указать в диапазоне 0..100!", mtWarning); ^False; fi; fi;
 ^True;
end;

Proc ЦветаПолей;
var nn, len, sysTxt, sysObj :Integer;
 sysTxt=РАБ.ЦВЕТА.GetColor("coBtnText");
 sysObj=РАБ.ЦВЕТА.GetColor("coBtnFace");
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo);
 nn=InsertInArraySort(BufField,"ДОТКК");              InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"АПРИЗН_");            InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПНАИМЕНФГУ");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СУБЪЕКТКОД");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СУБЪЕКТНМН");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ТЕРРИТОРИЯ");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПОЧТААДРЕС");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НОМКАДАСТР");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"КТГ_ЗЕМЕЛЬ");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ИСПОЛЬ_ВИД");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ВИДЮПРАВА");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ДОЛЯПРАВА");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ЮРПРАВОDOC");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ЗЕМПАСПОРТ");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"КОЛ_УЧАСТ");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"SQUAREОБЩ");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"SQUAREДОЛ");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ИМНС_REFК.КОРИМЯ");   InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ИМНС_REFБ.БАНКИМЯ");  InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"НАЛ_ОКТМО");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НАЛ_КОДУИН");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НАЛ_ОЧЕРПЛ");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НАЛ_СТАТУС");         InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НАЛ_КБК");            InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НАЛ_ОКАТО");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НАЛ_ОСНПЛ");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"НАЛ_ТИППЛ");          InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"Д_ИЗМ");              InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"С_ИЗМ");              InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"Т_ИЗМ");              InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"КНПК01");             InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"КНПК02");             InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"КБК_УЧЕТА");          InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ПУТЬPDF");            InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СКАНГЭК2");           InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"УДАЛГЭК2");           InsertInArray(BufColorBg,nn,sysObj);
 len=LengthOfArray(BufField);
 for nn=1 to len do
   if BufColorBg[nn]=coTeal: BufColorFo[nn]=coWhite;
   |  BufColorBg[nn]=sysObj: BufColorFo[nn]=sysTxt;
   |  True:                  if BufField[nn]="АПРИЗН_": BufColorFo[nn]=coNavy; else BufColorFo[nn]=coBlack; fi;
   fi;
 od;
end;

Proc ИНИ_ИменаСекций;
var ii :Integer;
 ClearVariable(ИменаСекций);
 AddInArray(ИменаСекций, False, False, "ОСЕК2");
 for ii=1 to mЗЕМ0 do AddInArray(ИменаСекций, False, False, "ЗЕМ"+Format("%.2d", ii)); od;
 for ii=1 to mИНС0 do AddInArray(ИменаСекций, False, False, "ИНС"+Format("%.2d", ii)); od;
 for ii=1 to mКАД0 do AddInArray(ИменаСекций, False, False, "КАД"+Format("%.2d", ii)); od;
 for ii=1 to mЭКД0 do AddInArray(ИменаСекций, False, False, "ЭКД"+Format("%.2d", ii)); od;
 for ii=1 to mНАЛ0 do AddInArray(ИменаСекций, False, False, "НАЛ"+Format("%.2d", ii)); od;
end;

Proc ТолькоЧтение(Flag:Logical);
var len, kk, ii, jj, ik, jk, nn, цвFont, цвBack :Integer;
var ТЧ :Logical;
var tmp :String;
var СекцИмя : Object;
 ИНИ_ИменаСекций;
 len=LengthOfArray(ИменаСекций);
 ShowProgress(len, "Обработка данных...");
 Try
   for kk=1 to len do
     ProgressPos(kk);
     if FindObject(ИменаСекций[kk], СекцИмя):
       ik=asInteger(СекцИмя.RowsCount); jk=asInteger(СекцИмя.ColsCount);
       for ii=1 to ik do
         for jj=1 to jk do
           tmp=Up(asString(СекцИмя.Cell(ii, jj, CellContents, "")));
           nn=SearchInArray(BufField, tmp, True, 1);
           if nn<>-1:
             if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=BufColorFo[nn]; цвBack=BufColorBg[nn]; ТЧ=False; fi;
             СекцИмя.Cell(ii, jj, CellFontColor, цвFont); СекцИмя.Cell(ii, jj, CellBgColor, цвBack); СекцИмя.Cell(ii, jj, CellReadOnly, ТЧ);
           fi;
         od;
       od;
     fi;
   od;
 Finally
   CloseProgress;
 end;
 cb_CRDClosed.Enabled  = not Flag;
 cb_НеПровИМНС.Enabled = not Flag;
 ClearVariable(ИменаСекций);
end;

Proc ВнешнийВид_ДатыЗакрытия(УчетЗавершен:Logical; Щит:Logical);
var цвFont, цвBack :Integer;
var Flag, ТЧ :Logical;
 if not УчетЗавершен or Щит: Flag=True; else Flag=False; fi;
 if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coBlack; цвBack=coAqua; ТЧ=False; fi;
 if not УчетЗавершен and not Щит and ДЗАКК>1.1.1800: ДЗАКК=1.1.100; fi;
 ОСек2.Cell(3, 3, CellFontColor, цвFont);
 ОСек2.Cell(3, 3, CellBgColor,   цвBack);
 ОСек2.Cell(3, 3, CellReadOnly, ТЧ);
 ОСек2.Cell(3, 3, CellLookup,   not ТЧ);
end;

2-- События объектов
Proc cbЗащита_onChange(Sender:String);
var Flag, SaveOK :Logical;
var num :Integer;
 Flag=False;
 if not Защита:
   SaveOK=True; -- если защита 'снимается' значит проверка данных уже производилась
   num=EnqOkCancel("Вы действительно хотите снять^Mзащиту от изменений^Mу данного документа?", mtConfirmation);
   if num=cmCancel: Flag=True; else Flag=False; fi;
 else
   СинхроКадастроваяСтоимость(False);
   SaveOK=BlankToCRD_SaveOK;
   Flag=SaveOK;
 fi;
 Защита=Flag;
 cb_Защита.State=Flag;
 ТолькоЧтение(Flag);
 ВнешнийВид_ДатыЗакрытия(CRDClosed, Flag);
 ValidateSectionInit;
 if not SaveOK: Exit; fi; -- Избегаем двойных сообщений
 EditorApply; -- по всей видимости нельзя применять EditorApply для скрытой секции ЦЕНА
end;

Proc ПоменятьЧислоВводаНовойЦены(OldDD:Date; NewDD:Date);
var RO, ii, len, OA, jj, num, xx :Integer;
var valDATREG :String;
 RO=OpenWorkArea(SelfCRD, "", "");
 Try
   BeginChanging(RO);
   Try
     len=Records(RO);
     if len>0:
       valDATREG=DateToString(ToDay)+" "+TimeToHMSstring_adv(Time, ":");
       for ii=1 to len do
         OA=OpenArray(RO, ii, "ЦЕНА", "ДАТИЗМ", "");
         num=Records(OA);
         if num>0:
           for jj=1 to num do
             if GetFieldD(OA, jj, "ДАТИЗМ")=OldDD:
               xx=PutFieldD(OA, jj, "ДАТИЗМ", NewDD);
               xx=PutFieldS(OA, jj, "DATREG", valDATREG);
             fi;
           od;
         fi;
         CloseWorkArea(OA);
       od;
     fi;
     EndChanging(RO);
   Except
     CancelChanging(RO);
   end;
 Finally
   CloseWorkArea(RO);
 end;
end;

Proc Service_Run;
 ПоменятьЧислоВводаНовойЦены(1.1.2014, 31.12.2013);
end;

Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnClose"   : Close;
 |  Sender="btnService" : Service_Run;
 fi;
end;

Proc cb_CRDClosed_OnChange(Sender: String);
 ВнешнийВид_ДатыЗакрытия(CRDClosed, Защита);
end;

2-- События шаблона
Proc Инициализация;
 if NewREC:
   ЗАЩИТА=False;
   CRDClosed=False;
   НЕПРОВИМНС=False;
   КБК_УЧЕТА=def_КБК;
   НАЛ_ОЧЕРПЛ="5";
   НАЛ_СТАТУС="01";
   НАЛ_ОСНПЛ="ТП";
   НАЛ_ТИППЛ="0";
 fi;
 --currКнопка=1; -- если раскомментировать, то при навигации открыватся будет 1 страница
 ТолькоЧтение(Защита);
 ВнешнийВид_ДатыЗакрытия(CRDClosed, Защита);
 ValidateSectionInit;
end;

Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 EnableCommands(False, cmDublRec);
 btnService.Visible=False;
 Очистить;
 ОчиститьПозиции_ЦЕНА;
 Очистить_ОтчетПоНалогу_2;
 Очистить_ГЭК2;
 --CopyCfgPrn("*.cfg"); -- на будущее, может нужно будет
 ЦветаПолей;
 currКнопка=1;
 First=True;
end;

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
 if First: Инициализация; fi;
 First=False;
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo); ClearVariable(ИменаСекций);
 Очистить;
 ОчиститьПозиции_ЦЕНА;
 Очистить_ОтчетПоНалогу_2;
 Очистить_ГЭК2;
 if CurrentState=CrdusUndefined: Destroy=True; fi;
end;

Proc Template_onRead; -- при считывании шаблона
 if recCurrent<>NIL: if recCurrent<>Current: recCurrent=Current(recCurrent); fi; recCurrent=NIL; fi;
 Очистить;
 ОчиститьПозиции_ЦЕНА;
 Очистить_ОтчетПоНалогу_2;
 if not First: Инициализация; fi;
 Template.Field="ФокусО";
end;

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

Func Template_OnValidate: Logical; -- при проверке шаблона
 if not BlankToCRD_SaveOK: ^False; fi;
 СинхроКадастроваяСтоимость(Защита);
 if Trim(НАЛ_ОКТМО)="" and ИМНС_REFК<>NIL: НАЛ_ОКТМО=Взять_Код_ОКТМО(ИМНС_REFК); fi;
 ^True;
end;

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