БланкСШаблоном "Смета доходов и расходов", Редактор РПО_СМЕТА_ДОХОД_РАСХОД;
var ColBase:I=10;
var ColBase1:I=5;

Refr:L=[False];

var ПБС_:string=ПБС.КорИмя;
var AddDoh:S=if(Проводить,'','+');
var AddRash:S=if(Проводить,'','+');
var DelDoh:S=if(Проводить,'','-');
var DelRash:S=if(Проводить,'','-');

btnPrint:Object;
btnПФХД:Object;

var БК_К:S;

var Секц:S;
var Поле:S;

--Var РассчFlag:L=(ПОЗИЦИИ_Д+ПОЗИЦИИ_Р<>0);
var fПС:L=[True];

var typs[]:S;

var ГОД_Д[]:N=ДОХОД[$].СУММГОД_ДОИЗМ+ДОХОД[$].СУММГОД_ИЗМ;
var ГОД_Р[]:N=РАСХОД[$].СУММГОД_ДОИЗМ+РАСХОД[$].СУММГОД_ИЗМ;

var БК_Д[]:S=ПОЗИЦИИ_Д[$].БК+'.'+ПОЗИЦИИ_Д[$].КОСГУ;
var БК_Р[]:S=ПОЗИЦИИ_Р[$].БК+'.'+ПОЗИЦИИ_Р[$].КОСГУ;

var ПРИЗНАК_Д[]:S=ДОХОД[$].ПРИЗНАК;
var ПРИЗНАК_Р[]:S=РАСХОД[$].ПРИЗНАК;

var Def_Сч_Деб_Д:S='507.10';
var Def_Сч_Кре_Д:S='504.10';
var Def_Сч_Деб_Р:S='504.10';
var Def_Сч_Кре_Р:S='506.10';

var Mask_Сч_Деб_Д:S='*.?.507.??.*';
var Mask_Сч_Кре_Д:S='*.?.504.??.*';
var Mask_Сч_Деб_Р:S='*.?.504.??.*';
var Mask_Сч_Кре_Р:S='*.?.506.??.*';

Дубл_БК_Д:L;
Дубл_БК_Р:L;
Дубл_КОСГУ_Д:L;
Дубл_КОСГУ_Р:L;
Дубл_ПРИЗНАК_Д:L;
Дубл_ПРИЗНАК_Р:L;

cbПроводить: Object;

Шапка: секция;
Организации: Секция;

Изм: Секция;
Доход_строки:Секция;
Доход_шапка:Секция;
Расход_строки:Секция;
Расход_шапка:Секция;
Доход_итог:Секция;
Расход_итог:Секция;
--Доход_с_строки:Секция;
--Доход_с_шапка:Секция;
--Расход_с_строки:Секция;
--Расход_с_шапка:Секция;
--Доход_с_итог:Секция;
--Расход_с_итог:Секция;

BufColorBg[]:I;
BufField[]:S;
Buf[]:S;
Ключ[]:S;

Init:L;

-- вызываемые процедуры бланка
Proc КонтрольПС;
var Iter,n:I;
 Раб.Обмен.Очистить;
 Раб.Обмен.Sender="ДОКУМЕНТЫ.ЛБО.СМЕТА_ДОХОД_РАСХОД";
 Раб.Обмен.Recipient="КОНСТРУКТОР_СЧЕТОВ";
 Раб.Обмен.BufI1[1]=0; --Тип плана счетов
 Раб.Обмен.BufI1[2]=1; --Вид деятельности
 Раб.Обмен.BufI1[3]=0; --Показывать существующие счета
 Раб.Обмен.BufI1[4]=0; --Отключить контроль вида деятельности
 n=0;
 for Iter=1..ДОХОД do
  if РАБ.БЮДЖЕТ2005.ТипКБКСчета(ДОХОД[Iter].БК)='КД' and not ДОХОД[Iter].КОСГУ="" and not ДОХОД[Iter].СУММГОД_Изм=0:
     n=n+1;
     Раб.Обмен.BufS1[n]="КД"+" "+ДОХОД[Iter].БК+" "+ДОХОД[Iter].КОСГУ;
  fi;
 od;
 if IsBlankOpen("КОНСТРУКТОР_СЧЕТОВ"): Close("КОНСТРУКТОР_СЧЕТОВ"); fi;
 if not IsBlankOpen("КОНСТРУКТОР_СЧЕТОВ"): OpenBlank("КОНСТРУКТОР_СЧЕТОВ",True); fi;

 Раб.Обмен.Очистить;
 Раб.Обмен.Sender="ДОКУМЕНТЫ.ЛБО.СМЕТА_ДОХОД_РАСХОД";
 Раб.Обмен.Recipient="КОНСТРУКТОР_СЧЕТОВ";
 Раб.Обмен.BufI1[1]=0; --Тип плана счетов
 Раб.Обмен.BufI1[2]=1; --Вид деятельности
 Раб.Обмен.BufI1[3]=0; --Показывать существующие счета
 Раб.Обмен.BufI1[4]=0; --Отключить контроль вида деятельности
 n=0;
 for Iter=1..РАСХОД do
  if РАБ.БЮДЖЕТ2005.ТипКБКСчета(ДОХОД[Iter].БК)='ФКР' and not РАСХОД[Iter].КОСГУ="" and not РАСХОД[Iter].СУММГОД_Изм=0:
     n=n+1;
     Раб.Обмен.BufS1[n]="ФКР"+" "+РАСХОД[Iter].БК+" "+РАСХОД[Iter].КОСГУ;
  fi;
 od;
 if IsBlankOpen("КОНСТРУКТОР_СЧЕТОВ"): Close("КОНСТРУКТОР_СЧЕТОВ"); fi;
 if not IsBlankOpen("КОНСТРУКТОР_СЧЕТОВ"): OpenBlank("КОНСТРУКТОР_СЧЕТОВ",True); fi;

 Раб.Обмен.Очистить;
 Раб.Обмен.Sender="ДОКУМЕНТЫ.ЛБО.СМЕТА_ДОХОД_РАСХОД";
 Раб.Обмен.Recipient="КОНСТРУКТОР_СЧЕТОВ";
 Раб.Обмен.BufI1[1]=0; --Тип плана счетов
 Раб.Обмен.BufI1[2]=1; --Вид деятельности
 Раб.Обмен.BufI1[3]=0; --Показывать существующие счета
 Раб.Обмен.BufI1[4]=0; --Отключить контроль вида деятельности
 n=0;
 for Iter=1..ДОХОД do
  if РАБ.БЮДЖЕТ2005.ТипКБКСчета(ДОХОД[Iter].БК)='КИФД' and not ДОХОД[Iter].КОСГУ="" and not ДОХОД[Iter].СУММГОД_Изм=0:
     n=n+1;
     Раб.Обмен.BufS1[n]="КИФД"+" "+ДОХОД[Iter].БК+" "+ДОХОД[Iter].КОСГУ;
  fi;
 od;
 for Iter=1..РАСХОД do
  if РАБ.БЮДЖЕТ2005.ТипКБКСчета(ДОХОД[Iter].БК)='КИФД' and not РАСХОД[Iter].КОСГУ="" and not РАСХОД[Iter].СУММГОД_Изм=0:
     n=n+1;
     Раб.Обмен.BufS1[n]="КИФД"+" "+РАСХОД[Iter].БК+" "+РАСХОД[Iter].КОСГУ;
  fi;
 od;
 if IsBlankOpen("КОНСТРУКТОР_СЧЕТОВ"): Close("КОНСТРУКТОР_СЧЕТОВ"); fi;
 if not IsBlankOpen("КОНСТРУКТОР_СЧЕТОВ"): OpenBlank("КОНСТРУКТОР_СЧЕТОВ",True); fi;
 Раб.Обмен.Очистить;
end;


