-- Шаблон создан мастером бланков
-- 19.12.2005 15:31:41
--
БланкСШаблоном "Заключение счетов бюджетного учета отчетного финансового года", Редактор РПО_ЗАКЛПР;

var НоваяЗапись:L=(CurrentState=crdusInserted);

var ДН:D=Dat(1,1,ОтчГод);
var ДК:D=Dat(1,1,ОтчГод+1);

var A:S=if(Проводить,"","+");
var D:S=if(Проводить,"","-");
var пп[]:i=$;
var Раздел_ДК_[]:s=if(Настр[$].Раздел_ДК,"Да","Нет");
var ИсклСправ_[]:S=Настр[$].ИсклСправ;

var ПризнОбщ_:S=ПризнОбщ;

var Buf[]:S;
var ID_Настр[]:I;
var Сум_[]:N=Позиции[$].Сум;
var Ост0[]:N;

S1:Section;
S2:Section;
S3:Section;
S4:Section;
S5:Section;
S6:Section;

СекцArrayKEY:Object;

var BufField[]:S;
var BufColorBg[]:I;
var BufColorFo[]:I;
var FlagInit:L;

btnРасчет: Object;
btnУмолчание: Object;
cbПроводить: Object;

var count_arrKEY :I;
var ПозицииArrayKEY :I;

var arr_РЕФKEY[]:S;
var arr_КОДKEY[]:S;
var Общ_SrtKEY[]:S;
var Общ_СумБаз[]:N;
var Общ_СумВал[]:N;
var Общ_ДК_Баз[]:N;
var Общ_ДК_Вал[]:N;
var Общ_ЗГ_Баз[]:N;
var Общ_ЗГ_Вал[]:N;
var Общ_Раздел[]:L;
var Buf_SrtKEY[]:S;
var Buf_RefKEY[]:S;
var Buf_СумБаз[]:N;
var Buf_СумВал[]:N;
var Buf_ВалВид[]:S;
var Buf_СчтПрв[]:S;
var Buf_АнаПрв[]:S;
var Buf_ID[]:I;

var НеГрСправ:s="ЗАБАЛАНС|ОПЕР|КРЕ_ОФР|ДЕБ_ОФР";
--
--Процедуры и функции ------------- 
Proc Инициализация;
var Obj:Object;
var s,r,rr,c,cc,n,l,bgColor:i;
var Field:S;
 ClearVariable(BufField);
 ClearVariable(BufColorBg);
 ClearVariable(BufColorFo);
 for s=1..6 do
  if FindObject("S"+Str(s),Obj):
     rr=asInteger(Obj.RowsCount);
     cc=asInteger(Obj.ColsCount);
     for r=1 ..rr  do
      for c=1 ..cc  do
       BgColor=asInteger(Obj.Cell(r,c,CellBgColor,""));
       if BgColor=coAqua or BgColor=coTeal:
          Field=asString(Obj.Cell(r,c,CellContents,""));
          if SearchInArray(BufField,Field,True)=-1:
             n=InsertInArraySort(BufField,Field); 
             InsertInArray(BufColorBg,n,BgColor);
          fi;
       fi;
      od;
     od;
  fi;
 od;
 l=LengthOfArray(BufField);
 for n=1..l do
  if BufColorBg[n]=coTeal: BufColorFo[n]=coWhite;
    |True: BufColorFo[n]=coBlack;
  fi;
 od;
end;

Proc Оформление;
var s,c,r,cc,rr,n:i;
var Obj: Object;
 btnРасчет.Enabled=not Проводить;
 btnУмолчание.Enabled=not Проводить;
 for s=1..6 do
  if FindObject("S"+Str(s),Obj):
     rr=asInteger(Obj.RowsCount);
     cc=asInteger(Obj.ColsCount);
     for r=1 .. rr do
      for c=1 .. cc do
       n=SearchInArray(BufField,asString(Obj.Cell(r,c,CellContents,"")),True);
       if not n=-1:
          if Проводить:
             Obj.Cell(r,c,CellFontColor,coBlack); 
             Obj.Cell(r,c,CellBgColor,coTransparent); 
             Obj.Cell(r,c,CellReadOnly,True);
            else
             Obj.Cell(r,c,CellFontColor,BufColorFo[n]); 
             Obj.Cell(r,c,CellBgColor,BufColorBg[n]); 
             Obj.Cell(r,c,CellReadOnly,False);
          fi;
       fi;
      od;
     od;
  fi;
 od;
