-- Шаблон создан мастером бланков
-- 23.07.2001 10:43:46
--
БланкСШаблоном [10.06.2005] "Карточка учета средств и расчетов";

S1: Section;

var Упр:I;

НК:s;

НИ:L;

MM:I;
var MMTxt:S=Месяц(MM);
YYYY:I=[Year(ToDay)];
ДН:D=if(НИ,Dat(1,1,YYYY),Dat(1,MM,YYYY)); -- начало периода
ДК:D=if(MM<12,Dat(1,MM+1,YYYY),Dat(1,1,YYYY+1)); -- конец периода

Учреждение:S;
ОКПО:S;

ПризнПодр:S;
var НаимПодр:S=if(Name_A(ПризнПодр)="" or Name_A(ПризнПодр)=" ",ПризнПодр,Name_A(ПризнПодр));

РежимСч:L;

КБК:S;
КОСГУ:S;
Сч:S;
УслАнДоп:S;
Призн:s;
var НаимПризн:S=if(Name_A(Призн)="" or Name_A(Призн)=" ",Призн,Name_A(Призн));

var СчУсл:S=if(РежимСч,Сч,if(КБК="","*",КБК)+"."+Сч+"."+if(КОСГУ="","*",КОСГУ));
var АнУсл:S;

var Дт    []:D;
var НЖО   []:S;
var Содерж[]:S;
var ДСум  []:N;
var КСум  []:N;
var ОстД  []:N;
var ОстК  []:N;
var tID   []:I;

ФИОИсп:S;
ДолжнИсп:S;

var Buf[]:S;
var Buf2[]:S;
var Buf3[]:S;
var Buf4[]:S;
var Buf5[]:S;
var Buf6[]:S;
var Buf7[]:S;

var BufAcc[]:S;
var BufVoc[]:S;
--
--Процедуры и функции -------------
Proc Очистить;
 ClearVariable(Упр);
 ClearVariable(Дт);
 ClearVariable(НЖО);
 ClearVariable(Содерж);
 ClearVariable(ДСум);
 ClearVariable(КСум);
 ClearVariable(ОстД);
 ClearVariable(ОстК);
 ClearVariable(Buf);
 ClearVariable(tID);
end;

Func DebПризн (t:i):L;
var n:i;
var z,tmp,Призн_:s;
var Flag:L;
 Призн_=Раб.Бюджет.НаборПризнtoMask(Призн,"|");
 if Призн_="": ^True; fi;
 Flag=False;
 for n=1..TransSignCount(t) do
  tmp=TransSignName(t,n);
  z=SubStr(tmp,1,1);
  if z<>"-":
    if z="+": tmp=SubStr(tmp,2,256); fi;
    Flag=Раб.Бюджет.MatchMask(tmp,Призн_);
    if Flag=True: Break; fi;
  fi;
 od;
 ^Flag;
end;

Func CreПризн (t:i):L;
var n:i;
var z,tmp,Призн_:s;
var Flag:L;
 Призн_=Раб.Бюджет.НаборПризнtoMask(Призн,"|");
 if Призн_="": ^True; fi;
 Flag=False;
 for n=1..TransSignCount(t) do
  tmp=TransSignName(t,n);
  z=SubStr(tmp,1,1);
  if z<>"+":
    if z="-": tmp=SubStr(tmp,2,256); fi;
    Flag=Раб.Бюджет.MatchMask(tmp,Призн_);
    if Flag=True: Break; fi;
  fi;
 od;
 ^Flag;
end;

