БЛАНКСШАБЛОНОМ "Бухгалтерская справка", РЕДАКТОР РПО_БУХСПРАВКА;

var FlagEdit:L;

var Start:S="";
var Страница:I;

Timer1          :Object;
cbПроводить     :Object;
cbПдпСтрПод     :Object;
cbВспомПечать   :Object;
btnПечать       :Object;
btnОчистить     :Object;
btnИмортЖур     :Object;
btnНастр        :Object;
btnУдалить      :Object;
btnЗакрыть      :Object;
cbЗакрытьДок    :Object;
cbВисячаяПодпись:Object;
cbНеСвязАналит  :Object;
cbФиксШапка     :Object;
btnДокОсн       :Object;

btnРасшифр      :Object;
btnГЭК2         :Object;

S1 :Section;
S2 :Section;
S3 :Section;
S4 :Section;
S5 :Section;
S6 :Section;
S7 :Section;
S8 :Section;
S9 :Section;
var nS:I=9;

S10 :Section;
S11 :Section;
S12 :Section;

prn1:Section;
prn2:Section;

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

fQCMF:L;

var nПозиции:i=Позиции;

var СодержОбщ:S="Наименование и основание проводимой операции";
var НомДокОбщ:S="Номер документа";
var ДатаДокОбщ:S="Дата";
var СчДебОбщ:S="Дебет";
var СчКреОбщ:S="Кредит";
var ПризнОбщ:S="Аналитические признаки";
var ПризнДебОбщ:S="по дебету";
var ПризнКреОбщ:S="по кредиту";
var ПризнКолОбщ:S="Количество";
var Выделить_:S="...";

var A:S=if(Проводить,"","+");
var AA:S=if(Проводить,"","++");
var D:S=if(Проводить,"","-");
var AБО:S=if(Проводить,"","+БО");
var AДО:S=if(Проводить,"","+ДО");
var AБД:S=if(Проводить,"","+БО/ДО");

var Содерж_:s="";
var НомДок_:s="";

var Выделить[]:S;
var Призн_[]:S=Позиции[$].Призн;
var ПризнДеб_[]:S=Позиции[$].ПризнДеб;
var ПризнКре_[]:S=Позиции[$].ПризнКре;

var ИтогСумма_:N=SumOfArray(Позиции[].Сумма,Позиции);
var ИтогСуммаРуб_:N=SumOfArray(Позиции[].СуммаРуб,Позиции);
var ИтогКол_:N=SumOfArray(Позиции[].Кол,Позиции);

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

var SelfBln:S="ДОКУМЕНТЫ.ПРОЧИЕ.БУХСПРАВКА";
var SelfCrd:S="РПО_БУХСПРАВКА";

var First:L;

hСчДеб:S;
hСчКре:S;
hПризн:S;
hЖур  :S;

var coBtnFace_:I;

fВспомПечать:L;
var flgПдпСтрПод:L=True; --52н
var flgПчтСтрПод:L=not flgПдпСтрПод;
fВисячаяПодпись:L;
var fНеСвязАналит:L;
fФиксШапка:L;

var Buf[]:S;
var Buf2[]:S;

var cache   :I;
var cacheS[]:S;
var cacheJ[]:I;

var NumSplitVoc:I=5;

var УпрНастр:L;
var НастрПоУмолч:S="Настройка по умолчанию";
var НастрЗакр:S="Закрыть настройку";

var extКлюч:S;

var НастрGUID:S;

var СканГЭК2:S=if(Проводить,"","Сканирование");
var ОбновГЭК2:S="Обновить";
var ГЭК2вPDF:S="Выгрузить в PDF";
    ПутьPDF:S;

var УпрГЭК2:I;
var пп      []:I=$;
var ГЭК2Дат []:D;
var ГЭК2Лист[]:S;
var ГЭК2Кмнт[]:S;
var ГЭК2CU  []:S;
var ГЭК2MU  []:S;
var ГЭК2Rec []:Record;

var Упр:I;
var Упр_:I=Упр+1;
var УпрВП:L;

var prnСодерж[]:S;
var prnНомДок[]:S;
var prnДатаДок[]:D;
var prnСчДеб[]:S;
var prnСчКре[]:S;
var prnПризн[]:S;
var prnПризнДеб[]:S;
var prnПризнКре[]:S;
var prnПризнКол[]:S;
var prnКол[]:N;
var prnСумма[]:N;
var prnСуммаРуб[]:N;
--
--Процедуры и функции -------------
Proc Настр(aСохр:L);
var Flag:L;
 if НастрGUID="" or aСохр: НастрGUID=GetGUID; fi;
 if Раб.Настр.Начать(SelfBln,0,0,"",НастрGUID):
    Раб.Настр.Добавить("extКлюч","S");
    if aСохр: 
       Раб.Настр.Сохранить; 
      else 
       НастрGUID=Раб.Настр.Загрузить("","");
       if НастрGUID="":
          Flag=ExecuteFuncL("НастрПоУмолч_OnEnter","",1);
       fi;
    fi;
 fi;
end;

Proc ОткрНастр (Flag:L);
 cbПроводить.Visible=not Flag;
 cbПдпСтрПод.Visible=False; --52н
 cbВспомПечать.Visible=not Flag;
 btnПечать.Visible=not Flag;
 btnОчистить.Visible=not Flag;
 btnИмортЖур.Visible=not Flag;
 btnДокОсн.Visible=not Flag and not RecCrd=0;
 btnНастр.Visible=not Flag;
 btnУдалить.Visible=not Flag;
 btnЗакрыть.Visible=not Flag;
 cbЗакрытьДок.Visible=not Flag and Раб.Бюджет2005.Сетевая;
 cbВисячаяПодпись.Visible=not Flag;
 cbНеСвязАналит.Visible=not Flag;
 cbФиксШапка.Visible=not Flag;
 УпрНастр=Flag;
 if Flag=True: Template.Field="extКлюч"; Template.Frame=1; fi;
end;

Proc Инициализация;
var Obj:Object;
var s,r,rr,c,cc,n,l,bgColor:i;
var Field:S;
 coBtnFace_=asInteger(S3.Cell(1,1,CellBgColor,""));
 ClearVariable(BufField);
 ClearVariable(BufColorBg);
 ClearVariable(BufColorFo);
 for s=1..nS 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 or BgColor=coBtnFace_ or BgColor=coLime:
          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,y:i;
var Obj: Object;
var Field:S;
 cbПроводить.Caption=if(RecCrd=0,"Проводить","Закрыть от изменений");
 btnОчистить.Enabled=RecCrd=0 and not Проводить;
 btnИмортЖур.Enabled=RecCrd=0 and not Проводить;
 btnДокОсн.Visible=not RecCrd=0;
 btnУдалить.Enabled=RecCrd=0 and not Проводить;
 for s=1..nS 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;
 Template.Freeze(0,0);
 Field=AsString(Template.Field);
 Template.Field="Start";
 if fФиксШапка:
    if Страница=1: Y=AsInteger(S3.Row(1,RowTop,""));
      |Страница=2: Y=AsInteger(S11.Row(1,RowTop,""));
    fi;
    Template.Freeze(1,y);
 fi;
 Template.Field=Field;
end;

Proc ПоложениеКнопок_;
var y:i;
 y=AsInteger(S1.Row(11,RowTop,""));
 btnРасшифр.Top=y+5;
 btnГЭК2.Top=y+5;
end;

Proc ПоложениеКнопок;
 Timer1.Active=True;
end;

Proc ОчиститьPrn;
 ClearVariable(Упр);
 ClearVariable(УпрВП);
 ClearVariable(prnСодерж);
 ClearVariable(prnНомДок);
 ClearVariable(prnДатаДок);
 ClearVariable(prnСчДеб);
 ClearVariable(prnСчКре);
 ClearVariable(prnПризн);
 ClearVariable(prnПризнДеб);
 ClearVariable(prnПризнКре);
 ClearVariable(prnПризнКол);
 ClearVariable(prnКол);
 ClearVariable(prnСумма);
 ClearVariable(prnСуммаРуб);
end;

func Рендер:I;
var tmpL:L;
var res, s, c:I;
var Obj: Object;

  S1.Column(10,ColPrinted,fВспомПечать);
  for s=2..4 do
   if FindObject("S"+Str(s),Obj):
      for c=11..13 do
       Obj.Column(c,ColPrinted,fВспомПечать);
      od;
   fi;
  od;
  if fВспомПечать:
     Раб.Вспом.Печать2.SelfCfg = "RPO_0504833_001.cfg";
    else
     Раб.Вспом.Печать2.SelfCfg = "RPO_0504833_000.cfg";
  fi;

  Раб.Вспом.Печать2.Инициализация(SelfBln,"S1@S2@S3@S4@S5@S6@S7@S8@S9");
  Раб.Вспом.Печать2.ВывестиСекцию(SelfBln,"S1");
  res=Раб.Вспом.Печать2.ВывестиТаблицу(SelfBln,"S2#3","S3","S4#4@S5#4@S6#4@S7#4@S8#4@S9#4","",-1,"");

  ^res;
end;


