--
--
-- Разработка бланка: ТБ.БЮДЖЕТ
БЛАНКСШАБЛОНОМ "Земля: регистрация движения налога", РЕДАКТОР ТББ_ЗЕМЛЯ_ДВИЖ;

2--0 2Общие настроечные переменные
var Фокус      :String="";
var SelfCRD    :String="ТББ_ЗЕМЛЯ_ДВИЖ";
var PAnaCRD    :String="ТББ_ЗЕМЛЯ_КАРТ";
var def_КБК    :String="188.0302.0840049.851"; --дефолтное КБК
var DefMaskACC :String="*.1.303.13.???";
var DefMaskVOC :String="РКН.*";
var DefПРИЗН_Н :String="ГОЗ.НЕТ.НАЛОГ КОСГУ.290 НР.02 П.УЖПИХО РБС.ФЭД_МВД";
var DefПРИЗН_О :String="БО.000 ГОЗ.НЕТ.НАЛОГ КОСГУ.290 ЛС.03951001880.ЛС_03 НР.02 П.УЖПИХО РБС.ФЭД_МВД";
var Def_ПР_ЗКР :String="ГОЗ.НЕТ.НАЛОГ КОСГУ.290 НР.02 П.УЖПИХО РБС.ФЭД_МВД";
var Def_ПР_ЛИМ :String="(НР.02&П.УЖПИХО&РБС.ФЭД_МВД)";
var AA         :String="+";
var DD         :String="-";
var XXYY       :String="***";
var XXYY_      :String=XXYY;
var XXZZ       :String="***";
var XXZZ_      :String=XXZZ;
var XXXX       :String="***";
var XXXX_      :String=XXXX;
var ValidDate  :Date=1.1.1900;


var ЗКР_ДатаДок     :Date;
var ЗКР_ДатаПодписи :Date;
var ЗКР_ДолжнРук    :String;
var ЗКР_ДолжнБух    :String;
var ЗКР_ФИОРук      :String;
var ЗКР_ФИОБух      :String;

-- 2Объекты
cb_Проводить  :Object;
cb_КакОстатки :Object;
btnClose      :Object;
btnAutoC      :Object;
btnЗКРbd      :Object;
cb_ЗКР_Аванс  :Object;
секцШапка01   :Object;
секцШапка02   :Object;
секцШапка02_1 :Object;
секцШапка03   :Object;
секцШапка04   :Object;
секцЛимиты    :Object;
секцЗаголТБ   :Object;
секцТаблица   :Object;
секцИтогиТБ   :Object;
секцПодвал1   :Object;
секцПодвал2   :Object;

2--0 2Переменные
var recCurrent     :Record;
var NewREC         :Logical=(CurrentState=crdusInserted);
var First          :Logical;
var OldДАТОПР      :Date; -- для запоминания и возвратов
var Flag_onEnter   :Logical;
ИСПREC             :Record; -- исполнитель (для запоминания и возвратов)
var ТИПОПР_        :Integer = ТИПОПР;
var УЧТГОДold      :Integer; -- для запоминания и возвратов
var УЧТКВТ_        :Integer = УЧТКВТ;
var ИТГСУМНЛГ      :Numeric=SumOfArray(ПОЗИЦИИ[].СУМНАЛ);
var ИТГСУМПЛТ      :Numeric=SumOfArray(ПОЗИЦИИ[].СУММАП);

2--0 2Массивы
var СУМ_УН_[]      :Numeric=Позиции[$].СУМ_УН;
var СУМ_УО_[]      :Numeric=Позиции[$].СУМ_УО;

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

Func Заменить_на_Энтер(sSet:String; sSep:String) :String;
var num, ii :Integer;
var RES :String;
 RES="";
 if sSet<>"":
   num=WordsCount(sSet, sSep);
   if num>0:
     for ii=1 to num do
       RES=Объединить(RES, ExtractWord(ii, sSet, sSep), Chr(13));
     od;
   else
     RES=sSet;
   fi;
 fi;
 ^RES;
end;

var NNN[]         :Integer=$;
var КАДЕДН_NAME[] :String=Trim(Name_A(ПОЗИЦИИ[$].КАДЕДН));
var КАДЕДН_[]     :String=ПОЗИЦИИ[$].КАДЕДН;
var КОДКБК_[]     :String=ПОЗИЦИИ[$].КОДКБК;
var ПРИЗНД_[]     :String=ПОЗИЦИИ[$].ПРИЗНД;
var ОПЛTXT_vid[]  :String=Заменить_на_Энтер(ПОЗИЦИИ[$].ОПЛTXT, "#");

var Buf[]         :String;
var Txt[]         :String;

var RepObj[]      :String;
var RepRef[]      :String;
var RepSts[]      :Integer;
var RepSum[]      :Numeric;

var ИменаСекций[]  :String;
var BufField[]     :String;
var BufColorBg[]   :Integer;
var BufColorFo[]   :Integer;

var КакОстаткиТекст :String=if(КакОстатки, "Проводки будут сформированы как ОСТАТКИ", "");

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

Proc ОчисткаТаблицы;
 Автозаполн = False;
 ClearVariable(Позиции);
 ClearVariable(NNN);
 ClearVariable(КАДЕДН_NAME);
 ClearVariable(КАДЕДН_);
 ClearVariable(КОДКБК_);
 ClearVariable(ПРИЗНД_);
 ClearVariable(ОПЛTXT_vid);
end;

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(Txt);
 ClearVariable(NNN);
 ClearVariable(КАДЕДН_NAME);
 ClearVariable(КАДЕДН_);
 ClearVariable(КОДКБК_);
 ClearVariable(ПРИЗНД_);
 ClearVariable(RepObj);
 ClearVariable(RepRef);
 ClearVariable(RepSts);
 ClearVariable(RepSum);
 ClearVariable(ОПЛTXT_vid);
end;

Proc НеПустаяТаблица;
var nn :Integer;
 if Позиции<1:  Try nn=InsertFrame(Позиции, 1); Except end; fi;
 if Лимиты <1:  Try nn=InsertFrame(Лимиты, 1);  Except end; fi;
end;

Proc УдалитьПустыеСтроки;
var nn :Integer;
 nn=1;
 while nn<=Позиции do if Позиции[nn].КАДЕДН="": Try DeleteFrame(Позиции, nn); Except end; else nn=nn+1; fi; od;
 НеПустаяТаблица;
end;

Func ОтменитьИзмененияУсловийОтчета :Logical;
var FF :Logical;
var qq :Integer;
 FF=False;
 if Автозаполн and Позиции>0 and Позиции[1].КАДЕДН<>"":
   qq=EnqOkCancel("Условия отбора данных изменились!^MОчистить таблицу автозаполнения?", mtConfirmation);
   if qq=cmOk: ОчисткаТаблицы;
   |  qq=cmCancel: FF=True;
   fi;
 fi;
 ^FF;
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="ДАТИСП" : ^ДАТИСП;
 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;
 fi;
end;

Proc ValidateSectionInit;
var Flag :Logical;

 Flag=if(ТИПОПР>0, True, False);

 секцШапка02.Visible = Flag;
 секцШапка03.Visible = if(ТИПОПР=3, True, False);
 секцЗаголТБ.Visible = Flag;
 секцТаблица.Visible = Flag;
 секцИтогиТБ.Visible = Flag;
 секцПодвал1.Visible = Flag;
 секцПодвал2.Visible = Flag;

 btnClose.Visible      = Flag;
 btnAutoC.Visible      = Flag;
 cb_Проводить.Visible  = Flag;
 btnЗКРbd.Visible      = if(ТИПОПР=3, True, False);
 cb_ЗКР_Аванс.Visible  = if(ТИПОПР=3, True, False);
 cb_КакОстатки.Visible = if(ТИПОПР=1, True, False);

 if Flag and not Проводить: НеПустаяТаблица; fi;

end;

Func MatchMask(Src:String; Mask:String; SepMask:String) :Logical;
var i, num :Integer;
var tmp :String;
 num=WordsCount(Mask, SepMask);
 for i=1 to num do
   tmp=ExtractWord(i, Mask, SepMask);
   if Match(Src, tmp): ^True; fi;
 od;
 ^if(num=0, Match(Src, Mask), False);
end;

Func МаскаОбязательныхСправочников_дляПроводки(Acc01:String; Acc02:String) :String;
var SetVoc, Mask :String;
var ii, len :Integer;
  ClearVariable(Txt);
  SetVoc=SignsMask(Acc01, True);
  if SetVoc<>"":
     len=WordsCount(SetVoc, "|");
     for ii=1 to len do
       Mask=ExtractWord(ii, SetVoc, "|");
       if not MatchMask(Mask, DefMaskVOC+"|ПЕРИОД.*|ФКР.*", "|"):
          if SearchInArray(Txt, Mask, True)<0: InsertInArraySort(Txt, Mask); fi;
       fi;
     od;
  fi;
  SetVoc=SignsMask(Acc02, True);
  if SetVoc<>"":
     len=WordsCount(SetVoc, "|");
     for ii=1 to len do
       Mask=ExtractWord(ii, SetVoc, "|");
       if not MatchMask(Mask, DefMaskVOC+"|ПЕРИОД.*|ФКР.*", "|"):
          if SearchInArray(Txt, Mask, True)<0: InsertInArraySort(Txt, Mask); fi;
       fi;
     od;
  fi;
  mask="";
  len=LengthOfArray(Txt);
  if len>0: for ii=1 to len do mask=mask+"|"+Txt[ii]; od; else mask=""; fi;
  if mask<>"": mask=SubStr(mask, 2, 255); fi;
  ^mask;
end;

Func ПроверитьНаборСлов(Set:String; SepSet:String; Mask:String; SepMask:String; Msg:String) :Logical;
--Проверяет набор слов "Set" на соотвествие маске "Mask"; SepSet, SepMask - разделители; если Msg не пустое то выдаеться сообщение
var nn1,nn2, i, j :Integer;
var tmp1, tmp2 :String;
var Flag :Logical;
 nn1=WordsCount(Mask, SepMask);
 nn2=WordsCount(Set,   SepSet);
 if not nn1=0 and nn2=0: if not Msg="": Message(Msg+ExtractWord(1, Mask, SepMask), mtError); fi; ^False; fi;
 for i=1 to nn1 do
   tmp1=ExtractWord(i, Mask, SepMask);
   Flag=False;
   for j=1 to nn2 do
     tmp2=ExtractWord(j, Set, SepSet);
     if Match(tmp2, tmp1): Flag=True; Break; fi;
   od;
   if not Flag: if not Msg="": Message(Msg+tmp1, mtError); fi; ^False; fi;
 od;
 ^True;
end;

