БЛАНКСШАБЛОНОМ [14.06.2006] "Приходный ордер", РЕДАКТОР ПрихОрд;
2-- Переменные
cbPacketMode   :Object;
cbПроводить    :Object;
btnПечать      :Object;
cbPrintPacket  :Object;
cbPrintPacketNP:Object;

var НоваяЗапись:L=(CurrentState=crdusInserted);
var FlagEdit2   0:L=[False];

SloEnabled     :L;
PrintPacket2    0:L;
PrintPacketNP2  0:L;
var Buf[]      :S;

var СК :S=Format("%.2D",Int((Сумма-Trunc(Сумма))*100));
var СК2:S=if(SloEnabled,СК,"");
var СР :I=Int(Trunc(Сумма));

var НаимПодр2 0  :S=if(Name_A(ПО)<>"" and Name_A(ПО)<>" ",Name_A(По),По);
var Призн_     :S=Призн;
var Цель_      :S=Цель;
var ПропР      :S=if(Сумма=0 or SloEnabled=False,"",if(Валюта="РУБ" or Валюта="РУБ":ExtractWords(1,wordscount(Slo_(Сумма,"РУБ1")," ")-1,Slo_(Trunc(Сумма),"РУБ1")," ") |Валюта="USD":Slo_(Сумма,"ДОЛ")|Валюта="EUR":Slo_(Сумма,"ЕВР")|True:""));
var ПропНДС    :S; -- предварительное описание
var ФИО1       :S=ФИО;
var Основание1 :S="Основание: " + Осн;

var ТПризн_ [] :S=РПО_Позиции[$].ТПризн; -- Шифр аналитического учета
var PacketSum  :N=SumOfArray(РПО_Позиции[].ТСумма,РПО_Позиции);
var PacketDelta:N=Round(PacketSum-Сумма, 2);

var Текст1:s=if(Валюта="РУБ","руб. коп.","");

var МаскаСчКас :S="???.01.05.02.*.?.201.34.51*";
var A	       :S=if(Проводить,"","+");
var AA	       :S=if(Проводить,"","++");
var D	       :S=if(Проводить,"","-");
var SelfCrd:S="ПрихОрд";

StoreДСчет:S;
StoreСчет:S;

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

var BufField[]:S;
var BufColorBg[]:I;
var BufColorFo[]:I;
var FlagInit:L;
-----
Func FormatChisloOrMoney(Chislo:N; Sep:S; Money:L): S;
var np, i: I;
var temp, man, Out: S;
 temp=Str(Chislo,2);
 np=Pos(".", temp);
 if np<>0:
   man =Substr(temp, np+1, 2);
   temp=Substr(temp, 1, np-1);
 else 
   Man="";
 fi;
 i=Length(temp); Out=""; np=3;
 While i > np do
   Out=Sep+Substr(temp, i-(np-1), np) + Out;
   temp=Substr(temp, 1, i-np);
   i=i-np;
 od;
 if Money=True:
   if Man<>"": 
     Out=temp+Out+" руб."+" "+man+" коп.";
   else
     Out=temp+Out+" руб.";
   fi;
 else
   if Man<>"": 
     Out=temp+Out+"."+man;
   else 	  
     Out = temp + Out;
   fi;
 fi;
 ^Out;
cnuF;

ПропНДС :S=if(НДС>0 and Сумма>0,"НДС = " + FormatChisloOrMoney(НДС," ",True),if(Сумма=0,"","Без НДС"));
2-- Общие процедуры и функции
Proc Инициализация;
var Obj:Object;
var s,r,rr,c,cc,n,l,bgColor:i;
var Field:S;
 ClearVariable(BufField);
 ClearVariable(BufColorBg);
 ClearVariable(BufColorFo);
 for s=1..4 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=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;
 --Вручную добавляем данные таблицы (если она невидна будут проблемы в автоматичском режиме)
 n=InsertInArraySort(BufField,"ТДСчет");  InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ТСчет");   InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ТПризн_"); InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ТСумма");  InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"ТПримеч"); InsertInArray(BufColorBg,n,coAqua);
 --
 l=LengthOfArray(BufField);
 for n=1..l do
  if BufColorBg[n]=coTeal: BufColorFo[n]=coWhite;
    |True: BufColorFo[n]=coBlack;
  fi;
 od;
end;

