-- Шаблон создан мастером бланков
-- 15.07.2013 12:50:14
--
БланкСШаблоном "Проверка банковских реквизитов договора по БИКу";

fОбщСправ1:L;
fОбщСправ2:L;
fСорт	  :I;

var LastUpd:S;
var LastUpd_:S="Номер последней  проведенной корректировки справочника БИК РФ: "+LastUpd;

var Расчет_:S;

Банк:S;
Банк_:S;
Общ_Справ1:S;
Общ_Справ2:S;

var Общ_Справ_Наим1:S;
var Общ_Справ_Наим2:S;

var Key[]:S;
var Упр:I;
var пп[]:i=$;
var Общ_Призн1[]:S;
var Общ_Призн2[]:S;
var Наим[]:s;
var Ном[]:S;
var Дат[]:D;
var Сум[]:N;
var НаимК[]:S;
var ИНН[]:S;
var КПП[]:S;
var РСчет[]:S;
var НаимБ[]:S;
var ГородБ[]:S;
var БИК[]:S;
var КСчет[]:S;
var Статус[]:S;
var Статус2[]:S;
var UKey[]:Record;
var ДатСтатус[]:D;

var cacheVer:S;
var cacheNEWNUM[]:S;
var cacheREAL[]:S;
var cacheKSNP[]:S;
var cacheNAMEP[]:S;
var cacheTNP[]:S;
var cacheNNP[]:S;
var cacheDT_IZM[]:D;

S0: Section;
S1: Section;
S2: Section;

var SelfCfg:S="ТББ.ДОКУМЕНТЫ.ДОГОВОРПОСТ.КОНТРОЛЬ_ПО_БИК.000.cfg";

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

var retСтатус	:S;
var retСтатус2	:S;
var retДатСтатус:D;
--
--Процедуры и функции -------------
Proc Оформление;
 S0.Column(2,ColVisible,fОбщСправ1 or fОбщСправ2);
 S1.Column(2,ColVisible,fОбщСправ1 or fОбщСправ2);
 S2.Column(2,ColVisible,fОбщСправ1 or fОбщСправ2);
end;

Proc ОчиститьCache;
 ClearVariable(cacheVer);
 ClearVariable(cacheNEWNUM);
 ClearVariable(cacheREAL);
 ClearVariable(cacheKSNP);
 ClearVariable(cacheNAMEP);
 ClearVariable(cacheTNP);
 ClearVariable(cacheNNP);
 ClearVariable(cacheDT_IZM);
end;

Proc Очистить;
 ClearVariable(Общ_Справ_Наим1);
 ClearVariable(Общ_Справ_Наим2);
 ClearVariable(Key);
 ClearVariable(Упр);
 ClearVariable(Общ_Призн1);
 ClearVariable(Общ_Призн2);
 ClearVariable(Наим);
 ClearVariable(Ном);
 ClearVariable(Дат);
 ClearVariable(Сум);
 ClearVariable(НаимК);
 ClearVariable(ИНН);
 ClearVariable(КПП);
 ClearVariable(РСчет);
 ClearVariable(НаимБ);
 ClearVariable(ГородБ);
 ClearVariable(БИК);
 ClearVariable(КСчет);
 ClearVariable(Статус);
 ClearVariable(Статус2);
 ClearVariable(ДатСтатус);
 ClearVariable(UKey);
 ClearVariable(Расчет_);
end;

Proc ПереСорт;
var z,zz,Iter:I;
var t,Key_:S;
 t=Str16(Time);
 zz=Упр;
 ShowProgress(zz,"Сортировка");
 Try
  for z=1..zz do
   ProgressPos(z);
   if fСорт=0: Key_=БИК[1];
     |fСорт=1: Key_=Раб.Формат.ДатаСтр(ДатСтатус[1],14)+"#"+БИК[1];
     |fСорт=2: Key_=ИНН[1]+"#"+Раб.Формат.ДатаСтр(ДатСтатус[1],14)+"#"+БИК[1];
     |fСорт=3: Key_=Ном[1];
     |fСорт=4: Key_=Раб.Формат.ДатаСтр(Дат[1],14);
   fi;
   Key_=t+"#"+Str(fСорт)+"#"+Key_+"#"+Str16(RecordToInteger(UKey[1]));
   Iter=InsertInArraySort(Key,Key_);
   InsertFrame(Упр,Iter);
   Общ_Призн1[Iter]=Общ_Призн1[1];
   Общ_Призн2[Iter]=Общ_Призн2[1];
   Наим[Iter]=Наим[1];
   Ном[Iter]=Ном[1];
   Дат[Iter]=Дат[1];
   Сум[Iter]=Сум[1];
   НаимК[Iter]=НаимК[1];
   ИНН[Iter]=ИНН[1];
   КПП[Iter]=КПП[1];
   РСчет[Iter]=РСчет[1];
   НаимБ[Iter]=НаимБ[1];
   ГородБ[Iter]=ГородБ[1];
   БИК[Iter]=БИК[1];
   КСчет[Iter]=КСчет[1];
   Статус[Iter]=Статус[1];
   Статус2[Iter]=Статус2[1];
   ДатСтатус[Iter]=ДатСтатус[1];
   UKey[Iter]=UKey[1];
   DeleteFromArray(Key,1);
   DeleteFrame(Упр,1);
  od;
 Finally
  CloseProgress;
 end;