Func BlankToCRD_SaveOK(ПоУчету:Logical) :Logical;
var MsgTxt, TplFld, Acc1, Acc2, MSK :String;
var NoError :Logical;
var ii, Iter :Integer;

 ClearVariable(Buf);
 NoError=True;
 Iter=0;

 if NoError: if not ДАТОПР>ValidDate : MsgTxt="Не заполнено поле 'Дата операции (проводки)'."; TplFld="ДАТОПР";  NoError=False; fi; fi;
 if NoError: if УЧТГОД<2000          : MsgTxt="Не заполнено поле 'Учетный год'.";              TplFld="УЧТГОД";  NoError=False; fi; fi;

 if ТИПОПР=3:
   if NoError: if УЧТКВТ=0:        MsgTxt="Не заполнено поле 'Учетный период'.";       TplFld="УЧТКВТ_";           NoError=False; fi; fi;
   if NoError: if НАШЕ_REFК=NIL:   MsgTxt="Не выбраны 'наши' реквизиты (контрагент)."; TplFld="НАШЕ_REFК.КОРИМЯ";  NoError=False; fi; fi;
   if NoError: if НАШЕ_REFБ=NIL:   MsgTxt="Не выбраны 'наши' реквизиты (банк).";       TplFld="НАШЕ_REFБ.БАНКИМЯ"; NoError=False; fi; fi;
   if NoError: if Trim(ПРДНАЛ)="": MsgTxt="Не заполнено поле 'Налоговый период'.";     TplFld="ПРДНАЛ";            NoError=False; fi; fi;
 fi;

 if NoError and ПоУчету:

   УдалитьПустыеСтроки;

   for ii=1 to Позиции do
     if NoError: if not Match(Позиции[ii].КАДЕДН, DefMaskVOC):             MsgTxt="Не заполнено колонка 'Кадастровая единица'.";         TplFld="КАДЕДН_"; Iter=ii; NoError=False; fi; fi;
     if NoError: if Позиции[ii].СУММАП=0.00:                               MsgTxt="Не задана сумма налога";                              TplFld="СУММАП";  Iter=ii; NoError=False; fi; fi;
     if NoError: if not Match(Позиции[ii].КОДКБК, "???.????.???????.???"): MsgTxt="Не заполнено колонка 'Код бюджетной классификации'."; TplFld="КОДКБК_"; Iter=ii; NoError=False; fi; fi;
     if NoError: if Trim(Позиции[ii].ПРИЗНД)="":                           MsgTxt="Не заполнено колонка 'Дополнительные признаки'.";     TplFld="ПРИЗНД_"; Iter=ii; NoError=False; fi; fi;
     if not NoError: Break; fi;
     if NoError:
       if ТИПОПР=1:
         Acc1=Позиции[ii].КОДКБК+".1.401.20.290";
         Acc2=Позиции[ii].КОДКБК+".1.303.13.730";
       |  ТИПОПР=2 or ТИПОПР=3:
         Acc1=Позиции[ii].КОДКБК+".1.303.13.830";
         Acc2=Позиции[ii].КОДКБК+".1.304.05.290";
       fi;
       if NoError:
         if Name_S(Acc1)=" " or Name_S(Acc2)=" ":
           if Name_S(Acc1) =" " and Name_S(Acc2) =" ": MsgTxt="Счет '"+Acc1+"',^Mсчет '"+Acc2+"'^M отсутствуют в структуре учета!";
           |  Name_S(Acc1) =" " and Name_S(Acc2)<>" ": MsgTxt="Счет '"+Acc1+"'^M отсутствует в структуре учета!";
           |  Name_S(Acc1)<>" " and Name_S(Acc2) =" ": MsgTxt="Счет '"+Acc2+"'^M отсутствует в структуре учета!";
           fi;
           TplFld="КОДКБК_";
           Iter=ii;
           NoError=False;
         fi;
       fi;
       if NoError:
         MSK=МаскаОбязательныхСправочников_дляПроводки(Acc1, Acc2);
         if not ПроверитьНаборСлов(Позиции[ii].ПРИЗНД, " ", MSK, "|", ""):
           MsgTxt="Отсутствуют обязательные аналитические признаки!^M[признак из набора "+MSK+"]";
           TplFld="ПРИЗНД_";
           Iter=ii;
           NoError=False;
         fi;
       fi;
     fi;
     if not NoError: Break; fi;
   od;

 fi;

 if not NoError:
   Message(MsgTxt, mtError);
   Template.Field=TplFld;
   if Iter>0: Template.Frame=Iter; fi;
   ^False;
 fi;

 ^True;
end;

Func КБК_Выбор(OV:String; onExit:Logical) :String;
var NV, Value :String;
 if onExit:
   NV="";
 else
   Value=Trim(РАБ.УПП.КБК2005.ВыборКБКиерарх2005(DefMaskACC, "КР", False));
   if Value="": NV=OV; else NV=Value; fi;
 fi;
 if NV<>OV: ^NV; Автозаполн=False; else ^OV; fi;
end;

Func ТипОпераций_Выбор(aType:Integer; onExit:Logical) :Integer;
var Res, num, qq :Integer;
 Res=aType;
 if onExit:
   num=0;
 else
   ClearVariable(Buf);
   Buf[1]="регистрация НАЧИСЛЕНИЯ налога";
   Buf[2]="регистрация ОПЛАТЫ налога (проводки в этой операции)";
   Buf[3]="регистрация ОПЛАТЫ налога (проводки после формирования ЗКР)";
   num=Alternate("Выберите операцию", Buf, -1, aType, 12);
   if not num>0: num=aType; fi;
 fi;
 if num<>aType:
   Res=num;
   if Позиции>0 and aType>0:
     qq=EnqOkCancel("Изменился тип операции.^MТаблица будет очищена.^MПродолжить?", mtConfirmation);
     if qq=cmOk     : ОчисткаТаблицы;
     |  qq=cmCancel : Res=aType;
     fi;
   fi;
   if Res<>aType: ЗКР_Аванс=if(Res=3: True, False); fi;
 fi;
 ^Res;
end;

Func ВзятьПериодОперации(YYYY:Integer; Mode:Integer) :String;
var RES :String;
 RES="";
 if not (YYYY<2000 or YYYY>2100):
   RES="ПЕРИОД."+Str(YYYY);
   if Mode>0 and Mode<5: RES=RES+"."+Str(Mode); fi;
 fi;
 ^RES;
end;

Proc УчетныйПериод_Выбор(prevValue:Integer; onExit:Logical);
var SaveValue :Logical;
var NewValue, num :Integer;
 SaveValue=False;
 if УЧТГОД<2000:
   Message("Предварительно необходимо выбрать учетный год", mtWarning);
   Template.Field="УЧТГОД";
   Exit;
 fi;
 if onExit:
   NewValue=0;
 else
   ClearVariable(Buf);
   Buf[1]="1 квартал";
   Buf[2]="2 квартал";
   Buf[3]="3 квартал";
   Buf[4]="4 квартал";
   Buf[5]="За год";
   num=Alternate("Выберите учетный период", Buf, -1, if(prevValue>0 and prevValue<5, prevValue, 5), 12);
   if num>0: NewValue=num; if NewValue=5: NewValue=0; fi; else NewValue=prevValue; fi;
 fi;
 if NewValue<>prevValue: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue:
   УЧТКВТ=NewValue;
   ПРДОПР=ВзятьПериодОперации(УЧТГОД, УЧТКВТ);
 fi;
end;

Proc ЗаполнитьЛимиты;
var Путь, vMaskACC, vMaskANA, КОДКБК :String;
var num, pp :Integer;
var WD1, WD2 :Date;
var SUM  :Numeric;
var Отч1 :Report;

 if not УЧТГОД<2000:
   WD1=Dat(1, 1, УЧТГОД);
   WD2=Dat(1, 1, УЧТГОД+1);
   vMaskACC="(+???.????.???????.851.1.501.15.290/-???.????.???????.851.1.501.13.290)|(+???.????.???????.852.1.501.15.290/-???.????.???????.852.1.501.13.290)";
   vMaskANA=Def_ПР_ЛИМ;
   --
   Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
   if ExistFile(Путь):
     Try
       Отч1=RepOpen(Путь+"|По_счетам_Бал_Заб", vMaskACC, vMaskANA, WD1, WD2);
       Try
         ClearVariable(Лимиты);
         RepReset(Отч1);
         while RepNext(Отч1) do
           КОДКБК=RepIdent(Отч1);
           SUM=RepSaldoF(Отч1, отчСверн);
           if Match(КОДКБК, "???.????.???????.???.?.???.??.???") and SUM<>0.00:
             КОДКБК=SubStr(КОДКБК, 1, 20)+".290";
             pp=SearchInArray(Лимиты[].ЛИМКБК, КОДКБК, False, 1);
             if not pp>0:
               num=InsertFrame(Лимиты, Лимиты+1);
               Лимиты[num].ЛИМКБК=КОДКБК;
               Лимиты[num].ЛИМСУМ=SUM;
             else
               Лимиты[pp].ЛИМСУМ=Лимиты[pp].ЛИМСУМ+SUM;
             fi;
           fi;
         end; -- while
       Finally
         Отч1=RepClose(Отч1);
         ЛИМГОД=SumOfArray(Лимиты[].ЛИМСУМ);
       end;
     Except
     end;
     if Лимиты <1:  Try num=InsertFrame(Лимиты, 1);  Except end; fi;
   else
     Try ЛИМГОД=Turn(vMaskACC+"{"+vMaskANA+"}", WD1, WD2, "РУБ"); Except ЛИМГОД=0.00; end;
     if Лимиты <1:  Try num=InsertFrame(Лимиты, 1);  Except end; fi;
   fi;
 fi;
end;

Func ЗаменитьСимволСтрокиВпозиции(valStr:String; repChar:String; repPos:Integer) :String;
var tmpFirst, tmpLast, out :String;
var len :Integer;
 tmpFirst=""; tmpLast=""; out="";
 len=Length(valStr);
 if repPos<1: repPos=1; fi;
 if repPos>len or repChar="" or valStr="": ^valStr; fi;
 repChar=SubStr(repChar, 1, 1);
 if repPos>1: tmpFirst=SubStr(valStr, 1, repPos-1); else tmpFirst=""; fi;
 if repPos<len: tmpLast=SubStr(valStr, repPos+1, len-repPos); else tmpLast=""; fi;
 out=tmpFirst+repChar+tmpLast;
 ^out;
end;

Func УдалитьРазделитель_для(Value:String) :String;
var nn :Integer;
 nn=Pos("#", Value);
 while nn>0 do Value=ЗаменитьСимволСтрокиВпозиции(Value, "_", nn); nn=Pos("#", Value); od;
 ^Value;
end;

Func СобратьПлатежки_по_РКН(РКНКОД:String; КБККОД:String; repDAT:Date) :Integer;
var MskTrn, ПРДКОД, KMNT, Value :String;
var TRN, RO, pp, xx :Integer;
 ClearVariable(RepObj);
 ClearVariable(RepRef);
 xx=0;
 MskTrn="+"+КБККОД+".1.303.13.830/-"+КБККОД+".1.304.05.290"+"{"+РКНКОД+"}";
 for Transaction TRN=MskTrn, 1.1.100, repDAT, Reverse do
   ПРДКОД=РАБ.УПП.LIB.ПризнакИзСтрокиАналитикиПроводки(TRN, "ПЕРИОД", True);
   Value="";
   if Up(TransCardFile(TRN))="ПОРУЧ":
     RO=OpenWorkArea("ПОРУЧ", "", "Ukey="+RecordToString(TransRecord(TRN)));
     Try
       if Records(RO)=1:
         Value="ПП №"+GetFieldS(RO, 1, "НОМЕРБУМ")+" от "+DateToString(GetFieldD(RO, 1, "ДАТА"));
       fi;
     Finally
       CloseWorkArea(RO);
     end;
   else
     KMNT=TransComment(TRN);
     pp=Pos(" от ", KMNT);
     if pp>0:
       Value=Trim(SubStr(KMNT, 01, pp))+" "+Trim(SubStr(KMNT, pp, 15));
     fi;
   fi;
   if Value<>"":
     if ПРДКОД<>"": Value=Value+" за "+ПРДКОД; fi;
     xx=xx+1;
     RepObj[xx]=УдалитьРазделитель_для(Value);
     RepRef[xx]=RecordToString(TransRecord(TRN));
   fi;
 end; --Transaction
 ^LengthOfArray(RepObj);