Proc Оформление;
var s,c,r,cc,rr,n:i;
var Obj: Object;
 cbPacketMode.Enabled=not Проводить;
 cbPrintPacket.Enabled=РПО_PacketMode;
 cbPrintPacketNP.Enabled=РПО_PacketMode and PrintPacket;
 sPNP.Row(1,RowNewPage,PrintPacketNP or not PrintPacket);
 for s=1..5 do
  if s=5 and РПО_ПОЗИЦИИ=0: Break; fi;
  if FindObject("S"+Str(s),Obj):
     rr=asInteger(Obj.RowsCount);
     cc=asInteger(Obj.ColsCount);
     for r=1 .. rr do
      for c=1 .. cc do
       n=SearchInArray(BufField,asString(Obj.Cell(r,c,CellContents,"")),True);
       if not n=-1:
	  if Проводить:
	     Obj.Cell(r,c,CellFontColor,coBlack); 
	     Obj.Cell(r,c,CellBgColor,coTransparent); 
	     Obj.Cell(r,c,CellReadOnly,True);
	    else
	     Obj.Cell(r,c,CellFontColor,BufColorFo[n]); 
	     Obj.Cell(r,c,CellBgColor,BufColorBg[n]); 
	     Obj.Cell(r,c,CellReadOnly,False);
	  fi;
       fi;
      od;
     od;
  fi;
 od;
end;

Proc Ф_Инфо(S: String);
var Rec    :Record;
var s1, s2, s3 :S;
var type: I;
 Rec=SignToRecord(S);
 if Rec=NIL: ФИО=""; Exit; fi;
 if SignCardFile(S) = "Контрагент":
   type = GetCardFieldI("Контрагент", Rec, "ТИП");
   if type=1:
	 s1=GetCardFieldS("Контрагент", Rec, "ФамилияФЛ",Д);
	 s2=GetCardFieldS("Контрагент", Rec, "ИмяФЛ",Д);
	 s3=GetCardFieldS("Контрагент", Rec, "ОтчествоФЛ",Д);
	 if s1="" or s2="" or s3="": ФИО=GetCardFieldS("Контрагент", Rec, "Коримя", Д); else ФИО=s1+" "+s2+" "+s3; fi;
   fi;
  |SignCardFile(S) = "Сотрудники":
    s1=GetCardFieldS("Сотрудники", Rec, "ФОТКОГО",Д);
    s2=GetCardFieldS("Сотрудники", Rec, "ИОТКОГО",Д);
    if s1="" or s2="": ФИО=GetCardFieldS("Сотрудники", Rec, "ФИОТ", Д); else ФИО=s1+" "+s2; fi;
 fi;
end;

Proc УдалитьПустыеСтроки;
var n:i;
 n=1; 
 While n<=РПО_Позиции do
  if РПО_Позиции[n].ТДСчет="" and
     РПО_Позиции[n].ТСчет ="" and
     РПО_Позиции[n].ТПризн="" and
     РПО_Позиции[n].ТСумма=0: DeleteFrame(РПО_Позиции, n);
    else
     n=n+1;
  fi;
 od;
end;
--
Proc НеПустаяТаблица;
 if РПО_PacketMode=False: Exit; fi;
 if РПО_Позиции<1: InsertFrame(РПО_Позиции, 1); fi;