Proc СчитатьОформление;
var Obj:Object;
var r,c,rr,cc,o,n,BgColor:i;
var objn,Field:S;
ClearVariable(BufColorBg);n=0;
ClearVariable(BufField);
for o=-7 to 7 do
 if o=-7 then objn='Шапка';
   |o=7 then objn='Изм';
   |o=0 then objn='Организации';
   else if o>0 then objn='Доход';
        else objn='Расход'; fi;
        if Abs(o)=1 then objn=objn+'_шапка';
        |Abs(o)=2 then objn=objn+'_строки';
        |Abs(o)=3 then objn=objn+'_итог';
        fi;

    fi;
 if FindObject(objn,Obj) then
   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,""));
        Field=asString(Obj.Cell(r,c,CellContents,""));
        if SearchInArray(BufField,Field,True)=-1:
           n=InsertInArraySort(BufField,Field); 
           InsertInArray(BufColorBg,n,BgColor);
        fi;
    od;
   od;
   fi;
od;
end;

Proc Непусто;
if ДОХОД=0 then InsertFrame(Доход,Доход+1); fi;
if РАСХОД=0 then InsertFrame(Расход,Расход+1); fi;
end;

Proc ClearEmpty;
var n:i;
 n=1; 
 While n<=Доход do
  if Доход[n].ИСТ1+Доход[n].БК+Доход[n].КОСГУ+Доход[n].ПРИЗНАК+Доход[n].КИФ+Доход[n].ПРИМ='' and Доход[n].СУММГОД_ИЗМ=0: DeleteFrame(Доход,n);
   else 
    n=n+1; 
  fi; 
 od;
 n=1; 
 While n<=Расход do
  if РАсход[n].НАПР1+РАсход[n].БК+РАсход[n].КОСГУ+РАсход[n].ПРИЗНАК+РАсход[n].КНИ+РАсход[n].ПРИМ='' and РАсход[n].СУММГОД_ИЗМ=0: DeleteFrame(РАсход,n);
   else 
    n=n+1; 
  fi; 
 od;
--Непусто;
end;

Proc ОформлениеПр;
var Obj:Object;
var r,c,rr,cc,o,n,BgColor:i;
var objn:S;

--if Проводить then btnРасчет.Enabled=False; else btnРасчет.Enabled=True;  fi;
--if Проводить then cbНалог.Enabled=False; else cbНалог.Enabled=True;  fi;
btnПФХД.Enabled=BlankExist('ДОКУМЕНТЫ.ЛБО.ПЛАН_ФХД');
for o=-7 to 7 do
 if o=-7 then objn='Шапка';
   |o=7 then objn='Изм';
   |o=0 then objn='Организации';
   else if o>0 then objn='Доход';
        else objn='Расход'; fi;
        if Abs(o)=1 then objn=objn+'_шапка';
        |Abs(o)=2 then objn=objn+'_строки';
        |Abs(o)=3 then objn=objn+'_итог';
--          |Abs(o)=4 then objn=objn+'_с_шапка';
--          |Abs(o)=5 then objn=objn+'_с_строки';
--          |Abs(o)=6 then objn=objn+'_с_итог';
        fi;

    fi;
 if FindObject(objn,Obj) then
   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,if(BufColorBg[n]=coTeal,coWhite,coBlack));
           Obj.Cell(r,c,CellBgColor,BufColorBg[n]); 
           Obj.Cell(r,c,CellReadOnly,BufColorBg[n]=coTransparent);
        fi;
       fi;
    od;
   od;
   fi;
od;
end;


Proc ОбновПризнЛС;
var i,nn:I;
Var tmp:S;

if ПБС_СЧЕТ=nil then Exit; fi;

nn=RecSignsCount("БАНК_СЧЕТА",ПБС_СЧЕТ);
for i=1..nn do
 tmp=RecSign("БАНК_СЧЕТА",ПБС_СЧЕТ,i);
  if Substr(Trim(tmp),1,3)='ЛС.' then
    ПРИЗН_ЛС=tmp;
  fi;
 od;


end;


Proc ИмяУмолч(Force:L;typN:S;Iter:I);
var varn,kod:S;
varn=Раб.Бюджет2005.ТипКБКСчета(GetVariableS(typN+'['+Str(Iter)+'].БК'));
if varn='ФКР' then kod=GetVariableS(typN+'['+Str(Iter)+'].КОСГУ');
                 varn='ЭКР';
  else
  kod=GetVariableS(typN+'['+Str(Iter)+'].БК')+GetVariableS(typN+'['+Str(Iter)+'].КОСГУ');
  kod=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов (kod,'.','');
  kod='000'+Substr(kod,4,17);
  fi;

varn=varn+'2006';
kod=РАБ.Бюджет.НаимКБК(varn,kod);
if kod='':
  exit;
fi;

if UP(typN)='ДОХОД' then 
  if (GetVariableS(typN+'['+Str(Iter)+'].ИСТ1')='') or (Force and GetVariableS(typN+'['+Str(Iter)+'].ИСТ1')<>kod) then PutVariableS(typN+'['+Str(Iter)+'].ИСТ1',kod); fi;
 else 
  if (GetVariableS(typN+'['+Str(Iter)+'].НАПР1')='') or (Force and GetVariableS(typN+'['+Str(Iter)+'].НАПР1')<>kod) then PutVariableS(typN+'['+Str(Iter)+'].НАПР1',kod); fi;
fi;

end;

Proc Обнов(Iter:I; Typ:S; Mode:S);
var i,f,t:I;
var Счет,mask:S;
if Iter>0 then f=Iter; t=Iter; 
  else f=1;
  if Typ='Д' then t=ДОХОД;
    |Typ='Р' then t=РАСХОД;
    fi;
  fi;

РАБ.КСА.Начать;
for i=f to t do

  if Typ='Д' then 
       ИмяУмолч(False,'Доход',i);
       if not (ДОХОД[i].БК="" or ДОХОД[i].ВД="" or ДОХОД[i].КОСГУ="") then
         if Сч_Деб_Д <> '' then
            Счет = ДОХОД[i].БК+'.' + ДОХОД[i].ВД +'.'+Сч_Деб_Д+'.'+ДОХОД[i].КОСГУ;
            if ДОХОД[i].СЧЕТ_ДЕБ <> Счет:
               ДОХОД[i].СЧЕТ_ДЕБ = Счет;
            fi;
            Раб.КСА.Добавить(ДОХОД[i].СЧЕТ_ДЕБ);
         fi;
         if Сч_Кре_Д<>'' then
            Счет=ДОХОД[i].БК+'.' + ДОХОД[i].ВД +'.'+Сч_КРЕ_Д+'.'+ДОХОД[i].КОСГУ;
            if ДОХОД[i].СЧЕТ_КРЕ <> Счет:
               ДОХОД[i].СЧЕТ_КРЕ = Счет;
            fi;

            Раб.КСА.Добавить(ДОХОД[i].СЧЕТ_КРЕ);
         fi;

       fi;
       if Name_S(Доход[i].СЧЕТ_ДЕБ)<>" " and NAME_S(Доход[i].СЧЕТ_КРЕ)<>" " then
          Mask=РАБ.БЮДЖЕТ.НаборПризнаков(Доход[i].СЧЕТ_ДЕБ, Доход[i].СЧЕТ_КРЕ, "");
          Mask=Раб.Бюджет2005.Объединить(Mask,"НАЛОГ","|");
          Доход[i].Признак=Раб.Бюджет.МухиОтКотлет(Доход[i].Признак,Mask);
       fi;
    |Typ='Р' then
       ИмяУмолч(False,'Расход',i);
       if not (Расход[i].БК="" or Расход[i].ВД="" or Расход[i].КОСГУ="") then
         if Сч_Деб_Р<>'' then
            Расход[i].СЧЕТ_ДЕБ=Расход[i].БК+'.'+Расход[i].ВД+'.'+Сч_Деб_Р+'.'+Расход[i].КОСГУ;
            Раб.КСА.Добавить(Расход[i].СЧЕТ_ДЕБ);
         fi;
         if Сч_Кре_Р<>'' then
            Расход[i].СЧЕТ_КРЕ=Расход[i].БК+'.'+Расход[i].ВД+'.'+Сч_КРЕ_Р+'.'+Расход[i].КОСГУ;
            Раб.КСА.Добавить(Расход[i].СЧЕТ_КРЕ);
         fi;
       fi;
       if Name_S(Расход[i].СЧЕТ_ДЕБ)<>" " and NAME_S(Расход[i].СЧЕТ_КРЕ)<>" " then
          Mask=РАБ.БЮДЖЕТ.НаборПризнаков(Расход[i].СЧЕТ_ДЕБ, Расход[i].СЧЕТ_КРЕ, "");
          Mask=Раб.Бюджет2005.Объединить(Mask,"НАЛОГ","|");
          Расход[i].Признак=Раб.Бюджет.МухиОтКотлет(Расход[i].Признак,Mask);
       fi;

    fi;
  od;