Proc РасчетГЭК2;
var OWA,n,nn,i1,i2:I;
var isNet:L;
var Rec: Record;
 if not Страница=2: Exit; fi;
 isNet=Раб.Бюджет2005.Сетевая;
 ClearVariable(УпрГЭК2);
 ClearVariable(ГЭК2CU);
 ClearVariable(ГЭК2MU);
 ClearVariable(ГЭК2Дат);
 ClearVariable(ГЭК2Лист);
 ClearVariable(ГЭК2Кмнт);
 ClearVariable(ГЭК2Rec);
 OWA=OpenWorkArea("РПО_СКАН_ДОК","Дата","Док='"+SelfCrd+"' and Запись="+Str(RecordToInteger(Current)));
 Try
  nn=Records(OWA);
  ShowProgress(nn,"Расчет...");
  for n=1..nn do
   ProgressPos(n);
   Rec=GetRecordKey(OWA,n);
   i1=Раб.Вспом.Сканер.ЧитатьГЭК("РПО_СКАН_ДОК",RecordToInteger(Rec),"jpg",True);
   i2=Раб.Вспом.Файлы.ПоказСписок("РПО_СКАН_ДОК",RecordToInteger(Rec),"","","","","","",0);
   if not i1=0 or not i2=0:
      InsertFrame(УпрГЭК2,УпрГЭК2+1);
      ГЭК2Дат[УпрГЭК2]=GetFieldD(OWA,n,"Дата");
      ГЭК2Лист[УпрГЭК2]=Str(i1)+" / "+Str(i2);
      ГЭК2Кмнт[УпрГЭК2]=GetFieldS(OWA,n,"Кмнт");
      ГЭК2CU[УпрГЭК2]=DateToString(GetFieldD(OWA,n,"CreateTime"))+if(isNet," "+GetFieldS(OWA,n,"CreatedUser"),"");
      ГЭК2MU[УпрГЭК2]=DateToString(GetFieldD(OWA,n,"UpdateTime"))+if(isNet," "+GetFieldS(OWA,n,"ModifiedUser"),"");
      ГЭК2Rec[УпрГЭК2]=Rec;
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
end;

Proc ВывестиСтраницу;
 Template.Freeze(0,0);
 if Страница=0: Страница=1; fi;
 if not AsLogical(S2.Visible)=(Страница=1):
    S2.Visible=Страница=1;
    S3.Visible=Страница=1;
    S4.Visible=Страница=1;
    S5.Visible=Страница=1;
    S6.Visible=Страница=1;
    S7.Visible=Страница=1;
    S8.Visible=Страница=1;
    S9.Visible=Страница=1;
 fi;
 btnРасшифр.Enabled=not Страница=1;
 --ГЭК 2
 if not AsLogical(S10.Visible)=(Страница=2):
    S10.Visible=Страница=2;
    S11.Visible=Страница=2;
    S12.Visible=Страница=2;
    РасчетГЭК2;
 fi;
 btnГЭК2.Enabled=not Страница=2;
end;

Proc Страница_onClick(Sender: String);
 if Sender="btnРасшифр": Страница=1;
   |Sender="btnГЭК2":    Страница=2;
 fi;
 ВывестиСтраницу;
 Оформление;
end;

Proc НеПустаяТаблица;
var Iter:I;
 if Позиции<1: Iter=InsertFrame(Позиции, 1); fi;
end;

Proc УдалитьПустыеСтроки;
var Iter:I;
 Iter=1;
 While Iter<=Позиции do
   if Позиции[Iter].Содерж="" and
      Позиции[Iter].НомДок="" and
      Позиции[Iter].ДатаДок=1.1.100 and
      Позиции[Iter].СчДеб="" and
      Позиции[Iter].СчКре="" and
      Позиции[Iter].Сумма=0  and
      Позиции[Iter].СуммаРуб=0  and
      Позиции[Iter].Кол=0  and
      Позиции[Iter].ПризнКол=""  and
      Позиции[Iter].Призн="": DeleteFrame(Позиции, Iter);
     else 
      Iter=Iter+1;
   fi;
 od;
 НеПустаяТаблица;
end;

Func ПроверитьСправку :L;
var Iter:i;
 if RecCrd>0: ^True; fi;
 if ДатаСпр=1.1.100: Message("Введите дату справки",mtError); Template.Field="ДатаСпр"; ^False; fi;
 if Валюта="": Валюта=BaseCurrency; fi;
 if Name_C(Валюта)=" ": Message("Неизвестный идентификатор валюты "+Валюта,mtError); Template.Field="Валюта"; Template.Frame=Iter; ^False; fi;
 УдалитьПустыеСтроки;
 Раб.КСА.Начать;
 for Iter=1..Позиции do
  Раб.КСА.Добавить(Позиции[Iter].СчДеб);
  Раб.КСА.Добавить(Позиции[Iter].СчКре);
 od;
 if Раб.КСА.Закончить(True): Message("Добавление новых счетов закончено"); fi;
 Раб.Бюджет.ПроверитьПризнакиНачать;
 for Iter=1..Позиции do
  if Позиции[Iter].СчДеб="": Message('Введите счет дебета',mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].СчКре="": Message('Введите счет кредита',mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
  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 Correspond(Позиции[Iter].СчДеб,Позиции[Iter].СчКре)=False: Message('Счета '+Позиции[Iter].СчДеб+'/'+Позиции[Iter].СчКре+' не могут корреспондировать',mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].Сумма=0 and Позиции[Iter].Кол=0: Message('Введите сумму или количество',mtError); Template.Field="Сумма"; Template.Frame=Iter; ^False; fi;
  if Валюта=BaseCurrency and not Позиции[Iter].СуммаРуб=0: Message("Сумму в рублях возможно ввести, только для валюты, отличной от базовой ("+BaseCurrency+")",mtError); Template.Field="СумРуб"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].ПризнКол="" and not Позиции[Iter].Кол=0: Message("Введите количественный признак",mtError); Template.Field="ПризнКол"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].ПризнДеб="" and Позиции[Iter].ПризнКре="":
     if not Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,Trim(Позиции[Iter].Призн+" "+Позиции[Iter].ПризнКол+" "+ПризнПодр),""): Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
     if not Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,Trim(Позиции[Iter].Призн+" "+Позиции[Iter].ПризнКол+" "+ПризнПодр),""): Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
    else
     if not Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб,"",Trim(Позиции[Iter].Призн+" "+Позиции[Iter].ПризнКол+" "+Позиции[Iter].ПризнДеб+" "+ПризнПодр),""): Template.Field="ПризнДеб_"; Template.Frame=Iter; ^False; fi;
     if not Раб.Бюджет.ПроверитьПризнакиОбязательные("",Позиции[Iter].СчКре,Trim(Позиции[Iter].Призн+" "+Позиции[Iter].ПризнКол+" "+Позиции[Iter].ПризнКре+" "+ПризнПодр),""): Template.Field="ПризнКре_"; Template.Frame=Iter; ^False; fi;
     if not Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб,"",Trim(Позиции[Iter].Призн+" "+Позиции[Iter].ПризнКол+" "+Позиции[Iter].ПризнДеб+" "+ПризнПодр),""): Template.Field="ПризнДеб_"; Template.Frame=Iter; ^False; fi;
     if not Раб.Бюджет.ПроверитьПризнакиСвязанные("",Позиции[Iter].СчКре,Trim(Позиции[Iter].Призн+" "+Позиции[Iter].ПризнКол+" "+Позиции[Iter].ПризнКре+" "+ПризнПодр),""): Template.Field="ПризнКре_"; Template.Frame=Iter; ^False; fi;
  fi;
  if WordsCount(Позиции[Iter].ПризнДеб," ")>NumSplitVoc: Message("Превышено максимальное количество справочников ("+Str(NumSplitVoc)+") для аналитики по дебету",mtError); Template.Field="ПризнДеб_"; Template.Frame=Iter; ^False; fi;
  if WordsCount(Позиции[Iter].ПризнКре," ")>NumSplitVoc: Message("Превышено максимальное количество справочников ("+Str(NumSplitVoc)+") для аналитики по кредиту",mtError); Template.Field="ПризнКре_"; Template.Frame=Iter;  ^False; fi;
 od;
 ^True;
end;