end;
--
Func ПроверитьРКО:L;
var tmp,tmp2:S;
 if Д<=1.1.100 : Message("Введите дату",mtError); Template.Field="Д"; ^False; fi;
 if Валюта="":Message("Укажите валюту",mtError); Template.Field="Валюта"; ^False; fi;
 if Name_C(Валюта)=" ":Message("Неизвестный идентификатор валюты "+Валюта,mtError); Template.Field="Валюта"; ^False; fi;
 if Де="": Message("Введите счет кассы",mtError); Template.Field="Де"; ^False; fi;
 if Name_S(Де)=" ": Message("Неизвестный счет кассы '"+Де+"'",mtError); Template.Field="Де"; ^False; fi;
 if Счет="": Message("Введите корреспондирующий счет",mtError); Template.Field="Счет"; ^False; fi;
 if Name_S(Счет)=" ": Message("Неизвестный корреспондирующий счет '"+Счет+"'",mtError); Template.Field="Счет"; ^False; fi;
 if Сумма=0: Message("Введите сумму",mtError); Template.Field="Сумма"; ^False; fi;
 if Correspond(Де, Счет)=False: Message("Субсчета "+Де+"/"+Счет+" не могут корреспондировать",mtError); Template.Field="Счет"; ^False; fi;
 Раб.Бюджет.ПроверитьПризнакиНачать;
 if Раб.Бюджет.ПроверитьПризнакиОбязательные(Де, Счет, По+" "+Призн+" "+Цель, "")=False: Template.Field="Призн_"; ^False; fi;
 if Раб.Бюджет.ПроверитьПризнакиСвязанные   (Де, Счет, По+" "+Призн+" "+Цель, "")=False: Template.Field="Призн_"; ^False; fi;
 if Match(Счет,"*.?.208.??.???") or Match(Счет,"*.?.302.??.???"):
    tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Trim(По+" "+Призн+" "+Цель)," ","КОСГУ.*","");
    if not tmp="":
       tmp2=Раб.Бюджет2005.ВзятьКодСчета(Счет,"","АН",False);
       tmp2=Раб.Бюджет2005.Соотв_Ан_КОСГУ("",tmp2);
       if not Match(tmp,"КОСГУ."+tmp2+"!"): Message("Аналитический признак "+tmp+" не соответствует КБК счета "+Счет,mtError); Template.Field="Призн_"; ^False; fi;
    fi;
    tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Trim(По+" "+Призн+" "+Цель)," ","ФКР.*","");
    if not tmp="":
       tmp2=Раб.Бюджет2005.ВзятьКодСчета(Счет,"","БК",False);
       if not tmp="ФКР."+tmp2: Message("Аналитический признак "+tmp+" не соответствует КБК счета "+Счет,mtError); Template.Field="Призн_"; ^False; fi;
    fi;
 fi;
 if Match(Счет,"*.?.205.??.???"):
    tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Trim(По+" "+Призн+" "+Цель)," ","КОСГУ.*","");
    if not tmp="":
       tmp2=Раб.Бюджет2005.ВзятьКодСчета(Счет,"","АН",False);
       tmp2=Раб.Бюджет2005.Соотв_Ан_КОСГУ("205",tmp2);
       if not Match(tmp,"КОСГУ."+tmp2+"!"): Message("Аналитический признак "+tmp+" не соответствует КБК счета "+Счет,mtError); Template.Field="Призн_"; ^False; fi;
    fi;
    tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Trim(По+" "+Призн+" "+Цель)," ","КД.*","");
    if not tmp="":
       tmp2=Раб.Бюджет2005.ВзятьКодСчета(Счет,"","БК",False);
       if not tmp="КД."+tmp2: Message("Аналитический признак "+tmp+" не соответствует КБК счета "+Счет,mtError); Template.Field="Призн_"; ^False; fi;
    fi;
 fi;
 ^True;
end;

Func ПроверитьРКОPacket:L;
var n:i;
var tmp,tmp2:S;
 if Д<=1.1.100	   : Message("Введите дату",mtError); Template.Field="Д"; ^False; fi;
 if Сумма=0	   : Message("Введите сумму",mtError); Template.Field="Сумма"; ^False; fi;
 if Валюта="":Message("Укажите валюту",mtError); Template.Field="Валюта"; ^False; fi;
 if Name_C(Валюта)=" ":Message("Неизвестный идентификатор валюты "+Валюта,mtError); Template.Field="Валюта"; ^False; fi;