if Раб.КСА.Закончить(True): Message("Добавление новых счетов закончено"); fi;
end;

Func ПроверитьНаборСправ:L;
var OWA,OA,Iter,z:I;
var Error:L;
var tmp:S;
 ClearVariable(Ключ);
 ClearVariable(Buf);
 for Iter=1..Расход do
  Расход[Iter].Признак=Раб.Бюджет2005.СортироватьНаборСлов(Расход[Iter].Признак," ",True);
  tmp=Раб.Бюджет2005.ПризнВСправ(Расход[Iter].Признак," ","");
  z=SearchInArray(Ключ,Расход[Iter].БК+"."+Расход[Iter].ВД+"."+Расход[Iter].КОСГУ,True);
  if z=-1:
     z=InsertInArraySort(Ключ,Расход[Iter].БК+"."+Расход[Iter].ВД+"."+Расход[Iter].КОСГУ);
     InsertInArray(Buf,z,tmp);
    else
     if not Buf[z]=tmp:
        Message("Различный набор аналитических справочников для КБК="+ExtractWord(1,Ключ[z]," "),mtError);
        Template.Name="Расход";
        Template.Field="Признак_Р";
        Template.Frame=Iter;
        ^False;
     fi;
  fi;
 od;
 Error=False;
 if IsChanging then
  OWA=OpenWorkArea('РПО_СМЕТА_ДОХОД_РАСХОД','Д','(not IsChanging) and (ГОД_СМЕТЫ="'+ГОД_СМЕТЫ+'") and (НОМЕР_СМЕТЫ="'+НОМЕР_СМЕТЫ+'") and (ПРИЗН_ЛС="'+ПРИЗН_ЛС+'")');
  try
   if Records(OWA)>0 then
    OA=OpenArray(OWA,1,'Расход','БК');
    try
     for Iter=1..Records(OA) do
      tmp=Раб.Бюджет2005.ПризнВСправ(GetFieldS(OA,Iter,'Признак')," ","");
      z=SearchInArray(Ключ,GetFieldS(OA,Iter,'БК')+"."+GetFieldS(OA,Iter,'ВД')+"."+GetFieldS(OA,Iter,'КОСГУ'),True);
      if z<>-1 then
       if not (Buf[z]=tmp) and (not Error) then
         Message("Расхождение со сметой в наборе аналитических справочников для КБК="+ExtractWord(1,Ключ[z]," "),mtError);
         Template.Name="Расход";
         Template.Field="Признак_Р";
         Error=True;
       fi;
      fi;
     od;
    Finally
    CloseWorkArea(OA);
    end;
   fi;
  finally
  CloseWorkArea(OWA);
  end;
 fi;
 if Error then ^False; fi;

 ClearVariable(Ключ);
 ClearVariable(Buf);
 for Iter=1..Доход do
  Доход[Iter].Признак=Раб.Бюджет2005.СортироватьНаборСлов(Доход[Iter].Признак," ",True);
  tmp=Раб.Бюджет2005.ПризнВСправ(Доход[Iter].Признак," ","");
  tmp=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске (tmp,' ','НАЛОГ',' ');
  z=SearchInArray(Ключ,Доход[Iter].БК+"."+Доход[Iter].ВД+"."+Доход[Iter].КОСГУ,True);
  if z=-1:
     z=InsertInArraySort(Ключ,Доход[Iter].БК+"."+Доход[Iter].ВД+"."+Доход[Iter].КОСГУ);
     InsertInArray(Buf,z,tmp);
    else
     if not Buf[z]=tmp:
        Message("Различный набор аналитических справочников для КБК="+ExtractWord(1,Ключ[z]," "),mtError);
        Template.Name="Доход";
        Template.Field="Признак_Д";
        Template.Frame=Iter;
        ^False;
     fi;
  fi;
 od;
 Error=False;
 if IsChanging then
  OWA=OpenWorkArea('РПО_СМЕТА_ДОХОД_РАСХОД','Д','(not IsChanging) and (ГОД_СМЕТЫ="'+ГОД_СМЕТЫ+'") and (НОМЕР_СМЕТЫ="'+НОМЕР_СМЕТЫ+'") and (ПРИЗН_ЛС="'+ПРИЗН_ЛС+'")');
  try
   if Records(OWA)>0 then
    OA=OpenArray(OWA,1,'Доход','БК');
    try
     for Iter=1..Records(OA) do
      tmp=Раб.Бюджет2005.ПризнВСправ(GetFieldS(OA,Iter,'Признак')," ","");
      tmp=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске (tmp,' ','НАЛОГ',' ');
      z=SearchInArray(Ключ,GetFieldS(OA,Iter,'БК')+"."+GetFieldS(OA,Iter,'ВД')+"."+GetFieldS(OA,Iter,'КОСГУ'),True);
      if z<>-1 then
       if not (Buf[z]=tmp) and (not Error) then
         Message("Расхождение со сметой в наборе аналитических справочников для КБК="+ExtractWord(1,Ключ[z]," "),mtError);
         Template.Name="Доход";
         Template.Field="Признак_Д";
         Error=True;
       fi;
      fi;
     od;
    Finally
    CloseWorkArea(OA);
    end;
   fi;
  finally
  CloseWorkArea(OWA);
  end;
 fi;
 if Error then ^False; fi;
 ^True;
end;


Func ПроверитьСубс:L;
var Iter,z:I;
var Error:L;
var tmp:S;
 ClearVariable(Buf);
 ClearVariable(Ключ);
 for Iter=1..Расход do
  tmp = Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Расход[Iter].Признак," ","СУБС"," ");
  z = SearchInArray(Buf, tmp, True);
  if z = -1:
     z = InsertInArraySort(Buf, tmp);
  fi;
 od;

 for Iter=1..Доход do
  tmp = Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Доход[Iter].Признак," ","СУБС"," ");
  z = SearchInArray(Ключ, tmp, True);
  if z = -1:
     z = SearchInArray(Buf, tmp, True);
     if z = -1:
        if EnqOkCancel("Признак "+tmp+" отсутствует в расходах, продолжить?", mtWarning) = cmOk:
           z = InsertInArraySort(Ключ, tmp);
          else
           ^False;
        fi;
       else
        DeleteFromArray(Buf,z);
        z = InsertInArraySort(Ключ, tmp);
     fi;
  fi;
 od;
 for Iter = 1 .. LengthOfArray(Buf) do
   if EnqOkCancel("Признак "+Buf[Iter]+" отсутствует в расходах, продолжить?", mtWarning)<>cmOk:
     ^False;
   fi;
 od;
 ^True;
end;