Proc ПолучитьДопАн(Iter:I);
var Справ,ПризнБК,ПризнКОСГУ,ТипКБК,tmp,Сч:S;
var isДеб:L;
 if not Name_S(Позиции[Iter].СчДеб)=" " and not Name_S(Позиции[Iter].СчКре)=" ":
    Справ=Раб.Бюджет2005.СписокСправ(Позиции[Iter].СчДеб+"|"+Позиции[Iter].СчКре,0,"");
    Сч=Позиции[Iter].СчДеб;
    isДеб=True;
    ТипКБК=Раб.Бюджет2005.ТипКБКСчета(Сч);
    if ТипКБК="КИФД":
       Сч=Позиции[Iter].СчКре;
       isДеб=False;
       ТипКБК=Раб.Бюджет2005.ТипКБКСчета(Сч);
    fi;
    if not (ТипКБК="ФКР" or ТипКБК="КД"): Exit; fi;
    ПризнБК="";
    if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Справ,"|",ТипКБК+".*","")="":
       ПризнБК=ТипКБК;
    fi;
    if not ПризнБК="":
       ПризнБК=ПризнБК+"."+Раб.Бюджет2005.ВзятьКодСчета(Сч,ТипКБК,"БК",False);
       if Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(if(isДеб,Позиции[Iter].ПризнДеб,Позиции[Iter].ПризнКре)," ","ФКР.*|КД.*|КИФД.*","|")="":
          Позиции[Iter].Призн=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].Призн," ",ПризнБК,"ФКР.*|КД.*|КИФД.*","|");
         else
          if isДеб:
             Позиции[Iter].ПризнДеб=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].ПризнДеб," ",ПризнБК,"ФКР.*|КД.*|КИФД.*","|");
            else
             Позиции[Iter].ПризнКре=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].ПризнКре," ",ПризнБК,"ФКР.*|КД.*|КИФД.*","|");
          fi;
       fi;
    fi;
    if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Справ,"|","КОСГУ.*","")="":
       if Match(Сч,"*.?.206.??.*") or Match(Сч,"*.?.208.??.*") or Match(Сч,"*.?.302.??.*"):
          ПризнКОСГУ=Раб.Бюджет2005.ВзятьКодСчета(Сч,ТипКБК,"Ан",False);
          ПризнКОСГУ=Раб.Бюджет2005.Соотв_Ан_КОСГУ("",ПризнКОСГУ);
          ПризнКОСГУ="КОСГУ."+ПризнКОСГУ;
         else
          ПризнКОСГУ="КОСГУ."+Раб.Бюджет2005.ВзятьКодСчета(Сч,ТипКБК,"КОСГУ",False);
          if not ((ТипКБК="ФКР" and Раб.Бюджет2005.MatchMask(ПризнКОСГУ,Раб.Бюджет2005.МаскаРасхСч)) or (ТипКБК="КД" and Раб.Бюджет2005.MatchMask(ПризнКОСГУ,Раб.Бюджет2005.МаскаДоходСч))):
             ПризнКОСГУ="КОСГУ.";
          fi;
       fi;
       if ПризнКОСГУ="КОСГУ.":
          isДеб=not isДеб;
          if isДеб: Сч=Позиции[Iter].СчДеб; else Сч=Позиции[Iter].СчКре; fi;
          ТипКБК=Раб.Бюджет2005.ТипКБКСчета(Сч);
          if not (ТипКБК="ФКР" or ТипКБК="КД"): Exit; fi;
          if Match(Сч,"*.?.206.??.*") or Match(Сч,"*.?.208.??.*") or Match(Сч,"*.?.302.??.*"):
             ПризнКОСГУ=Раб.Бюджет2005.ВзятьКодСчета(Сч,ТипКБК,"Ан",False);
             ПризнКОСГУ=Раб.Бюджет2005.Соотв_Ан_КОСГУ("",ПризнКОСГУ);
             ПризнКОСГУ="КОСГУ."+ПризнКОСГУ;
            else
             ПризнКОСГУ="КОСГУ."+Раб.Бюджет2005.ВзятьКодСчета(Сч,ТипКБК,"КОСГУ",False);
             if not ((ТипКБК="ФКР" and Раб.Бюджет2005.MatchMask(ПризнКОСГУ,Раб.Бюджет2005.МаскаРасхСч)) or (ТипКБК="КД" and Раб.Бюджет2005.MatchMask(ПризнКОСГУ,Раб.Бюджет2005.МаскаДоходСч))):
                ПризнКОСГУ="КОСГУ.";
             fi;
          fi;
       fi;
       if not ПризнКОСГУ="КОСГУ.":
          tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(if(isДеб,Позиции[Iter].ПризнДеб,Позиции[Iter].ПризнКре)," ","КОСГУ.*","");
          if tmp="":
             tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","КОСГУ.*","");
             if not Match(tmp,ПризнКОСГУ+"!"):
                Позиции[Iter].Призн=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].Призн," ",ПризнКОСГУ,"КОСГУ.*","|");
             fi;
            else
             if not Match(tmp,ПризнКОСГУ+"!"):
                if isДеб:
                   Позиции[Iter].ПризнДеб=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].ПризнДеб," ",ПризнКОСГУ,"КОСГУ.*","|");
                  else
                   Позиции[Iter].ПризнКре=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].ПризнКре," ",ПризнКОСГУ,"КОСГУ.*","|");
                fi;
             fi;
          fi;
       fi;
    fi;
 fi;
end;

Proc ПривестиВСоотвПризн(Iter:I);
var tmp1,tmp2,tmp:s;
 if not Позиции[Iter].СчДеб="" and not Позиции[Iter].СчКре="" and not fНеСвязАналит:
    tmp1=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб,"","");
    tmp2=Раб.Бюджет.НаборПризнаков("",Позиции[Iter].СчКре,"");
    Позиции[Iter].ПризнДеб=Раб.Бюджет.МухиОтКотлет(Позиции[Iter].ПризнДеб,tmp1);
    Позиции[Iter].ПризнКре=Раб.Бюджет.МухиОтКотлет(Позиции[Iter].ПризнКре,tmp2);
    tmp=Раб.Бюджет2005.Объединить(tmp1,tmp2,"|");
    Позиции[Iter].Призн=Раб.Бюджет.МухиОтКотлет(Позиции[Iter].Призн,tmp);
    Позиции[Iter].ПризнКол=Раб.Бюджет.МухиОтКотлет(Позиции[Iter].ПризнКол,tmp);
 fi;
end;

Func РежимОбщ:I;
var Iter:I;
var fMin,fSel:L;
 fMin=False; fSel=False;
 for Iter=1..Позиции do
  if Позиции[Iter].Сумма<0: fMin=True; fi;
  if Выделить[Iter]="X": fSel=True; fi;
 od;
 ClearVariable(Buf);
 if fSel:
    Buf[1]="Для всех строк таблицы";
    Buf[2]="Для всех выделенных строк таблицы";
    Iter=Alternate("Выберите режим заполнения",Buf,-1,1,12);
    if Iter=0: ^99;
      |Iter=2: ^ 2;
    fi;
   |fMin:
    Buf[1]="Для всех строк таблицы";
    Buf[2]="Для строк таблицы с положительной суммой";
    Buf[3]="Для строк таблицы с отрицательной суммой";
    Iter=Alternate("Выберите режим заполнения",Buf,-1,1,12);
    if Iter=0: ^99;
      |Iter=2: ^ 1;
      |Iter=3: ^-1;
    fi;
 fi;
 ^0;
end;

Func ЗаполнитьКлючДок:L;
var Flag:L;
 Flag=True;
 if FuncExists(extКлюч): 
    Flag=ExecuteFuncL(extКлюч);
    if not Flag and Проводить:
       Проводить=Flag;
       cbПроводить.State=Проводить;
       Оформление;
    fi;
 fi;
 ^Flag;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func НастрПоУмолч_OnEnter(FieldName: String; Iter: Integer): logical;
 if FieldName="НастрПоУмолч":
    if EnqOkCancel("Восстановить значения по умолчанию ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 if FieldName="НастрПоУмолч":
    Message("Значения по умолчанию восстановлены");
 fi;
 Return False;
end;

Func НастрЗакр_OnEnter(FieldName: String; Iter: Integer): logical;
 ОткрНастр(False);
 Настр(True);
 Return False;
end;

Func extFunc_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if not Value="":
    if not FuncExists(Value): Message("Функция '"+Value+"' не найдена",mtError); ^False; fi;
 fi;
 Return True;
end;

Proc ДатаСпр_OnExit(FieldName: String; Iter: Integer);
 if not ДатаСпр=1.1.100:
    if ДатаИсп<ДатаСпр and not ДатаИсп=1.1.100: ДатаИсп=ДатаСпр; fi;
    if ДатаОтв<ДатаСпр and not ДатаОтв=1.1.100: ДатаОтв=ДатаСпр; fi;
    if ДатаУчет<ДатаСпр and not ДатаУчет=1.1.100: ДатаУчет=ДатаСпр; fi;
 fi;
end;

Func Дата_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:d;
var Field:S;
var Iter:I;
 Template.HideEditor(False);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 Field=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if Field="ДатаСпр":  ДатаСпр=tmp;
   |Field="ДатаДок":  Позиции[Iter].ДатаДок=tmp;
   |Field="ДатаИсп":  ДатаИсп=tmp;
   |Field="ДатаОтв":  ДатаОтв=tmp;
   |Field="ДатаУчет": ДатаУчет=tmp;
 fi;
 ^Cur;
end;

Func Рекв_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
 Rec=OpenCardFile("Контрагент","Наше",Рекв,crdRecordOnly);
 if not rec=nil:
    Рекв=Rec;
    ФИОРук=Рекв.ФИОРук;
    ФИОБух=Рекв.ФИОБух;
    ПоложениеКнопок;
 fi;
 ^False;
end;

Proc Рекв_OnExit(FieldName: String; Iter: Integer);
 ПоложениеКнопок;
end;

Func НаимПодр_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
var Rec: Record;
 tmp=AnaElection("П.*");
 if not tmp="":
    ПризнПодр=tmp;
    НаимПодр=Name_A(tmp);
    if НаимПодр="" or НаимПодр=" ": НаимПодр=tmp; fi;
    ПоложениеКнопок;
    for Iter=1..Позиции do
     Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","П.*","");
     Позиции[Iter].ПризнДеб=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнДеб," ","П.*","");
     Позиции[Iter].ПризнКре=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКре," ","П.*","");
    od;
    Rec=SignToRecord(ПризнПодр);
    if not Rec=nil:
       tmp=GetCardFieldS("ПОДРАЗДЕЛЕНИЯ",Rec,"Отв.ФИОТ");
       if not tmp="":
          ФИОрук=tmp;
       fi;
    fi;
 fi;
 ^False;