Proc Расчет;
var Mask:S;
var t:i;
var tSum:n;
var tDeb,tCre:S;
var ОстСч:N;
 Очистить;
 АнУсл=Раб.Бюджет2005.Объединить(Призн,ПризнПодр,"&");
 if not УслАнДоп="": АнУсл=Раб.Бюджет2005.Объединить(АнУсл,"("+УслАнДоп+")","&"); fi;
 Mask=СчУсл+"{"+АнУсл+"}";
 InsertFrame(Упр,Упр+1);
 Дт[Упр]=ДН;
 Содерж[Упр]="Остаток на начало периода";
 ОстСч=Saldo(Mask,ДН);
 ОстД[Упр]=Deb(ОстСч);
 ОстК[Упр]=Cre(ОстСч);
 tID[Упр]=-1;
 ShowProgress(ДК-ДН,"Расчет....");
 Try
  for Transaction t=Mask, ДН, ДК do
   InsertFrame(Упр,Упр+1);
   Дт[Упр]=TransDate(t);
   ProgressPos(Дт[Упр]-ДН);
   Содерж[Упр]=TransComment(t);
   tDeb=TransDeb(t);
   tCre=TransCre(t);
   tSum=TransSum(t);
   if Match(tDeb,СчУсл) and DebПризн(t): ДСум[Упр]=tSum; fi;
   if Match(tCre,СчУсл) and CreПризн(t): КСум[Упр]=tSum; fi;
   ОстСч=ОстСч+ДСум[Упр]-КСум[Упр];
   ОстД[Упр]=Deb(ОстСч);
   ОстК[Упр]=Cre(ОстСч);
   tID[Упр]=t;
  -- НЖО[Упр]=Раб.ЖО.ОпределитьЖО(tCre,"");
  od;
  -- Добавлено 26.03.2009 - Ершов
  InsertFrame(Упр,Упр+1);
  Дт[Упр]=ДК;
  Содерж[Упр]="Обороты за период";
  ДСум[Упр]=SumOfArray(ДСум, Упр-1);
  КСум[Упр]=SumOfArray(КСум, Упр-1);
  tID[Упр]=-1;
  --
  InsertFrame(Упр,Упр+1);
  Дт[Упр]=ДК;
  Содерж[Упр]="Остаток на конец периода";
  ОстСч=Saldo(Mask,ДК);
  ОстД[Упр]=Deb(ОстСч);
  ОстК[Упр]=Cre(ОстСч);
  tID[Упр]=-1;
  --
 Finally
  CloseProgress;
 end;
 Message("Расчет завершен");
end;

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

Func Объединить(Value1:s; Value2:s):S;
var z:s;
 if not Value1="": z=Оператор; else z=""; fi;
 ^Раб.Бюджет2005.Объединить(Value1,Value2,z);
end;
--Процедуры и функции -------------
--
--
--Обработчики событий объектов--------
Proc btnРасчет_onClick (Obj:S);
 if MM=0: Message("Введите месяц расчета",mtError); Template.Field="MMTxt"; Exit; fi;
 if YYYY=0  : Message("Введите год расчета",mtError); Template.Field="YYYY"; Exit;  fi;
 if Сч="": Message("Не выбран номер счета",mtError); Template.Field="Сч"; Exit; fi;
 Refresh;
 Расчет;
end;

Proc cbНИ_OnChange(Sender: String);
 if EnqOkCancel("Выполнить перерасчет ?",mtConfirmation)=cmCancel: Exit; fi;
 btnРасчет_onClick(Sender);
end;

Proc btnПечать_OnClick(Sender: String);
 Раб.Настр_Печать.Prn('','','Rpo_0511604_000.cfg','',1);
end;

Proc btnЗакрыть_onClick (Obj:S);
 Close;
end;

Proc РежимСч_OnChange(Sender: String);
var bg:i;
 Сч=""; КБК=""; КОСГУ=""; Призн=""; УслАнДоп="";
 bg=if(РежимСч,coTransparent,coTeal);
 S1.Cell(1,2,CellBgColor,bg); S1.Cell(1,2,CellReadOnly,РежимСч);
 S1.Cell(1,4,CellBgColor,bg); S1.Cell(1,4,CellReadOnly,РежимСч);
 Очистить;
end;
--Обработчики событий объектов--------
--
--Обработчики событий полей--------
Func MMTxt_onEnter (Field:S; Iter:I):L;
var i:I;
 ClearVariable(Buf);
 for i=1..12 do Buf[i]=Месяц(i); od;
 I=Alternate("Выбор месяца расчета",Buf,30,Mon(ToDay),12);
 if I<>0: MM=I; fi;
 ClearVariable(Buf);
 Очистить;
 ^False;
end;

Func YYYY_onEnter (Field:S; Iter:I):L;
var i:i;
 ClearVariable(Buf);
 for i=1..5 do  Buf[i]=Str(Year(ToDay)+I-4); od;
 i=Alternate("Выбор года расчета",Buf,30,4,12);
 if I<>0: YYYY=Int(Buf[i]); fi;
 ClearVariable(Buf);
 Очистить;
 ^False;
end;

Func Учреждение_onEnter(FieldName: S; Iter: I): L;
var Rec:Record;
 Rec=OpenCardFile('Контрагент','Наше',nil,crdRecordOnly);
 if Rec=nil: ^False; fi;
 Учреждение=GetCardFieldS('Контрагент',Rec,'КорИмя');
 ОКПО=GetCardFieldS('Контрагент',Rec,'ОКПО');
 ^False;
end;

Func НаимПодр_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("П.*");
 if tmp="": ^False; fi;
 ПризнПодр=tmp;
 Очистить;
 ^False;
end;

Proc НаимПодр_OnExit(FieldName: String; Iter: Integer);
 ПризнПодр="";
 Очистить;
end;