Func ПроверитьУникальность:L;
var Iter,z:I;
 ClearVariable(Ключ);
 ClearVariable(Buf);
 for Iter=1..Доход do
  z=SearchInArray(Ключ,Доход[Iter].БК+"."+Доход[Iter].ВД+"."+Доход[Iter].КОСГУ+" "+Доход[Iter].Признак,True);
  if z=-1:
     z=InsertInArraySort(Ключ,Доход[Iter].БК+"."+Доход[Iter].ВД+"."+Доход[Iter].КОСГУ+" "+Доход[Iter].Признак);
     InsertInArray(Buf,z,Str(Iter));
    else
     Message("Ошибка! Повторный ввод данных. ^M Поступления, строка N"+Str(Iter)+"=Строке N"+Buf[z],mtError);
     Template.Name="Доход_строки";
     Template.Field="БК";
     Template.Frame=Iter;
     ^False;
  fi;
 od;
 ClearVariable(Ключ);
 ClearVariable(Buf);
 for Iter=1..Расход do
  z=SearchInArray(Ключ,Расход[Iter].БК+"."+Расход[Iter].ВД+"."+Расход[Iter].КОСГУ+" "+Расход[Iter].Признак,True);
  if z=-1:
     z=InsertInArraySort(Ключ,Расход[Iter].БК+"."+Расход[Iter].ВД+"."+Расход[Iter].КОСГУ+" "+Расход[Iter].Признак);
     InsertInArray(Buf,z,Str(Iter));
    else
     Message("Ошибка! Повторный ввод данных. ^M Выбытия, строка N"+Str(Iter)+"=Строке N"+Buf[z],mtError);
     Template.Name="Расход_строки";
     Template.Field="БК";
     Template.Frame=Iter;
     ^False;
  fi;
 od;
 ^True;
end;


Func ОбязаловкаСтр(Iter:I;Typ:S;Msg:L):L;
if typ='Д' then
     if ДОХОД[Iter].БК='' then
       if Msg then Message('Заполните код бюджетной классификации',mtError);
       Template.Name='ДОХОД_строки';
       Template.Field="БК"; Template.Frame=Iter;
       fi;
       ^False;
     fi;
     if ДОХОД[Iter].КОСГУ='' then
       if Msg then Message('Заполните код бюджетной классификации',mtError);
       Template.Name='ДОХОД_строки';
       Template.Field="КОСГУ"; Template.Frame=Iter;
       fi;
       ^False;
     fi;
     if ДОХОД[Iter].ВД='' then
       if Msg then Message('Заполните вид средств',mtError);
       Template.Name='ДОХОД_строки';
       Template.Field="ВД"; Template.Frame=Iter;
       fi;
       ^False;
     fi;
  else
     if Расход[Iter].БК='' then
       if Msg then Message('Заполните код бюджетной классификации',mtError);
       Template.Name='Расход_строки';
       Template.Field="БК"; Template.Frame=Iter;
       fi;
       ^False;
     fi;
     if Расход[Iter].КОСГУ='' then
       if Msg then Message('Заполните код бюджетной классификации',mtError);
       Template.Name='Расход_строки';
       Template.Field="КОСГУ"; Template.Frame=Iter;
       fi;
       ^False;
     fi;
     if Расход[Iter].КОСГУ='' then
       if Msg then Message('Заполните вид средств',mtError);
       Template.Name='Расход_строки';
       Template.Field="ВД"; Template.Frame=Iter;
       fi;
       ^False;
     fi;
  fi;
^True;
end;

Func Обязаловка(Strong:L):L;
var OWA,i:Integer;
  if НОМЕР_СМЕТЫ='' then Message('Введите номер сметы', mtError); Template.Field='НОМЕР_СМЕТЫ'; ^False;  fi;
  if ДАТА_СМЕТЫ=1.1.100 then Message('Введите дату сметы', mtError); Template.Field='ДАТА_СМЕТЫ'; ^False;  fi;
  if (НОМЕР_ИЗМ='') and IsChanging then Message('Введите номер изменения к смете', mtError); Template.Field='НОМЕР_ИЗМ'; ^False;              fi;
  if (ДАТА_ИЗМ=1.1.100) and IsChanging then Message('Введите дату изменения к смете', mtError);  Template.Field='ДАТА_ИЗМ'; ^False;  fi;
  if ГОД_СМЕТЫ<>'' and (Length(ГОД_СМЕТЫ)<>4 or Int(ГОД_СМЕТЫ)=0) then Message('Введите год в 4х значном формате', mtError); Template.Field='ГОД_СМЕТЫ'; ^False; fi;
  if (Д<>1.1.100) and ГОД(Д)<>INT(ГОД_СМЕТЫ) then  Message('Дата операции должна быть в годе сметы', mtError); Template.Field='Д'; ^False; fi;
  if not Strong then ^True; fi;
  if Проводить and ПРИЗН_ЛС='' then Message('Выберете аналитический признак счета', mtError); Template.Field='ПРИЗН_ЛС'; ^False; fi;
  if Д=1.1.100 then  Message('Выберете дату операции', mtError); Template.Field='Д'; ^False; fi;



  if Сч_Деб_Д='' then Message('Заполните счет дебета для поступлений', mtError); Template.Field='Сч_Деб_Д'; ^False; fi;
  if Сч_Кре_Д='' then Message('Заполните счет кредита для поступлений', mtError); Template.Field='Сч_Кре_Д'; ^False; fi;
  if Сч_Деб_Р='' then Message('Заполните счет дебета для выбытий', mtError); Template.Field='Сч_Деб_Р'; ^False;fi;
  if Сч_Кре_Р='' then Message('Заполните счет кредита для выбытий', mtError); Template.Field='Сч_Кре_Р'; ^False;fi;
  РАБ.БЮДЖЕТ.ПроверитьПризнакиНачать;
  for i=1 to Доход do
    if not ОбязаловкаСтр(i,'Д', true) then ^False; fi;
       if not Correspond(Доход[i].СЧЕТ_ДЕБ,Доход[i].СЧЕТ_КРЕ):
         Message("Счета не могут корреспондировать "+Доход[i].СЧЕТ_ДЕБ+"/"+Доход[i].СЧЕТ_КРЕ,mtError);
         Template.Name='ДОХОД_строки';
         Template.Field="СЧЕТ_ДЕБ"; Template.Frame=i;
         ^False; fi;

       if РАБ.БЮДЖЕТ.ПроверитьПризнакиОбязательные(Доход[i].Счет_Деб,Доход[i].Счет_Кре,Доход[i].Признак,"")=False: Template.Name='ДОХОД_строки'; Template.Field="Признак_Д"; Template.Frame=i; ^False; fi;
       if РАБ.БЮДЖЕТ.ПроверитьПризнакиСвязанные(Доход[i].Счет_Деб,Доход[i].Счет_Кре,Доход[i].Признак,"")=False: Template.Name='ДОХОД_строки'; Template.Field="Признак_Д"; Template.Frame=i; ^False; fi;
    od;
  for i=1 to Расход do
    if not ОбязаловкаСтр(i,'Р', true) then ^False; fi;
    if not Correspond(Расход[i].СЧЕТ_ДЕБ,Расход[i].СЧЕТ_КРЕ):
       Message("Счета не могут корреспондировать "+Расход[i].СЧЕТ_ДЕБ+"/"+Расход[i].СЧЕТ_КРЕ,mtError);
       Template.Name='Расход_строки';
       Template.Field="СЧЕТ_ДЕБ"; Template.Frame=i;
       ^False;
    fi;
    if РАБ.БЮДЖЕТ.ПроверитьПризнакиОбязательные(Расход[i].Счет_Деб,Расход[i].Счет_Кре,Расход[i].Признак,"")=False:
       Template.Name='Расход_строки';
       Template.Field="Признак_Р";
       Template.Frame=i; 
       ^False;
    fi;
    if РАБ.БЮДЖЕТ.ПроверитьПризнакиСвязанные(Расход[i].Счет_Деб,Расход[i].Счет_Кре,Расход[i].Признак,"")=False:
       Template.Name='Расход_строки';
       Template.Field="Признак_Д";
       Template.Frame=i; 
       ^False;
    fi;
  od;
  if ПроверитьНаборСправ=False: ^False; fi;
  if ПроверитьУникальность=False: ^False; fi;
 ^True;