end;

Proc НеПустаяНастр;
 if Настр=0: InsertFrame(Настр,1); fi;
end;

Proc УдалитьПустыеСтроки;
var Iter:I;
 Iter=1;
 While Iter<=Настр do
  if Настр[Iter].УслСч="" and
     Настр[Iter].УслАн="" and
     Настр[Iter].ЗаклСч5="": DeleteFrame(Настр,Iter);
    else
     Iter=Iter+1;
  fi;
 od;
 НеПустаяНастр;
end;

Proc Очистить;
 ClearVariable(Позиции);
 ClearVariable(ID_Настр);
end;

Func Оператор:S;
var n:i;
 ClearVariable(Buf);
 Buf[1]="И";
 Buf[2]="ИЛИ";
 Buf[3]="И ИСКЛЮЧИТЬ";
 n=Alternate("Выбор оператора",Buf,20,1,12);
 if n=1: ^"&";
   |n=2: ^"|";
   |n=3: ^"&~";
 fi;
 ^"";
end;

Func Объединить(Value1:s; Value2:s):S;
var z:s;
 if not Value1="" and not Value2="": z=Оператор; else z=""; fi;
 ^Раб.Бюджет2005.Объединить(Value1,Value2,z);
end;

Func ВыборСправ(Iter:I):S;
var n:i;
 Раб.Бюджет2005.СписокСправ(Настр[Iter].УслСч,0,"");
 CopyArray(Раб.Бюджет2005.BufСправ,Buf);
 n=Alternate("Аналитические справочники",Buf,-1,1,12);
 if n=0: ^""; fi;
 ^SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
end;

Func ПроверитьУсловия(Iter1:I; Iter2:I):L;
var Acc,Sgn,УслСч1,УслСч2,УслАн1,УслАн2:S;
var FlagAcc:L;
 УслСч1=Настр[Iter1].УслСч;
 УслСч2=Настр[Iter2].УслСч;
 FlagAcc=False;
 for Account Acc=УслСч1+"&"+УслСч2 do
  FlagAcc=True;
  Break;
 od;
 if FlagAcc=False: ^True; fi;
 if Настр[Iter1].УслАн="" and Настр[Iter2].УслАн="": Trace("Ошибка! Условия отбора (по счетам) заключаемых счетов №"+Str(пп[Iter1])+" пересекаются с условиями отбора заключаемых счетов №"+Str(пп[Iter2])); ^False; fi;
 if not Настр[Iter1].УслАн="": УслАн1="("+Настр[Iter1].УслАн+")"; else УслАн1=""; fi;
 if not Настр[Iter2].УслАн="": УслАн2="("+Настр[Iter2].УслАн+")"; else УслАн2=""; fi;
 for Sign Sgn=Раб.Бюджет2005.Объединить(УслАн1,УслАн2,"&") do
  Trace("Ошибка! Условия отбора (по счетам и аналитике) заключаемых счетов №"+Str(пп[Iter1])+" пересекаются с условиями отбора заключаемых счетов №"+Str(пп[Iter2]));
  ^False;
 od;
 ^True;
end;

Func ПроверитьНастр:L;
var Iter,Iter2:I;
var noError:L;
 if ОтчГод=0: Message("Введите отчетный год",mtError); Template.Field="ОтчГод"; ^False; fi;
 УдалитьПустыеСтроки;
 for Iter=1..Настр do
  if Настр[Iter].УслСч=""  : Message("Введите условие",mtError); Template.Field="УслСч"; Template.Frame=Iter; ^False; fi;
  if Настр[Iter].ЗаклСч5="": Message("Введите счет заключения",mtError); Template.Field="ЗаклСч5"; Template.Frame=Iter; ^False; fi;
 od;
 ClearTrace(True);
 noError=True;
 for Iter=1..Настр do
  for Iter2=Iter+1..Настр do
   noError=ПроверитьУсловия(Iter,Iter2);
  od;
 od;
 if not noError: Message("Обнаружены ошибки в условиях отбора заключаемых счетов",mtError); ^False; fi;
 ^True;