end;

Proc Найти_ПлатежкиОплаты_для_РКН(Iter:Integer; dRepDat:Date);
var num, ii, len, kk :Integer;
var val01, val02 :String;
 if Iter>0 and dRepDat>ValidDate:
   num=СобратьПлатежки_по_РКН(ПОЗИЦИИ[Iter].КАДЕДН, ПОЗИЦИИ[Iter].КОДКБК, dRepDat);
   if num>0:
     len=0; val01=""; val02="";
     for ii=1 to num do
       kk=Length(RepObj[ii])+1;
       if (len+kk)<=247:
         len=len+kk;
         val01=Объединить(val01, RepObj[ii], "#");
         val02=Объединить(val02, RepRef[ii], "#");
       else
         val01=Объединить(val01, "и т.д.", "#");
         Break;
       fi;
     od;
     ПОЗИЦИИ[Iter].ОПЛTXT = val01;
     ПОЗИЦИИ[Iter].ОПЛREF = val02;
   fi;
 fi;
end;

Proc Расшифровка_ИНФО_оплаты(frameIter:Integer);
var num, ii, TRN, look_TRN :Integer;
var MskTrn :String;
var repDAT :Date;
var REC :Record;
 num=WordsCount(ПОЗИЦИИ[frameIter].ОПЛTXT, "#");
 if num>0 and num=WordsCount(ПОЗИЦИИ[frameIter].ОПЛREF, "#"):
   ClearVariable(RepObj);
   ClearVariable(RepRef);
   for ii=1 to num do
     RepObj[ii]=ExtractWord(ii, ПОЗИЦИИ[frameIter].ОПЛTXT, "#");
     RepRef[ii]=ExtractWord(ii, ПОЗИЦИИ[frameIter].ОПЛREF, "#");
   od;
   num=Alternate("Выберите ПП", RepObj, -1, 1, 12);
   if num>0:
     REC=StringToRecord(RepRef[num]);
     if REC<>NIL:
       if not ДАТОПР>ValidDate: repDAT=Dat(1, 1, УЧТГОД+1); else repDAT=ДАТОПР; fi;
       MskTrn="+"+ПОЗИЦИИ[frameIter].КОДКБК+".1.303.13.830/-"+ПОЗИЦИИ[frameIter].КОДКБК+".1.304.05.290"+"{"+ПОЗИЦИИ[frameIter].КАДЕДН+"}";
       look_TRN=0;
       for Transaction TRN=MskTrn, 1.1.100, repDAT, Reverse do
         if TransRecord(TRN)=REC: look_TRN=TRN; Break; fi;
       end; --Transaction
       if look_TRN>0: 
         TransOpenJur(look_TRN);
       else
         Message("Информацию об оплате не удалось сопоставить с проводкой.", mtError);
       fi;
     fi;
   fi;
 else
   Message("Информация об оплата не сохранена или сохранена некорректно.", mtInformation);
 fi;
end;

Func ВзятьДатуПоПериоду(aYYYY:Integer; aKKKK:Integer) :Date;
 if not aYYYY<2000:
   if aKKKK=1: ^(Dat(1, 04, aYYYY  ));
   |  aKKKK=2: ^(Dat(1, 07, aYYYY  ));
   |  aKKKK=3: ^(Dat(1, 10, aYYYY  ));
   |  aKKKK=4: ^(Dat(1, 01, aYYYY+1));
   else        ^(Dat(1, 01, aYYYY+1));
   fi;
 fi;
 ^(1.1.100);
end;

Proc КадастровыйНомер_Выбор(Iter:Integer; onExit:Logical);
var prevValue, ANA, KBK, MASK :String;
var RO, OA, num, kk :Integer;
var SaveValue, WorkOK, ЭтоОстаток :Logical;
var WD1, WD2, ddP, ddS :Date;
var Delta, SUM, TAX :Numeric;
var REC :Record;
 if УЧТГОД<2000:
   Message("Предварительно необходимо выбрать учетный год", mtWarning);
   Template.Field="УЧТГОД";
   Exit;
 fi;
 if not ДАТОПР>ValidDate:
   Message("Не заполнено поле 'Дата операции (проводки)'.", mtWarning);
   Template.Field="ДАТОПР";
   Exit;
 fi;
 SaveValue=False;
 if Iter>0:
   if not AutoRefresh: RefreshAna; fi;
   WD1=Dat(1, 1, УЧТГОД);
   WD2=Dat(1, 1, УЧТГОД+1);
   prevValue=Позиции[Iter].КАДЕДН;
   if onExit: ANA=""; else ANA=AnaElection(DefMaskVOC, False, False, prevValue); if ANA="": ANA=prevValue; fi; fi;
   if ANA<>prevValue: 
     if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi;
   else
     num=EnqOkCancel("Аналитический признак остался прежний.^MОбновить данные карточки^M(данные ручного ввода будут утеряны)?", mtWarning);
     if num=cmOk: SaveValue=True; fi;
   fi;
   if SaveValue:
     if ANA<>"":
       WorkOK=True;
       REC=SignToRecord(ANA, False);
       if REC<>NIL and WD1>ValidDate:
         RO=OpenWorkArea(PAnaCRD, "", "Ukey="+RecordToString(REC));
         Try
           if Records(RO)=1:
             ddP=GetFieldD(RO, 1, "ДОТКК");
             ddS=GetFieldD(RO, 1, "ДЗАКК");
             if WorkOK:
               if ddS>ValidDate:
                 if ddS<WD1:
                   Message("Выбранный земельный участок '"+ANA+"'^Mна выбранный учетный год '"+Str(УЧТГОД)+"'^Mзакрыт для учета.", mtError);
                   WorkOK=False;
                 fi;
               fi;
             fi;
             if WorkOK:
               if ddP>=WD2:
                 Message("Выбранный земельный участок '"+ANA+"'^Mпринят к учету позже текущего учетного года ("+Str(УЧТГОД)+").", mtError);
                 WorkOK=False;
               fi;
             fi;
             if WorkOK:
               -- считаем коэффициент пересчет если год неполный, если год полный коэффициент 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:
                  KBK=GetFieldS(RO, 1, "КБК_УЧЕТА");
                  Позиции[Iter].КАДЕДН=ANA;
                  if Match(KBK, "???.????.???????.???"): Позиции[Iter].КОДКБК=KBK; else KBK=def_КБК; Позиции[Iter].КОДКБК=KBK; fi;
                  Позиции[Iter].ДАТ_ПУ=ddP;
                  Позиции[Iter].КОЭФФП=Delta;
                  SUM=GetFieldN(OA, num, "СУМИЗМ");
                  TAX=GetFieldN(OA, num, "СТАВКА");
                  if SUM>0.00: Позиции[Iter].СУМ_КС=SUM; fi; -- кадастровая стоимость
                  SUM=(Позиции[Iter].СУМ_КС*TAX/100)*Delta;  -- корректировка базы налога
                  if SUM>0.00: Позиции[Iter].СУМНАЛ=Round(SUM, if(УЧТГОД<2014, 2, 0)); fi; -- сумма налога за учетный год

                  ЗаполнитьЛимиты;

                  ЭтоОстаток=False;

                  MASK="+(00|"+KBK+".1.401.20.290)/-"+KBK+".1.303.13.730 {"+ANA+"&ПЕРИОД."+Str(УЧТГОД)+"*}";
                  Try SUM=Turn(MASK, 1.1.100, ДАТОПР, "РУБ"); Except SUM=0.00; end;
                  if SUM>0.00: Позиции[Iter].СУМ_УН=SUM; fi;

                  MASK="+"+KBK+".1.303.13.830/-"+KBK+".1.304.05.290 {"+ANA+"&ПЕРИОД."+Str(УЧТГОД)+"*}";
                  Try SUM=Turn(MASK, 1.1.100, ДАТОПР, "РУБ"); Except SUM=0.00; end;
                  if SUM>0.00: Позиции[Iter].СУМ_УО=SUM; fi;

                  Позиции[Iter].СУМ_ОН=Позиции[Iter].СУМНАЛ-Позиции[Iter].СУМ_УН;
                  Позиции[Iter].СУМ_ОО=Позиции[Iter].СУМНАЛ-Позиции[Iter].СУМ_УО;
                  if УЧТКВТ>0 and УЧТКВТ<5:
                    if УЧТКВТ=4: 
                     if ТИПОПР=1:
                       Позиции[Iter].СУММАП=Позиции[Iter].СУМ_ОН;
                     else
                       Позиции[Iter].СУММАП=if(ЭтоОстаток, Позиции[Iter].СУМ_УН, Позиции[Iter].СУМ_ОО);
                     fi;
                     if Позиции[Iter].СУММАП=Позиции[Iter].СУМНАЛ: Позиции[Iter].СУММАП=Round(Позиции[Iter].СУМНАЛ/4, if(УЧТГОД<2014, 2, 0)); fi;
                    else
                      Позиции[Iter].СУММАП=Round(Позиции[Iter].СУМНАЛ/4, if(УЧТГОД<2014, 2, 0));
                    fi;
                  else
                    Позиции[Iter].СУММАП=Round(Позиции[Iter].СУМНАЛ, if(УЧТГОД<2014, 2, 0));
                  fi;
                  --
                  Найти_ПлатежкиОплаты_для_РКН(Iter, if(not ДАТОПР>ValidDate, ВзятьДатуПоПериоду(УЧТГОД, УЧТКВТ), ДАТОПР));
                  --
                  Автозаполн = False;
               else
                 Message("Ошибка.^MДля выбранного года учета ("+Str(УЧТГОД)+")^Mнет сохраненной кадастровой стоимости.", mtError);
               fi;
               CloseWorkArea(OA);
             fi;
           fi; --Records(RO)=1:
         Finally
           CloseWorkArea(RO);
         end;
       else
         Message("Ошибка при считывании свойств аналитического признака.", mtError);
       fi;
     else
       Позиции[Iter].КАДЕДН="";
       Позиции[Iter].КОДКБК="";
       Позиции[Iter].ДАТ_ПУ=1.1.100;
       Позиции[Iter].КОЭФФП=0.00;
       Позиции[Iter].СУМ_КС=0.00;
       Позиции[Iter].СУМНАЛ=0.00;
       Позиции[Iter].СУМ_УН=0.00;
       Позиции[Iter].СУМ_УО=0.00;
       Позиции[Iter].СУМ_ОН=0.00;
       Позиции[Iter].СУМ_ОО=0.00;
       Позиции[Iter].СУММАП=0.00;
       Автозаполн = False;
     fi;
   fi;
 fi;
end;