end;

Proc Кмнт_OnExit(FieldName: String; Iter: Integer);
 ПоложениеКнопок;
end;

Func СодержОбщ_OnEnter(FieldName: String; Iter: Integer): logical;
var i:i;
var Txt,tmp:S;
 FieldName=SubStr(FieldName,1,Length(FieldName)-3);
 Txt=if(FieldName="СодержОбщ","Наименование и основание проводимой операции","Номер документа");
 if Input(tmp,Txt)=cmOk:
    if not tmp="":
       i=РежимОбщ;
       if i=99: ^False; fi;
       for Iter=1..Позиции do
        if i=0 or (Позиции[Iter].Сумма>=0 and i=1) or (Позиции[Iter].Сумма<0 and i=-1) or (Выделить[Iter]="X" and i=2):
           PutVariableS("Позиции["+Str(Iter)+"]."+FieldName,tmp);
        fi;
       od;
    fi;
 fi;
 Return False;
end;

Proc СодержОбщ_OnExit(FieldName: String; Iter: Integer);
var i:i;
 FieldName=SubStr(FieldName,1,Length(FieldName)-3);
 i=РежимОбщ;
 if i=99: Exit; fi;
 for Iter=1..Позиции do
  if i=0 or (Позиции[Iter].Сумма>=0 and i=1) or (Позиции[Iter].Сумма<0 and i=-1) or (Выделить[Iter]="X" and i=2):
     PutVariableS("Позиции["+Str(Iter)+"]."+FieldName,"");
  fi;
 od;
end;

Func ДатаДокОбщ_OnEnter(FieldName: String; Iter: Integer): logical;
var i:i;
var tmp:D;
 tmp=Calendar;
 if not tmp=1.1.100:
    i=РежимОбщ;
    if i=99: ^False; fi;
    for Iter=1..Позиции do
     if i=0 or (Позиции[Iter].Сумма>=0 and i=1) or (Позиции[Iter].Сумма<0 and i=-1) or (Выделить[Iter]="X" and i=2):
        Позиции[Iter].ДатаДок=tmp;
     fi;
    od;
 fi;
 Return False;
end;

Proc ДатаДокОбщ_OnExit(FieldName: String; Iter: Integer);
var i:i;
 i=РежимОбщ;
 if i=99: Exit; fi;
 for Iter=1..Позиции do
  if i=0 or (Позиции[Iter].Сумма>=0 and i=1) or (Позиции[Iter].Сумма<0 and i=-1) or (Выделить[Iter]="X" and i=2):
     Позиции[Iter].ДатаДок=1.1.100;
  fi;
 od;
end;

Func СчОбщ_OnEnter(FieldName: String; Iter: Integer): logical;
var i:i;
var tmp:S;
 FieldName=SubStr(FieldName,1,Length(FieldName)-3);
 tmp=AccountElection("*",False,if(FieldName="СчДеб",hСчДеб,hСчКре));
 if tmp="": ^False; fi;
 if FieldName="СчДеб": hСчДеб=tmp; else hСчКре=tmp; fi;
 i=РежимОбщ;
 if i=99:^False; fi;
 for Iter=1..Позиции do
  if i=0 or (Позиции[Iter].Сумма>=0 and i=1) or (Позиции[Iter].Сумма<0 and i=-1) or (Выделить[Iter]="X" and i=2):
     PutVariableS("Позиции["+Str(Iter)+"]."+FieldName,tmp);
     if not Позиции[Iter].СчДеб="" and not Позиции[Iter].СчКре="":
        if not Correspond(Позиции[Iter].СчДеб,Позиции[Iter].СчКре): 
           if FieldName="СчДеб": Позиции[Iter].СчКре=""; else Позиции[Iter].СчДеб=""; fi;
        fi;
     fi;
     ПривестиВСоотвПризн(Iter);
  fi;
 od;
 Return False;
end;

Func ПризнОбщ_OnEnter(FieldName: String; Iter: Integer): logical;
var i:i;
var tmp,voc:S;
 if FieldName="ПризнКолОбщ": Message("Для поля 'количественный признак' доступно только удаление, выбор признака возможен только в строке",mtWarning); ^False; fi;
 FieldName=SubStr(FieldName,1,Length(FieldName)-3);
 if fНеСвязАналит:
    tmp="*";
   else
    ClearVariable(Раб.Бюджет2005.BufСч);
    for Iter=1..Позиции do
     if FieldName="ПризнДеб" and not Позиции[Iter].СчДеб="":
        AddInArray(Раб.Бюджет2005.BufСч,True,False,Позиции[Iter].СчДеб);
       |FieldName="ПризнКре" and not Позиции[Iter].СчКре="":
        AddInArray(Раб.Бюджет2005.BufСч,True,False,Позиции[Iter].СчКре);
       |FieldName="Призн":
        if not Позиции[Iter].СчДеб="": AddInArray(Раб.Бюджет2005.BufСч,True,False,Позиции[Iter].СчДеб); fi;
        if not Позиции[Iter].СчКре="": AddInArray(Раб.Бюджет2005.BufСч,True,False,Позиции[Iter].СчКре); fi;
     fi;
    od;
    tmp=Раб.Бюджет2005.СписокСправ("@",0,"");
    if tmp="": Message("Аналитические признаки не требуются"); ^False; fi;
 fi;
 tmp=AnaElection(tmp+"|(*&~*.*)",False,False,hПризн);
 if not tmp="":
    hПризн=tmp;
    i=РежимОбщ;
    if i=99: ^False; fi;
    Voc=SubStr(tmp,1,Pos(".",tmp));
    if Voc="": Voc=tmp; else Voc=Voc+"*"; fi;
    for Iter=1..Позиции do
     if i=0 or (Позиции[Iter].Сумма>=0 and i=1) or (Позиции[Iter].Сумма<0 and i=-1) or (Выделить[Iter]="X" and i=2):
        if FieldName="Призн":
           Позиции[Iter].Призн=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].Призн," ",tmp,Voc,"");
           Позиции[Iter].ПризнДеб=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнДеб," ",Voc,"");
           Позиции[Iter].ПризнКре=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКре," ",Voc,"");
          else
           if FieldName="ПризнДеб": Позиции[Iter].ПризнДеб=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].ПризнДеб," ",tmp,Voc,"");
             |FieldName="ПризнКре": Позиции[Iter].ПризнКре=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].ПризнКре," ",tmp,Voc,"");
           fi;
           Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ",Voc,"");
        fi;
        Позиции[Iter].ПризнКол=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКол," ",Voc,"");
        if not Pos(".",tmp)=0:
           ПривестиВСоотвПризн(Iter);
        fi;
     fi;
    od;
    if Voc="П.*":
       ПризнПодр="";
       НаимПодр="";
    fi;
 fi;
 Return False;
end;

Proc ПризнОбщ_OnExit(FieldName: String; Iter: Integer);
var w,ww,i,p,n:i;
var tmp,Призн_:S;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 FieldName=SubStr(FieldName,1,Length(FieldName)-3);
 for Iter=1..Позиции do
  Призн_=GetVariableS("Позиции["+Str(Iter)+"]."+FieldName);
  if not Призн_="":
     ww=WordsCount(Призн_," ");
     for w=1..ww do
      tmp=ExtractWord(w,Призн_," ");
      p=Pos(".",tmp);
      if not p=0: tmp=SubStr(tmp,1,p); fi;
      AddInArray(Buf,True,False,tmp);
     od;
  fi;
 od;
 ww=LengthOfArray(buf);
 for w=1..ww do
  if Pos(".",Buf[w])=0: tmp=""; else tmp="*"; fi;
  Buf2[w]=Buf[w]+tmp+"  --"+Name_A(Buf[w]);
  Buf[w]=Buf[w]+tmp;
 od;
 InsertInArray(Buf,1,"");
 InsertInArray(Buf2,1,"Удалить все");
 n=Alternate("Удаление справочника...",Buf2,-1,1,12);
 if not n=0:
    Призн_=Buf[n];
    i=РежимОбщ;
    if i=99: Exit; fi;
    for Iter=1..Позиции do
     if i=0 or (Позиции[Iter].Сумма>=0 and i=1) or (Позиции[Iter].Сумма<0 and i=-1) or (Выделить[Iter]="X" and i=2):
        if n=1:
           PutVariableS("Позиции["+Str(Iter)+"]."+FieldName,"");
          else
           tmp=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(GetVariableS("Позиции["+Str(Iter)+"]."+FieldName)," ",Призн_,"");
           PutVariableS("Позиции["+Str(Iter)+"]."+FieldName,tmp);
        fi;
     fi;
    od;
 fi;
end;