end;

Proc ДобавитьСтр (OWAД:I; nД:I; OWAК:I; nК:I; OWAБ:I; nБ:I; prefixК:S; prefixБ:S; Статус_:S; Статус2_:S; ДатСтатус_:D);
var Iter:I;
var Key_:S;
var UKey_:Record;
 UKey_=GetRecordKey(OWAД,nД);
 if fСорт=0: Key_=GetFieldS(OWAБ,nБ,prefixБ+".БИК");
   |fСорт=1: Key_=Раб.Формат.ДатаСтр(ДатСтатус_,14)+"#"+GetFieldS(OWAБ,nБ,prefixБ+".БИК");
   |fСорт=2: Key_=GetFieldS(OWAК,nК,prefixК+".ИНН")+"#"+Раб.Формат.ДатаСтр(ДатСтатус_,14)+"#"+GetFieldS(OWAБ,nБ,prefixБ+".БИК");
   |fСорт=3: Key_=GetFieldS(OWAД,nД,"НомерДок");
   |fСорт=4: Key_=Раб.Формат.ДатаСтр(GetFieldD(OWAД,nД,"ДатаДок"),14);
 fi;
 Key_="00000000#"+Str(fСорт)+"#"+Key_+"#"+Str16(RecordToInteger(UKey_));
 Iter=InsertInArraySort(Key,Key_);
 InsertFrame(Упр,Iter);
 Общ_Призн1[Iter]=GetFieldS(OWAД,nД,"Общ_Призн1");
 Общ_Призн2[Iter]=GetFieldS(OWAД,nД,"Общ_Призн2");
 Наим[Iter]=GetFieldS(OWAД,nД,"НаимДок.Наим");
 Ном[Iter]=GetFieldS(OWAД,nД,"НомерДок");
 Дат[Iter]=GetFieldD(OWAД,nД,"ДатаДок");
 Сум[Iter]=GetFieldN(OWAД,nД,"СумДок");
 НаимК[Iter]=GetFieldS(OWAК,nК,prefixК+".КорИмя");
 ИНН[Iter]=GetFieldS(OWAК,nК,prefixК+".ИНН");
 КПП[Iter]=GetFieldS(OWAК,nК,prefixК+".КПП");
 РСчет[Iter]=GetFieldS(OWAБ,nБ,prefixБ+".РСчет");
 НаимБ[Iter]=GetFieldS(OWAБ,nБ,prefixБ+".Банк");
 ГородБ[Iter]=GetFieldS(OWAБ,nБ,prefixБ+".Город");
 БИК[Iter]=GetFieldS(OWAБ,nБ,prefixБ+".БИК");
 КСчет[Iter]=GetFieldS(OWAБ,nБ,prefixБ+".КСчет");
 Статус[Iter]=Статус_;
 Статус2[Iter]=Статус2_;
 ДатСтатус[Iter]=ДатСтатус_;
 UKey[Iter]=UKey_;
 if Общ_Справ_Наим1="" and not Общ_Призн1[Iter]="":
    Общ_Справ_Наим1=GetFieldS(OWAД,nД,"Настр.Общ_Справ_Наим1");
 fi;
 if Общ_Справ_Наим2="" and not Общ_Призн2[Iter]="":
    Общ_Справ_Наим2=GetFieldS(OWAД,nД,"Настр.Общ_Справ_Наим2");
 fi;
end;