Proc Автозаполнение_Выполнить;
var RO, OA, Iter, len, ii, num, kk :Integer;
var WD1, WD2, WD3, ddP, ddS :Date;
var Delta, SUM, TAX :Numeric;
var ANA, KBK, MSK, KNTR :String;
var Work, OK, ЭтоОстаток :Logical;
var REC :Record;

 if УЧТГОД<2000:
   Message("Предварительно необходимо выбрать учетный год.", mtWarning);
   Template.Field="УЧТГОД";
   Exit;
 fi;
 if not ДАТОПР>ValidDate:
   Message("Не заполнено поле 'Дата операции (проводки)'.", mtWarning);
   Template.Field="ДАТОПР";
   Exit;
 fi;
 if УЧТКВТ=0: 
   if EnqOkCancel("'Учетный период' не выбран,^Mсумма налога будет дана за весь год.^MПродолжить?", mtWarning)=cmCancel:
     Template.Field="УЧТКВТ_";
     Exit;
   fi;
 fi;
 if Позиции>0 and Позиции[1].КАДЕДН<>"":
   if EnqOkCancel("Таблица непустая,^Mданные набранные вручную будут утеряны.^MПродолжить?", mtWarning)=cmCancel:
     Template.Field="КАДЕДН_";
     Template.Frame=1;
     Exit;
   fi;
 fi;
 Refresh(False);
 WD1=Dat(1, 1, УЧТГОД);
 WD2=Dat(1, 1, УЧТГОД+1);
 WD3=if(not ДАТОПР>ValidDate, ВзятьДатуПоПериоду(УЧТГОД, УЧТКВТ), ДАТОПР);
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea(PAnaCRD, "АПРИЗН", "");
 Try
   len=Records(RO);
   if len>0:
     Iter=0;
     ShowProgress(len, "Обработка карточек земельных участков.");
     ClearVariable(Позиции);
     for ii=1 to len do
       ProgressPos(ii);
       ANA=ExtractWord(1, DefMaskVOC, ".")+"."+GetFieldS(RO, ii, "АПРИЗН");
       Work=if(Name_A(ANA)=" ", 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:

           Try Iter=InsertFrame(Позиции, Позиции+1); OK=True; Except OK=False; end;

           if OK:

             Позиции[Iter].КАДЕДН=ANA;
             REC=GetFieldR(RO, ii, "ИМНС_REFК");
             if REC<>NIL: KNTR="К.НАЛОГОВАЯ."+GetCardFieldS("КОНТРАГЕНТ", REC, "ПРИЗНАК"); fi;
             if Name_A(KNTR)=" ": KNTR=""; fi;
             KBK=GetFieldS(RO, ii, "КБК_УЧЕТА");
             if not Match(KBK, "???.????.???????.???"): KBK=def_КБК; fi;
             Позиции[Iter].КОДКБК=KBK;

             Позиции[Iter].ДАТ_ПУ=ddP;

             Позиции[Iter].КОЭФФП=Delta;

             SUM=GetFieldN(OA, num, "СУМИЗМ");
             TAX=GetFieldN(OA, num, "СТАВКА");
             if SUM>0.00: Позиции[Iter].СУМ_КС=SUM; fi; -- кадастровая стоимость
             SUM=(Позиции[Iter].СУМ_КС*TAX/100)*Delta;  -- корректировка базы налога
             if SUM>0.00: Позиции[Iter].СУМНАЛ=Round(SUM, if(УЧТГОД<2014, 2, 0)); fi; -- сумма налога за учетный год

             ЗаполнитьЛимиты;

             ЭтоОстаток=False;

             MSK="+(00|"+KBK+".1.401.20.290)/-"+KBK+".1.303.13.730 {"+ANA+"&ПЕРИОД."+Str(УЧТГОД)+"*}";
             Try SUM=Turn(MSK, 1.1.100, ДАТОПР, "РУБ"); Except SUM=0.00; end;
             if SUM>0.00: Позиции[Iter].СУМ_УН=SUM; fi;

             MSK="+"+KBK+".1.303.13.830/-"+KBK+".1.304.05.290 {"+ANA+"&ПЕРИОД."+Str(УЧТГОД)+"*}";
             Try SUM=Turn(MSK, 1.1.100, ДАТОПР, "РУБ"); Except SUM=0.00; end;
             if SUM>0.00: Позиции[Iter].СУМ_УО=SUM; fi;

             Позиции[Iter].СУМ_ОН=Позиции[Iter].СУМНАЛ-Позиции[Iter].СУМ_УН;
             Позиции[Iter].СУМ_ОО=Позиции[Iter].СУМНАЛ-Позиции[Iter].СУМ_УО;

             if УЧТКВТ>0 and УЧТКВТ<5:
               if УЧТКВТ=4:
                 if ТИПОПР=1:
                   Позиции[Iter].СУММАП=Позиции[Iter].СУМ_ОН;
                 else
                   Позиции[Iter].СУММАП=if(ЭтоОстаток, Позиции[Iter].СУМ_УН, Позиции[Iter].СУМ_ОО);
                 fi;
                 if Позиции[Iter].СУММАП=Позиции[Iter].СУМНАЛ: Позиции[Iter].СУММАП=Round(Позиции[Iter].СУМНАЛ/4, if(УЧТГОД<2014, 2, 0)); fi;
               else
                 Позиции[Iter].СУММАП=Round(Позиции[Iter].СУМНАЛ/4, if(УЧТГОД<2014, 2, 0));
               fi;
             else
               Позиции[Iter].СУММАП=Round(Позиции[Iter].СУМНАЛ, if(УЧТГОД<2014, 2, 0));
             fi;

             if ТИПОПР=1: Позиции[Iter].ПРИЗНД=DefПРИЗН_Н;
             |  ТИПОПР=2: Позиции[Iter].ПРИЗНД=Объединить(DefПРИЗН_О, KNTR, " ");
             |  ТИПОПР=3: Позиции[Iter].ПРИЗНД=Объединить(DefПРИЗН_О, KNTR, " ");
             fi;

             Найти_ПлатежкиОплаты_для_РКН(Iter, WD3);

           fi;
         fi;
         CloseWorkArea(OA);
       fi; --Work
     od;
     if Позиции>0: Автозаполн=True; fi;
   else
     Message("Аналитическая картотека земельных участков пустая", mtError);
     Exit;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
   НеПустаяТаблица;
   ClearVariable(NNN);
   ClearVariable(КАДЕДН_NAME);
 end;
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,coTeal);
 nn=InsertInArraySort(BufField,"ДАТОПР");            InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"УЧТГОД");            InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"УЧТКВТ_");           InsertInArray(BufColorBg,nn,coTeal);
 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,coTeal);
 nn=InsertInArraySort(BufField,"КАДЕДН_");           InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"КОДКБК_");           InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"СУММАП");            InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПРИЗНД_");           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,"AA");                InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"DD");                InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"XXXX_");             InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"XXYY_");             InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"XXZZ_");             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:                  BufColorFo[nn]=coBlack;
   fi;
 od;
end;

Proc ТолькоЧтение(Flag:Logical);
var len, kk, ii, jj, ik, jk, nn, цвFont, цвBack :Integer;
var ТЧ :Logical;
var tmp :String;
var СекцИмя : Object;
 ClearVariable(ИменаСекций);
 kk=0;
 kk=kk+1; ИменаСекций[kk] ="секцШапка01";
 kk=kk+1; ИменаСекций[kk] ="секцШапка02";
 kk=kk+1; ИменаСекций[kk] ="секцШапка03";
 kk=kk+1; ИменаСекций[kk] ="секцШапка04";
 kk=kk+1; ИменаСекций[kk] ="секцЗаголТБ";
 kk=kk+1; ИменаСекций[kk] ="секцТаблица";
 --kk=kk+1; ИменаСекций[kk] ="секцИтогиТБ";
 kk=kk+1; ИменаСекций[kk] ="секцПодвал1";
 kk=kk+1; ИменаСекций[kk] ="секцПодвал2";
 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;

 btnAutoC.Enabled      = not Flag;
 btnЗКРbd.Enabled      = Flag;
 cb_ЗКР_Аванс.Enabled  = not Flag;
 cb_КакОстатки.Enabled = if(ТИПОПР=1 and not Flag, True, False);

 ClearVariable(ИменаСекций);
end;

Func УдалитьСловоИзНабора_Диалог(Set:String; SepSet:String) :String;
var num, ii, kk :Integer;
 ClearVariable(Buf);
 num=WordsCount(Set, SepSet);
 if num<2: ^""; fi;
 for ii=1 to num do Buf[ii+1]=ExtractWord(ii, Set, SepSet); od;
 Buf[1]="Удалить все";
 kk=Alternate("Удаление...", Buf, -1, 1, 12);
 if kk=0: ^Set; fi;
 Set="";
 if kk=1: ^Set; fi;
 num=num+1;
 for ii=2 to num do if not ii=kk: Set=Set+SepSet+Buf[ii]; fi; od;
 Set=SubStr(Set, Length(SepSet)+1, 255);
 ^Set;
end;

Func СортироватьНаборСлов(Set:String; SepSet:String; Flag:Logical) :String; --Сортирует набор по словам
-- Set набор слов; SepSet разделитель; Flag направление сортировки
var num, i, k :Integer;
var tmp :String;
 ClearVariable(Buf);
 num=WordsCount(Set, SepSet);
 k=0;
 for i=1 to num do
   tmp=ExtractWord(i, Set, SepSet);
   if tmp<>"": k=k+1; Buf[k]=tmp; fi;
 od;
 SortArray(Buf, Flag);
 tmp="";
 for i=1 to k do tmp=tmp+SepSet+Buf[i]; od;
 tmp=SubStr(tmp, Length(SepSet)+1, 255);
 ^tmp;
end;

Func УдалитьСловаИзНабораПоМаске(Set:String; SetSep:String; Mask:String; MaskSep:String) :String;
var nn1, nn2, i, j :Integer;
var Res, tmp1, tmp2 :String;
 if Set="" or Mask="": ^Set; fi;
 Res="";
 nn1=WordsCount(Set,   SetSep);
 nn2=WordsCount(Mask, MaskSep);
 for i=1 to nn1 do
   tmp1=ExtractWord(i, Set, SetSep);
   for j=1 to nn2 do
     tmp2=ExtractWord(j, Mask, MaskSep);
     if Match(tmp1, tmp2): tmp1=""; Break; fi;
   od;
   if not tmp1="": Res=Res+SetSep+tmp1; fi;
 od;
 Res=SubStr(Res, Length(SetSep)+1, 255);
 ^Res;
end;

Func ДобавитьСловоВНаборСЗаменой(Set:String; SetSep:String; Value:String; Mask:String; MaskSep:String) :String;
var Res :String;
 if Set="": ^Value; fi;
 Res=УдалитьСловаИзНабораПоМаске(Set, SetSep, Mask, MaskSep);
 Res=Объединить(Res, Value, SetSep);
 ^Res;
end;

Func ДобавитьПризнак(Set:String; NewSign:String) :String;
var Voc :String;
 Voc=GetAnaGlossary(NewSign);
 if Voc<>"": Voc=Voc+".*"; else Voc="*"; fi;
 ^ДобавитьСловоВНаборСЗаменой(Set, " ", NewSign, Voc, "");
end;