Func Валюта_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var Cur:S;
 ClearVariable(Buf);
 n=0;
 for Currencies Cur="*" do
  n=n+1;
  Buf[n]=Up(Cur)+" --"+Name_C(Cur);
 od;
 n=Alternate("Валюта",Buf,-1,1,12);
 if not n=0:
    Валюта=SubStr(Buf[n],1,3);
    if Валюта=BaseCurrency:
       for n=1..Позиции do
        Позиции[Iter].СуммаРуб=0;
       od;
    fi;
 fi;
 Return False;
end;

Func СуммаРуб_OnEnter(FieldName: String; Iter: Integer): logical;
 if Валюта=BaseCurrency or Валюта="":
    Message("Сумму в рублях возможно ввести, только для валюты, отличной от базовой ("+BaseCurrency+")",mtWarning);
    Template.Field="Валюта";
    ^False;
 fi;
 Return True;
end;

Func Выделить_OnEnter(FieldName: String; Iter: Integer): logical;
var n,nn:i;
 if FieldName="Выделить_":
    n=1;
    nn=Позиции;
   else
    n=Iter;
    nn=Iter;
 fi;
 for Iter=n..nn do
  Выделить[Iter]=if(Выделить[Iter]="","X","");
 od;
 Return False;
end;

Proc Выделить_OnExit(FieldName: String; Iter: Integer);
 ClearVariable(Выделить);
end;

Func A_OnEnter(FieldName: String; Iter: Integer): logical;
 if Проводить: ^False; fi;
 Iter=InsertFrame(Позиции, Iter+1);
 ^False;
end;

Func AA_OnEnter(FieldName: String; Iter: Integer): logical;
var Iter_:I;
 if Проводить: ^False; fi;
 Iter_=Iter;
 Iter=InsertFrame(Позиции, Iter+1);
 Позиции[Iter].Содерж=Позиции[Iter_].Содерж;
 Позиции[Iter].НомДок=Позиции[Iter_].НомДок;
 Позиции[Iter].ДатаДок=Позиции[Iter_].ДатаДок;
 Позиции[Iter].СчДеб=Позиции[Iter_].СчДеб;
 Позиции[Iter].СчКре=Позиции[Iter_].СчКре;
 Позиции[Iter].Сумма=Позиции[Iter_].Сумма;
 Позиции[Iter].Призн=Позиции[Iter_].Призн;
 Позиции[Iter].ПризнДеб=Позиции[Iter_].ПризнДеб;
 Позиции[Iter].ПризнКре=Позиции[Iter_].ПризнКре;
 Позиции[Iter].ПризнКол=Позиции[Iter_].ПризнКол;
 Позиции[Iter].Кол=Позиции[Iter_].Кол;
 Return False ;
end;

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

Func AБД_OnEnter(FieldName: String; Iter: Integer): logical;
var Iter_,n,nn:I;
var Д_КОСГУ,К_КОСГУ,Сч,СчКорр,БК,Ист,Синт,Ан,КОСГУ,Зн,БО:S;
 if Проводить: ^False; fi;
 if Позиции[Iter].СчДеб="": Message('Введите счет дебета',mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
 if Позиции[Iter].СчКре="": Message('Введите счет кредита',mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
 Д_КОСГУ=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчДеб,"","КОСГУ",False);
 К_КОСГУ=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"","КОСГУ",False);
 if not (Д_КОСГУ="560" or Д_КОСГУ="660" or Match(Д_КОСГУ,"7??") or Match(Д_КОСГУ,"8??") or К_КОСГУ="560" or К_КОСГУ="660" or Match(К_КОСГУ,"7??") or Match(К_КОСГУ,"8??")):
    Message("Дебиторской (увеличение, уменьшение) или кредиторской (увеличение, уменьшение) задолженности в текщуй строке не обнаружено",mtError);
    ^False;
 fi;
 if FieldName="AБО" or FieldName="AБД":
    if (Match(Позиции[Iter].СчДеб,"*.?.501.?3.*") or Match(Позиции[Iter].СчКре,"*.?.506.10.*")) and Match(Позиции[Iter].СчКре,"*.1.502.?1.*"):
       Message("Текущая строка уже проводкой бюджетного обязательства",mtError);
       ^False;
    fi;
 fi;
 if FieldName="AДО" or FieldName="AБД":
    if Match(Позиции[Iter].СчДеб,"*.?.502.?1.*") and Match(Позиции[Iter].СчДеб,"*.?.502.?2.*"):
       Message("Текущая строка уже проводкой денежного обязательства",mtError);
       ^False;
    fi;
 fi;
 if Д_КОСГУ="560": Сч=Позиции[Iter].СчДеб; СчКорр=Позиции[Iter].СчКре; Зн="+"; --увелечение дебиторки
   |Match(Д_КОСГУ,"8??"): Сч=Позиции[Iter].СчДеб; СчКорр=Позиции[Iter].СчКре; Зн="+"; --уменьшение кредиторки
   |Match(К_КОСГУ,"7??"): Сч=Позиции[Iter].СчКре; СчКорр=Позиции[Iter].СчДеб; Зн="-"; --увелечение кредиторки
   |К_КОСГУ="660": Сч=Позиции[Iter].СчКре; СчКорр=Позиции[Iter].СчДеб; Зн="-"; --уменьшение дебиторки
   |Д_КОСГУ="660" or Match(Д_КОСГУ,"7??"): Сч=Позиции[Iter].СчДеб; СчКорр=Позиции[Iter].СчКре; Зн="+"; --???
   |К_КОСГУ="560" or Match(К_КОСГУ,"8??"): Сч=Позиции[Iter].СчКре; СчКорр=Позиции[Iter].СчДеб; Зн="-"; --???
   |True: Message("Все так сложно все так запутано, но разбираться некогда брат...",mtError);  ^False;
 fi;
 БК=Раб.Бюджет2005.ВзятьКодСчета(Сч,"","БК",False);
 Ист=Раб.Бюджет2005.ВзятьКодСчета(Сч,"","Ист",False);
 if Ист="3": Message("Для источника (3) формирование бюджетного или денежного обязательства не предусмотрено",mtError); ^False; fi;
 Синт=Раб.Бюджет2005.ВзятьКодСчета(Сч,"","Синт",False);
 Ан=Раб.Бюджет2005.ВзятьКодСчета(Сч,"","Ан",False);
 if Синт="206" or Синт="302":
    КОСГУ=Раб.Бюджет2005.Соотв_Ан_КОСГУ(Синт,Ан);
   |Match(СчКорр,"*.1.304.05.*"):
    КОСГУ=Раб.Бюджет2005.ВзятьКодСчета(СчКорр,"","КОСГУ",False);
   |True:
    КОСГУ=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","КОСГУ.*","");
    if КОСГУ="": 
       if Зн="+":
          КОСГУ=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].ПризнДеб," ","КОСГУ.*","");
         else
          КОСГУ=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].ПризнКре," ","КОСГУ.*","");
       fi;
    fi;
    КОСГУ=SubStr(КОСГУ,7,3);
 fi;
 if КОСГУ="": Message("Не удалось вычислить значение КОСГУ, введите значение КОСГУ в аналитических признаках",mtError); Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
 БО=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","БО.*","");
 if БО="":
    if Зн="+":
       БО=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].ПризнДеб," ","БО.*","");
      else
       БО=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].ПризнКре," ","БО.*","");
    fi;
 fi;
 if FieldName="AБД":
    nn=2;
    FieldName="AБО";
   else
    nn=1;
 fi;
 for n=1..nn do
  if n=1: Iter_=Iter+1; else Iter_=Iter_+1; fi;
  InsertFrame(Позиции,Iter_);
  Позиции[Iter_].Содерж=Позиции[Iter].Содерж;
  Позиции[Iter_].НомДок=Позиции[Iter].НомДок;
  Позиции[Iter_].ДатаДок=Позиции[Iter].ДатаДок;
  Позиции[Iter_].Призн=Позиции[Iter].Призн;
  Позиции[Iter_].ПризнДеб=Позиции[Iter].ПризнДеб;
  Позиции[Iter_].ПризнКре=Позиции[Iter].ПризнКре;
  Позиции[Iter_].ПризнКол=Позиции[Iter].ПризнКол;
  Позиции[Iter_].Кол=Позиции[Iter].Кол;
  Позиции[Iter_].Сумма=Позиции[Iter].Сумма;
  if FieldName="AБО":
     Позиции[Iter_].СчДеб=БК+"."+Ист+if(Ист="1",".501.13.",".506.10.")+КОСГУ;
     Позиции[Iter_].СчКре=БК+"."+Ист+".502.11."+КОСГУ;
    |FieldName="AДО":
     Позиции[Iter_].СчДеб=БК+"."+Ист+".502.11."+КОСГУ;
     Позиции[Iter_].СчКре=БК+"."+Ист+".502.12."+КОСГУ;
  fi;
  if БО="": Позиции[Iter_].Призн=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter_].Призн," ","БО.000","БО.*",""); fi;
  if n=1 and FieldName="AБО": FieldName="AДО"; fi;
 od;
 Template.Frame=Iter_;
 Return False;
end;

Func Содерж_OnEnter(FieldName: String; Iter: Integer): logical;
 Template.Field=SubStr(FieldName,1,Length(FieldName)-1);
 Return False;