-- if Де=""	     : Message("Введите счет кассы",mtError); Template.Field="Де"; ^False; fi;
-- if Счет=""	     : Message("Введите корреспондирующий счет",mtError); Template.Field="Счет"; ^False; fi;
-- if Correspond(Де, Счет)=False: Message("Субсчета "+Де+"/"+Счет+" не могут корреспондировать",mtError); Template.Field="Счет"; ^False; fi;
 if not Round(PacketDelta,2)=0: Message("Отклонение между суммой РКО и суммой пакетного режима должно быть равным нулю",mtError); Template.Field="PacketDelta"; Template.Frame=РПО_Позиции; ^False; fi;
 УдалитьПустыеСтроки;
 if РПО_Позиции<1: НеПустаяТаблица; Message("Отсутствуют проводки с ненулевыми суммами",mtError); Template.Field="ТСчет"; Template.Frame=1; ^False; fi;
 Раб.Бюджет.ПроверитьПризнакиНачать;
 for n=1..РПО_Позиции do
  if РПО_Позиции[n].ТДСчет="": Message("Введите счет кассы",mtError); Template.Field="ТДСчет"; Template.Frame=n; ^False; fi;
  if Name_S(РПО_Позиции[n].ТДСчет)=" ": Message("Неизвестный счет кассы '"+РПО_Позиции[n].ТДСчет+"'",mtError); Template.Field="ТДСчет_"; Template.Frame=n; ^False; fi;
  if РПО_Позиции[n].ТСчет="" : Message("Введите корреспондирующий счет",mtError); Template.Field="ТСчет"; Template.Frame=n; ^False; fi;
  if Name_S(РПО_Позиции[n].ТСчет)=" ": Message("Неизвестный корреспондирующий счет '"+РПО_Позиции[n].ТСчет+"'",mtError); Template.Field="ТСчет_"; Template.Frame=n; ^False; fi;
  if Correspond(РПО_Позиции[n].ТДСчет, РПО_Позиции[n].ТСчет)=False: Message("Счета "+РПО_Позиции[n].ТДСчет+"/"+РПО_Позиции[n].ТСчет+" не могут корреспондировать",mtError); Template.Field="ТСчет"; Template.Frame=n; ^False; fi;
  if РПО_Позиции[n].ТСумма=0 : Message("Введите сумму",mtError); Template.Field="ТСумма"; Template.Frame=n; ^False; fi;
  if Раб.Бюджет.ПроверитьПризнакиОбязательные(РПО_Позиции[n].ТДСчет, РПО_Позиции[n].ТСчет, РПО_Позиции[n].ТПризн, "")=False: Template.Field="ТПризн_"; Template.Frame=n; ^False; fi;
  if Раб.Бюджет.ПроверитьПризнакиСвязанные   (РПО_Позиции[n].ТДСчет, РПО_Позиции[n].ТСчет, РПО_Позиции[n].ТПризн, "")=False: Template.Field="ТПризн_"; Template.Frame=n; ^False; fi;
  if Match(РПО_Позиции[n].ТСчет,"*.?.208.??.???") or Match(РПО_Позиции[n].ТСчет,"*.?.302.??.???"):
     tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(РПО_Позиции[n].ТПризн," ","КОСГУ.*","");
     if not tmp="":
	tmp2=Раб.Бюджет2005.ВзятьКодСчета(РПО_Позиции[n].ТСчет,"","АН",False);
	tmp2=Раб.Бюджет2005.Соотв_Ан_КОСГУ("",tmp2);
	if not Match(tmp,"КОСГУ."+tmp2+"!"): Message("Аналитический признак "+tmp+" не соответствует КБК счета "+РПО_Позиции[n].ТСчет,mtError); Template.Field="ТПризн_"; Template.Frame=n; ^False; fi;
     fi;
     tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(РПО_Позиции[n].ТПризн," ","ФКР.*","");
     if not tmp="":
	tmp2=Раб.Бюджет2005.ВзятьКодСчета(РПО_Позиции[n].ТСчет,"","БК",False);
	if not tmp="ФКР."+tmp2: Message("Аналитический признак "+tmp+" не соответствует КБК счета "+РПО_Позиции[n].ТСчет,mtError); Template.Field="ТПризн_"; Template.Frame=n; ^False; fi;
     fi;
  fi;
  if Match(РПО_Позиции[n].ТСчет,"*.?.205.??.???"):
     tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(РПО_Позиции[n].ТПризн," ","КОСГУ.*","");
     if not tmp="":
	tmp2=Раб.Бюджет2005.ВзятьКодСчета(РПО_Позиции[n].ТСчет,"","АН",False);
	tmp2=Раб.Бюджет2005.Соотв_Ан_КОСГУ("205",tmp2);
	if not Match(tmp,"КОСГУ."+tmp2+"!"): Message("Аналитический признак "+tmp+" не соответствует КБК счета "+РПО_Позиции[n].ТСчет,mtError); Template.Field="ТПризн_"; Template.Frame=n; ^False; fi;
     fi;
     tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(РПО_Позиции[n].ТПризн," ","КД.*","");
     if not tmp="":
	tmp2=Раб.Бюджет2005.ВзятьКодСчета(РПО_Позиции[n].ТСчет,"","БК",False);
	if not tmp="КД."+tmp2: Message("Аналитический признак "+tmp+" не соответствует КБК счета "+РПО_Позиции[n].ТСчет,mtError); Template.Field="ТПризн_"; Template.Frame=n; ^False; fi;
     fi;
  fi;
 od;
 ^True;
end;