Proc ВыбратьДопПризнак_Обязательные(Iter:Integer);
var VAL, MSK, Acc1, Acc2 :String;
var num, jj, ii, len :Integer;
 if not Match(Позиции[Iter].КОДКБК, "???.????.???????.???"):
   if Позиции[Iter].КОДКБК="":
     Message("Предварительно необходимо выбрать код БК!", mtWarning);
     Template.Field="КОДКБК_";
     Template.Frame=Iter;
     Exit;
   fi;
 fi;
 if ТИПОПР=1:
   Acc1=Позиции[Iter].КОДКБК+".1.401.20.290";
   Acc2=Позиции[Iter].КОДКБК+".1.303.13.730";
 |  ТИПОПР=2 or ТИПОПР=3:
   Acc1=Позиции[Iter].КОДКБК+".1.303.13.830";
   Acc2=Позиции[Iter].КОДКБК+".1.304.05.290";
 fi;
 if Name_S(Acc1)=" ":
    Message("Счет '"+Acc1+"'^M отсутствует в структуре учета!", mtWarning);
    Template.Field="КОДКБК_";
    Template.Frame=Iter;
    Exit;
 fi;
 if Name_S(Acc2)=" ":
    Message("Счет '"+Acc2+"'^M отсутствует в структуре учета!", mtWarning);
    Template.Field="КОДКБК_";
    Template.Frame=Iter;
    Exit;
 fi;
 MSK=МаскаОбязательныхСправочников_дляПроводки(Acc1, Acc2);
 if MSK="": Message("Обязательные аналитические признаки не требуются!", mtInformation); Exit; fi;
 VAL=AnaElection(MSK);
 if VAL="": Exit; fi;
 -- ***
 ClearVariable(Buf);
 Buf[1]="Добавить значение в текущую ячейку";
 Buf[2]="Добавить значение во все ячейки таблицы";
 num=Alternate("Выберите действие...", Buf, -1, 1, 12);
 if num=1: ii=Iter; len=Iter;
 |  num=2: ii=1;    len=Позиции;
 else Exit;
 fi;
 for jj=ii to len do
   Позиции[jj].ПРИЗНД=ДобавитьПризнак(Позиции[jj].ПРИЗНД, VAL);
   Позиции[jj].ПРИЗНД=СортироватьНаборСлов(Позиции[jj].ПРИЗНД, " ", True);
 od;
end;

Proc ВыбратьДопПризнак(Iter:Integer);
var tmp :String;
 if Позиции[Iter].ПРИЗНД="":
   if ТИПОПР=1: Позиции[Iter].ПРИЗНД=DefПРИЗН_Н;
   |  ТИПОПР=2: Позиции[Iter].ПРИЗНД=DefПРИЗН_О;
   |  ТИПОПР=3: Позиции[Iter].ПРИЗНД=DefПРИЗН_О;
   fi;
   if ТИПОПР=2 or ТИПОПР=3:
     tmp=AnaElection("К.НАЛОГОВАЯ.*");
     if tmp="": Exit; fi;
     Позиции[Iter].ПРИЗНД=ДобавитьПризнак(Позиции[Iter].ПРИЗНД, tmp);
     Позиции[Iter].ПРИЗНД=СортироватьНаборСлов(Позиции[Iter].ПРИЗНД, " ", True);
   fi;
 else
   if (ТИПОПР=2 or ТИПОПР=3) and Позиции[Iter].ПРИЗНД=DefПРИЗН_О:
     tmp=AnaElection("К.НАЛОГОВАЯ.*");
     if tmp="": Exit; fi;
     Позиции[Iter].ПРИЗНД=ДобавитьПризнак(Позиции[Iter].ПРИЗНД, tmp);
     Позиции[Iter].ПРИЗНД=СортироватьНаборСлов(Позиции[Iter].ПРИЗНД, " ", True);
   else
     ВыбратьДопПризнак_Обязательные(Iter);
   fi;
 fi;
end;

Proc Инициализация;
 if NewREC:
   Проводить=False;
   КакОстатки=False;
   ТИПОПР=0;
 fi;
 ValidateSectionInit;
 ТолькоЧтение(Проводить);
 УЧТГОДold=УЧТГОД;
 Template.Field="Фокус";
end;

Func MyTurn(УслОтб:String; DB:D; DE:D; ВАЛ:String) :Numeric;
var Res :Numeric;
 Try Res=Turn(УслОтб, DB, DE, ВАЛ); Except Res=0; end;
 ^Res;
end;

Func ПроверкаНаДубляж(aDB:Date; aDE:Date; aPRD:String) :Logical;
var ii, wrn0, wrn1, wrn2, wrn3 :Integer;
var УслОтб, ANA, KBK :String;
var SUM :Numeric;
var REC :Record;
 ClearVariable(RepObj);
 ClearVariable(RepSts);
 ClearVariable(Buf);
 wrn0=0; wrn1=0; wrn2=0; wrn3=0;
 if Позиции>0:
   for ii=1 to Позиции do
     ANA=Позиции[ii].КАДЕДН;
     KBK=Позиции[ii].КОДКБК;
     SUM=0.00;
     RepObj[ii]=ANA;
     if SUM=0.00:
       -- ЗКР ПРОВЕДЕНА и подтверждена
       УслОтб="+"+KBK+".1.303.13.830/-"+KBK+".1.304.05.290 {"+ANA+"&"+aPRD+"}";
       SUM=MyTurn(УслОтб, aDB, aDE, "РУБ");
       if SUM>0.00: RepSts[ii]=1; wrn1=wrn1+1; fi;
     fi;
     if SUM=0.00:
       -- ЗКР ПРОВЕДЕНА и НЕ подтверждена
       УслОтб="+"+KBK+".1.ЗАБ.00.830/-"+KBK+".1.ЗАБ.КР.290 {"+ANA+"&"+aPRD+"}";
       SUM=MyTurn(УслОтб, aDB, aDE, "РУБ");
       if SUM>0.00: RepSts[ii]=2; wrn2=wrn2+1; fi;
     fi;
     if SUM=0.00:
       -- ЗКР создана и НЕ ПРОВЕДЕНА
       if Позиции[ii].ЗКРREF<>"": 
         REC=StringToRecord(Позиции[ii].ЗКРREF);
         if REC<>NIL: 
           if RecordExists("РПО_ЗАЯВКА_КР", REC):
             RepSts[ii]=3;
             wrn3=wrn3+1;
           fi;
         fi;
       fi;
     fi;
     if RepSts[ii]=0: wrn0=wrn0+1; fi;
   od;
 fi;
 if (wrn1+wrn2+wrn3)>0: 
   ii=0;
   if wrn0>0: ii=ii+1; Txt[ii]="0"; Buf[ii]="Создать недостающие ЗКР"; fi;
   if wrn1>0: ii=ii+1; Txt[ii]="1"; Buf[ii]="Предупреждение (вывести в отчет): ЗКР проведена и подтверждена"; fi;
   if wrn2>0: ii=ii+1; Txt[ii]="2"; Buf[ii]="Предупреждение (вывести в отчет): ЗКР проведена и НЕ подтверждена"; fi;
   if wrn3>0: ii=ii+1; Txt[ii]="3"; Buf[ii]="Предупреждение (вывести в отчет): ЗКР создана и не проведена"; fi;
   ii=ii+1; Txt[ii]="4"; Buf[ii]="Вывести весь список уже созданных ЗКР";
   ^False;
 else 
   ^True;
 fi;
end;

Func ЗКР_ТипКБК(aКБК:String) :String;
 if Match(aКБК,"???.????.*") : ^"10";
 |  Match(aКБК,"???.?.*")    : ^"20";
 |  Match(aКБК,"???.01.*")   : ^"31";
 |  Match(aКБК,"???.02.*")   : ^"32";
 fi;
 ^"";
end;

Func Переформатировать_НАЗНПЛ(Source:String) :String;
var Value :String;
var num :Integer;
 Value=Up(Source);
 num=Pos("КАДАСТРОВЫЙ НОМЕР", Value);
 if num>0:
  ^(Trim(SubStr(Source, num, 255))+" "+Trim(SubStr(Source, 1, num-1)));
 else
  ^Source;
 fi;
end;

Proc ВывестиСписок_ЗКР(asAll:Logical);
var RO, ii, xx, num :Integer;
var REC, asGOTO :Record;
var Work :Logical;
 asGOTO=NIL;
 if Позиции>0:
   ClearVariable(Buf);
   ClearVariable(Txt);
   ShowProgress(Позиции, "Создание списка");
   RO=OpenWorkArea("РПО_ЗАЯВКА_КР", "", "");
   Try
     for ii=1 to Позиции do
       ProgressPos(ii);
       Work=False;
       if asAll:
         if Позиции[ii].ЗКРREF<>"": Work=True; fi;
       else
         if RepSts[ii]=3: if Позиции[ii].ЗКРREF<>"": Work=True; fi; fi;
       fi;
       if Work:
         REC=StringToRecord(Позиции[ii].ЗКРREF);
         if REC<>NIL:
           if RecordExists("РПО_ЗАЯВКА_КР", REC):
             num=GetRecordNumber(RO, REC);
             if num>0:
               xx=xx+1;
               Buf[xx]="ЗКР N"+GetFieldS(RO, num, "НОМЕРДОК")+" от "+DateToString(GetFieldD(RO, num, "ДАТАДОК"))+"--Сумма:"+Format("%17.2N", GetFieldN(RO, num, "ДОК_СУМ"))+" - "+Переформатировать_НАЗНПЛ(GetFieldS(RO, num, "ДОК_НАЗНПЛ"));
               Txt[xx]=Позиции[ii].ЗКРREF;
             fi;
           fi;
         fi;
       fi;
     od;
   Finally
     CloseWorkArea(RO);
     CloseProgress;
   end;
   num=0;
   if LengthOfArray(Txt)>0:
     num=AlternateTree("Выберите ЗКР", Buf, -1, 1, 12, "", "ЗКР", "Пояснение", 20, False);
     if num>0: asGOTO=StringToRecord(Txt[num]); fi;
   fi;
 fi;
 if asGOTO<>NIL:
   OpenBlank("ДОКУМЕНТЫ.БАНК.ЗАЯВКА_КР", False, asGOTO);
 fi;
end;