Func ПроверитьПоБИК(OWAБИК:I; БИК_:S; НаимБ_:S; ГородБ_:S; КСчет_:S):L;
var z:i;
var tmp:S;
 retСтатус="";
 retСтатус2="";
 retДатСтатус=1.1.100;
 if БИК_="":
    retСтатус="БИК не заполнен";
   else
    z=SearchInArray(cacheNEWNUM,БИК_,True);
    if z=-1:
       SetFilter(OWAБИК,"NEWNUM='"+БИК_+"'");
       if Records(OWAБИК)=0:
	  retСтатус="БИК '"+БИК_+"' в справочнике не найден";
	 else
	  z=InsertInArraySort(cacheNEWNUM,GetFieldS(OWAБИК,1,"NEWNUM"));
	  InsertInArray(cacheREAL,z,GetFieldS(OWAБИК,1,"REAL_"));
	  InsertInArray(cacheKSNP,z,GetFieldS(OWAБИК,1,"KSNP"));
	  InsertInArray(cacheNAMEP,z,GetFieldS(OWAБИК,1,"NAMEP"));
	  InsertInArray(cacheTNP,z,GetFieldS(OWAБИК,1,"TNP"));
	  InsertInArray(cacheNNP,z,GetFieldS(OWAБИК,1,"NNP"));
	  InsertInArray(cacheDT_IZM,z,GetFieldD(OWAБИК,1,"DT_IZM"));
       fi;
    fi;
    if not z=-1:
       if not cacheREAL[z]="":
	  retСтатус="Значение кода контроля по справочнику: "+Раб.Вспом.Справ_БИК.КодВТекст("Real",cacheREAL[z]);
       fi;
       if not НаимБ_=cacheNAMEP[z]:
	  retСтатус=retСтатус+" Наименование банка отличается от наименования по справочнику: "+cacheNAMEP[z];
       fi;
       tmp=Раб.Вспом.Справ_БИК.КодВТекст("TNP",cacheTNP[z]);
       if not (Pos(ГородБ_,tmp+"."+cacheNNP[z])=1 or Pos(ГородБ_,tmp+". "+cacheNNP[z])=1):
	  retСтатус=retСтатус+" Наименование населенного пункта отличается от наименования по справочнику: "+tmp+"."+cacheNNP[z];
       fi;
       if not КСчет_=cacheKSNP[z]:
	  retСтатус=retСтатус+" Корреспондентский счет отличается от значения по справочнику: "+cacheKSNP[z];
       fi;
       if not retСтатус="":
	  retСтатус2="Дата последнего изменения: "+DateToString(cacheDT_IZM[z]);
	  retДатСтатус=cacheDT_IZM[z];
       fi;
       retСтатус=Trim(retСтатус);
    fi;
 fi;
 ^retСтатус="";
end;