end;


Proc ПредВерсия;
var Iter,z:I;
var tmp:N;
var УслСч,УслАн:S;
var ДН,ДК:Date;
if Д=1.1.100 then exit; fi;
if Int(ГОД_СМЕТЫ)=0 then ДН=Dat(01,01,Year(Д)); else ДН=Dat(01,01,Int(ГОД_СМЕТЫ)); fi;
ДК=Д;
  --
  for Iter=1..Доход do
     if ОбязаловкаСтр(Iter,"Д",False) then
        Обнов(Iter,"Д",'');
        УслАн=Доход[Iter].Признак;
        if POS('НАЛОГ',УслАн)=0 then УслАн=Раб.Бюджет2005.Объединить(УслАн,'~НАЛОГ',' '); fi;
        УслАн=Раб.Бюджет2005.Объединить(УслАн,ПРИЗН_ЛС,' ');
        УслАн=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(УслАн," ","&");
        if Name_S(Доход[Iter].СЧЕТ_КРЕ) <> ' ' and Name_S(Доход[Iter].СЧЕТ_ДЕБ) <> ' ':
           УслСч = Доход[Iter].СЧЕТ_ДЕБ + "/" + Доход[Iter].СЧЕТ_КРЕ;
           tmp=Turn(УслСч+"{"+УслАн+"}",ДН,ДК);
--           if Проводить then tmp=ДОХОД[Iter].СУММГОД_ДОИЗМ-Доход[Iter].СУММГОД_ИЗМ; fi;
          else
           tmp=0;
        fi;
        if ДОХОД[Iter].СУММГОД_ДОИЗМ<>tmp then
           ДОХОД[Iter].СУММГОД_ДОИЗМ=tmp;
     --      ClearVariable(Позиции_Д);        ClearVariable(Позиции_Р);
        fi;
     fi;
  od;

  for Iter=1..Расход do
     if ОбязаловкаСтр(Iter,"Р",False) then
        Обнов(Iter,"Р",'');
        УслАн=Расход[Iter].Признак;
        УслАн=Раб.Бюджет2005.Объединить(УслАн,ПРИЗН_ЛС,' ');
        УслАн=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(УслАн," ","&");

        if Name_S(Расход[Iter].СЧЕТ_КРЕ) <> ' ' and Name_S(Расход[Iter].СЧЕТ_ДЕБ) <> ' ':
           УслСч = Расход[Iter].СЧЕТ_ДЕБ + "/" + Расход[Iter].СЧЕТ_КРЕ;
           tmp=Turn(УслСч+"{"+УслАн+"}",ДН,ДК);
--           if Проводить then tmp=РАСХОД[Iter].СУММГОД_ДОИЗМ-Расход[Iter].СУММГОД_ИЗМ; fi;
          else
           tmp=0;
        fi;
        if РАСХОД[Iter].СУММГОД_ДОИЗМ<>tmp then
           РАСХОД[Iter].СУММГОД_ДОИЗМ=tmp;
     --     ClearVariable(Позиции_Д);        ClearVariable(Позиции_Р);
        fi;
     fi;
  od;

end;

Proc ДобОтсутствПред(ТипК:S;Табл:S);
var x,y,nn,n:I;
var УслСч,УслАн,БК,ВД,КОСГУ,АН,Key:S;
var Тек:N;
var ДН,ДК:Date;
 if Д=1.1.100 then exit; fi;
 if Int(ГОД_СМЕТЫ)=0 then ДН=Dat(01,01,Year(Д)); else ДН=Dat(01,01,Int(ГОД_СМЕТЫ)); fi;
 ДК=Д+1;
 УслСч='(*.'+if(Табл='Расх',Сч_Деб_Р+'.*|*.'+Сч_Кре_Р,Сч_Деб_Д+'.*|*.'+Сч_Кре_Д)+'.*)&';
 Раб.Бюджет2005.РежимМаски="?";
 if ТипК='ФКР'   :УслСч=УслСч+Раб.Бюджет2005.МаскаСчетаФКР; x=20;
   |ТипК='КД'    :УслСч=УслСч+Раб.Бюджет2005.МаскаСчетаКД;  x=22;
   |True         :УслСч=УслСч+Раб.Бюджет2005.МаскаСчетаКИФД;x=23;
 fi;
 УслАн=Призн_ЛС;
 ClearVariable(Buf);

 ShowProgress(nn*2,"Расчет....");
 try
   --Собираем использованные КБК
   for Transaction n=УслСч+'{'+УслАн+'}',ДН,ДК do
       БК=Раб.Бюджет2005.ВзятьКодСчета(TransDeb(n),ТипК,"КБК",False);
       ВД=Раб.Бюджет2005.ВзятьКодСчета(TransDeb(n),ТипК,"ВД",False);
       КОСГУ=Раб.Бюджет2005.ВзятьКодСчета(TransDeb(n),ТипК,"КОСГУ",False);
       Key=Раб.Бюджет2005.Объединить(БК + " " + ВД + " " + КОСГУ, Раб.Бюджет2005.СортироватьНаборСлов(TransSigns(n), " ", True)," ");
--       Key=Раб.Бюджет2005.Объединить(TransDeb(n),TransSigns(n)," ");
       if SearchInArray(Buf,Key,True)=-1 then
        InsertInArraySort(Buf,Key);
       fi;
   od;
   --Исключаем те, что уже есть
   if Табл='Расх':
     nn=Расход;
       |Табл='Дох':
     nn=Доход;

   fi;
   for n=1..nn do
       ProgressPos(n);
       if Табл='Расх':
          БК=Расход[n].БК;
          ВД=Расход[n].ВД;
          КОСГУ=Расход[n].КОСГУ;
          АН=Расход[n].ПРИЗНАК + " " + Призн_ЛС;
       |Табл='Дох':
          БК=Доход[n].БК;
          ВД=Доход[n].ВД;
          КОСГУ=Доход[n].КОСГУ;
          АН=Доход[n].ПРИЗНАК + " " + Призн_ЛС;
       fi;
       Key = Раб.Бюджет2005.Объединить(БК + " " + ВД + " " + КОСГУ, Раб.Бюджет2005.СортироватьНаборСлов(АН, " ", True), " ");
       y = SearchInArray(Buf, Key, True);
       if y <> -1 then
          DeleteFromArray(Buf, y);
       fi;
   od;
   --Остальные добавляем при наличии оборотов
   nn = LengthOfArray(Buf);
   for n=1..nn do
    ProgressPos(n+nn);
    БК=ExtractWord(1,Buf[n]," ");
    ВД=ExtractWord(2,Buf[n]," ");
    КОСГУ=ExtractWord(3,Buf[n]," ");
    if Name_S(БК+"."+ВД+"."+if(Табл='Расх',Сч_Деб_Р,Сч_Деб_Д)+"."+КОСГУ)=" "  or Name_S(БК+"."+ВД+"."+if(Табл='Расх',Сч_Кре_Р,Сч_Кре_Д)+"."+КОСГУ)=" ":
       --Нет счетов - нет и оборотов
       Тек=0;
      else
       УслАн="";
       for x=4 to WordsCount(Buf[n]," ") do
         if ExtractWord(x,Buf[n]," ")<>Призн_ЛС then УслАн=Раб.Бюджет2005.Объединить(УслАн,ExtractWord(x,Buf[n]," "),"&"); fi;
       od;
       УслСч=БК+"."+ВД+"."+if(Табл='Расх',Сч_Деб_Р,Сч_Деб_Д)+"."+КОСГУ+"/"+БК+"."+ВД+"."+if(Табл='Расх',Сч_Кре_Р,Сч_Кре_Д)+"."+КОСГУ;
       Тек=Turn(УслСч+"{"+УслАн+"}",ДН,ДК);
    fi;
    АН=Раб.Бюджет2005.ЗаменитьРазделительВНабореСлов(УслАн,"&"," ");
    if not Тек=0:
       if Табл='Расх':
           y=InsertFrame(Расход,Расход+1);
           Расход[y].БК=БК;
           Расход[y].ВД=ВД;
           Расход[y].КОСГУ=КОСГУ;
           Расход[y].ПРИЗНАК=АН;
         |Табл='Дох':
           y=InsertFrame(Доход,Доход+1);
           Доход[y].БК=БК;
           Доход[y].ВД=ВД;
           Доход[y].КОСГУ=КОСГУ;
           Доход[y].ПРИЗНАК=АН;
       fi;
 --      Обнов(y,Substr(Табл,1,1),'');
    fi;
   od;
 finally
   CloseProgress;
 end;