Proc ПолучитьДопАн(СчКасс:S; СчКорр:S; Iter:I);
var Справ,ПризнКБК,ТипКБК:S;
 if СчКасс="": Exit; fi;
 Справ=Раб.Бюджет2005.СписокСправ(СчКасс+"|"+СчКорр,0,"");
 if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Справ,"|","ФКР.*|КД.*","|")="":
    ТипКБК=Раб.Бюджет2005.ТипКБКСчета(СчКорр);
    ПризнКБК=Раб.Бюджет2005.ВзятьКодСчета(СчКорр,ТипКБК,"КБК",False);
    if not ПризнКБК="" and (ТипКБК="ФКР" or ТипКБК="КД"):
       ПризнКБК=ТипКБК+"."+ПризнКБК;
       if Iter=0:
	  Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Призн," ","ФКР.*|КД.*","|");
	  Цель=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Цель," ","ФКР.*|КД.*","|");
	  Цель=Раб.Бюджет2005.Объединить(Цель,ПризнКБК," ");
	 else
	  РПО_Позиции[Iter].ТПризн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(РПО_Позиции[Iter].ТПризн," ","ФКР.*|КД.*","|");
	  РПО_Позиции[Iter].ТПризн=Раб.Бюджет2005.Объединить(РПО_Позиции[Iter].ТПризн,ПризнКБК," ");
       fi;
    fi;
 fi;
 if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Справ,"|","КОСГУ.*","")="":
    ПризнКБК=Раб.КБК.ВзятьЭКСчета(СчКорр,"");
    if not ПризнКБК="":
       ПризнКБК="КОСГУ."+ПризнКБК;
       if Iter=0:
	  Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Призн," ","КОСГУ.*","");
	  Цель=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Цель," ","КОСГУ.*","");
	  Цель=Раб.Бюджет2005.Объединить(Цель,ПризнКБК," ");
	 else
	  РПО_Позиции[Iter].ТПризн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(РПО_Позиции[Iter].ТПризн," ","КОСГУ.*","");
	  РПО_Позиции[Iter].ТПризн=Раб.Бюджет.ДобавитьПризнак(РПО_Позиции[Iter].ТПризн,ПризнКБК);
       fi;
    fi;
 fi;
end;

Proc ОбработатьНомер (vНомерБум:S);
var tmp:i;
 tmp=Int(vНомерБум);
 if tmp=0:
    if Д=1.1.100:
       tmp=РАБ.ОБЛ.СледСУчетомГодаФ(SelfCrd,"Номер","Д","UKey<>"+RecordToString(Current));
      else
       tmp=РАБ.ОБЛ.СледСУчетомДатыФ(SelfCrd,"Номер","Д",Д,"UKey<>"+RecordToString(Current));
    fi;
 fi;
 if not Номер=tmp:
    Номер=tmp;
    if Раб.Бюджет2005.Сетевая: EditorApply; fi;
 fi;
end;

Proc ОбработатьДату (prevДата:D; newДата:D);
var prevYYYY,newYYYY:I;
 prevYYYY=Year(prevДата);
 newYYYY=Year(newДата);
 if prevYYYY=newYYYY: Exit; fi;
 if not prevYYYY=100:
    if EnqOkCancel("Изменился отчетный год ("+Str(prevYYYY)+") документа, получить номер документа соответствуещего года ("+Str(newYYYY)+") ?",mtWarning)=cmCancel: Exit; fi;
 fi;
 НомерБум=Str(Раб.Обл.СледСУчетомДатыФ(SelfCrd,"Номер","Д",Д,"not UKey="+RecordToString(Current)));
 ОбработатьНомер(НомерБум);
 Template.Field="НомерБум";
end;
2-- Обработчики событий полей, объектов и шаблона
2-- События полей
Func Рекв_onEnter(Field:S; Iter:I) :L;
var Rec:Record;
 Rec=OpenCardFile("Контрагент", "Наше", Рекв, crdRecordOnly);
 if Rec=nil: ^False; fi;
 Рекв=Rec;
 РПО_ФИОБух =Рекв.ФИОБух;
 РПО_ФИОКасс=Рекв.ФИОКасс;
 ^False;
end;

Func НаимПодр_onEnter (Field:S; Iter:I) :L;
 Template.Field="ПО";
 ^False;
end;

Proc НомерБум_OnExit(FieldName: String; Iter: Integer);
 ОбработатьНомер(НомерБум);
end;

func НомерБум_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 if Д=1.1.100:
    НомерБум=Str(РАБ.ОБЛ.СледСУчетомГодаФ(SelfCrd,"Номер","Д","UKey<>"+RecordToString(Current)));
   else
    НомерБум=Str(РАБ.ОБЛ.СледСУчетомДатыФ(SelfCrd,"Номер","Д",Д,"UKey<>"+RecordToString(Current)));
 fi;
 ОбработатьНомер(НомерБум);
 ^Cur;
end;

Func Д_OnVerify(FieldName: String; Iter: Integer; Value: Date):Logical;
var prevД:D;
 prevД=Д;
 Д=Value;
 ОбработатьДату(prevД,Д);
 Return True;
end;