Proc Расчет;
var OWAБИК,OWAДог,OAБ,OAК,n,nr,nБ,nrБ,nК,nrК,z:I;
var Банк_:Record;
var LastUpd_,НаимБ_,ГородБ_,БИК_,КСчет_,Общ_Справ1_,Общ_Справ2_:S;
var UpdDate_:D;
 Очистить;
 LastUpd_=Раб.Вспом.Справ_БИК.НомерКорректировки("");
 if not cacheVer=LastUpd_:
    ОчиститьCache;
    cacheVer=LastUpd_;
 fi;
 if not LastUpd_="":
    UpdDate_=StringToDate(ExtractWord(3,LastUpd_," "));
 fi;
 if UpdDate_=1.1.100:
    UpdDate_=ToDay;
 fi;
 if fОбщСправ1 and not Общ_Справ1="":
    if Match(Общ_Справ1,"*."):
       Общ_Справ1_=SubStr(Общ_Справ1,1,Length(Общ_Справ1)-1)+"!";
      else
       Общ_Справ1_=Общ_Справ1;
    fi;
 fi;
 if fОбщСправ2 and not Общ_Справ2="":
    if Match(Общ_Справ2,"*."):
       Общ_Справ2_=SubStr(Общ_Справ2,1,Length(Общ_Справ2)-1)+"!";
      else
       Общ_Справ2_=Общ_Справ2;
    fi;
 fi;
 OWAБИК=OpenWorkArea("РПО_BNKSEEK","NEWNUM");
 Try
  if Records(OWAБИК)=0: Message("Справочник БИК РФ не загружен",mtError); Exit; fi;
  OWAДог=OpenWorkArea("РПО_ДОГОВОР","","not НеДейств and not Исполнен and not Аннулирован and Рег and ДатаРег>=1.1."+Str(Year(UpdDate_))+if(fОбщСправ1 and not Общ_Справ1=""," and Match(Общ_Призн1,'"+Общ_Справ1_+"')","")+if(fОбщСправ2 and not Общ_Справ2=""," and Match(Общ_Призн2,'"+Общ_Справ2_+"')",""));
  Try
   nr=Records(OWAДог);
   ShowProgress(nr,"Расчет...");
   if not nr=0:
      OAК=OpenArray(OWAДог,1,"КОНТР2","");
      OAБ=OpenArray(OWAДог,1,"КОНТР_БАНК2","");
   fi;
   for n=1..nr do
    ProgressPos(n);
    Банк_=GetFieldR(OWAДог,n,"Контр_Банк");
    if RecordExists("БАНК_СЧЕТА",Банк_) and (GetFieldS(OWAДог,n,"Контр_Банк.РПО_Страна")="" or GetFieldS(OWAДог,n,"Контр_Банк.РПО_Страна")="RU"):
       БИК_=GetFieldS(OWAДог,n,"Контр_Банк.БИК");
       НаимБ_=GetFieldS(OWAДог,n,"Контр_Банк.Банк");
       ГородБ_=GetFieldS(OWAДог,n,"Контр_Банк.Город");
       КСчет_=GetFieldS(OWAДог,n,"Контр_Банк.КСчет");
       ПроверитьПоБИК(OWAБИК,БИК_,НаимБ_,ГородБ_,КСчет_);
       if (not retСтатус="" and Банк="") or (not Банк="" and БИК_=Банк):
	   ДобавитьСтр(OWAДог,n,OWAДог,n,OWAДог,n,"Контр","Контр_Банк",retСтатус,retСтатус2,retДатСтатус);
       fi;
    fi;
    nrБ=Records(OAБ);
    for nБ=1..nrБ do
      Банк_=GetFieldR(OAБ,nБ,"Контр_Банк");
      if RecordExists("БАНК_СЧЕТА",Банк_) and (GetFieldS(OAБ,nБ,"Контр_Банк.РПО_Страна")="" or GetFieldS(OAБ,nБ,"Контр_Банк.РПО_Страна")="RU"):
	 БИК_=GetFieldS(OAБ,nБ,"Контр_Банк.БИК");
	 НаимБ_=GetFieldS(OAБ,nБ,"Контр_Банк.Банк");
	 ГородБ_=GetFieldS(OAБ,nБ,"Контр_Банк.Город");
	 КСчет_=GetFieldS(OAБ,nБ,"Контр_Банк.КСчет");
	 ПроверитьПоБИК(OWAБИК,БИК_,НаимБ_,ГородБ_,КСчет_);
	 if (not retСтатус="" and Банк="") or (not Банк="" and БИК_=Банк):
	     ДобавитьСтр(OWAДог,n,OWAДог,n,OAБ,nБ,"Контр","Контр_Банк",retСтатус,retСтатус2,retДатСтатус);
	 fi;
      fi;
    od;
    nrК=Records(OAК);
    for nК=1..nrК do
      Банк_=GetFieldR(OAК,nК,"Контр_Банк");
      if RecordExists("БАНК_СЧЕТА",Банк_) and (GetFieldS(OAК,nК,"Контр_Банк.РПО_Страна")="" or GetFieldS(OAК,nК,"Контр_Банк.РПО_Страна")="RU"):
	 БИК_=GetFieldS(OAК,nК,"Контр_Банк.БИК");
	 НаимБ_=GetFieldS(OAК,nК,"Контр_Банк.Банк");
	 ГородБ_=GetFieldS(OAК,nК,"Контр_Банк.Город");
	 КСчет_=GetFieldS(OAК,nК,"Контр_Банк.КСчет");
	 ПроверитьПоБИК(OWAБИК,БИК_,НаимБ_,ГородБ_,КСчет_);
	 if (not retСтатус="" and Банк="") or (not Банк="" and БИК_=Банк):
	    ДобавитьСтр(OWAДог,n,OAК,nК,OAК,nК,"Контр","Контр_Банк",retСтатус,retСтатус2,retДатСтатус);
	 fi;
      fi;
    od;

   od;
  Finally
   if not OAК=0:
      CloseWorkArea(OAК);
   fi;
   if not OAБ=0:
      CloseWorkArea(OAБ);
   fi;
   CloseWorkArea(OWAДог);
  end;
 Finally
  CloseWorkArea(OWAБИК);
  Расчет_="Отчет составлен :"+DateToString(ToDay)+" "+Раб.Бюджет2005.TimeToStr(Time,"")+" Пользователь: "+UserName(AliasName("РПО_БЮДЖ_КЛАСС"));
  CloseProgress;
 end;
 Message("Расчет завершен");
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
Func Банк_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
var v1,v2:S;
 Rec=Раб.Поиск.ВыборИзКартотеки("Выбор из справочника БИК РФ","РПО_BNKSEEK","NEWNUM|NAMEP|NNP|KSNP","БИК|Платежное наименование участника расчетов|Наименование населенного пункта|Корреспондентский счет","");
 if not Rec=nil:
    Банк=GetCardFieldS("РПО_BNKSEEK",Rec,"NEWNUM");
    Банк_="БИК "+Банк+" "+GetCardFieldS("РПО_BNKSEEK",Rec,"NAMEP");
    v1=Раб.Вспом.Справ_БИК.КодВТекст("TNP",GetCardFieldS("РПО_BNKSEEK",Rec,"TNP"));
    v2=GetCardFieldS("РПО_BNKSEEK",Rec,"NNP");
    Банк_=Банк_+" "+Раб.Бюджет2005.Объединить(v1,v2,".");
    Банк_=Банк_+" К/С "+GetCardFieldS("РПО_BNKSEEK",Rec,"KSNP");
    Очистить;
 fi;
 Return False;