end;


Proc Цифрошапка;
var i,n:I;
var vis:L;
n=1;
for i= 3 to 22 do
   vis=AsLogical(Доход_шапка.Column(i,ColVisible,''));
   if vis then Доход_шапка.Cell(4,i,CellContents,Str(n));
      Расход_шапка.Cell(4,i,CellContents,Str(n));
     n=n+1;
   fi;
od;

--n=1;
--for i= 2 to 9 do
--   vis=AsLogical(Доход_с_шапка.Column(i,ColVisible,''));
--   if vis then Доход_с_шапка.Cell(4,i,CellContents,Str(n));
--      Расход_с_шапка.Cell(4,i,CellContents,Str(n));
--      n=n+1;
--   fi;
--od;
end;

Proc Суммир;
var i:I;
  ВСЕГО_ДОХОД=0;ВСЕГО_ДОХОД_ИЗМ=0;
  for i=1 to ДОХОД do
    ВСЕГО_ДОХОД=ВСЕГО_ДОХОД+ГОД_Д[i];
    ВСЕГО_ДОХОД_ИЗМ=ВСЕГО_ДОХОД_ИЗМ+ДОХОД[i].СУММГОД_ИЗМ;
  od;
  ВСЕГО_РАСХОД=0;ВСЕГО_РАСХОД_ИЗМ=0;
  for i=1 to РАСХОД do
    ВСЕГО_РАСХОД=ВСЕГО_РАСХОД+ГОД_Р[i];
    ВСЕГО_РАСХОД_ИЗМ=ВСЕГО_РАСХОД_ИЗМ+РАСХОД[i].СУММГОД_ИЗМ;
  od;
end;


Proc Видимость;
var i,o,t,r,d:I;
var obj:Object;
var namobj:S;
  Изм.Visible= IsChanging;
end;

Func НовНомИзм:S;
var OWA,new,n:I;
var tmp:S;
 tmp=НОМЕР_ИЗМ;
 if tmp='' then n=0;
   else  
    n=Int(tmp);
    if n=0 then n=-1; fi;
 fi;
 n=n+1;
 if n=0 then 
    tmp=tmp+'#';
   else 
    tmp=Str(n);
 fi;
 OWA=OpenWorkArea('РПО_СМЕТА_ДОХОД_РАСХОД','НОМЕР_ИЗМ','НОМЕР_СМЕТЫ="'+НОМЕР_СМЕТЫ+'" and ГОД_СМЕТЫ="'+ГОД_СМЕТЫ+'"');
 try
   new=Search(OWA,1,tmp);
   while new>0 do tmp=tmp+'#';  new=Search(OWA,new,tmp); od;
 finally
   CloseWorkArea(OWA);
 end;
^tmp;
end;



---------------- Обработчики бланка --------------------------------------------------------------------------------------

Func AddRemove(FieldName: String; Iter: Integer): logical;
  if Substr(FieldName,1,1)='A' then
      if Substr(FieldName,4,1)='D' then 
         InsertFrame(Доход,Iter+1);
         if Дубл_БК_Д: ДОХОД[Iter+1].БК=ДОХОД[Iter].БК; fi;
         if Дубл_КОСГУ_Д: ДОХОД[Iter+1].КОСГУ=ДОХОД[Iter].КОСГУ; fi;
         if Дубл_ПРИЗНАК_Д: ДОХОД[Iter+1].ПРИЗНАК=ДОХОД[Iter].ПРИЗНАК; ДОХОД[Iter+1].ПГР=ДОХОД[Iter].ПГР; fi;
        |Substr(FieldName,4,1)='R' then 
         InsertFrame(Расход,Iter+1);
         if Дубл_БК_Р: РАСХОД[Iter+1].БК=РАСХОД[Iter].БК; fi;
         if Дубл_КОСГУ_Р: РАСХОД[Iter+1].КОСГУ=РАСХОД[Iter].КОСГУ; fi;
         if Дубл_ПРИЗНАК_Р: РАСХОД[Iter+1].ПРИЗНАК=РАСХОД[Iter].ПРИЗНАК;  РАСХОД[Iter+1].ПГР=РАСХОД[Iter].ПГР; fi;
        fi;
    |Substr(FieldName,1,1)='D' then
      if Substr(FieldName,4,1)='D' then DeleteFrame(Доход,Iter);
        |Substr(FieldName,4,1)='R' then DeleteFrame(Расход,Iter); fi;
--      ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
    fi;
    Непусто;
  Return False ;
end;

Proc OnRadio(Comp:String);
Видимость;
end;

Func IsChanging_OnEnter(FieldName: String; Iter: Integer): logical;
  IsChanging= not IsChanging;
  Видимость;
  Return False ;
end;

Func РБСКорИмя_OnEnter(FieldName: String; Iter: Integer): logical;
var rec: Record;
  rec=OpenCardFile("КОНТРАГЕНТ","",РБС);
  if rec<>nil then РБС=Rec; fi;
  Return False;
end;

Func БАНКРПО_ЛСЧЕТ_OnEnter(FieldName: String; Iter: Integer): logical;
var rec: Record;
  if ПБС=nil then Message('Введите получателя, чтобы выбрать счет',mtError);  ^False; fi;
  Rec=OpenCardFile("БАНК_СЧЕТА","Контрагент="+RecordToString(ПБС),ПБС_СЧЕТ);
  if (Rec<>nil) and (Rec<>ПБС_СЧЕТ) then  
    ПБС_СЧЕТ=Rec; 
  fi;
  ОбновПризнЛС;
  Return False;
end;

Proc ЗаписьполяSChk(ИмяПоля:S;Значение:S);
var tmp:S;
if Значение="": exit; fi;
tmp=GetVariableS(ИмяПоля);
if Значение<>tmp then
   PutVariableS(ИмяПоля,Значение);
fi;
end;

proc РазобратьСчета;
  if Доход>=1 then
     ЗаписьполяSChk("Сч_Деб_Д",Раб.Бюджет2005.ВЗЯТЬКОДСЧЕТА(ДОХОД[1].Счет_Деб,"","СЧ5",False));
     ЗаписьполяSChk("Сч_Кре_Д",Раб.Бюджет2005.ВЗЯТЬКОДСЧЕТА(ДОХОД[1].Счет_Кре,"","СЧ5",False));
  fi;
  if Расход>=1 then
     ЗаписьполяSChk("Сч_Деб_Р",Раб.Бюджет2005.ВЗЯТЬКОДСЧЕТА(РАСХОД[1].Счет_Деб,"","СЧ5",False));
     ЗаписьполяSChk("Сч_Кре_Р",Раб.Бюджет2005.ВЗЯТЬКОДСЧЕТА(РАСХОД[1].Счет_Кре,"","СЧ5",False));
  fi;
end;