Proc СоздатьЗКР_Выполнить;
var Путь, УслСчт, УслАна, ANA, KBK, PRD, Value, Err1, Err2, Папка_, Ключ_ :String;
var ЗКР_ОКТМО, ЗКР_ОЧЕРПЛ, ЗКР_СТАТУС, ЗКР_КБК, ЗКР_ОСНПЛ, ЗКР_ТИППЛ, ЗКР_РКН :String;
var RO, R1, R2, OA, ii, kk, k1, ia, num, Sts, ПДИ, verЗКР, numЗКР, nn2, jj :Integer;
var REC, RC1, RC2, УЧР_РЕКВ, УЧР_БАНК :Record;
var WD1, WD2 :Date;
 if not ТИПОПР=3: Exit; fi;
 if not Проводить:
   Message("Перед созданием заявок необходимо провести операцию.", mtWarning);
   Exit;
 fi;
 if НАШЕ_REFК=NIL: 
   Message("Не выбраны 'наши' реквизиты (контрагент).", mtWarning);
   Template.Field="НАШЕ_REFК.КОРИМЯ";
   Exit;
 fi;
 if НАШЕ_REFБ=NIL:
   Message("Не выбраны 'наши' реквизиты (банк).", mtWarning);
   Template.Field="НАШЕ_REFБ.БАНКИМЯ";
   Exit;
 fi;
 Refresh(False);
 ClearTrace(True);
 ShowProgress(0, "Подготовка");
 Try
   WD1=Dat(1, 1, УЧТГОД);
   WD2=Dat(1, 1, УЧТГОД+1);
   PRD=ВзятьПериодОперации(УЧТГОД, УЧТКВТ);
   if not ПроверкаНаДубляж(WD1, WD2, PRD):
     CloseProgress;
     num=Alternate("Выберите действие", Buf, -1, 1, 12);
     if num>0: Sts=Int(Txt[num]); else Sts=-1; fi;
     if Sts=0:
     |  Sts=1:
       Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
       if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
       УслСчт="+*.1.303.13.830/-*.1.304.05.290";
       УслАна=DefMaskVOC+"&"+PRD;
       Report(Путь+"|По_проводкам_БАЛ", WD1, WD2, УслСчт, УслАна);
       Exit;
     |  Sts=2:
       Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
       if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
       УслСчт="+*.1.ЗАБ.00.830/-*.1.ЗАБ.КР.290";
       УслАна=DefMaskVOC+"&"+PRD;
       Report(Путь+"|По_проводкам_ЗАБ", WD1, WD2, УслСчт, УслАна);
       Exit;
     |  Sts=3:
       ВывестиСписок_ЗКР(False);
       Exit;
     |  Sts=4:
       ВывестиСписок_ЗКР(True);
       Exit;
     else Exit;
     fi;
   fi;
   --
 Finally
   CloseProgress;
 end;
 if EnqOkCancel("Будут автоматически созданы требуемые ЗКР.^MПродолжить?", mtWarning)=cmCancel: Exit; fi;
 ПДИ=0;
 verЗКР=12;
 РАБ.ВСПОМ.Подписи_Сегодня.Взять(ДАТОПР, "ДТ.ЗЕМЛЯ.ДВИЖЕНИЕ", "ЗКР_ДатаДок:Дата_Док:D|ЗКР_ДатаПодписи:Дата_Подписи:D|ЗКР_ДолжнРук:ДолжнРук:S|ЗКР_ФИОРук:ФИОРук:S|ЗКР_ДолжнБух:ДолжнБух:S|ЗКР_ФИОБух:ФИОБух:S");
 if ЗКР_ДАТАДОК=1.1.100     : ЗКР_ДАТАДОК=ДАТОПР;          fi;
 if ЗКР_ДАТАПОДПИСИ=1.1.100 : ЗКР_ДАТАПОДПИСИ=ЗКР_ДАТАДОК; fi;
 if ЗКР_ДолжнРук="" : ЗКР_ДолжнРук = НАШЕ_REFК.ДОЛЖНРУК;   fi;
 if ЗКР_ДолжнБух="" : ЗКР_ДолжнБух = НАШЕ_REFК.ДОЛЖНБУХ;   fi;
 if ЗКР_ФИОРук=""   : ЗКР_ФИОРук   = НАШЕ_REFК.ФИОРУК;     fi;
 if ЗКР_ФИОБух=""   : ЗКР_ФИОБух   = НАШЕ_REFК.ФИОБУХ;     fi;
 --
 if РАБ.НАСТР.Начать("ДОКУМЕНТЫ.БАНК.ЗАЯВКА_КР", 0, 0, "", GetGUID):
    ПДИ=Int(РАБ.НАСТР.ВзятьЗначение("ПДИ"));
 fi;
 if РАБ.НАСТР.Начать("УПРАВЛЕНИЕ.БАНК", 0, 0, "", GetGUID):
    if Int(РАБ.НАСТР.ВзятьЗначение("Ver"))>=12: verЗКР=12; else verЗКР=7; fi;
 fi;
 REC=NIL;
 numЗКР=РАБ.ОБЛ.СледСУчетомДаты("РПО_ЗАЯВКА_КР", "Номер", "ДатаДок", ЗКР_ДАТАДОК)-1;
 if numЗКР<0: numЗКР=0; fi;
 RO=OpenWorkArea("РПО_ЗАЯВКА_КР", "", "1=0");
 R1=OpenWorkArea(PAnaCRD, "АПРИЗН", "");
 R2=OpenWorkArea("РПО_СКАН_ДОК", "ДАТА", "1=0");
 ShowProgress(Позиции, "Создание ЗКР");
 Try
   BeginChanging(RO, False);
   Try
     for ii=1 to Позиции do
       if RepSts[ii]=0 and not Позиции[ii].ИСКЛП:
         УЧР_РЕКВ=NIL; УЧР_БАНК=NIL;
         ProgressPos(ii);
         ANA=Позиции[ii].КАДЕДН;
         KBK=Позиции[ii].КОДКБК;
         RC1=SignToRecord(ANA, False);
         k1=GetRecordNumber(R1, RC1);
         УЧР_РЕКВ = GetFieldR(R1, k1, "ИМНС_REFК");
         УЧР_БАНК = GetFieldR(R1, k1, "ИМНС_REFБ");
         ЗКР_КБК  = Trim(GetFieldS(R1, k1, "НАЛ_КБК"));
         ЗКР_РКН  = Trim(GetFieldS(R1, k1, "НОМКАДАСТР"));
         if УЧР_РЕКВ=NIL: Trace("Для признака "+ANA+" не найдена ссылка на реквизиты ИМНС"); fi;
         if УЧР_БАНК=NIL: Trace("Для признака "+ANA+" не найдена ссылка на реквизиты банка ИМНС"); fi;
         if ЗКР_КБК="":    Trace("Для признака "+ANA+" не указано КБК налогового платежа"); fi;
         if k1>0 and УЧР_РЕКВ<>NIL and УЧР_БАНК<>NIL and ЗКР_КБК<>"":
           numЗКР=numЗКР+1;
           ЗКР_ОКТМО  = Trim(GetFieldS(R1, k1, "НАЛ_ОКТМО"));
           ЗКР_ОЧЕРПЛ = Trim(GetFieldS(R1, k1, "НАЛ_ОЧЕРПЛ"));
           ЗКР_СТАТУС = Trim(GetFieldS(R1, k1, "НАЛ_СТАТУС"));
           ЗКР_ОСНПЛ  = Trim(GetFieldS(R1, k1, "НАЛ_ОСНПЛ"));
           ЗКР_ТИППЛ  = Trim(GetFieldS(R1, k1, "НАЛ_ТИППЛ"));
           --
           if ЗКР_ОКТМО  = "": ЗКР_ОКТМО  = НАШЕ_REFК.ОКТМО; fi;
           if ЗКР_ОЧЕРПЛ = "": ЗКР_ОЧЕРПЛ = "5";             fi;
           if ЗКР_СТАТУС = "": ЗКР_СТАТУС = "01";            fi;
           if ЗКР_ОСНПЛ  = "": ЗКР_ОСНПЛ  = "ТП";            fi;
           if ЗКР_ТИППЛ  = "": ЗКР_ТИППЛ  = "0";             fi;
           --
           kk=InsertRecord(RO);
           REC=GetRecordKey(RO, kk);
           --
           kk=PutFieldI(RO, kk, "НОМЕР"         , numЗКР);
           kk=PutFieldS(RO, kk, "НОМЕРДОК"      , Str(numЗКР));
           kk=PutFieldD(RO, kk, "ДАТАДОК"       , ЗКР_ДАТАДОК);
           kk=PutFieldR(RO, kk, "РЕКВ"          , НАШЕ_REFК);
           kk=PutFieldR(RO, kk, "БАНК"          , НАШЕ_REFБ);
           kk=PutFieldS(RO, kk, "ПРИЗН_ЛС"      , РАБ.БЮДЖЕТ2005.БанкВПризн(НАШЕ_REFБ));
           kk=PutFieldS(RO, kk, "ГРБС"          , РАБ.БЮДЖЕТ.НаимКБК("ППП2006", НАШЕ_REFК.РПО_ППП));
           kk=PutFieldS(RO, kk, "ГЛАВА"         , НАШЕ_REFК.РПО_ППП);
           kk=PutFieldD(RO, kk, "ДАТАИСПОЛ"     , if(ПДИ>0, if((ЗКР_ДАТАДОК+ПДИ)>Dat(31,12,Year(ЗКР_ДАТАДОК)), Dat(31,12,Year(ЗКР_ДАТАДОК)), ЗКР_ДАТАДОК+ПДИ), 1.1.100));
           kk=PutFieldS(RO, kk, "НОМЕРБО"       , "");
           kk=PutFieldS(RO, kk, "GUID_FKБО"     , "");
           kk=PutFieldS(RO, kk, "ДОЛЖНРУК"      , ЗКР_ДолжнРук);
           kk=PutFieldS(RO, kk, "ДОЛЖНБУХ"      , ЗКР_ДолжнБух);
           kk=PutFieldS(RO, kk, "ФИОРУК"        , ЗКР_ФИОРук);
           kk=PutFieldS(RO, kk, "ФИОБУХ"        , ЗКР_ФИОБух);
           kk=PutFieldD(RO, kk, "ДАТАПОДПИСИ"   , ЗКР_ДатаПодписи);
           --Раздел 1
           kk=PutFieldN(RO, kk, "ДОК_СУМ"       , Позиции[ii].СУММАП);
           kk=PutFieldS(RO, kk, "ДОК_ОКВ"       , "643");
           kk=PutFieldN(RO, kk, "ДОК_СУМРУБ"    , 0);
           kk=PutFieldL(RO, kk, "ДОК_АВАНС"     , ЗКР_Аванс);
           kk=PutFieldN(RO, kk, "ДОК_СУМНДС"    , 0);
           kk=PutFieldS(RO, kk, "ДОК_СТАВКАНДС" , "");
           kk=PutFieldS(RO, kk, "ДОК_ОЧРПЛ"     , ЗКР_ОЧЕРПЛ);
           kk=PutFieldS(RO, kk, "ДОК_ВИДПЛ"     , "0");
           kk=PutFieldS(RO, kk, "ВАЛ"           , "РУБ");
           Value="("+РАБ.ФОРМАТ.ReplaceSubStr(KBK+".290", ".", "")+" л/с "+Trim(НАШЕ_REFБ.РПО_ЛСЧЕТ)+")"+if(Trim(НАЗНАЧ_ПЛ)<>"", " "+Trim(НАЗНАЧ_ПЛ)+" ", "")+" Кадастровый номер "+ЗКР_РКН;
           kk=PutFieldS(RO, kk, "ДОК_НАЗНПЛ"    , Value);
           --Раздел 2
           -- в будущем УИН
           --Раздел 3
           kk=PutFieldR(RO, kk, "РЕКВП"         , УЧР_РЕКВ);
           kk=PutFieldR(RO, kk, "БАНКП"         , УЧР_БАНК);
           kk=PutFieldS(RO, kk, "ПРИЗН_К"       , CardFileRecSign("КОНТРАГЕНТ", "ПРИЗНАК", "К", УЧР_РЕКВ));
           --Раздел 4
           kk=PutFieldS(RO, kk, "НАЛ_СТАТУС"    , ЗКР_СТАТУС);
           kk=PutFieldS(RO, kk, "НАЛ_КБК"       , ЗКР_КБК);
           kk=PutFieldS(RO, kk, "НАЛ_ОКАТО"     , ЗКР_ОКТМО);
           kk=PutFieldS(RO, kk, "НАЛ_ОСНПЛ"     , ЗКР_ОСНПЛ);
           kk=PutFieldS(RO, kk, "НАЛ_ПЕР"       , ПРДНАЛ);
           kk=PutFieldS(RO, kk, "НАЛ_НОМДОК"    , "0");
           kk=PutFieldD(RO, kk, "НАЛ_ДАТДОК"    , 1.1.100);
           kk=PutFieldS(RO, kk, "НАЛ_ТИППЛ"     , ЗКР_ТИППЛ);
           --Раздел 5
           OA=OpenArray(RO, kk, "РАСШИФР", "");
           ia=InsertRecord(OA, 1);
           ia=PutFieldS(OA, ia, "ИСТ"           , "1");
           ia=PutFieldS(OA, ia, "ТИПКБК"        , ЗКР_ТипКБК(KBK));
           ia=PutFieldS(OA, ia, "КБК"           , РАБ.ФОРМАТ.ReplaceSubStr(KBK+".290", ".", ""));
           ia=PutFieldS(OA, ia, "ПРИЗН_ОСНДОК"  , "");
           ia=PutFieldS(OA, ia, "ПРИЗН"         , ANA+" "+ПРДОПР+" "+Def_ПР_ЗКР);
           ia=PutFieldR(OA, ia, "ДО"            , NIL);
           ia=PutFieldN(OA, ia, "ДОКСУМ"        , 0.00);
           ia=PutFieldN(OA, ia, "ДОКСУМРУБ"     , 0.00);
           ia=PutFieldN(OA, ia, "ДОКОПЛ"        , 0.00);
           ia=PutFieldN(OA, ia, "ДОКОПЛРУБ"     , 0.00);
           ia=PutFieldN(OA, ia, "СУМ"           , Позиции[ii].СУММАП);
           ia=PutFieldN(OA, ia, "СУМРУБ"        , 0);
           ia=PutFieldS(OA, ia, "СЧДЕБ"         , KBK+".1.303.13.830");
           ia=PutFieldS(OA, ia, "СЧКРЕ"         , KBK+".1.304.05.290");
           CloseWorkArea(OA);
           kk=PutFieldI(RO, kk, "VER"           , verЗКР);
           Позиции[ii].ЗКРREF=RecordToString(REC);
           -- НАЧАЛО Формирование ГЭК
           SetFilter(R2, "ДОК='"+PAnaCRD+"' and ЗАПИСЬ="+Str(RecordToInteger(RC1)));
           nn2=Records(R2);
           if nn2>0:
--             val=ПолучПапкуКлючГЭК("|");
--             Папка_=ExtractWord(1,val,"|");
--             Ключ_=ExtractWord(2,val,"|");
             Папка_="";
             Ключ_="";
             for jj=1 to nn2 do
               RC2=GetRecordKey(R2, jj);
               Try
                 Try
                   ia=РАБ.ВСПОМ.СКАНЕР.ЧитатьГЭК("РПО_СКАН_ДОК", RecordToInteger(RC2), "jpg", jj=1);
                   if ia>0:
                     CopyArray(РАБ.ВСПОМ.СКАНЕР.ФайлГЭК, РАБ.ВСПОМ.СКАНЕР.Img);
                     Try
                       РАБ.ВСПОМ.СКАНЕР.КолЛист=ia;
                       РАБ.ВСПОМ.СКАНЕР.extПапка=Папка_;
                       РАБ.ВСПОМ.СКАНЕР.vКлюч=Ключ_;
                       РАБ.ВСПОМ.СКАНЕР.СохранГЭК("РПО_ЗАЯВКА_КР", RecordToInteger(REC), "jpg");
                     Finally
                       ClearVariable(РАБ.ВСПОМ.СКАНЕР.Img); --нужно очистить список файлов, иначе будут удалены при заходе в бланк
                       РАБ.ВСПОМ.СКАНЕР.КолЛист=1;
                     end;
                   fi;
                 Except
                   Err1=ErrorMessage;
                 end;
                 Try
                   РАБ.ВСПОМ.ФАЙЛЫ.Копировать("РПО_СКАН_ДОК", RecordToInteger(RC2), "РПО_ЗАЯВКА_КР", RecordToInteger(REC), Папка_, "*", Ключ_);
                 Except
                   Err2=ErrorMessage;
                 end;
               Finally
                 if not Err1="":
                   Trace("");
                   Trace(ANA+" "+RecordToString(RC2)+" - к сожалению, при переносе графической электронной копии документа, возникли непредвиденные трудности");
                   Trace(ANA+" "+RecordToString(RC2)+" - "+Err1);
                 fi;
                 if not Err2="":
                   Trace("");
                   Trace(ANA+" "+RecordToString(RC2)+" - к сожалению, при переносе прикрепленных файлов, возникли непредвиденные трудности");
                   Trace(ANA+" "+RecordToString(RC2)+" - "+Err2);
                 fi;
               end;
             od; --for jj=1 to nn2 do
           fi;
           -- КОНЕЦ Формирование ГЭК
         else
           Trace("Для признака "+ANA+" ЗКР не сформирована.");
         fi;
       fi;
     od;
     EndChanging(RO);
     EditorApply;
     Message("ЗКР успешно созданы", mtInformation);
   Except
     CancelChanging(RO);
     Raise;
   end;
 Finally
   CloseWorkArea(R2);
   CloseWorkArea(R1);
   CloseWorkArea(RO);
   CloseProgress;
 end;
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;

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;

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

2-- События клеток
Func Field_onEnter(nameField:String; iterFrame:Integer): Logical; -- на входе в клетку
var nn :Integer;
 Flag_onEnter=False;
 if nameField="ТИПОПР_" : ТИПОПР=ТипОпераций_Выбор(ТИПОПР, False); ValidateSectionInit; ^False;
 |  nameField="ДАТОПР"  : OldДАТОПР=ДАТОПР; Flag_onEnter=True; ^True;
 |  nameField="УЧТГОД"  : УЧТГОДold=УЧТГОД; Flag_onEnter=True; ^True;
 |  nameField="УЧТКВТ_" : УчетныйПериод_Выбор(УЧТКВТ, False); ЗаполнитьЛимиты; ^False;
 |  nameField="КАДЕДН_" : КадастровыйНомер_Выбор(iterFrame, False); ^False;
 |  nameField="КОДКБК_" : Позиции[iterFrame].КОДКБК=КБК_Выбор(Позиции[iterFrame].КОДКБК, False); ^False;
 |  nameField="ПРИЗНД_" : ВыбратьДопПризнак(iterFrame); ^False;
 |  nameField="AA"      : Try nn=InsertFrame(Позиции, iterFrame+1); Автозаполн=False; Except end; ^False;
 |  nameField="DD"      : if EnqOkCancel("Вы уверены что хотите удалить данную строчку?", mtConfirmation)=cmOk: Try DeleteFrame(Позиции, iterFrame); НеПустаяТаблица; Автозаполн=False; Except end; fi; ^False;
 |  nameField="ИСКЛП"   : Позиции[iterFrame].ИСКЛП = not Позиции[iterFrame].ИСКЛП; ^False;
 |  nameField="НАШЕ_REFК.КОРИМЯ"  : ВзятьРеквизиты(False); ^False;
 |  nameField="НАШЕ_REFБ.БАНКИМЯ" : Выбор_БанкаКНТР(НАШЕ_REFК); ^False;
 fi;
 ^True;
end;

Proc Field_onExit(nameField:String; iterFrame:Integer); -- на выходе из клетки
 if nameField="ТИПОПР_" : ТИПОПР=ТипОпераций_Выбор(ТИПОПР, True); ValidateSectionInit;
 |  nameField="ДАТОПР"  : if ДАТОПР<>OldДАТОПР: if ОтменитьИзмененияУсловийОтчета: ДАТОПР=OldДАТОПР; fi; fi;
 |  nameField="УЧТГОД"  : if Flag_onEnter and УЧТГОД<>УЧТГОДold: if ОтменитьИзмененияУсловийОтчета: УЧТГОД=УЧТГОДold; fi; fi;
                          if УЧТГОД=0: УЧТГОД=УЧТГОДold; fi;
                          ПРДОПР=ВзятьПериодОперации(УЧТГОД, УЧТКВТ);
                          ЗаполнитьЛимиты;
 |  nameField="УЧТКВТ_" : УчетныйПериод_Выбор(УЧТКВТ, True); ЗаполнитьЛимиты;
 |  nameField="КАДЕДН_" : КадастровыйНомер_Выбор(iterFrame, True);
 |  nameField="КОДКБК_" : Позиции[iterFrame].КОДКБК=КБК_Выбор(Позиции[iterFrame].КОДКБК, True);
 |  nameField="ПРИЗНД_" : Позиции[iterFrame].ПРИЗНД=УдалитьСловоИзНабора_Диалог(Позиции[iterFrame].ПРИЗНД, " ");
 |  nameField="ФИОИСП"  : if ФИОИСП="": ДЛЖИСП=""; fi;
 |  nameField="СУММАП"  : Автозаполн = False;
 |  nameField="НАШЕ_REFК.КОРИМЯ": if НАШЕ_REFК=NIL: НАШЕ_REFБ=NIL; 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, if(ResultVal>0, 4-(Year(ToDay)-ResultVal), 4), 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 ВзятьАналитическийПризнакИМНС(Iter:Integer) :String;
var RO :Integer;
var REC, REK :Record;
var Контр_Призн :String;
 Контр_Призн="";
 if Iter>0:
   REC=SignToRecord(Позиции[Iter].КАДЕДН, False);
   if REC<>NIL:
     RO=OpenWorkArea(PAnaCRD     , "", "UKey="+RecordToString(REC));
     Try
       if Records(RO)=1:
         REK=GetFieldR(RO, 1, "ИМНС_REFК");
         if REK<>NIL: Контр_Призн=CardFileRecSign("КОНТРАГЕНТ", "Признак", "К", REK); fi;
       fi;
     Finally
       CloseWorkArea(RO);
     end;
   fi;
 fi;
^Trim(Контр_Призн);
end;

Func ДопПризнаки_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var num, ii :Integer;
var Value :String;
 Template.HideEditor(False);
 ClearVariable(Buf);
 Buf[1]="Проставить во всех строках дефолтные доп.признаки";
 Buf[2]="Очистить колонку доп.признаки";
 Buf[3]="Проставить признак ИМНС";
 num=Alternate("Выберите действие", Buf, -1, 1, 12);
 if num=1:
    if ТИПОПР=1: for ii=1 to Позиции do Позиции[ii].ПРИЗНД=DefПРИЗН_Н; od;
    |  ТИПОПР=2: for ii=1 to Позиции do Позиции[ii].ПРИЗНД=DefПРИЗН_О; od;
    |  ТИПОПР=3: for ii=1 to Позиции do Позиции[ii].ПРИЗНД=DefПРИЗН_О; od;
    fi;
 |  num=2: for ii=1 to Позиции do Позиции[ii].ПРИЗНД=""; od;
 |  num=3: 
   Refresh(False);
   for ii=1 to Позиции do
     Value=Trim(РАБ.БЮДЖЕТ2005.ВзятьСловоИзНабораПоМаске(Позиции[ii].ПРИЗНД, " ", "К.*", ""));
     if Value="":
       Value=ВзятьАналитическийПризнакИМНС(ii);
       Позиции[ii].ПРИЗНД=ДобавитьПризнак(Позиции[ii].ПРИЗНД, Value);
       Позиции[ii].ПРИЗНД=СортироватьНаборСлов(Позиции[ii].ПРИЗНД, " ", True);
     fi;
   od;
 else ^"";
 fi;
 ^"";
end;

Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ddNew, ddOld : Date;
var nameField :String;
 Template.HideEditor(False);
 nameField=AsString(Template.Field);
 ddOld=GetDate;
 ddNew=ВыборДаты(ddOld);
 if ddNew<>ddOld:
   if ОтменитьИзмененияУсловийОтчета: ddNew=ddOld; fi;
 fi;
 SetDate(ddNew);
 ^"";
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;