Func Д_OnLookup(Sect:S; Row:I; Col:I; Cur:S) :S;
var tmp:d;
var prevД:D;
 Template.HideEditor(False);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 prevД=Д;
 Д=tmp;
 ОбработатьДату(prevД,Д);
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);
 od;
 n=Alternate("Валюта документа",Buf,-1,SearchInArray(Buf,Валюта),12);
 if n=0: ^False; fi;
 Валюта=Buf[n];
 Return False;
end;

Func ПО_onEnter(Field:S; Iter:I) :L;
var tmp :s;
 tmp=ВыборПризнака("П.*");
 if tmp="": ^false; fi;
 ПО=tmp;
 ^False;
end;

Func Де_onEnter(Field:S; Iter:I) :L;
var tmp :S;
var Mask:S;
 tmp=ВыборСчета(МаскаСчКас,False,StoreДСчет);
 if tmp="": ^False; fi;
 if Correspond(tmp,Счет)=False: Счет=""; fi;
 Де=tmp;
 StoreДСчет=Де;
 if Счет<>"":
    Mask =РАБ.БЮДЖЕТ.НаборПризнаков(Де, Счет, "П.*");
    Призн=РАБ.БЮДЖЕТ.МухиОтКотлет(Призн, Mask);
    Цель =РАБ.БЮДЖЕТ.МухиОтКотлет(Цель, Mask);
 fi;
 ^False;
end;

Func Призн_onEnter(Field:S; Iter:I) :L;
var Mask,tmp :S;
 if Де="" : Message("Введите счет дебета",mtError); Template.Field="Де"; ^False; fi;
 if Счет ="" : Message("Введите счет кредита",mtError); Template.Field="Счет"; ^False; fi;
 Mask=РАБ.БЮДЖЕТ.НаборПризнаков(Де, Счет, "П.*");
 if Mask=""  : Message("Аналитические признаки не требуются"); ^False; fi;
 tmp=ВыборПризнака(Mask);
 if tmp="": ^False; fi;
 Призн =РАБ.БЮДЖЕТ.ДобавитьПризнак(Призн,tmp);
 Цель  =РАБ.БЮДЖЕТ.УдалитьПризнак(Цель,tmp);
 if Match(tmp, "Ф.*") or Match(tmp, "МОЛ.*") or Match(tmp, "К.*"): Ф_Инфо(tmp); fi;
 ^False;
end;

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

Func Счет_onEnter(Field:S; Iter:I) :L;
var tmp :S;
var Mask:S;
 if Де=""  : Message("Введите счет дебета",mtError); Template.Field="Де"; ^False; fi;
 tmp=ВыборКоррСчета(Де,False,StoreСчет);
 if tmp="": ^False; fi;
 Счет=Tmp;
 StoreСчет=tmp;
 if Де<>"":
    Mask =РАБ.БЮДЖЕТ.НаборПризнаков(Де, Счет, "П.*");
    Призн=РАБ.БЮДЖЕТ.МухиОтКотлет(Призн, Mask);
    Цель =РАБ.БЮДЖЕТ.МухиОтКотлет(Цель, Mask);
 fi;
 ПолучитьДопАн(Де,Счет,0);
 ^False;
end;

Func Цель_onEnter(Field:S; Iter:I) :L;
var Mask,tmp :S;
 if Де=""  : Message("Введите счет дебета",mtError); Template.Field="Де"; ^False; fi;
 if Счет=""   : Message("Введите счет кредита",mtError); Template.Field="Счет"; ^False; fi;
 Mask=РАБ.БЮДЖЕТ.НаборПризнаков(Де, Счет, "П.*");
 if Mask=""   : Message("Аналитические признаки не требуются"); ^False; fi;
 tmp=ВыборПризнака(Mask);
 if tmp="": ^False; fi;
 Цель =РАБ.БЮДЖЕТ.ДобавитьПризнак(Цель, tmp);
 Призн=РАБ.БЮДЖЕТ.УдалитьПризнак(Призн, tmp);
 if Match(tmp, "Ф!") or Match(tmp, "МОЛ!"): Ф_Инфо(tmp); fi;
 ^False;
end;

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