Proc Onread;
if CurrentState=crdusInserted and НОМЕР_СМЕТЫ='' then
  if Проводить=True then Проводить=False; fi;
  if Квартал=True then Квартал=False; fi;
  if IsChanging=True then IsChanging=False; fi;
  if Length(Сч_Деб_Д)<>6 then Сч_Деб_Д=Def_Сч_Деб_Д; fi;
  if Length(Сч_Кре_Д)<>6 then Сч_Кре_Д=Def_Сч_Кре_Д; fi;
  if Length(Сч_Деб_Р)<>6 then Сч_Деб_Р=Def_Сч_Деб_Р; fi;
  if Length(Сч_Кре_Р)<>6 then Сч_Кре_Р=Def_Сч_Кре_Р; fi;
  НОМЕР_ДОК=НОМЕР_ДОК+1;
  НОМЕР_СМЕТЫ = Str(НОМЕР_ДОК);
  ГОД_СМЕТЫ = Str(Year(today));
  ДАТА_СМЕТЫ = Today;
  if ПБС=nil:
     ПБС=Раб.Бюджет2005.НашРекв;
     ПБС_СЧЕТ=Раб.Бюджет2005.БанкСчет(ПБС,False);
     ОбновПризнЛС;
  fi;
elsif CurrentState=crdusInserted and НОМЕР_СМЕТЫ<>'' then
  РазобратьСчета;
  НОМЕР_ИЗМ=НовНомИзм; 
  ДАТА_ИЗМ=Today; 
  IsChanging=True;
  Д=Д+1;
  Проводить=False; EditorApply;
 else
  РазобратьСчета;
fi;

if Refr then
  ДОКУМЕНТЫ.ЛБО.СМЕТА_ДОХОД_РАСХОД.Обнов(0,'Д','');
  ДОКУМЕНТЫ.ЛБО.СМЕТА_ДОХОД_РАСХОД.Обнов(0,'Р','');
  Refr=False;
fi;
if not Проводить then
   ClearEmpty;
  --Доходы
    ДобОтсутствПред('КД','Дох');
    ДобОтсутствПред('КИФД','Дох');
  --Расходы
    ДобОтсутствПред('ФКР','Расх');
    ДобОтсутствПред('КИФД','Расх');
   ПредВерсия; 
   Непусто;
fi;
Видимость;
if Init then ОформлениеПр; fi;
end;


Func БК_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,val,mask,mode:S;
var ask:I;
var typ:S;
var ВД:S;

typ=Substr(AsString(Шаблон.Name),1,1);
mask='';
mode='';
  if typ="Д" then
     ВД = if(ДОХОД[Iter].ВД="","?",ДОХОД[Iter].ВД);
     Раб.КБК.Список_КБК_КодСч = ВД + '.' + Сч_Деб_Д + "|" + ВД + '.' + Сч_Кре_Д;
     Раб.КБК.Список_КОСГУ_КодСч = ВД + '.' + Сч_Деб_Д + "|" + ВД + '.' + Сч_Кре_Д;
    else
     ВД = if(РАСХОД[Iter].ВД="","?",РАСХОД[Iter].ВД);
     Раб.КБК.Список_КБК_КодСч = ВД + '.' + Сч_Деб_Р + "|" + ВД + '.' + Сч_Кре_Р;
     Раб.КБК.Список_КОСГУ_КодСч = ВД + '.' + Сч_Деб_Р + "|" + ВД + '.' + Сч_Кре_Р;
  fi;

Раб.КБК.Список_КОСГУ_БК='';
Раб.КБК.Список_КБК_КОСГУ='';

if FieldName="БК" then
     Val="КБК";
     if typ="Д" then 
          mask="*."+ ВД +'.'+if(Сч_Деб_Д="","*",Сч_Деб_Д)+'.'+if(ДОХОД[Iter].КОСГУ="","*",ДОХОД[Iter].КОСГУ);
          Раб.КБК.Список_КБК_КОСГУ=ДОХОД[Iter].КОСГУ;
          Раб.КБК.Список_КБК_РазрКОСГУ=ДОХОД[Iter].КОСГУ="";
       |typ="Р" then 
          mask="*."+ ВД +'.'+if(Сч_Кре_Р="","*",Сч_Кре_Р)+'.'+if(РАСХОД[Iter].КОСГУ="","*",РАСХОД[Iter].КОСГУ);
          Раб.КБК.Список_КБК_КОСГУ=РАСХОД[Iter].КОСГУ;
          Раб.КБК.Список_КБК_РазрКОСГУ=РАСХОД[Iter].КОСГУ="";
     fi;
  |Fieldname="КОСГУ" then 
     Val="КОСГУ";
     if typ="Д" then 
          mask=if(ДОХОД[Iter].БК="","*",ДОХОД[Iter].БК)+'.'+if(ДОХОД[Iter].ВД="","?",ДОХОД[Iter].ВД)+'.'+if(Сч_Деб_Д="","*",Сч_Деб_Д);
          mask=mask+".*&("+Раб.Бюджет2005.МаскаДоходСч+"|"+Раб.Бюджет2005.МаскаДефицитСч+")";
          Раб.КБК.Список_КОСГУ_БК=ДОХОД[Iter].БК;
          Раб.КБК.Список_КОСГУ_РазрБК=ДОХОД[Iter].БК="";
       |typ="Р" then 
          mask=if(РАСХОД[Iter].БК="","*",РАСХОД[Iter].БК)+'.'+if(РАСХОД[Iter].ВД="","?",РАСХОД[Iter].ВД)+'.'+if(Сч_Кре_Р="","*",Сч_Кре_Р);
          mask=mask+".*&("+Раб.Бюджет2005.МаскаРасхСч+"|"+Раб.Бюджет2005.МаскаДефицитСч+")";
          Раб.КБК.Список_КОСГУ_БК=РАСХОД[Iter].БК;
          Раб.КБК.Список_КОСГУ_РазрБК=РАСХОД[Iter].БК="";
     fi;
  |Fieldname="ВД" then
     Val="ВД";
     if typ="Д" then 
          mask=if(ДОХОД[Iter].БК="","*",ДОХОД[Iter].БК)+'.'+if(ДОХОД[Iter].ВД="","?",ДОХОД[Iter].ВД)+'.'+if(Сч_Кре_Д="","*",Сч_Кре_Д);
          mask=mask+".*&("+Раб.Бюджет2005.МаскаДоходСч+"|"+Раб.Бюджет2005.МаскаДефицитСч+")";
       |typ="Р" then 
          mask=if(РАСХОД[Iter].БК="","*",РАСХОД[Iter].БК)+'.'+if(РАСХОД[Iter].ВД="","?",РАСХОД[Iter].ВД)+'.'+if(Сч_Кре_Р="","*",Сч_Кре_Р);
          mask=mask+".*&("+Раб.Бюджет2005.МаскаРасхСч+"|"+Раб.Бюджет2005.МаскаДефицитСч+")";
     fi;
  |ExtractWord(1,FieldName,'_')="Сч" then
     mask=GetVariableS('Mask_'+FieldName);
     Val="СЧ5";
  fi;
if ВД<>"?" then
   Раб.КБК.Список_КБК_РазрДобав=(FieldName="БК");
   Раб.КБК.Список_КОСГУ_РазрДобав=(FieldName="КОСГУ");
fi;

Раб.КБК.ВнебФКР=False;
Раб.КБК.ДобКБКEnq=true;
tmp=Раб.КБК.Список(mask,mode,Val);
Раб.КБК.ДобКБКEnq=False;
if tmp='' then ^False; fi;
if ExtractWord(1,FieldName,'_')<>"Сч" then FieldName=ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"]."+FieldName; fi;
--  if ПеременнаяСуществует(FieldName) then
PutVariableS(FieldName,tmp);

if ExtractWord(1,FieldName,'_')="Сч" then  Обнов(0,typ,''); ^False; fi;
  if ОбязаловкаСтр(Iter,typ,False) then
   Обнов(Iter,typ,'');
  fi;
--ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
Return      False;
end;

Proc БК_Д_OnExit(FieldName: String; Iter: Integer);
PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"]."+FieldName,"");
if fieldname='БК' or Fieldname='КОСГУ' then
  PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"].СЧЕТ_ДЕБ","");
  PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"].СЧЕТ_КРЕ","");
  fi;
--  ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
end;

Proc ПБСКорИмя_OnExit(FieldName: String; Iter: Integer);
  PutVariableR(ExtractWord(1,FieldName,'.'),nil);