Func ПРДНАЛ_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var num, YYYY, ii :Integer;
var Value :String;
var dd :Date;
 Template.HideEditor(False);
 ClearVariable(Buf);
 Buf[01]="Выбрать дату";
 Buf[02]="МС.01 - Месячный платеж за январь";
 Buf[03]="МС.02 - Месячный платеж за февраль";
 Buf[04]="МС.03 - Месячный платеж за март";
 Buf[05]="МС.04 - Месячный платеж за апрель";
 Buf[06]="МС.05 - Месячный платеж за май";
 Buf[07]="МС.06 - Месячный платеж за июнь";
 Buf[08]="МС.07 - Месячный платеж за июль";
 Buf[09]="МС.08 - Месячный платеж за август";
 Buf[10]="МС.09 - Месячный платеж за сентябрь";
 Buf[11]="МС.10 - Месячный платеж за октярь";
 Buf[12]="МС.11 - Месячный платеж за ноябрь";
 Buf[13]="МС.12 - Месячный платеж за декабрь";
 Buf[14]="КВ.01 - Квартальный платеж за I квартал";
 Buf[15]="КВ.02 - Квартальный платеж за II квартал";
 Buf[16]="КВ.03 - Квартальный платеж за III квартал";
 Buf[17]="КВ.04 - Квартальный платеж за IV квартал";
 Buf[18]="ПЛ.01 - Полугодовой платеж за I полугодие";
 Buf[19]="ПЛ.02 - Полугодовой платеж за II полугодие";
 Buf[20]="ГД.00 - Годовой платеж";
 num=Alternate('Налоговый период', Buf, -1, 1, 12);
 if not num=0:
   if num=1:
     dd=ВыборДаты(ToDay);
     if not dd=1.1.100: ПРДНАЛ=DateToString(dd); fi;
   else
     Value=SubStr(Buf[num], 1, 5);
     ClearVariable(Buf);
     for ii=1 to 5 do Buf[ii]=Str(Year(ToDay)+ii-4); od;
      InsertInArray(Buf, 1, "Ввести год в ручную");
      num=Alternate("Год налогового периода", Buf, 30, 5, 12);
      if num=0: ^Cur;
      |  num=1: if Input(YYYY, "Введите год налогового периода")=cmCancel: ^Cur; fi;
      | True: YYYY=Int(Buf[num]);
      fi;
      ПРДНАЛ=Value+"."+Str(YYYY);
   fi;
 fi;
 ^Cur;
end;

Func ПериодВТекст :String;
var Value :String;
 Value="";
 if УЧТГОД>0:
   if УЧТКВТ=1: Value="1 кв.";
   |  УЧТКВТ=2: Value="2 кв.";
   |  УЧТКВТ=3: Value="3 кв.";
   |  УЧТКВТ=4: Value="4 кв.";
   else Value="";
   fi;
   Value=Value+" "+Str(УЧТГОД)+"г.";
 fi;
 ^Value;
end;

Func НАЗНАЧ_ПЛ_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
 Template.HideEditor(False);
 НАЗНАЧ_ПЛ=if(ЗКР_АВАНС, "Авансовый платеж", "Платеж")+" по земельному налогу в разм.0.3% за "+ПериодВТекст;
 ^Cur;
end;

Func ПроведеннаяПоУчетуНачисленная_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var Путь, УслСЧТ, УслАНА :String;
var Iter :Integer;
var SUM  :Numeric;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if Iter>0:
   if Позиции[Iter].СУМ_УН<>0.00:
     if УЧТГОД<2000:
       Message("Предварительно необходимо выбрать учетный год.", mtWarning);
       Template.Field="УЧТГОД";
       ^Cur;
     fi;
     if not ДАТОПР>ValidDate:
       Message("Не заполнено поле 'Дата операции (проводки)'.", mtWarning);
       Template.Field="ДАТОПР";
       ^Cur;
     fi;
     УслСЧТ="+(00|"+Позиции[Iter].КОДКБК+".1.401.20.290)/-"+Позиции[Iter].КОДКБК+".1.303.13.730";
     УслАНА=Позиции[Iter].КАДЕДН+"&ПЕРИОД."+Str(УЧТГОД)+"*";
     Try SUM=Turn(УслСЧТ+"{"+УслАНА+"}", 1.1.100, ДАТОПР); Except ^Cur; end;
     Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
     if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); ^Cur; fi;
     Try
       Report(Путь+"|По_проводкам_БАЛ", 1.1.100, ДАТОПР, УслСЧТ, УслАНА);
     Except
       Message("Ошибка создания детализированного отчета!", mtError);
       ^Cur;
     end;
   else
     Message("Нет суммы для расшифровки", mtWarning);
   fi;
 fi;
 ^Cur;
end;

Func ПроведеннаяПоУчетуОплаченная_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var Путь, УслСЧТ, УслАНА :String;
var Iter :Integer;
var SUM  :Numeric;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if Iter>0:
   if Позиции[Iter].СУМ_УО<>0.00:
     if УЧТГОД<2000:
       Message("Предварительно необходимо выбрать учетный год.", mtWarning);
       Template.Field="УЧТГОД";
       ^Cur;
     fi;
     if not ДАТОПР>ValidDate:
       Message("Не заполнено поле 'Дата операции (проводки)'.", mtWarning);
       Template.Field="ДАТОПР";
       ^Cur;
     fi;
     УслСЧТ="+"+Позиции[Iter].КОДКБК+".1.303.13.830/-"+Позиции[Iter].КОДКБК+".1.304.05.290";
     УслАНА=Позиции[Iter].КАДЕДН+"&ПЕРИОД."+Str(УЧТГОД)+"*";
     Try SUM=Turn(УслСЧТ+"{"+УслАНА+"}", 1.1.100, ДАТОПР); Except ^Cur; end;
     Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
     if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); ^Cur; fi;
     Try
       Report(Путь+"|По_проводкам_БАЛ", 1.1.100, ДАТОПР, УслСЧТ, УслАНА);
     Except
       Message("Ошибка создания детализированного отчета!", mtError);
       ^Cur;
     end;
   else
     Message("Нет суммы для расшифровки", mtWarning);
   fi;
 fi;
 ^Cur;
end;

Func СинхроОплаты_поНачислению_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var RO, OA, ii, num, pp, xx :Integer;
var REC :Record;
var ANA :String;
var SUM :Numeric;
 Template.HideEditor(False);
 if not (ТИПОПР=2 or ТИПОПР=3): Message("Данная операция предусмотрена только для регистрации оплаты.", mtWarning); ^Cur; fi;
 if Проводить: Message("Операция проведена по учету.", mtWarning); ^Cur; fi;
 if not Позиции>0: Message("Предварительно необходимо выполнить расчет.", mtWarning); ^Cur; fi;
 REC=OpenCardFile(SelfCRD, "ТИПОПР=1", NIL, crdRecordOnly);
 if REC<>NIL:
   if EnqOkCancel("Суммы оплаты будут синхронизированны^Mс суммами начислений из данной операции.Продолжить?", mtWarning)=cmCancel: ^Cur; fi;
   ClearVariable(RepObj);
   ClearVariable(RepSum);
   ShowProgress(0, "Считывание...");
   RO=OpenWorkArea(SelfCRD, "", "Ukey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       OA=OpenArray(RO, 1, "ПОЗИЦИИ", "", "");
       num=Records(OA);
       if num>0:
         for ii=1 to num do
           ANA=GetFieldS(OA, ii, "КАДЕДН");
           SUM=GetFieldN(OA, ii, "СУММАП");
           if SUM<>0.00:
             xx=SearchInArray(RepObj, ANA, True, 1);
             if not xx>0:
               pp=InsertInArraySort(RepObj, ANA);
               InsertInArray(RepSum, pp, SUM);
             else
               RepSum[xx]=RepSum[xx]+SUM;
             fi;
           fi;
         od;
       fi;
       CloseWorkArea(OA);
       ShowProgress(0, "Синхронизация...");
       ii=Позиции;
       while ii>0 do
         xx=SearchInArray(RepObj, Позиции[ii].КАДЕДН, True, 1);
         if xx>0:
           Позиции[ii].СУММАП=RepSum[xx];
         else
           DeleteFrame(Позиции, ii);
         fi;
         ii=ii-1;
       od;
     fi;
   Finally
     CloseWorkArea(RO);
     CloseProgress;
   end;
 fi;
 ^Cur;
end;

Func ИНФО_оплаты_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var Iter :Integer;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if Iter>0: Расшифровка_ИНФО_оплаты(Iter); fi;
 ^Cur;
end;

Func ИНФОоплаты_ОбновитьВСЕ_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var ii :Integer;
var WD :Date;
 Template.HideEditor(False);
 if not Проводить:
   if not Позиции>0:
     Message("Предварительно необходимо выполнить расчет.", mtWarning);
     Template.Object="btnAutoC";
     ^Cur;
   fi;
   if УЧТГОД<2000:
     Message("Предварительно необходимо выбрать учетный год.", mtWarning);
     Template.Field="УЧТГОД";
     ^Cur;
   fi;
   if УЧТКВТ=0:
     if EnqOkCancel("'Учетный период' не выбран,^Mсумма оплаты будет дана за весь год.^MПродолжить?", mtWarning)=cmCancel:
       Template.Field="УЧТКВТ_";
       ^Cur;
     fi;
   fi;
   if Позиции>0:
     if not ДАТОПР>ValidDate: WD=ВзятьДатуПоПериоду(УЧТГОД, УЧТКВТ); else WD=ДАТОПР; fi;
     for ii=1 to Позиции do
       Найти_ПлатежкиОплаты_для_РКН(ii, WD);
     od;
   fi;
 else
   Message("Операция проведена по учету.", mtWarning);
 fi;
 ^Cur;
end;

Func Field_OnValidateN(Field:String; Iter:Integer; Value:Numeric) :Logical;
 if Value<0.00: Message('Нельзя вводить отрицательное число!', mtError); ^False; fi;
 ^True;
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
   SaveOK=BlankToCRD_SaveOK(True);
   Flag=SaveOK;
 fi;
 Проводить=Flag;
 cb_Проводить.State=Flag;
 ТолькоЧтение(Flag);
 if not SaveOK: Exit; fi; -- Избегаем двойных сообщений
 EditorApply;
end;

Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnClose" : Close;
 |  Sender="btnAutoC" : Автозаполнение_Выполнить;
 |  Sender="btnЗКРbd" : СоздатьЗКР_Выполнить;
 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); -- при открытии шаблона
 EnableCommands(False, cmDublRec);
 Очистить;
 CopyCfgPrn("ТББ_STD_Album10_000.cfg");
 ЦветаПолей;
 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);
 Очистить;
 if CurrentState=CrdusUndefined: Destroy=True; fi;
end;

Proc Template_onRead; -- при считывании шаблона
 if recCurrent<>NIL: if recCurrent<>Current: recCurrent=Current(recCurrent); fi; recCurrent=NIL; fi;
 Очистить;
 if not First: Инициализация; fi;
end;

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

Func ТипОперации_Текстом(CODE:Integer) :String;
 if CODE=1: ^"Регистрация начисления налога";
 |  CODE=2: ^"Регистрация оплаты налога (проводки в этой операции)";
 |  CODE=3: ^"Регистрация оплаты налога (проводки после формирования ЗКР)";
 else ^"";
 fi;
end;

Func Template_OnValidate: Logical; -- при проверке шаблона
var Value :String;
var Work  :Logical;
 if not BlankToCRD_SaveOK(Проводить): ^False; fi;
 if ТИПОПР>0:
   Work=False;
   Value=ТипОперации_Текстом(ТИПОПР);
   if NewREC: Work=True; else if ТИПОПР_ТЕКСТ<>"": if Up(ТИПОПР_ТЕКСТ)<>Up(Value): Work=True; fi; else Work=True; fi; fi;
   if Work: ТИПОПР_ТЕКСТ=Value; fi;
 fi;
 ^True;
end;

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