end;

Func СчДеб_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 НеПустаяТаблица;
 if FieldName="СчДеб": ^True; fi;
 tmp=ВыборКоррСчета(Позиции[Iter].СчКре,True,hСчДеб);
 if tmp="": ^False; fi;
 Позиции[Iter].СчДеб=tmp;
 hСчДеб=tmp;
 ПривестиВСоотвПризн(Iter);
 ^False;
end;

Func Сч_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
 if Name_S(Value)=" ": Message("Неизвестный счет '"+Value+"'",mtError); ^False; fi;
 Return True;
end;

Func СчДеб_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 СчДеб_OnEnter("",AsInteger(Template.Frame));
 Return Cur;
end;

Func СчКре_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 НеПустаяТаблица;
 if FieldName="СчКре": ^True; fi;
 tmp=ВыборКоррСчета(Позиции[Iter].СчДеб,False,hСчКре);
 if tmp="": ^False; fi;
 Позиции[Iter].СчКре=tmp;
 hСчКре=tmp;
 ПривестиВСоотвПризн(Iter);
 ^False;
end;

Func СчКре_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 СчКре_OnEnter("",AsInteger(Template.Frame));
 Return Cur;
end;

Func Призн_onEnter(Field:S; Iter:I):L;
var tmp,Voc:s;
 НеПустаяТаблица;
 if Name_S(Позиции[Iter].СчДеб)=" ": Message("Введите счет дебета",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
 if Name_S(Позиции[Iter].СчКре)=" ": Message("Введите счет кредита",mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
 if Field="ПризнДеб_": tmp=Позиции[Iter].СчДеб; if WordsCount(Позиции[Iter].ПризнДеб," ")>NumSplitVoc: Message("Превышено максимальное количество справочников ("+Str(NumSplitVoc)+") для аналитики по дебету",mtError); ^False; fi;
   |Field="ПризнКре_": tmp=Позиции[Iter].СчКре; if WordsCount(Позиции[Iter].ПризнКре," ")>NumSplitVoc: Message("Превышено максимальное количество справочников ("+Str(NumSplitVoc)+") для аналитики по кредиту",mtError); ^False; fi;
   |True: tmp=Позиции[Iter].СчДеб+"|"+Позиции[Iter].СчКре;
 fi;
 if Field="Призн_" or Field="ПризнДеб_" or Field="ПризнКре_": FlagEdit=True; ^True; fi;
 if Позиции[Iter].Призн="" and Позиции[Iter].ПризнДеб="" and Позиции[Iter].ПризнКре="":
    ПолучитьДопАн(Iter);
 fi;
 if fНеСвязАналит:
    tmp="*";
   else
    tmp=Раб.Бюджет2005.СписокСправ(tmp,0,"");
    if tmp="": Message("Аналитические признаки не требуются"); ^False; fi;
 fi;
 tmp=AnaElection(tmp+"|(*&~*.*)",False,False,hПризн);
 if not tmp="":
    Voc=SubStr(tmp,1,Pos(".",tmp));
    if Voc="": Voc=tmp; else Voc=Voc+"*"; fi;
    if Match(Field,"ПризнДеб*") or Match(Field,"ПризнКре*"):
       if Field="ПризнДеб": Позиции[Iter].ПризнДеб=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].ПризнДеб," ",tmp,Voc,"");
         |Field="ПризнКре": Позиции[Iter].ПризнКре=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].ПризнКре," ",tmp,Voc,"");
       fi;
       Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ",Voc,"");
      else
       Позиции[Iter].Призн=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(Позиции[Iter].Призн," ",tmp,Voc,"");
       Позиции[Iter].ПризнДеб=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнДеб," ",Voc,"");
       Позиции[Iter].ПризнКре=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКре," ",Voc,"");
    fi;
    Позиции[Iter].ПризнКол=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКол," ",Voc,"");
    if Voc="П.*":
       ПризнПодр="";
       НаимПодр="";
    fi;
    hПризн=tmp;
 fi;
 ^False;
end;

Func Призн_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var w,ww,z:i;
var voc:S;
 ClearVariable(Buf);
 Value=Up(Value);
 ww=WordsCount(Value," ");
 for w=1..ww do
  Buf[w]=ExtractWord(w,Value," ");
  if not ValidSign(Buf[w]): Message("Введённое значение признака не является корректным '"+Buf[w]+"'",mtError); ^False; fi;
  if Name_A(Buf[w])=" ": Message("Неизвестный аналитический признак '"+Buf[w]+"'",mtError); ^False; fi;
 od;
 for w=1..ww do
  z=SearchInArray(Buf,Buf[w],False,w+1);
  if not z=-1: Message("Повторный ввод признака '"+Buf[w]+"'",mtError); ^False; fi;
  if Match(Buf[w],"*.*"):
     Voc=ExtractWord(1,Buf[w],".")+".*";
    else
     Voc=Buf[w];
  fi;
  if FieldName="Призн_":
     Позиции[Iter].ПризнДеб=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнДеб," ",Voc,"");
     Позиции[Iter].ПризнКре=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКре," ",Voc,"");
    else
     Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ",Voc,"");
  fi;
  Позиции[Iter].ПризнКол=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКол," ",Voc,"");
 od;
 FieldName="Позиции["+Str(Iter)+"]."+SubStr(FieldName,1,Length(FieldName)-1);
 PutVariableS(FieldName,Value);
 Return True;
end;

Proc Призн_OnExit(Field:S; Iter:I);
 if FlagEdit:
    FlagEdit=False;
   else
    НеПустаяТаблица;
    Field="Позиции["+Str(Iter)+"]."+SubStr(Field,1,Length(Field)-1);
    PutVariableS(Field,Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(GetVariables(Field)," ","Name_A"));
 fi;
end;

Func Призн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Field:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 Призн_onEnter(SubStr(Field,1,Length(Field)-1),AsInteger(Template.Frame));
 Return Cur;
end;

Func ПризнКол_OnEnter(FieldName: String; Iter: Integer): logical;
var w,ww:i;
var Mask,tmp,Mask2:S;
 НеПустаяТаблица;
 if Позиции[Iter].СчДеб="": Message("Введите счет дебета",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
 if Позиции[Iter].СчКре="": Message("Введите счет кредита",mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
 if FieldName="ПризнКол": ^True; fi;
 Mask2="";
 Mask=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб, Позиции[Iter].СчКре,"");
 ww=WordsCount(Mask,"|");
 for w=1..ww do
  tmp=ExtractWord(w,Mask,"|");
  tmp=SubStr(tmp,1,Pos(".",tmp)-1);
  if СправИмеетКоличПризнак(tmp): Mask2=Раб.Бюджет2005.Объединить(Mask2,tmp,".*"); fi;
 od;
 if Mask2="": Message("Количественный признак не требуется"); ^False; fi;
 tmp=AnaElection(Mask2);
 if tmp="": ^False; fi;
 Позиции[Iter].ПризнКол=tmp;
 tmp=SubStr(tmp,1,Pos(".",tmp))+"*";
 Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ",tmp,"");
 Позиции[Iter].ПризнДеб=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнДеб," ",tmp,"");
 Позиции[Iter].ПризнКре=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКре," ",tmp,"");
 Return False;
end;

Func ПризнКол_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var tmp:S;
 if Name_A(Value)=" ": Message("Неизвестный аналитический признак '"+Value+"'",mtError); ^False; fi;
 tmp=ExtractWord(1,Value,".");
 if not СправИмеетКоличПризнак(tmp): Message("Аналитический признак '"+Value+"' не является количественным",mtError); ^False; fi;
 Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ",tmp+".*","");
 Позиции[Iter].ПризнДеб=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнДеб," ",tmp+".*","");
 Позиции[Iter].ПризнКре=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].ПризнКре," ",tmp+".*","");
 Return True;
end;

Func ПризнКол_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 ПризнКол_OnEnter("",AsInteger(Template.Frame));
 Return Cur;
end;

Func Кол_OnEnter(FieldName: String; Iter: Integer): logical;
 if Позиции[Iter].ПризнКол="": Message("Введите количественный признак",mtError); Template.Field="ПризнКол"; Template.Frame=Iter; ^False; fi;
 Return True;
end;

Func ФИО_OnLookup(Sect:S; Row:I; Col:I; Cur:S) :S;
var Rec:Record;
var v1,v2,v3,Field:S;
 Template.HideEditor(False);
 Rec=OpenCardFile("Сотрудники");
 if not Rec=nil:
    v1=GetCardFieldS("Сотрудники",Rec,"ДОЛЖНОСТЬ.Долж");
    v2=GetCardFieldS("Сотрудники",Rec,"ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники",Rec,"ИНИЦИАЛЫ");
    v3=GetCardFieldS("Сотрудники",Rec,"ТелефонРабочий");
    Field=AsString(Template.Field);
    if Field="ФИОРук"                                      :ФИОРук=v2;
      |Field="ФИОБух"                                      :ФИОБух=v2;
      |Field="ФИОИсп" or Field="ДолжнИсп" or Field="ТелИсп":ДолжнИсп=v1; ФИОИсп=v2; ТелИсп=v3;
      |Field="ФИООтв" or Field="ДолжнОтв"                  :ДолжнОтв=v1; ФИООтв=v2;
    fi;
 fi;
 ^Cur;