end;

Func ПРИЗНАК_Д_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,varname,typ,Mask:S;
  varname=ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"]."+"ПРИЗНАК";
  typ=Substr(AsString(Шаблон.Name),1,1);
  if ОбязаловкаСтр(Iter,typ,True) then Обнов(Iter,typ,''); else ^False; fi;
  if typ='Д':  Mask=Раб.Бюджет.НаборПризнаков(      ДОХОД[Iter].СЧЕТ_ДЕБ,ДОХОД[Iter].СЧЕТ_КРЕ,''        );
     else Mask=Раб.Бюджет.НаборПризнаков(РАСХОД[Iter].СЧЕТ_ДЕБ,РАСХОД[Iter].СЧЕТ_КРЕ,'');
     fi;
  if Mask="": Message("Аналитические признаки не требуются"); ^False; fi;
  Mask=Раб.Бюджет2005.Объединить(Mask,"НАЛОГ","|");
  tmp=ВыборПризнака(Mask);
  if tmp="": ^False; fi;
  PutVariableS(varname,Раб.Бюджет.ДобавитьПризнак(GetVariableS(varname),tmp));
  if ExtractWord(1,tmp,'.')='ПГР':
     PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"]."+"ПГР",if(ExtractWord(2,tmp,'.')='000','',ExtractWord(2,tmp,'.')));
  fi;
  --ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
  Return False ;
end;

Proc Сч_Деб_Д_OnExit(FieldName: String; Iter: Integer);
PutVariableS(FieldName,"");
--ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
end;

Func СЧЕТ_ДЕБ_OnEnter(FieldName: String; Iter: Integer): logical;
var typ:S;
  typ=SubStr(AsString(Шаблон.Name),1,1);
  if ОбязаловкаСтр(Iter,typ,True) then Обнов(Iter,typ,'');      fi;
  Return False ;
end;


Proc Button4_OnClick(Sender: String);
var ask:I;
if (CurrentState = 0) then Close;
  else
  ask=EnqYesNoCancel("Данные изменены, сохранить?");
  if ask=cmYes: EditorApply; Close;
    |ask=cmNo:    EditorCancel; Close;
    |ask=cmCancel: Exit;
    fi;
  fi;
end;


Proc Button5_OnClick(Sender: String);
ClearEmpty;
Непусто;
EditorApply;
end;


Func OnVerify: Logical;
  Return Обязаловка(False) ;
end;

Func Дубл_БК_Д_OnEnter(FieldName: String; Iter: Integer): logical;
var val:l;
  val=GetVariableL(Fieldname);
  PutVariableL(Fieldname,(not val));
  Return False ;
end;


Func ТБК_OnEnter(FieldName: String; Iter: Integer): logical;
var val:string;
var was,n:I;
  FieldName=ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"]."+FieldName;
  val=GetVariableS(FieldName);
  ClearVariable(typs);
  if Substr(AsString(Шаблон.Name),1,1)='Д' then typs[1]='КД --Код дохода';
    |Substr(AsString(Шаблон.Name),1,1)='Р' then typs[1]='ФКР --Функциональный классификатор расходов';
    fi;
  typs[2]='КИФД --Код источника финансирования дефецита бюджета';

  if val='КИФД' then was=2;
     |(val='КД') or (val='ФКР') then was=1;
     fi;
  n=Alternate('Выберите тип КБК', typs,-1,was);
  val=ExtractWord(1,typs[n],' ');
  PutVariableS(FieldName,val);

  PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"].БК","");
  PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"].КОСГУ","");
  PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"].СЧЕТ_ДЕБ","");
  PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"].СЧЕТ_КРЕ","");
  --ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
  Return False ;
end;

Func ИСТ1_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);

    ИмяУмолч(True,ExtractWord(1,Sect,"_"),Row);
  Return "" ;
end;


Proc OnOpen(Create: Logical);
Init=False;
end;


Proc AfterOpen(Destroy: Logical);
СчитатьОформление;
ОформлениеПр;
Init=True;
end;


Proc cbПроводить_OnChange(Sender: String);
var n:i;
ClearEmpty;
--Доходы
  ДобОтсутствПред('КД','Дох');
  ДобОтсутствПред('КИФД','Дох');
--Расходы
  ДобОтсутствПред('ФКР','Расх');
  ДобОтсутствПред('КИФД','Расх');
ClearEmpty;
ПредВерсия;
--if not(Проводить) then --РассчFlag or
if Проводить:
   Проводить=Обязаловка(True);
  else
   n=EnqOkCancel("Вы уверены, что хотите исключить документ из обработки ?",mtWarning);
   if n=cmCancel: Проводить=True; fi;
   НеПусто;
fi;
-- else Message("Выполните расчет",mtError);
--   Проводить=False;
-- fi;
 cbПроводить.State=Проводить;
 ОформлениеПр;
 if fПС and Проводить then КонтрольПС; fi;
 EditorApply;
 --Свертка;
 Суммир;
 Refresh;
-- ПредВерсия;
end;


Proc Print_OnClick(Sender: String);
 EditorApply;
 OpenBlank("ДОКУМЕНТЫ.ЛБО.СМЕТА_ДОХОД_РАСХОД_ПЕЧАТЬ88Н",FALSE,current);

end;

Proc cbПСч_OnChange(Sender: String);
if fПС and Проводить then КонтрольПС; fi;
end;

Proc DropFlag(FieldName: String; Iter: Integer);
var varn:S;
--varn=ExtractWord(1,AsString(Шаблон.Name),'_')+"["+Str(Iter)+"]"+".СУММГОД_ДОИЗМ";
--if value+(GetVariableN(varn))<0 then Message('Суммарное значение будет отрицательным',mterror); ^False; Fi;
  --ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
  Exit;
end;


Proc ГЛ_РБС_КОД_OnExit(FieldName: String; Iter: Integer);
var OWA,n:I;
var tmp:S;
  if ГЛ_РБС_КОД="" then exit; fi;
  OWA=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","(NAME_VOC='ППП2006') and (CODE='"+ГЛ_РБС_КОД+"')");
  try
   if Records(OWA)>0 then tmp=GetFieldS(OWA,1,"TXT"); fi;
   if ГЛ_РБС<>tmp then ГЛ_РБС=tmp; fi;
  finally
  CloseWorkArea(OWA);
  end;
end;


Proc ПРИЗНАК_OnExit(FieldName: String; Iter: Integer);
var temp:S;
 temp=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(GetVariableS(Fieldname+"["+Str(Iter)+"]")," ","Name_A");
 PutVariableS(ExtractWord(1,AsString(Шаблон.Name),"_")+"["+Str(Iter)+"].ПРИЗНАК",temp);
 --ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
end;


Proc Д_OnExit(FieldName: String; Iter: Integer);
  If Д<>1.1.100 and ГОД_СМЕТЫ='' then ГОД_СМЕТЫ=Str(ГОД(Д)); fi;
end;

Func ПРИЗН_ЛС_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
  tmp=ВыборПризнака("ЛС.*");
  if tmp<>'' then ПРИЗН_ЛС=tmp; fi;
  Return False ;
end;

Proc cbНалог_OnChange(Sender: String);
 --ClearVariable(Позиции_Д);  ClearVariable(Позиции_Р);
end;


Proc НДатаСв_OnClick(Sender: String);
var tmp:D;
 tmp=Calendar;
 if tmp<>1.1.100 then Дата_Свед=tmp; fi;
end;

Proc ПФХД_OnClick(Sender: String);
var i:I;
  PutVariableD("ДОКУМЕНТЫ.ЛБО.ПЛАН_ФХД.TGTDATE", Д+1);
  PutvariableS("ДОКУМЕНТЫ.ЛБО.ПЛАН_ФХД.ShowMe", "Шапка31");
  OpenBlank("ДОКУМЕНТЫ.ЛБО.ПЛАН_ФХД",False);


end;


Конец