Func НДС_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Тест  :I;
var Текст :S;
 Template.HideEditor(False);
 ClearVariable(Buf);
 Buf[1]="	НДС=18*Сумма/118";
 Buf[2]="	НДС=10*Сумма/110";
 Buf[3]="	Без НДС";
 Buf[4]="	Ручной ввод НДС";
 Тест=Alternate("НДС ордера",Buf,25);
 if  Тест=3 : НДС=0; СтавкаНДС=0; ЦЕНЫСНДС=False;
    |Тест=1 : НДС=Round(18/118*(Сумма),2); СтавкаНДС=18; ЦЕНЫСНДС=True;
    |Тест=2 : НДС=Round(10/110*(Сумма),2); СтавкаНДС=10; ЦЕНЫСНДС=True;
    |Тест=4 : Template.Field="НДС"; ЦЕНЫСНДС=True;
 fi;
 Return Cur;
end;

Func Должн_OnLookup(Sect:S; Row:I; Col:I; Cur:S) :S;
var REC:Record;
var v,FieldSender:S;
 Template.HideEditor(False);
 FieldSender=AsString(Template.Field);
 REC=OpenCardFile("Сотрудники");
 if REC=NIL: ^Cur; fi;
 v=GetCardFieldS("Сотрудники", REC,"ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники", REC, "ИНИЦИАЛЫ");
 if FieldSender="РПО_ФИОБух"  : РПО_ФИОБух=v;
 |  FieldSender="РПО_ФИОКасс" : РПО_ФИОКасс=v;
 fi;
 ^"";
end;

Func Add_Iter(FieldName: String; Iter: Integer): logical;
 if Проводить: ^False; fi;
 InsertFrame(РПО_Позиции, Iter+1);
 РПО_Позиции[Iter+1].ТДСчет=РПО_Позиции[Iter].ТДСчет;
 РПО_Позиции[Iter+1].ТСчет =РПО_Позиции[Iter].ТСчет;
 РПО_Позиции[Iter+1].ТПризн=РПО_Позиции[Iter].ТПризн;
 ^False;
end;

Func Del_Iter(FieldName: String; Iter: Integer): logical;
 if Проводить: ^False; fi;
 if РПО_Позиции>1: DeleteFrame(РПО_Позиции, Iter); else DeleteFrame(РПО_Позиции, Iter); InsertFrame(РПО_Позиции, Iter); fi;
 ^False;
end;

Func ТДСчет_onEnter(Field:S; Iter:I):L;
var tmp :S;
var Mask:S;
 tmp=ВыборСчета(МаскаСчКас,False,StoreДСчет);
 if tmp="": ^False; fi;
 if Correspond(tmp,РПО_Позиции[Iter].ТСчет)=False: РПО_Позиции[Iter].ТСчет=""; fi;
 РПО_Позиции[Iter].ТДСчет=tmp;
 StoreДСчет=tmp;
 if РПО_Позиции[Iter].ТСчет<>"":
    Mask=РАБ.БЮДЖЕТ.НаборПризнаков(РПО_Позиции[Iter].ТДСчет,РПО_Позиции[Iter].ТСчет, "");
    РПО_Позиции[Iter].ТПризн=РАБ.БЮДЖЕТ.МухиОтКотлет(РПО_Позиции[Iter].ТПризн, Mask);
 fi;
 ^False;
end;

Func ТСчет_onEnter(Field:S; Iter:I):L;
var tmp :S;
var Mask:S;
 tmp=ВыборКоррСчета(РПО_Позиции[Iter].ТДСчет,False,StoreСчет);
 if tmp="": ^False; fi;
 РПО_Позиции[Iter].ТСчет=Tmp;
 StoreСчет=Tmp;
 if РПО_Позиции[Iter].ТДСчет<>"":
    Mask=РАБ.БЮДЖЕТ.НаборПризнаков(РПО_Позиции[Iter].ТДСчет, РПО_Позиции[Iter].ТСчет, "");
    РПО_Позиции[Iter].ТПризн=РАБ.БЮДЖЕТ.МухиОтКотлет(РПО_Позиции[Iter].ТПризн, Mask);
 fi;
 ПолучитьДопАн(РПО_Позиции[Iter].ТДСчет,РПО_Позиции[Iter].ТСчет,Iter);
 ^false;
end;

Func ТПризн_onEnter(Field:S; Iter:I):L;
var Mask,tmp :S;
 if РПО_Позиции[Iter].ТДСчет="" : Message("Введите счет дебета",mtError); Template.Field="ТДСчет"; Template.Frame=Iter; ^False; fi;
 if РПО_Позиции[Iter].ТСчет=""	: Message("Введите счет кредита",mtError); Template.Field="ТСчет"; Template.Frame=Iter; ^False; fi;
 Mask=РАБ.БЮДЖЕТ.НаборПризнаков(РПО_Позиции[Iter].ТДСчет, РПО_Позиции[Iter].ТСчет, "");
 if Mask="": Message("Аналитические признаки не требуются"); ^False; fi;
 tmp=ВыборПризнака(Mask);
 if tmp="": ^False; fi;
 РПО_Позиции[Iter].ТПризн=РАБ.БЮДЖЕТ.ДобавитьПризнак(РПО_Позиции[Iter].ТПризн, tmp);
 if ФИО="":
    if Match(tmp, "Ф.*") or Match(tmp, "МОЛ.*"): Ф_Инфо(tmp); fi;
 fi;
 ^False;