Func КБК_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var tmp:S;
 ClearVariable(Buf);
 Buf[1]="ФКР --Классификация расходов";
 Buf[2]="КД --Классификация доходов";
 Buf[3]="КИФД --Классификация источников финансирования дефицитов";
 n=Alternate("Тип классификации",Buf,-1,1,12);
 if n=0: ^False; fi;
 tmp="*."+if(Сч="","?.???.??",Сч)+"."+if(КОСГУ="","*",КОСГУ);
 КБК=Раб.КБК.ВыбратьМаскуКБК(SubStr(Buf[n],1,Pos(" --",Buf[n])-1),tmp,КБК,False);
 Призн="";
 Очистить;
 ^False;
end;

Func КОСГУ_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=if(КБК="","*",КБК)+"."+if(Сч="","?.???.??",Сч)+".*";
 tmp=Раб.КБК.Список(tmp,"","КОСГУ");
 if tmp="": ^False; fi;
 КОСГУ=tmp;
 Призн="";
 Очистить;
 ^False;
end;

Func Сч_onEnter (Field:S;Iter:I):L;
var tmp:s;
var len:I;
 if РежимСч:
    tmp = AccountElection("",True,Сч);
    len = Length(tmp);
    if Substr(tmp, len, 1) = '.':
       tmp = Substr(tmp, 1, len - 1) + "!";
    fi;
   else
    tmp=if(КБК="","*",КБК)+".?.???.??."+if(КОСГУ="","*",КОСГУ);
    tmp=Раб.КБК.Список(tmp,"","СЧ6 ВД+? ИГ");
    if tmp="": ^False; fi;
    if Match(tmp,"?."): tmp=tmp+"???.??";
      |Match(tmp,"?.???."): tmp=tmp+"??";
    fi;
 fi;
 Сч=tmp;
 Призн="";
 УслАнДоп="";
 Очистить;
 ^False;
end;

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

Proc УслАнДоп_OnExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func УслАн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp,Field:s;
 Template.HideEditor(False);
 if Сч="": Message("Введите счет",mtError); Template.Field="Сч"; ^Cur; fi;
 Field=AsString(Template.Field);
 tmp=Раб.Бюджет2005.СписокСправ(СчУсл,0,"");
 if not tmp="": tmp=Раб.Бюджет2005.Объединить(tmp,"(~*.*)","|"); fi;
 tmp=AnaElection(tmp);
 if tmp="": ^Cur; fi;
 PutVariableS(Field,Объединить(GetVariableS(Field),tmp));
 if Field="АнУслДоп": Очистить; fi;
 Return  Cur;
end;

Func НаимПризн_onEnter(Field:s;Iter:I):l;
var tmp:s;
 if Сч="": Message("Введите счет",mtError); Template.Field="Сч"; ^False; fi;
 tmp=Раб.Бюджет2005.СписокСправ(СчУсл,0,"");
 tmp=AnaElection(tmp);
 if tmp="": ^False; fi;
 Призн=tmp;
 Очистить;
^False;
end;

Proc НаимПризн_OnExit(FieldName: String; Iter: Integer);
 Призн="";
end;

Func Проводка (Field: S; Iter: I): L;
 if tID[Iter]=-1: Message('Проводка не найдена',mtError); ^False; fi;
 TransOpenJur(tID[Iter]);
^False;
end;

Func Исп_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Rec:Record;
 Template.HideEditor(Ложь);
 Rec=OpenCardFile('Сотрудники',"",nil,crdRecordOnly);
 if Rec=nil: ^Cur; fi;
 ФИОИсп=GetCardFieldS('Сотрудники',Rec,'ФАМИЛИЯ')+' '+GetCardFieldS('Сотрудники',Rec,'ИНИЦИАЛЫ');
 ДолжнИсп=GetCardFieldS('Сотрудники',Rec,'ДОЛЖНОСТЬ.ДОЛЖ');
 ^Cur;
end;
--Обработчики событий полей--------
--
--Обработчики событий шаблона---------
Proc AfterOpen(Destroy: Logical);
var bg:i;
 bg=if(РежимСч,coTransparent,coTeal);
 S1.Cell(1,2,CellBgColor,bg); S1.Cell(1,2,CellReadOnly,РежимСч);
 S1.Cell(1,4,CellBgColor,bg); S1.Cell(1,4,CellReadOnly,РежимСч);
end;

Proc Template_onOpen (Create:L);
var Rec:Record;
 if Учреждение="": 
    Rec=Раб.Бюджет2005.НашРекв;
    Учреждение=GetCardFieldS("Контрагент",Rec,"КорИмя");
    ОКПО=GetCardFieldS("Контрагент",Rec,"ОКПО");
 fi;
 Раб.Настр_Печать.Cfg('','Rpo_0511604_000.cfg');
end;
--Обработчики событий шаблона---------
--

Конец