end;


Proc Банк_OnExit(FieldName: String; Iter: Integer);
 Банк="";
 Банк_="";
end;

Func Общ_Справ_OnEnter(FieldName: String; Iter: Integer): logical;
var OWA,n,nr,z,w,ww:I;
var Field,Призн_:S;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 Field="Общ_Призн"+if(Match(FieldName,"*1"),"1","2");
 OWA=OpenWorkArea("РПО_ДОГОВОР","","not НеДейств and not Исполнен and not Аннулирован and Рег and not "+Field+"=''");
 Try
  nr=Records(OWA);
  for n=1..nr do
   Призн_=GetFieldS(OWA,n,Field);
   if n=1:
      Buf [1]=ExtractWord(1,Призн_,".")+". -- "+Name_A(ExtractWord(1,Призн_,".")+".");
      Buf2[1]=ExtractWord(1,Призн_,".");
   fi;
   if SearchInArray(Buf2,Призн_,True)=-1:
      InsertInArraySort(Buf2,Призн_);
      ww=WordsCount(Призн_,".");
      for w=2..ww-1 do
       AddInArray(Buf,True,False,ExtractWords(1,w,Призн_,".")+". -- "+Name_A(ExtractWords(1,w,Призн_,".")));
       AddInArray(Buf2,True,False,ExtractWords(1,w,Призн_,".")+".");
      od;
      AddInArray(Buf,True,False,Призн_+" -- "+Name_A(Призн_));
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 if not LengthOfArray(Buf)=0:
    n=AlternateTree("Выберите признак",Buf,-1,SearchInArray(Buf2,GetVariableS(Field),True),12,".","Код","Наименование",-1,True);
    --
    if not n=0:
       PutVariableS(FieldName,SubStr(Buf[n],1,Pos(" ",Buf[n])-1));
       Очистить;
    fi;
   else
    Message("Ничего не найдено");
 fi;
 Return False;
end;

Proc Общ_Справ_OnExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func onEnter(FieldName: String; Iter: Integer): logical;
 if not UKey[Iter]=nil:
    OpenBlank("ИНФО.ДОГОВОР",True,UKey[Iter]);
 fi;
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc rbСорт_OnChange(Sender: String);
 ПереСорт;
end;

Proc btnРасчет_OnClick(Sender: String);
 Расчет;
end;

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

Proc cbОбщСправ_OnChange(Sender: String);
 Оформление;
 if not fОбщСправ1: Общ_Справ1=""; fi;
 if not fОбщСправ2: Общ_Справ2=""; fi;
end;

Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 LastUpd=Раб.Вспом.Справ_БИК.НомерКорректировки("");
 Раб.Настр_Печать.Cfg("",SelfCfg);
end;

Proc AfterOpen(Destroy: Logical);
 Оформление;
end;
--Обработчики событий шаблона -----
--



Конец