end;

Func Проверить:L;
var Iter:I;
var СправОбщ:S;
 if Позиции=0: Message("Необходимо выполнить расчет",mtError); Template.Object="btnРасчет"; ^False; fi;
 --if Name_A(Период)=" ": Message("Отсутствует аналитический признак "+Период,mtError); Template.Field="ОтчГод"; ^False; fi;
 Раб.КСА.Начать;
 for Iter=1..Позиции do
  if not Раб.КСА.Добавить(Позиции[Iter].СчДеб): Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
  if not Раб.КСА.Добавить(Позиции[Iter].СчКре): Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
 od;
 if Раб.КСА.Закончить(True): Message("Добавление счетов завершено");  fi;
 Раб.Бюджет.ПроверитьПризнакиНачать;
 ShowProgress(Позиции,"Проверка.....");
 СправОбщ=Раб.Бюджет2005.ПризнВСправ(ПризнОбщ," ",".*");
 СправОбщ=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(СправОбщ," ","|");
 Try
  for Iter=1..Позиции do
   ProgressPos(Iter);
   if Name_S(Позиции[Iter].СчДеб)=" ": Message("Неизвестный счет "+Позиции[Iter].СчДеб,mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
   if Name_S(Позиции[Iter].СчКре)=" ": Message("Неизвестный счет "+Позиции[Iter].СчКре,mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
   if not Correspond(Позиции[Iter].СчДеб,Позиции[Iter].СчКре): Message("Счета "+Позиции[Iter].СчДеб+"/"+Позиции[Iter].СчКре+" не могут корреспондировать",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
   if not СправОбщ="" and Раб.Бюджет2005.ПроверитьНаборСлов(Позиции[Iter].Призн," ",СправОбщ,"|",""): Message("Аналитические справочники "+Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(СправОбщ,"|"," ")+" уже встречаеются в наборе признаков",mtError); Template.Field="ПризнОбщ"; ^False; fi;
   if not Раб.Бюджет.ПроверитьПризнакиОбязательные (Позиции[Iter].СчДеб,Позиции[Iter].СчКре,Позиции[Iter].Призн,СправОбщ): Template.Field="Призн"; Template.Frame=Iter; ^False; fi;  --проверка обязательных
   --if not Раб.Бюджет.ПроверитьПризнакиСвязанные (Позиции[Iter].СчДеб,Позиции[Iter].СчКре,Позиции[Iter].Призн,СправОбщ): Template.Field="Призн"; Template.Frame=Iter; ^False; fi; --проверка связанных
   --а оно надо ?
  od;
 Finally
  CloseProgress;
 end;
 ^True;
end;

Proc ДобавитьПров(aДебПрв:Logical; aСумБаз:Numeric; aСумВал:Numeric; aВидВал:String; aСчтПрв:String; aАнаПрв:String; aItrINI:Integer; aЗГ:Logical);
var СпрИскл, стрSrtKey, рефSrtKey, Value :String;
var pp :Integer;

 СпрИскл = РАБ.БЮДЖЕТ2005.СписокСправ(aСчтПрв, 0, Настр[aItrINI].ИсклСправ);
 СпрИскл = РАБ.БЮДЖЕТ2005.Объединить(СпрИскл, НеГрСправ, "|");
 aАнаПрв = РАБ.БЮДЖЕТ2005.СортироватьНаборСлов(aАнаПрв, " ", True);
 aАнаПрв = РАБ.БЮДЖЕТ2005.ПривестиВСоотвНаборСлов(aАнаПрв, " ", СпрИскл, "|");
 --
 стрSrtKey=Str16(aItrINI)+"#"+if(aВидВал=""," ",aВидВал)+"#"+aСчтПрв+"#"+if(aАнаПрв=""," ",aАнаПрв);
 рефSrtKey="";
 pp=SearchInArray(arr_КОДKEY, стрSrtKey, True, 1);
 if pp=-1:
   count_arrKEY=count_arrKEY+1;
   рефSrtKey=Format("%.8d", count_arrKEY);
   pp=InsertInArraySort(arr_КОДKEY, стрSrtKey);
   InsertInArray(arr_РЕФKEY, pp, рефSrtKey);
 else
   рефSrtKey=arr_РЕФKEY[pp];
 fi;
 -- считываем проводки без разделения на дебетовые/кредитовые
 -- это нужно для того, чтоб отсеять уже "закрытые" проводки
 Value=рефSrtKey;
 pp=SearchInArray(Общ_SrtKEY, Value, True, 1);
 if pp=-1:
   pp=InsertInArraySort(Общ_SrtKEY, Value);
   InsertInArray(Общ_СумБаз, pp, aСумБаз);
   InsertInArray(Общ_СумВал, pp, aСумВал);
   InsertInArray(Общ_ДК_Баз, pp, if(aЗГ, 0.00, Abs(aСумБаз))); -- сумма проводки раздельного дебета/кредита, исключая суммы закрытия года
   InsertInArray(Общ_ДК_Вал, pp, if(aЗГ, 0.00, Abs(aСумВал)));
   InsertInArray(Общ_ЗГ_Баз, pp, if(aЗГ, Abs(aСумБаз), 0.00)); -- только сумма проводки закрытия года
   InsertInArray(Общ_ЗГ_Вал, pp, if(aЗГ, Abs(aСумВал), 0.00));
   InsertInArray(Общ_Раздел, pp, Настр[aItrINI].Раздел_ДК);
 else
   Общ_СумБаз[pp] = Общ_СумБаз[pp] + aСумБаз;
   Общ_СумВал[pp] = Общ_СумВал[pp] + aСумВал;
   Общ_ДК_Баз[pp] = Общ_ДК_Баз[pp] + if(aЗГ, 0.00, Abs(aСумБаз)); -- сумма проводки раздельного дебета/кредита, исключая суммы закрытия года
   Общ_ДК_Вал[pp] = Общ_ДК_Вал[pp] + if(aЗГ, 0.00, Abs(aСумВал));
   Общ_ЗГ_Баз[pp] = Общ_ЗГ_Баз[pp] + if(aЗГ, Abs(aСумБаз), 0.00); -- только сумма проводки закрытия года
   Общ_ЗГ_Вал[pp] = Общ_ЗГ_Вал[pp] + if(aЗГ, Abs(aСумВал), 0.00);
 fi;
 -- теперь, по надобности, учитываем дебетовое/кредитовое закрытие
 Value=рефSrtKey+"#"+if(Настр[aItrINI].Раздел_ДК, if(aДебПрв, "+", "-"), "*");
 pp=SearchInArray(Buf_SrtKEY, Value, True, 1);
 if pp=-1:
   pp=InsertInArraySort(Buf_SrtKEY, Value);
   InsertInArray(Buf_RefKEY, pp, рефSrtKey);
   InsertInArray(Buf_СумБаз, pp, aСумБаз);
   InsertInArray(Buf_СумВал, pp, aСумВал);
   InsertInArray(Buf_ВалВид, pp, aВидВал);
   InsertInArray(Buf_СчтПрв, pp, aСчтПрв);
   InsertInArray(Buf_АнаПрв, pp, aАнаПрв);
   InsertInArray(Buf_ID, pp, aItrINI);
 else
   Buf_СумБаз[pp] = Buf_СумБаз[pp] + aСумБаз;
   Buf_СумВал[pp] = Buf_СумВал[pp] + aСумВал;
 fi;

end;

Proc Расчет;
var УслВал_, Вал_, СчДеб_, СчКре_, Призн_, КБК_, КОСГУ_, ВД_, tmp, sgn :String;
var Iter, Err, tr, ii, len, pp, xx :Integer;
var Сум_, Сум_Вал_ :Numeric;
var Work, ЗакрГода :Logical;
 Refresh;
 ShowProgress(0,"Расчет....");
 ClearTrace(True);
 Try
   Очистить;
   ClearVariable(arr_РЕФKEY);
   ClearVariable(arr_КОДKEY);
   ClearVariable(ПозицииArrayKEY);
   count_arrKEY=0;
   ClearVariable(Общ_SrtKEY);
   ClearVariable(Общ_СумБаз);
   ClearVariable(Общ_СумВал);
   ClearVariable(Общ_ДК_Баз);
   ClearVariable(Общ_ДК_Вал);
   ClearVariable(Общ_ЗГ_Баз);
   ClearVariable(Общ_ЗГ_Вал);
   ClearVariable(Общ_Раздел);
   ClearVariable(Buf_SrtKEY);
   ClearVariable(Buf_RefKEY);
   ClearVariable(Buf_СумБаз);
   ClearVariable(Buf_СумВал);
   ClearVariable(Buf_ВалВид);
   ClearVariable(Buf_СчтПрв);
   ClearVariable(Buf_АнаПрв);
   ClearVariable(Buf_ID);
   -- Проверка начальных условий
   if Вал_База="": Вал_База=BaseCurrency; fi;
   УслВал_=if(УслВал="","","'"+УслВал);
   Err=0;
   for Iter=1 to Настр do
     Ост0[Iter]=Saldo(Настр[Iter].УслСч+УслВал_+"{"+Настр[Iter].УслАн+"}", ДН, Вал_База);
     if not Round(Ост0[Iter], 4)=0.00:
       Err=Err+1;
       if Err=1:
         Trace("Внимание! Обнаружены остатки заключаемых счетов по состоянию на "+DateToString(ДН));
         Trace("Перед заключением счетов в текущем году ("+Str(ОтчГод)+") необходимо закрыть остатки на счетах прошлых лет");
       fi;
       Trace("Остаток счетов по условию N"+Str(Iter)+" ="+Str(Ост0[Iter], 2)+" "+Вал_База);
     fi;
   od;
   -- Фильтрация проводок
   ShowProgress(Настр+1, "Расчет...");
   for Iter=1 to Настр do
     for Transaction tr=Настр[Iter].УслСч+УслВал_+"{"+Настр[Iter].УслАн+"}", ДН, ДК do
       Hint("Отбор счетов по маске: "+Настр[Iter].УслСч+" "+DateToString(TransDate(tr)));
       ProgressPos(Iter);
       --
       СчДеб_ = TransDeb(tr);
       СчКре_ = TransCre(tr);
       Вал_   = Lo(TransCurrency(tr));
       if Вал_=Вал_База: Вал_=""; fi;
       if Вал_="":
         Сум_     = TransSum(tr);
         Сум_Вал_ = 0.00;
       else
         Сум_     = TransSum(tr, Вал_База);
         Сум_Вал_ = TransSum(tr, "ВАЛ");
       fi;
       if РАБ.БЮДЖЕТ2005.MatchMask(СчДеб_, Настр[Iter].УслСч):
         Призн_="";
         len=TransSignCount(tr);
         for ii=1 to len do
           tmp=TransSignName(tr, ii);
           if Pos("+", tmp)=1: tmp=SubStr(tmp, 2, 255); fi;
           Призн_=Призн_+" "+tmp;
         od;
         Призн_=SubStr(Призн_, 2, 255);
         ЗакрГода=(Pos(" ЗГ ", Up(" "+Призн_+" "))>0);
         ДобавитьПров(True,   Сум_,  Сум_Вал_, Вал_, СчДеб_, Призн_, Iter, ЗакрГода);
       fi;
       if РАБ.БЮДЖЕТ2005.MatchMask(СчКре_, Настр[Iter].УслСч):
         Призн_="";
         len=TransSignCount(tr);
         for ii=1 to len do
           tmp=TransSignName(tr, ii);
           if Pos("-", tmp)=1: tmp=SubStr(tmp, 2, 255); fi;
           Призн_=Призн_+" "+tmp;
         od;
         Призн_=SubStr(Призн_, 2, 255);
         ЗакрГода=(Pos(" ЗГ ", Up(" "+Призн_+" "))>0);
         ДобавитьПров(False, -Сум_, -Сум_Вал_, Вал_, СчКре_, Призн_, Iter, ЗакрГода);
       fi;
     od; --for Transaction
   od; --for Iter=1 to Настр do
   -- Анализ проводок и формирование результата
   len=LengthOfArray(Общ_SrtKEY);
   if len>0:
     for ii=1 to len do
       Work=False;
       if not Round(Общ_СумБаз[ii], 4)=0.00 or not Round(Общ_СумВал[ii], 4)=0.00:
         -- если сумма общая <> 0, то она не закрыта - и мы работаем...
         Work=True;
       else
         -- если сумма общая = 0, то проверям настройку только для раздельного закрытия дебета/кредита
         if Общ_Раздел[ii]: if not Round(Общ_ДК_Баз[ii], 4)=Round(Общ_ЗГ_Баз[ii], 4) or not Round(Общ_ДК_Вал[ii], 4)=Round(Общ_ЗГ_Вал[ii], 4): Work=True; fi; fi;
       fi;
       if Work:
         tmp=Общ_SrtKEY[ii];
         xx=SearchInArray(Buf_RefKEY, tmp, True, 1);
         if xx>0:
           while Buf_RefKEY[xx]=tmp do
               sgn  = Trim(ExtractWord(2, Buf_SrtKEY[xx], "#"));
             if sgn="": sgn="*"; fi;
               КБК_ = РАБ.БЮДЖЕТ2005.ВзятьКодСчета(Buf_СчтПрв[xx], "",   "КБК", False);
                ВД_ = РАБ.БЮДЖЕТ2005.ВзятьКодСчета(Buf_СчтПрв[xx], "",   "ИСТ", False);
             КОСГУ_ = РАБ.БЮДЖЕТ2005.ВзятьКодСчета(Buf_СчтПрв[xx], "", "КОСГУ", False);
             if ((Round(Buf_СумБаз[xx], 4)>0 or Round(Buf_СумВал[xx], 4)>0) and sgn="*") or sgn="+":
               СчДеб_ = КБК_+"."+ВД_+"."+Настр[Buf_ID[xx]].ЗаклСч5+".000";
               СчКре_ = Buf_СчтПрв[xx];
             else
               СчДеб_ = Buf_СчтПрв[xx];
               СчКре_ = КБК_+"."+ВД_+"."+Настр[Buf_ID[xx]].ЗаклСч5+".000";
             fi;
             pp=InsertFrame(Позиции, Позиции+1);
             Позиции[Позиции].Сум     = if(sgn="+": Buf_СумБаз[xx] | sgn="-": -Buf_СумБаз[xx] |True: Abs(Buf_СумБаз[xx]));
             Позиции[Позиции].Сум_Вал = if(sgn="+": Buf_СумВал[xx] | sgn="-": -Buf_СумВал[xx] |True: Abs(Buf_СумВал[xx]));
             Позиции[Позиции].Вал     = Buf_ВалВид[xx];
             Позиции[Позиции].СчДеб   = СчДеб_;
             Позиции[Позиции].СчКре   = СчКре_;
             Позиции[Позиции].Призн   = Buf_АнаПрв[xx];
             ID_Настр[Позиции]        = Buf_ID[xx];
             xx=xx+1;
           end; -- while
         fi;
       fi;
     od;
   fi;
 Finally
   CloseProgress;
 end;
 if Err=0:
   Message("Расчет завершен");
 else
   Message("Расчет завершен, обнаружено предупреждений: "+Str(Err), mtWarning);
 fi;
end;

--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func ОтчГод_OnEnter(FieldName: String; Iter: Integer): logical;
var n:integer;
 ClearVariable(Buf);
 for n=1..5 do Buf[n]=Str(Year(Today)+n-4); od;
 n=Alternate("Выбор отчетного года",Buf,30,4,12);
 if n=0: ^False; fi;
 ОтчГод=Int(Buf[n]);
 --Период="ПЕРИОД."+Str(ОтчГод);
 Очистить;
-- if Name_A(Период)=" ": Message("Отсутствует аналитический признак "+Период,mtError); fi;
 Return False;
end;

Func УслВал_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
var tmp:N;
 tmp=Saldo("*'"+Value,1.1.100);
 Return True;
end;

Proc УслВал_OnExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func УслВал_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var n:i;
 ClearVariable(Buf);
 for Currencies Cur="*" do
  n=n+1;
  Buf[n]=Cur;
 od;
 n=Alternate("Выбор валюты",Buf,-1,1,12);
 if not n=0:
    Cur=Раб.Бюджет2005.Объединить_Диалог(УслВал,Buf[n],"|=ИЛИ;&~=И ИСКЛЮЧИТЬ;_=ЗАМЕНИТЬ","_");
    if Раб.Бюджет2005.HideEditor: Template.HideEditor(False); УслВал=Cur; Очистить; fi;
   else
    Template.HideEditor(False);
 fi;
 Return Cur;
end;

Func A_OnEnter(FieldName: String; Iter: Integer): logical;
 if Проводить: ^False; fi;
 InsertFrame(Настр,Iter+1);
 Очистить;
 Return False;
end;

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
 if Проводить: ^False; fi;
 DeleteFrame(Настр,Iter);
 НеПустаяНастр;
 Очистить;
 Return False;
end;

Proc Field_onExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func УслСч_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
var Ret:N;
 Try
  Ret=Saldo(Value,1.1.100);
 Except
  Raise;
  ^False;
 end;
 Настр[Iter].ИсклСправ="";
 Return True;
end;

Func УслСч_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:S;
var Iter:I;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 tmp=Раб.КБК.Список("","","СЧ9 ВД+? КОСГУ+? ИГ");
 if tmp="": ^Cur; fi;
 if Match(tmp,"?.???.??.?00"): tmp=SubStr(tmp,1,10)+"??";
   |Match(tmp,"?.???.??.??0"): tmp=SubStr(tmp,1,11)+"?";
 fi;
 if Match(tmp,"?."): tmp="*."+tmp+"???.??.???";
   |Match(tmp,"?.???."): tmp="*."+tmp+"??.???";
   |Match(tmp,"?.???.??."): tmp="*."+tmp+"???";
   |True: tmp="*."+tmp;
 fi;
 Настр[Iter].УслСч=Объединить(Настр[Iter].УслСч,tmp);
 Настр[Iter].ИсклСправ="";
 Return Cur;
end;

Func УслАн_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
var Ret:N;
 Try
  Ret=Saldo("{"+Value+"}",1.1.100);
 Except
  Raise;
  ^False;
 end;
 Return True;
end;

Func УслАн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:S;
var Iter:I;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 tmp=AnaElection("");
 if tmp="": ^Cur; fi;
 Настр[Iter].УслАн=Объединить(Настр[Iter].УслАн,tmp);
 Очистить;
 Return Cur;
end;

Func ЗаклСч5_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=Раб.КБК.Список("*.?.40?.30.*","","СЧ5");
 if tmp="": ^False; fi;
 Настр[Iter].ЗаклСч5=tmp;
 Очистить;
 Return False;
end;

Func Раздел_ДК_OnEnter(FieldName: String; Iter: Integer): logical;
 Настр[Iter].Раздел_ДК=not Настр[Iter].Раздел_ДК;
 Очистить;
 Return False;
end;

Func ИсклСправ_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Настр[Iter].УслСч="" : Message("Введите условие",mtError); Template.Field="УслСч"; Template.Frame=Iter; ^False; fi;
 tmp=ВыборСправ(Iter);
 Настр[Iter].ИсклСправ=Раб.Бюджет2005.Объединить(Настр[Iter].ИсклСправ,tmp,"|");
 Очистить;
 Return False;
end;

Proc ИсклСправ_OnExit(FieldName: String; Iter: Integer);
 Настр[Iter].ИсклСправ=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(Настр[Iter].ИсклСправ,"|");
 Очистить;
end;

Func ПризнОбщ_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("*&~ЗГ");
 if tmp="": ^False; fi;
 ПризнОбщ=Раб.Бюджет.ДобавитьПризнак(ПризнОбщ,tmp);
 Return False;
end;

Proc ПризнОбщ_OnExit(FieldName: String; Iter: Integer);
 ПризнОбщ=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(ПризнОбщ," ");
end;

Func Вал_База_OnEnter(FieldName: String; Iter: Integer): logical;
 Вал_База=BaseCurrency;
 Return False;
end;

Proc Вал_База_OnExit(FieldName: String; Iter: Integer);
 Вал_База=BaseCurrency;
end;

Func Сум_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var УслСч,УслАн,Rpt:S;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 УслСч=if(Match(Позиции[Iter].СчДеб,"*.?.40?.30.000"),Позиции[Iter].СчКре,Позиции[Iter].СчДеб);
 УслАн=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(Позиции[Iter].Призн," ","&");
 --УслАн=Раб.Бюджет2005.Объединить(УслАн,"~ЗГ","&");
 Rpt='"'+PlanVar("Общие")+'\Отчеты\Ф0503130.lst"."Расшифр';
 if Позиции[Iter].Вал="USD" or Позиции[Iter].Вал="EUR" or Позиции[Iter].Вал="РУБ":
    Rpt=Rpt+' ('+УслВал+')"';
    Report(Rpt,ДН,ДК,УслСч,УслАн);
   else
    Rpt=Rpt+'"';
    Report(Rpt,ДН,ДК,УслСч,УслАн);
 fi;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--
--Обработчики событий объектов шаблона-----
Proc cbПроводить_OnChange(Sender: String);
var n:i;
 if Проводить:
    Проводить=Проверить;
   else
    n=EnqOkCancel("Вы уверены, что хотите исключить документ из обработки ?");
    if n=cmCancel: Проводить=True; fi;
 fi;
 cbПроводить.State=Проводить;
 Оформление;
 EditorApply;
end;

Proc btnРасчет_OnClick(Sender: String);
 if not ПроверитьНастр: Exit; fi;
 Расчет;
end;

Proc btnУмолчание_OnClick(Sender: String);
var num :Integer;
 if Sender="btnУмолчание": if EnqOkCancel("Восстановить настройку по умолчанию ?",mtWarning)=cmCancel: Exit; fi; fi;
 num=0;
 ClearVariable(Buf);
 Buf[1]="Настройка для казенного учреждения (КУ) (инструкция 162н)";
 Buf[2]="Настройка для финансового органа (ФО) (инструкция 162н)";
 Buf[3]="Настройка для КУ + настройка для ФО (инструкция 162н)";
 Buf[4]="Настройка для бюджетного (БУ) учреждения  (инструкция 174н)";
 Buf[5]="Настройка для автономного (АУ) учреждения  (инструкция 183н)";
 while num=0 do num=Alternate("Выберите настройку...", Buf, -1, 1 ,12); end;
 УслВал="";
 ClearVariable(Настр);
 if num=1 or num=3:
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.401.10.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.401.20.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.1.304.05.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.304.04.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=True;  Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.304.06.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=True;  Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.210.02.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
 fi;
 if num=2 or num=3:
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.402.20.*"; Настр[Настр].ЗаклСч5="402.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.402.10.*"; Настр[Настр].ЗаклСч5="402.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.309.00.*"; Настр[Настр].ЗаклСч5="402.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.308.00.*"; Настр[Настр].ЗаклСч5="402.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.212.00.*"; Настр[Настр].ЗаклСч5="402.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.211.00.*"; Настр[Настр].ЗаклСч5="402.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
 fi;
 if num=4 or num=5:
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.304.04.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=True;  Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.304.06.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=True;  Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.401.10.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
    InsertFrame(Настр,Настр+1); Настр[Настр].УслСч="*.?.401.20.*"; Настр[Настр].ЗаклСч5="401.30"; Настр[Настр].Раздел_ДК=False; Настр[Настр].ИсклСправ="";
 fi;
 Очистить;
end;

--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 FlagInit=True;
end;

Proc AfterOpen(Destroy: Logical);
 Инициализация;
 Оформление;
 FlagInit=False;
end;

Proc OnRead;
 if НоваяЗапись: 
    Вал_База=BaseCurrency;
    Проводить=False;
    ClosedModFob=False;
    if Настр=0: btnУмолчание_OnClick("OnRead"); fi;
 fi;
 НеПустаяНастр;
 if not FlagInit: Оформление; fi;
end;

Func OnVerify: Logical;
 ДатаОпер=Dat(31,12,ОтчГод);
-- Период="ПЕРИОД."+Str(ОтчГод);
 Return True;
end;
--Обработчики событий шаблона -----
--




Конец