end;

Func СканГЭК2_OnEnter(FieldName: String; Iter: Integer): logical;
var bln:S;
 if Проводить and FieldName="СканГЭК2": ^False; fi;
 if FieldName="СканГЭК2": EditorApply; fi;
 bln="Раб.Вспом.Скан_Док";
 if ModalMode and isBlankOpen(bln): Message("Бланк электронной копии уже открыт. Для возврата закройте текущий бланк",mtWarning); ^False; fi;
 if isBlankOpen(bln): Close(bln); fi;
 ExecuteProc(bln+".Вызвать",Проводить,ToDay,SelfCrd,Current,"Бухгалтерская справка","",ДатаСпр,"",True,if(FieldName="СканГЭК2",nil,ГЭК2Rec[Iter]));
 РасчетГЭК2;
 Return False;
end;

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

Func ГЭК2вPDF_OnEnter(FieldName: String; Iter: Integer): logical;
var i:i;
var File:S;
 РасчетГЭК2;
 if УпрГЭК2=0: Message("Нет данных для формирования PDF"); ^False; fi;
 for Iter=1..УпрГЭК2 do
  i=Раб.Вспом.Сканер.ЧитатьГЭК("РПО_СКАН_ДОК",RecordToInteger(ГЭК2Rec[Iter]),"jpg",Iter=1);
 od;
 if i=0: Message("Нет данных для формирования PDF"); ^False; fi;
 if ПутьPDF="":
    if ChooseFolder(ПутьPDF,"Выберите папку для хранения PDF")=cmCancel: ^False; fi;
    File=ПутьPDF;
    ПутьPDF="";
   else
    File=ПутьPDF;
 fi;
 File=Раб.Бюджет2005.Контроль2Слэш(File+"\Бухгалтерская справка от "+Раб.Договор.ConvertStr(DateToString(ДатаСпр))+".pdf");
 if ExistFile(File):
    if EnqOkCancel("Файл "+File+" уже существет. Перезаписать ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 i=Раб.Вспом.Сканер.JpegToPdf(File,False);
 if i=1: 
    ExecuteProgram('"'+File+'"'); 
   else
    Message("Ошибка создания PDF файла ("+Str(i)+")");
 fi;
 Return False;
end;

Func ПутьPDF_OnEnter(FieldName: String; Iter: Integer): logical;
var i:I;
 if AsLogical(S1.Cell(5,3,CellReadOnly,"")):
    i=ChooseFolder(ПутьPDF,"Выберите папку для хранения PDF");
    ^False;
 fi;
 Return True;
end;

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

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

Proc Field_OnClick(Row: Integer; Col: Integer; Double: Logical);
var Field:S;
var Iter:I;
var Flag:L;
 Field=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if Double:
    Flag=ExecuteFuncL(Field+"_onEnter",Field,Iter);
 fi;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc OnTimer(Sender: String);
 Timer1.Active=False;
 ПоложениеКнопок_;
end;

Func S2OnInsert(SectName: String): Logical;
 Return not Проводить;
end;

Func S2OnDelete(SectName: String; Iter: Integer): Logical;
 Return not Проводить;
end;

Proc cbПроводить_onChange(Obj:S);
var Проводить_:L;
 if not Страница=1: Страница=1; ВывестиСтраницу; fi;
 ClearVariable(Выделить);
 if Проводить=False:
    if EnqOkCancel("Вы уверены, что хотите исключить данный документ из обработки ?",mtWarning)=cmCancel: EditorCancel; fi;
   else
    Проводить_=Проводить;
    Проводить=ПроверитьСправку;
 fi;
 cbПроводить.State=Проводить;
 if Проводить_=Проводить:
    Оформление;
    EditorApply;
 fi;
end;

Proc btnПечать_OnClick(Sender: S);
var cfg:s;
var s,c:i;
var Obj:Object;
 if Страница=1:
    --Рендер;
-- if Sender="btnPrint":
--    Раб.Настр_Печать.Prn("Раб.Вспом.Печать2","",Раб.Вспом.Печать2.SelfCfg,"",1);
--    Close("Раб.Вспом.Печать2");
--   |Sender="btnPreview":
--    OpenBlank("Раб.Вспом.Печать2");
-- fi;
    ОчиститьPrn;
    УпрВП=False;
    S3.Visible=True;
    Try
     S1.Column(7,colVisible,fВспомПечать);
     S1.Column(9,colVisible,fВспомПечать);
     for s=2..4 do
      if FindObject("S"+Str(s),Obj):
         for c=11..13 do
          Obj.Column(c,colVisible,fВспомПечать);
         od;
      fi;
     od;
     if fВисячаяПодпись:
        S3.Visible=False;
        УпрВП=True;
        for s=1..Позиции do
         InsertFrame(Упр,Упр+1);
         prnСодерж[Упр]=Позиции[s].Содерж;
         prnНомДок[Упр]=Позиции[s].НомДок;
         prnДатаДок[Упр]=Позиции[s].ДатаДок;
         prnСчДеб[Упр]=Позиции[s].СчДеб;
         prnСчКре[Упр]=Позиции[s].СчКре;
         prnПризн[Упр]=Позиции[s].Призн;
         prnПризнДеб[Упр]=Позиции[s].ПризнДеб;
         prnПризнКре[Упр]=Позиции[s].ПризнКре;
         prnПризнКол[Упр]=Позиции[s].ПризнКол;
         prnКол[Упр]=Позиции[s].Кол;
         prnСумма[Упр]=Позиции[s].Сумма;
         prnСуммаРуб[Упр]=Позиции[s].СуммаРуб;
        od;
        Упр=Упр-1;
        for s=1..2 do
         if FindObject("prn"+Str(s),Obj):
            for c=9..11 do
             Obj.Column(c,colVisible,fВспомПечать);
            od;
         fi;
        od;
     fi;
     if fВспомПечать:
        cfg="RPO_0504833_001.cfg";
       else
        cfg="RPO_0504833_000.cfg";
     fi;
--        Раб.Настр_Печать.PreView("","",cfg,"",True);
     Раб.Настр_Печать.Prn("","",cfg,"",1);
    Finally
     ОчиститьPrn;
     S1.Column(7,colVisible,True);
     S1.Column(9,colVisible,True);
     S3.Visible=True;
     for s=2..4 do
      if FindObject("S"+Str(s),Obj):
         for c=11..13 do
          Obj.Column(c,colVisible,True);
         od;
      fi;
     od;
    end;
   else
    Раб.Настр_Печать.Prn("","","RPO_0504833_001.cfg","",1);
--    Раб.Настр_Печать.PreView("","","RPO_0504833_001.cfg","",False);
 fi;
end;

Proc btnОчистить_OnClick(Sender: String);
 if not Страница=1: Страница=1; ВывестиСтраницу; Оформление; fi;
 if EnqOkCancel("Таблица будет очищена, продолжить ?",mtWarning)=cmOk:
    ClearVariable(Позиции);
 fi;
end;

Proc btnИмортЖур_OnClick(Sender: String);
var JName:S;
var tВал1,tВал2,tСчДеб,tСчКре,tКмнт,Crd,tmp:S;
var tДата:D;
var tСум1,tСум2:N;
var OWA,Iter,n,nn,z,j,jj,s,ss,t:I;
var Rec: Record;
 if not Страница=1: Страница=1; ВывестиСтраницу; Оформление; fi;
 Refresh;
 for transaction t="*",1.1.100,ToDay+1,Reverse do
  Break;
 od;
 if not t=cache:
    cache=t;
    ClearVariable(cacheS);
    ClearVariable(cacheJ);
    z=1;
    cacheS[z]="Текстовый журнал";
    jj=JournalsCount;
    ShowProgress(jj,"Обработка списка документов...");
    Try
     for j=0..jj do
      ProgressPos(j);
      tmp=JournalName(j);
      if JournalType(tmp)="КАРТ":
         crd=JournalCardFile(tmp);
         OWA=OpenWorkArea(crd,"",Раб.Бюджет2005.ПарсерJDF(tmp,"date+ff"));
         Try
          if not Records(OWA)=0:
            z=z+1;
            cacheS[z]=crd+"  -- "+Lo(ExtractWord(WordsCount(tmp,"\"),tmp,"\"));
            cacheJ[z]=j;
          fi;
         Finally
          CloseWorkArea(OWA);
         end;
      fi;
     od;
    Finally
     CloseProgress;
    end;
 fi;
 z=SearchInArray(cacheS,hЖур,False);
 z=Alternate("Выберите источник",cacheS,-1,z,12);
 if z=0: Exit;
   |z=1: hЖур=cacheS[z];
         if ChooseFile(JName,"Выберите журнал...","Журналы(*.jur)|*.jur")=cmCancel: Exit; fi;
         z=0; n=0;
         Раб.ИмяПолеКарт.Инициализация;
         RefreshAna;
         OpenTextJur(JName);
         Try
          ShowProgress(100,"Импорт проводок...");
          While not GetTransFromTextJur(tДата,tСум1,tВал1,tСум2,tВал2,tСчДеб,tСчКре,Buf,tКмнт) do
           n=n+1; ProgressPos(n); if n=100: n=0; fi;
           z=z+1;
           Iter=InsertFrame(Позиции,Позиции+1);
           Позиции[Iter].Содерж=tКмнт;
           Позиции[Iter].СчДеб=tСчДеб;
           Позиции[Iter].СчКре=tСчКре;
           nn=LengthOfArray(Buf);
           for n=1..nn do
            if (Match(Buf[n],"П.*") or Match(Buf[n],"+П.*") or Match(Buf[n],"-П.*")) and not ПризнПодр="": ПризнПодр=""; fi;
            if not Pos(":",Buf[n])=0:
               Позиции[Iter].ПризнКол=ExtractWord(1,Buf[n],":");
               Позиции[Iter].Кол=Round(ExtractWord(2,Buf[n],":"),15);
              |Pos("+",Buf[n])=1:
               Позиции[Iter].ПризнДеб=Раб.Бюджет2005.Объединить(Позиции[Iter].ПризнДеб,SubStr(Buf[n],2,255)," ");
              |Pos("-",Buf[n])=1:
               Позиции[Iter].ПризнКре=Раб.Бюджет2005.Объединить(Позиции[Iter].ПризнКре,SubStr(Buf[n],2,255)," ");
              |True:
               Позиции[Iter].Призн=Раб.Бюджет2005.Объединить(Позиции[Iter].Призн,Buf[n]," ");
               if Match(Buf[n],"ДОГОВОР.*"):
                  Rec=SignToRecord(Buf[n]);
                  Crd=SignCardFile(Buf[n]);
                  if not Rec=nil and not Crd="":
                     if Позиции[Iter].Содерж="":
                        Позиции[Iter].Содерж=Раб.ИмяПолеКарт.ЗначПоляС(Crd,"КОММЕНТ",Rec);
                     fi;
                     Позиции[Iter].НомДок=Раб.ИмяПолеКарт.ЗначПоляС(Crd,"ДОК",Rec)+" № "+Раб.ИмяПолеКарт.ЗначПоляС(Crd,"НОМЕР",Rec);
                     Позиции[Iter].ДатаДок=Раб.ИмяПолеКарт.ЗначПоляД(Crd,"ДАТА",Rec);
                  fi;
               fi;
               if Match(Позиции[Iter].Призн,"П.*") and not ПризнПодр="": ПризнПодр=""; fi;
            fi;
           od;
           Позиции[Iter].Сумма=tСум1;
          od;
         Finally
          CloseTextJur;
          CloseProgress;
         end;
   |true: hЖур=cacheS[z];
          j=cacheJ[z];
          tmp=JournalName(j);
          crd=JournalCardFile(tmp);
          rec=OpenCardFile(crd,Раб.Бюджет2005.ПарсерJDF(tmp,"date+ff"));
          if rec=nil: Exit; fi;
          Раб.ИмяПолеКарт.Инициализация;
          if Name_A("ДНФАID.")=" ": tmp="*"; else tmp="*{ДНФАID."+Str16(RecordToInteger(Rec))+"}"; fi;
          z=0; n=0;
          ShowProgress(100,"Импорт проводок...");
          Try
           for transaction t=tmp,1.1.100,ToDay+1 do
            n=n+1; ProgressPos(n); if n=100: n=0; fi;
            if TransCardFile(t)=crd and TransRecord(t)=rec and TransJurNum(t)=j:
               z=z+1;
               Iter=InsertFrame(Позиции,Позиции+1);
               Позиции[Iter].Содерж=TransComment(t);
               Позиции[Iter].НомДок=Раб.ИмяПолеКарт.ЗначПоляС(Crd,"НОМЕР",Rec);
               Позиции[Iter].ДатаДок=TransDate(t);
               Позиции[Iter].СчДеб=TransDeb(t);
               Позиции[Iter].СчКре=TransCre(t);
               ss=TransSignCount(t);
               for s=1..ss do
                tmp=TransSignName(t,s);
                if (Match(tmp,"П.*") or Match(tmp,"+П.*") or Match(tmp,"-П.*")) and not ПризнПодр="": ПризнПодр=""; fi;
                if Pos("+",tmp)=1: 
                   Позиции[Iter].ПризнДеб=Раб.Бюджет2005.Объединить(Позиции[Iter].ПризнДеб,SubStr(tmp,2,255)," ");
                  |Pos("-",tmp)=1: 
                   Позиции[Iter].ПризнКре=Раб.Бюджет2005.Объединить(Позиции[Iter].ПризнКре,SubStr(tmp,2,255)," ");
                  |True: if TransSignQuant(t,s):
                            Позиции[Iter].ПризнКол=tmp;
                            Позиции[Iter].Кол=TransSum(t,"КОЛ");
                           else
                            Позиции[Iter].Призн=Раб.Бюджет2005.Объединить(Позиции[Iter].Призн,tmp," ");
                         fi;
                fi;
               od;
               Позиции[Iter].Сумма=TransSum(t);
            fi;
           od;
          Finally
           CloseProgress;
          end;
 fi;
 Message("Импорт завершен, загружено записей: "+Str(z));
end;

Proc btnДокОсн_OnClick(Sender: String);
 if not RecordExists(Crd,IntegerToRecord(RecCrd)): Message("Документ - основание не найден",mtError); Exit; fi;
 if isBlankOpen(BlnCrd):
    if ModalMode: Message("Бланк документа - основания уже открыт. Для возврата закройте текущий бланк",mtWarning); Exit; fi;
    Close(BlnCrd); 
 fi;
 OpenBlank(BlnCrd,True,IntegerToRecord(RecCrd));
end;

Proc btnНастр_OnClick(Sender: String);
 Настр(False);
 ОткрНастр(True);
end;

Proc btnУдалить_OnClick(Sender: String);
var OWA,Iter:I;
var Flag:L;
 if EnqOkCancel("Справка и электронная копия первичных документов будет удалены, вы уверены ?",mtWarning)=cmCancel: Exit; fi;
 РасчетГЭК2;
 EditorCancel;
 for Iter=1..УпрГЭК2 do
  Flag=ExecuteFuncL("Раб.Вспом.Скан_Док.Стереть",ГЭК2Rec[Iter]);
 od;
 OWA=OpenWorkArea(SelfCrd,"","UKey="+RecordToString(Current));
 Try
  BeginChanging(OWA);
  Try
   DeleteRecord(OWA,1);
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 Close;
 Message("Справка успешно удалена");
end;

Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;

Proc cbЗакрытьДок_OnChange(Sender: String);
var State:I;
 if ClosedModFob and not fQCMF:
    State=Enquiry("","Документ будет закрыт от изменений^MВнимание!^MПосле установки данного флага, если вы необладаете достаточными правами, вы НЕ СМОЖЕТЕ снять данный флаг^MПродолжить ?","Отмена;Да;Больше не спрашивать",mtWarning);
    if State=1: ClosedModFob=False; cbЗакрытьДок.State=ClosedModFob; Exit;
      |State=3: fQCMF=True;
    fi;
 fi;
 EditorApply;
end;

Proc cbВисячаяПодпись_OnChange(Sender: String);
 if fВисячаяПодпись:
    if Позиции<2:
       Message("Не требуется");
       fВисячаяПодпись=False;
       cbВисячаяПодпись.State=fВисячаяПодпись;
    fi;
 fi;
end;

Proc cbФиксШапка_OnChange(Sender: String);
 Оформление;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 Раб.Настр_Печать.Cfg("","Rpo_0504833_000.cfg");
 Раб.Настр_Печать.Cfg("","Rpo_0504833_001.cfg");
-- flgПдпСтрПод=False;
 First=True;
end;

Proc AfterOpen(Destroy: Logical);
 Инициализация; 
 ВывестиСтраницу;
 Оформление; 
 ПоложениеКнопок_;
 First=False;
 cbЗакрытьДок.Visible=Раб.Бюджет2005.Сетевая;
end;

Proc onRead;
 ОчиститьPrn;
 ClearVariable(Выделить);
 ОткрНастр(False);
 Настр(False);
 if НоваяЗапись:
    ver=1;
    ДатаСпр=ToDay;
    Номер=Раб.Обл.СледСУчетомГода(SelfCrd,"Номер","ДатаСпр");
    if Рекв=nil:
       Рекв=Раб.Бюджет2005.НашРекв;
       if not Рекв=nil: ФИОрук=Рекв.ФИОрук; ФИОБух=Рекв.ФИОБух; fi;
    fi;
    Проводить=False;
    ClosedModFob=False;
    Валюта=BaseCurrency;
    if Раб.Бюджет2005.Сетевая: EditorApply; fi;
    НеПустаяТаблица;
 fi;
 Страница=1;
 if not First: 
    ВывестиСтраницу; 
    Оформление; 
    ПоложениеКнопок_;
 fi;
end;

Func OnVerify: Logical;
 if Валюта="": Валюта=BaseCurrency; fi;
 ИтогСумма=ИтогСумма_;
 ИтогСуммаРуб=ИтогСуммаРуб_;
 ИтогКол=ИтогКол_;
 Return ЗаполнитьКлючДок;
end;
--Обработчики событий шаблона -----
--



КОНЕЦ