end;

Proc ТПризн_OnExit(FieldName: String; Iter: Integer);
 РПО_Позиции[Iter].ТПризн=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(РПО_Позиции[Iter].ТПризн," ","Name_A");
end;
2-- События объектов
Proc cbПроводить_onChange (Obj:S);
var Flag:L;
var n:i;
 if Проводить=False:
    n=EnqOkCancel("Вы уверены что хотите исключить данный документ из обработки ?");
    if n=cmCancel: Flag=True; else Flag=False; fi;
   else
    if РПО_PacketMode: Flag=ПроверитьРКОPacket; else Flag=ПроверитьРКО; fi;
 fi;
 Проводить=Flag; cbПроводить.State=Проводить;
 EditorApply;
 Оформление;
end;

Proc cbPacketMode_onChange(Obj:S);
var tmp:i;
var Flag:L;
 if РПО_PacketMode=False:
    tmp=EnqOkCancel("Выход из пакетного режима приведет к потери данных 'пакетного режима', вы уверены ?");
    if tmp=cmCancel: Flag=True;  else Flag=False; ClearVariable(РПО_Позиции); fi;
   else
    Flag=True;
    InsertFrame(РПО_Позиции, РПО_Позиции+1);
    РПО_Позиции[РПО_Позиции].ТДСчет=Де;
    РПО_Позиции[РПО_Позиции].ТСчет=Счет;
    РПО_Позиции[РПО_Позиции].ТПризн=Trim(По+" "+Призн);
    РПО_Позиции[РПО_Позиции].ТПризн=Trim(РПО_Позиции[РПО_Позиции].ТПризн+" "+Цель);
    Template.Field="ТДСчет_"; Template.Frame=1;
 fi;
 РПО_PacketMode=Flag;
 cbPacketMode.State=РПО_PacketMode;
 Оформление;
end;

Proc cbPrintPacket_OnChange(Sender: String);
 Оформление;
end;

Proc btnПечать_OnClick(Sender: String);
 if РПО_PacketMode and PrintPacket:
    if PrintPacketNP:
       Раб.Настр_Печать.Prn("","","RPO_0310001_001.cfg","",1);
       if EnqOkCancel("Вставте лист для продожения печати.")=cmCancel: Exit; fi;
       Раб.Настр_Печать.Prn("","","RPO_0310001_002.cfg","",1);
      else
       Раб.Настр_Печать.Prn("","","RPO_0310001_000.cfg","",1);
    fi;
   else
    Раб.Настр_Печать.Prn("","","RPO_0310001_001.cfg","",1);
 fi;
end;
2-- События шаблона
Proc Template_onOpen(Create: Logical);
 FlagInit=True;
 Раб.Настр_Печать.Cfg("","RPO_0310001_000.cfg");
end;

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

Proc Template_onRead;
 if НоваяЗапись:
    if Номер=0 or Д=1.1.100: Д=ToDay; fi;
    Номер=РАБ.ОБЛ.СледСУчетомДаты(SelfCrd,"Номер","Д",Д);
    НомерБум=Str(Номер);
    if РЕКВ=nil:
       РЕКВ=РАБ.БЮДЖЕТ2005.НашРекв;
       if not РЕКВ=nil: РПО_ФИОБух=Рекв.ФИОБух; РПО_ФИОКасс=Рекв.ФИОКАСС; fi;
    fi;
    Проводить=False;
    if Де="": Де=StoreДСчет; fi;
    if РАБ.БЮДЖЕТ2005.Сетевая: EditorApply; fi;
 fi;
 if not FlagInit: Оформление; fi;
 НеПустаяТаблица;
 if Валюта="" and canUpdate(SelfCrd):
    Валюта=BaseCurrency;
    EditorApply;
 fi;
end;

Func Template_OnVerify: Logical;
var tmp:S;
 tmp=Раб.Бюджет.ВзятьПризнакИзНабораПоМаске(Призн+" "+Цель,"К.*"," ");
 РеквП=SignToRecord(tmp);
 if Валюта="": Валюта=BaseCurrency; fi;
 ^True;
end;




КОНЕЦ
