-- Шаблон создан мастером бланков
-- 30.03.2009 14:44:18
--
БланкСШаблоном "Справочник БИК РФ";

var Загрузить:S="Загрузить";
var Загрузить2:S="Загрузить с интернета";
var Обновить:S="Загрузить";
var Обновить2:S="Загрузить все корректировки";
var Обновить3:S="Загрузить с интернета";
var ОбновитьРБК:S="Загрузить";
var ОбновитьРБК2:S="Загрузить с интернета";
var ПоискБанка:S="Поиск банка";
var ПечатьБанка:S="Печать реквизитов";

fileBnkSeek:S;
fileKorrek:S;
var LastUpd:S;
fileUpd:S;
fileUpdRBC:S;

var VKEY:S;
var REAL:S;
var TNP:S;
var NNP:S;
var NAMEP:S;
var NEWNUM:S;
var KSNP:S;
var VKEYDEL:S;

var KOR:S;
var VER:S;
var DT_IZM:D;

var NUM_:S;
var OPR_:I;
var DBF_:S;
var VKEY_:S;
var FIELD_:S;
var NEW_:S;
var OLD_:S;

var fCaseSens:L;
var fОтклКонтроль:L;

cbCaseSens    : Object;
cbОтклКонтроль: Object;
btnПоиск      : Object;
btnЗагрузка   : Object;
btnВосстан    : Object;

var sБИК:S;
var sНаимПлат:S;
var sНасПункт:S;
var sКСчет:S;
var sСтатус:S;
var sДИ:D;

var НастрGUID:S;

var Страница:I;
var Упр0:L=Страница=0;
var Упр1:L=Страница=1;
var Упр2:L=Страница=1;

var SelfCfg:S="ТББ.Раб.вспом.справ_бик.000.cfg";

var service:S;

var RBC_REAL[]:S;
var RBC_NNP[]:S;
var RBC_TNP[]:S;
var RBC_NAMEP[]:S;
var RBC_NEWNUM[]:S;
var RBC_KSNP[]:S;
var RBC_STATE[]:S;
var RBC_REC[]:Record;
var RBC_RECDEL[]: Record;

var Rec_I[]:Record;
var Rec_U[]:Record;
var Rec_D[]:Record;

var Files[]:S;
var FilesDBF[]:S;
var dpos:I;
var Dates[]:S;
--
--Процедуры и функции -------------
Proc Оформление;
 btnПоиск.Enabled=not Страница=0;
 btnЗагрузка.Enabled=not Страница=1;
 btnВосстан.Visible=Страница=1;
end;

Proc Заполнить (Force:L);
var OWA:I;
var Path,File:S;
 if fОтклКонтроль: Exit; fi;
 if not Force:
    OWA=OpenWorkArea("РПО_BNKSEEK","");
    Try
     if not Records(OWA)=0: Exit; fi;
    Finally
     CloseWorkArea(OWA);
    end;
 fi;
 Path=PlanVar("Std_Rpo");
 File=Раб.Бюджет2005.Контроль2Слэш(Path+"\DBF\БИК\РПО_BNKSEEK");
 if not CanInsert("РПО_BNKSEEK") or not CanDelete("РПО_BNKSEEK") or IsReadOnly("РПО_BNKSEEK"): Exit; fi;
 if not CanInsert("РПО_KORREK") or not CanDelete("РПО_KORREK") or IsReadOnly("РПО_KORREK"): Exit; fi;
 if not ExistFile(File+".cdf") or not ExistFile(File+".crd"): Exit; fi;
 ImportCard(ieCRD, --Формат
            "РПО_BNKSEEK", --Картотека обязательное имя картотеки, в которую импортируется заданный файл
            File, --Файл полное или короткое имя файла со структурой заданной картотеки
            False, --ВидимПоля загружать только видимые поля (Истина) или все поля (Ложь)
            False, --Режим загружать поля CreateTime, UpdateTime, CreatedUser, ModifiedUser
            False, --DOS загружать текст в кодировке DOS (Истина) или в кодировке Windows (Ложь);
            False, --Подтв запрашивать подтверждения (Истина) или нет (Ложь).
            ovrNone, --Действ целочисленная константа для разрешения конфликтных ситуаций в импорте
            True, --Удал удалять содержимое картотеки (Истина) или нет (Ложь);
            False, --ПоказДиалог показывать диалог соответствия полей (Истина) даже
            False --Настройки логический параметр, определяющий, использовать ли настройки браузера картотеки при загрузке
           );
 File=Раб.Бюджет2005.Контроль2Слэш(Path+"\DBF\БИК\РПО_KORREK");
 if not ExistFile(File+".cdf") or not ExistFile(File+".crd"): Exit; fi;
 ImportCard(ieCRD, --Формат
            "РПО_KORREK", --Картотека обязательное имя картотеки, в которую импортируется заданный файл
            File, --Файл полное или короткое имя файла со структурой заданной картотеки
            False, --ВидимПоля загружать только видимые поля (Истина) или все поля (Ложь)
            False, --Режим загружать поля CreateTime, UpdateTime, CreatedUser, ModifiedUser
            False, --DOS загружать текст в кодировке DOS (Истина) или в кодировке Windows (Ложь);
            False, --Подтв запрашивать подтверждения (Истина) или нет (Ложь).
            ovrNone, --Действ целочисленная константа для разрешения конфликтных ситуаций в импорте
            True, --Удал удалять содержимое картотеки (Истина) или нет (Ложь);
            False, --ПоказДиалог показывать диалог соответствия полей (Истина) даже
            False --Настройки логический параметр, определяющий, использовать ли настройки браузера картотеки при загрузке
           );
end;

Func Настр(aСохр:L):L;
 if НастрGUID="" or aСохр: НастрGUID=GetGUID; fi;
 if Раб.Настр.Начать("РАБ.ВСПОМ.СПРАВ_БИК",0,0,"",НастрGUID):
    Раб.Настр.Добавить("fCaseSens","L");
    Раб.Настр.Добавить("fОтклКонтроль","L");
    if aСохр: 
       if not Раб.Настр.Сохранить: ^False; fi;
      else 
       НастрGUID=Раб.Настр.Загрузить("","");
       if НастрGUID="":
          fCaseSens=True;
          fОтклКонтроль=False;
       fi;
    fi;
 fi;
 if not aСохр:
    Заполнить(False);
 fi;
 ^True;
end;

Func КодВТекст (aСправ:S; aЗнач:S):S;
 if aСправ="REAL":
    if aЗнач="ОТЗВ": ^"(ОТЗВ) Отозвана лицензия";
      |aЗнач="ИСКЛ": ^"(ИСКЛ) Начат процесс ликвидации";
      |aЗнач="БЛОК": ^"(БЛОК) Расчеты блокированы";
      |aЗнач="ИЗМР": ^"(ИЗМР) Изменены реквизиты";
      |aЗнач="ИРКЦ": ^"(ИРКЦ) Смена головного участника МЭР";
      |aЗнач="ВАДМ": ^"(ВАДМ) Временная администрация";
      |aЗнач="ЛИКВ": ^"(ЛИКВ) Ликвидационная комиссия (ликвидатор, конкурсный управляющий)";
      |aЗнач="ИНФО": ^"(ИНФО) Предварительное оповещение о предстоящих изменениях";
      |aЗнач="ЗСЧТ": ^"(ЗСЧТ) Закрытие счета";
      |aЗнач="ПРИС": ^"(ПРИС) Предварительное оповещение об исключении из системы БЭСП";
      |True: ^aЗнач;
    fi;
   |aСправ="TNP":
    if aЗнач="1": ^"Г"; --город
      |aЗнач="2": ^"П"; --поселок
      |aЗнач="3": ^"С"; --село
      |aЗнач="4": ^"ПГТ"; --поселок городского типа
      |aЗнач="5": ^"СТ-ЦА"; --станица
      |aЗнач="6": ^"АУЛ"; --аул
      |aЗнач="7": ^"РП"; --рабочий поселок
    fi;
 fi;
 ^"";
end;

Func ИсправитьБанкСчета(OWA:i; n:I; Field:S; Val:S):L;
var tmp:S;
 BeginChanging(OWA,False);
 Try
  tmp=GetFieldS(OWA,1,Field);
  if tmp=Val: --регистр
     n=PutFieldS(OWA,1,Field,"");
     EndChanging(OWA);
     BeginChanging(OWA,False);
  fi;
  n=PutFieldS(OWA,1,Field,Val);
  EndChanging(OWA);
 Except
  CancelChanging(OWA);
  Raise;
 end;
 ^True;
end;

Func Контроль (aБанк: Record; aPrefix:S):I;
var OWA1,n1,OWA2,n2,state:i;
var tmp,v1,v2:s;
var Flag:L;
 Настр(False);
 if fОтклКонтроль: ^1; fi;
 OWA1=OpenWorkArea("Банк_Счета","","UKey="+RecordToString(aБанк));
 Try
  if Records(OWA1)=0: Message("Запись "+RecordToString(aБанк)+" не надена в картотеке Банк_Счета",mtError); ^-1; fi;
  OWA2=OpenWorkArea("РПО_BNKSEEK","");
  Try
   if Records(OWA2)=0: ^1; fi;
   SetFilter(OWA2,"NEWNUM='"+GetFieldS(OWA1,1,"БИК")+"'");
   if Records(OWA2)=0:
      if EnqOkCancel("Для "+aPrefix+"^MБИК "+GetFieldS(OWA1,1,"БИК")+" не найден в справочнике БИК^MИгнорировать ?",mtWarning)=cmCancel: ^-2; else ^2; fi;
   fi;
   --
   tmp=КодВТекст("Real",GetFieldS(OWA2,1,"REAL_"));
   if not tmp="":
      if EnqOkCancel("Внимание !^MЗначение кода контроля для "+aPrefix+"^M"+tmp+"^MИгнорировать ?",mtWarning)=cmCancel: ^-3; fi;
   fi;
   --
   v1=GetFieldS(OWA1,1,"Банк");
   v2=GetFieldS(OWA2,1,"NAMEP");
   if not v1=v2 or (fCaseSens and not Pos(v1,v2)=1):
      State=Enquiry("","Наименование банка для "+aPrefix+"^M"+v1+"^Mотличается от наименования по справочнику^M"+v2+if(fCaseSens,"^Mс учетом регистра",""),"Отмена;Исправить;Игнорировать",mtWarning);
      if State=1: ^-4;
        |State=2: if not ИсправитьБанкСчета(OWA1,1,"Банк",v2): ^-99; fi;
      fi;
   fi;
   --
   v1=GetFieldS(OWA1,1,"Город");
   v2=GetFieldS(OWA2,1,"NNP");
   tmp=КодВТекст("TNP",GetFieldS(OWA2,1,"TNP"));
   Flag=(v1=Раб.Бюджет2005.Объединить(tmp,v2,".") or v1=Раб.Бюджет2005.Объединить(tmp,v2,". "));
   if fCaseSens and Flag:
      Flag=(Pos(v1,Раб.Бюджет2005.Объединить(tmp,v2,"."))=1 or Pos(v1,Раб.Бюджет2005.Объединить(tmp,v2,". "))=1);
   fi;
   if not Flag:
      State=Enquiry("","Наименование населенного пункта для "+aPrefix+"^M"+v1+"^Mотличается от наименования по справочнику^M"+Раб.Бюджет2005.Объединить(tmp,v2,".")+if(fCaseSens,"^Mс учетом регистра",""),"Отмена;Исправить;Игнорировать",mtWarning);
      if State=1: ^-5;
        |State=2: if not ИсправитьБанкСчета(OWA1,1,"Город",Раб.Бюджет2005.Объединить(tmp,v2,".")): ^-99; fi;
      fi;
   fi;
   --
   v1=GetFieldS(OWA1,1,"КСчет");
   v2=GetFieldS(OWA2,1,"KSNP");
   if not v1=v2:
      State=Enquiry("","Корреспондентский счет для "+aPrefix+"^M"+v1+"^Mотличается от значения по справочнику^M"+v2,"Отмена;Исправить;Игнорировать",mtWarning);
      if State=1: ^-6;
        |State=2: if not ИсправитьБанкСчета(OWA1,1,"КСчет",v2): ^-99; fi;
      fi;
   fi;
   --
   tmp=GetFieldS(OWA2,1,"VKEYDEL");
   if not tmp="":
      SetFilter(OWA2,"VKEY='"+tmp+"'");
      if not Records(OWA2)=0:
         if EnqOkCancel("Внимание !^MДля банка "+aPrefix+"^MНайден правопреемник^M"+GetFieldS(OWA2,1,"NAMEP")+" "+Раб.Бюджет2005.Объединить(КодВТекст("TNP",GetFieldS(OWA2,1,"TNP")),GetFieldS(OWA2,1,"NNP"),"")+"^MБИК "+GetFieldS(OWA2,1,"NEWNUM")+"^MКорр.счет "+GetFieldS(OWA2,1,"KSNP")+"^MИгнорировать ?",mtWarning)=cmCancel: ^-7; fi;
      fi;
   fi;
  Finally
   CloseWorkArea(OWA2);
  end;
 Finally
  CloseWorkArea(OWA1);
 end;
 ^0;
end;

Func Контроль2 (aБИК:S; aБанк:S; aГород:S; aКСчет:S):I;
var OWA,n,state:i;
var tmp,v1,v2:s;
var Flag:L;
 Настр(False);
 if fОтклКонтроль: ^1; fi;
 OWA=OpenWorkArea("РПО_BNKSEEK","");
 Try
  if Records(OWA)=0: ^1; fi;
  SetFilter(OWA,"NEWNUM='"+aБИК+"'");
  if Records(OWA)=0:
     if EnqOkCancel("БИК "+aБИК+" не найден в справочнике БИК^MИгнорировать ?",mtWarning)=cmCancel: ^-2; else ^2; fi;
  fi;
  --
  tmp=КодВТекст("Real",GetFieldS(OWA,1,"REAL_"));
  if not tmp="":
     if EnqOkCancel("Внимание !^MЗначение кода контроля^M"+tmp+"^MИгнорировать ?",mtWarning)=cmCancel: ^-3; fi;
  fi;
  --
  v1=aБанк;
  v2=GetFieldS(OWA,1,"NAMEP");
  if not v1=v2 or (fCaseSens and not Pos(v1,v2)=1):
     State=Enquiry("","Наименование банка^M"+v1+"^Mотличается от наименования по справочнику^M"+v2+if(fCaseSens,"^Mс учетом регистра",""),"Отмена;Игнорировать",mtWarning);
     if State=1: ^-4;
     fi;
  fi;
  --
  v1=aГород;
  v2=GetFieldS(OWA,1,"NNP");
  tmp=КодВТекст("TNP",GetFieldS(OWA,1,"TNP"));
  Flag=(v1=Раб.Бюджет2005.Объединить(tmp,v2,".") or v1=Раб.Бюджет2005.Объединить(tmp,v2,". "));
  if fCaseSens and Flag:
     Flag=(Pos(v1,Раб.Бюджет2005.Объединить(tmp,v2,"."))=1 or Pos(v1,Раб.Бюджет2005.Объединить(tmp,v2,". "))=1);
  fi;
  if not Flag:
     State=Enquiry("","Наименование населенного пункта^M"+v1+"^Mотличается от наименования по справочнику^M"+Раб.Бюджет2005.Объединить(tmp,v2,".")+if(fCaseSens,"^Mс учетом регистра",""),"Отмена;Игнорировать",mtWarning);
     if State=1: ^-5;
     fi;
  fi;
  --
  v1=aКСчет;
  v2=GetFieldS(OWA,1,"KSNP");
  if not v1=v2:
     State=Enquiry("","Корреспондентский счет для^M"+v1+"^Mотличается от значения по справочнику^M"+v2,"Отмена;Игнорировать",mtWarning);
     if State=1: ^-6;
     fi;
  fi;
  --
  tmp=GetFieldS(OWA,1,"VKEYDEL");
  if not tmp="":
     SetFilter(OWA,"VKEY='"+tmp+"'");
     if not Records(OWA)=0:
        if EnqOkCancel("Внимание !^MНайден правопреемник^M"+GetFieldS(OWA,1,"NAMEP")+" "+Раб.Бюджет2005.Объединить(КодВТекст("TNP",GetFieldS(OWA,1,"TNP")),GetFieldS(OWA,1,"NNP"),"")+"^MБИК "+GetFieldS(OWA,1,"NEWNUM")+"^MКорр.счет "+GetFieldS(OWA,1,"KSNP")+"^MИгнорировать ?",mtWarning)=cmCancel: ^-7; fi;
     fi;
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^0;
end;

Func НомерКорректировки(Режим:S):S;
var OWA,nr:I;
 OWA=OpenWorkArea("РПО_KORREK","DT_IZM;KOR",if(Режим="ЦБР":"Int(KOR)>0"|Режим="РБК":"KOR='????'"|True:""));
 Try
  nr=Records(OWA);
  if not nr=0:
     ^GetFieldS(OWA,nr,"KOR")+" от "+DateToString(GetFieldD(OWA,nr,"DT_IZM"));
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^"";
end;

Func СоздатьСтруктурныйФайл(aРежим:S):S;
var FStruct:S;
 FStruct=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\"+GetGUID);
 CreateFile(FStruct);
 if ExistFile(FStruct)=False: Message("Ошибка создания структурного файла: "+FStruct,mtError); ^""; fi;
 Try
  if aРежим="BNKSEEK":
     WriteLn(FStruct,"VKEY:STRING=VKEY");
     WriteLn(FStruct,"REAL:STRING=REAL");
     WriteLn(FStruct,"TNP:STRING=TNP");
     WriteLn(FStruct,"NNP:STRING=NNP");
     WriteLn(FStruct,"NAMEP:STRING=NAMEP");
     WriteLn(FStruct,"NEWNUM:STRING=NEWNUM");
     WriteLn(FStruct,"KSNP:STRING=KSNP");
     WriteLn(FStruct,"VKEYDEL:STRING=VKEYDEL");
     WriteLn(FStruct,"DT_IZM:DATE=DT_IZM");
    |aРежим="KORREK":
     WriteLn(FStruct,"KOR:STRING=KOR");
     WriteLn(FStruct,"VER:STRING=VER ");
     WriteLn(FStruct,"DT_IZM:DATE=DT_IZM");
    |aРежим="UPD":
     WriteLn(FStruct,"NUM_:STRING=NUM_");
     WriteLn(FStruct,"OPR_:INTEGER=OPR_");
     WriteLn(FStruct,"DBF_:STRING=DBF_");
     WriteLn(FStruct,"VKEY_:STRING=VKEY_");
     WriteLn(FStruct,"FIELD_:STRING=FIELD_");
     WriteLn(FStruct,"NEW_:STRING=NEW_");
     WriteLn(FStruct,"OLD_:STRING=OLD_");
  fi;
 Except
  Message("Ошибка создания структурного файла: "+FStruct,mtError);
  Raise;
 End;
 ^FStruct;
end;

func PutFieldChkS(OWA:I;n:I;NameF:S;Value:S):I;
var tmp:S;
  tmp = GetFieldS(OWA,n,NameF);
  if tmp = Value:
    return n;
  else
    return PutFieldS(OWA,n,NameF,Value);
  fi;
end;

var Pushed[]:S;
Proc ЗагрузитьСправочник(silent:L);
var OWA,n,Dbf,pp,p,i:i;
var sBnkSeek,sKorrek,tmpS:S;
var tmpD:D;
 OWA=OpenWorkArea("РПО_BNKSEEK","");
 Try
  if not Records(OWA)=0 and not silent:
     if EnqOkCancel("Справочник БИК уже загружен в базу данных, вы уверены, что хотите перезагрузить справочник БИК ?",mtWarning)=cmCancel: Exit; fi;
  fi;
  sBnkSeek=СоздатьСтруктурныйФайл("BNKSEEK");
  if sBnkSeek="": Exit; fi;
  Dbf=DbfOpen(fileBnkSeek,sBnkSeek,False,True,True);
  ClearVariable(Pushed);
  Try
   pp=DbfRecordCount(Dbf);
   ShowProgress(pp,"Загрузка участников расчетов...");
   DbfFirstRecord(Dbf);
   for p=1..pp do
     ProgressPos(p);
     if DbfReadBlank(Dbf,"")=False: Message("Ошибка чтения файла "+fileBnkSeek,mtError); Exit; fi;
     SetFilter(OWA,"VKEY='"+VKEY+"'");
     BeginChanging(OWA,False);
     --DeleteAllRecords(OWA);
     Try
       n = 1;
       if Records(OWA) = 0:
          n=InsertRecord(OWA);
         |Records(OWA)>1:
          cancelChanging(OWA);
          Message("Задвоение ключа "+VKEY + "БИК:" + NEWNUM, mtError);
          Exit;
       fi;
       n=PutFieldChkS(OWA,n,"VKEY",VKEY);
       n=PutFieldChkS(OWA,n,"REAL_",REAL);
       n=PutFieldChkS(OWA,n,"TNP",TNP);
       n=PutFieldChkS(OWA,n,"NNP",NNP);
       n=PutFieldChkS(OWA,n,"NAMEP",NAMEP);
       n=PutFieldChkS(OWA,n,"NEWNUM",NEWNUM);
       n=PutFieldChkS(OWA,n,"KSNP",KSNP);
       n=PutFieldChkS(OWA,n,"VKEYDEL",VKEYDEL);
       tmpD=GetFieldD(OWA,n,"DT_IZM");
       if DT_IZM<>tmpD:
          n=PutFieldD(OWA,n,"DT_IZM",DT_IZM);
       fi;
       insertInArray(Pushed,1,VKEY);
       DbfNextRecord(Dbf);
       EndChanging(OWA);
     Except
      CancelChanging(OWA);
      Raise;
     end;
   od;
  Finally
   DbfClose(dbf);
  end;
  --Вычистка "протухших"
  SetFilter(OWA,"");
  pp=Records(OWA);
  ShowProgress(pp,"Удаление устаревших данных...");
  Beginchanging(OWA,True);
  try
    for p=1..pp do
       ProgressPos(p);
       tmpS=GetFieldS(OWA,p,"VKEY");
       if SearchInArray(Pushed,tmpS) = -1:
          DeleteRecord(OWA,p);
       fi;
    od;
    EndChanging(OWA);
  except
    CancelChanging(OWA);
  end;

 Finally
  CloseWorkArea(OWA);
  if not sBnkSeek="":
     if ExistFile(sBnkSeek): DeleteFile(sBnkSeek); fi;
  fi;
  CloseProgress;
 end;
 --
 OWA=OpenWorkArea("РПО_KORREK","");
 Try
  sKorrek=СоздатьСтруктурныйФайл("KORREK");
  if sKorrek="": Exit; fi;
  Dbf=DbfOpen(fileKorrek,sKorrek,False,True,True);
  Try
   pp=DbfRecordCount(Dbf);
   ShowProgress(pp,"Загрузка проведенных корректировок...");
   DbfFirstRecord(Dbf);
   BeginChanging(OWA,False);
   Try
    DeleteAllRecords(OWA);
    SetFilter(OWA,"1=0");
    for p=1..pp do
     ProgressPos(p);
     if DbfReadBlank(Dbf,"")=False: Message("Ошибка чтения файла "+fileKorrek,mtError); Exit; fi;
     n=InsertRecord(OWA);
     n=PutFieldS(OWA,n,"KOR",KOR);
     n=PutFieldS(OWA,n,"VER",VER);
     n=PutFieldD(OWA,n,"DT_IZM",DT_IZM);
     DbfNextRecord(Dbf);
    od;
    EndChanging(OWA);
   Except
    CancelChanging(OWA);
    Raise;
   end;
  Finally
   DbfClose(dbf);
  end;
 Finally
  CloseWorkArea(OWA);
  if not sKorrek="":
     if ExistFile(sKorrek): DeleteFile(sKorrek); fi;
  fi;
  CloseProgress;
 end;
 if not silent:
    Message("Загрузка успешно завершена");
 fi;
end;

Func ВерсияКоррDBF(korrek:S):S;
var sKorrek:S;
var Dbf,p,pp:I;
var resv: S;
var resd: D;
  sKorrek=СоздатьСтруктурныйФайл("KORREK");
  if sKorrek="": return ""; fi;
  Dbf=DbfOpen(korrek,sKorrek,False,True,True);
  Try
   pp=DbfRecordCount(Dbf);
   DbfFirstRecord(Dbf);
   resv=""; resd = 1.1.100;
   for p=1..pp do
    if DbfReadBlank(Dbf,"")=False: return ""; fi; --Message("Ошибка чтения файла "+fileKorrek,mtError);
    if DT_IZM > resd:
       resd = DT_IZM;
       resv = KOR;
    fi;
    DbfNextRecord(Dbf);
   od;
  Finally
   DbfClose(dbf);
  end;
  return resv+" от "+DateToString(resd) ;
end;


Func ВерсияКорректировки:L;
var OWA,nr,Last,Dbf,p,pp:i;
var sUpd:S;
var KOR,KOR_:S;
var DT_IZM,DT_IZM_:D;
 KOR="";
 KOR_="";
 DT_IZM=1.1.100;
 DT_IZM_=1.1.100;
 OWA=OpenWorkArea("РПО_KORREK","KOR");
 Try
  nr=Records(OWA);
  if not nr=0:
     KOR=GetFieldS(OWA,nr,"KOR");
     DT_IZM=GetFieldD(OWA,nr,"DT_IZM");
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 sUpd=СоздатьСтруктурныйФайл("UPD");
 if sUpd="": ^False; fi;
 Dbf=DbfOpen(fileUpd,sUpd,False,True,True);
 Try
  pp=DbfRecordCount(Dbf);
  DbfFirstRecord(Dbf);
  for p=1..pp do
   if DbfReadBlank(Dbf,"")=False: Message("Ошибка чтения файла "+fileUpd,mtError); ^False; fi;
   if OPR_=1 and DBF_="KORREK" and FIELD_="KOR": KOR_=NEW_; fi;
   if OPR_=1 and DBF_="KORREK" and FIELD_="DT_IZM": DT_IZM_=StringToDate(NEW_); fi;
   DbfNextRecord(Dbf);
  od;
 Finally
  DbfClose(dbf);
  if not sUpd="":
     if ExistFile(sUpd): DeleteFile(sUpd); fi;
  fi;
 end;
 if KOR="":
    if EnqOkCancel("Внимание ! Загруженный ранее справочник не содержит информацию о проведенных корректировках^MЗагрузка корректироки может привести к искажению информации^MВы уверены, что хотите загрузить корректировку "+KOR_+" от "+DateToString(DT_IZM_)+" ?",mtWarning)=cmCancel: ^False; fi;
 fi;
 if not Int(KOR)+1=Int(KOR_) and not KOR="":
    Message("Последняя загруженная корректировка имеет номер "+KOR+" от "+DateToString(DT_IZM)+"^MВы пытаетесь загрузить корректировку номер "+KOR_+" от "+DateToString(DT_IZM_)+"^MДопустимый номер корректировки "+Format("%.4D",Int(KOR)+1),mtError);
    ^False;
 fi;
 ^True;
end;

Proc ОбновитьСправочник(noMsg:L);
var OWA1,OWA2,n,n2,Dbf,pp,p:i;
var sUpd,Old:S;
var Flag,Wrn:L;
 ClearVariable(Rec_I);
 ClearVariable(Rec_U);
 ClearVariable(Rec_D);
 Wrn=False;
 OWA1=OpenWorkArea("РПО_BNKSEEK","VKEY");
 Try
  if Records(OWA1)=0:
     Message("Справочник БИК не был загружен в базу данных^MПроведение корректировки невозможно",mtError); Template.Field="Загрузить"; Exit;
  fi;
  OWA2=OpenWorkArea("РПО_KORREK","KOR");
  Try
   sUpd=СоздатьСтруктурныйФайл("UPD");
   if sUpd="": Exit; fi;
   Dbf=DbfOpen(fileUpd,sUpd,False,True,True);
   Try
    pp=DbfRecordCount(Dbf);
    ShowProgress(pp,"Загрузка корректировки...");
    DbfFirstRecord(Dbf);
    BeginChanging(OWA1,False);
    Try
     BeginChanging(OWA2,False);
     Try
      n2=InsertRecord(OWA2);
      Flag=True;
      for p=1..pp do
       ProgressPos(p);
       if DbfReadBlank(Dbf,"")=False: Message("Ошибка чтения файла "+fileUpd,mtError); Exit; fi;
       if DBF_="BNKSEEK":
          if FIELD_="VKEY" or FIELD_="REAL" or FIELD_="TNP" or FIELD_="NNP" or FIELD_="NAMEP" or FIELD_="NEWNUM" or FIELD_="KSNP" or FIELD_="VKEYDEL" or FIELD_="DT_IZM" or OPR_=0:
             if FIELD_="REAL": FIELD_="REAL_"; fi;
             SetFilter(OWA1,"not Pos('"+VKEY_+"',VKEY)=0");
             if not Records(OWA1)=0:
                n=1;
                if OPR_=0:
                   AddInArray(Rec_D,True,False,GetRecordKey(OWA1,n));
                   DeleteRecord(OWA1,n); --удаление
                  else
                   if FIELD_="DT_IZM":
                      Old=Trim(DateToString(GetFieldD(OWA1,n,FIELD_)));
                      Old=Раб.Формат.ReplaceSubStr(Old,".","/");
                      if Old="": Old=Old_; fi; --новая запись?
                     else
                      Old=GetFieldS(OWA1,n,FIELD_);
                   fi;
                   if not Old=Old_:
                      if Wrn=False: Trace("Корректировка "+ExtractWord(WordsCount(fileUpd,"\"),fileUpd,"\")); fi;
                      Wrn=True;
                      Trace("Возможно информация по БИК="+NUM_+" искажена, рекомендуется перезагрузить справочник");
                      Trace("Field="+FIELD_+" значение по базе="+Old);
                      Trace("Field="+FIELD_+" значение по корр="+Old_);
                   fi;
                   if FIELD_="DT_IZM":
                      n=PutFieldD(OWA1,n,FIELD_,StringToDate(NEW_));
                     else
                      n=PutFieldS(OWA1,n,FIELD_,NEW_);
                   fi;
                   if SearchInArray(Rec_I,GetRecordKey(OWA1,n),True)=-1:
                      AddInArray(Rec_U,True,False,GetRecordKey(OWA1,n));
                   fi;
                fi;
               else
                if OPR_=1:
                   n=InsertRecord(OWA1);
                   n=PutFieldS(OWA1,n,"VKEY",VKEY_);
                   AddInArray(Rec_I,True,False,GetRecordKey(OWA1,n));
                  else
                   if Wrn=False: Trace("Корректировка "+ExtractWord(WordsCount(fileUpd,"\"),fileUpd,"\")); fi;
                   Wrn=True;
                   Trace("Возможно информация по БИК="+NUM_+" искажена, рекомендуется перезагрузить справочник");
                fi;
             fi;
          fi;
         |DBF_="KORREK":
          if FIELD_="KOR" or FIELD_="VER" or FIELD_="DT_IZM":
             if FIELD_="DT_IZM":
                n2=PutFieldD(OWA2,n2,FIELD_,StringToDate(NEW_));
               else
                n2=PutFieldS(OWA2,n2,FIELD_,NEW_);
             fi;
             Flag=False;
          fi;
       fi;
       DbfNextRecord(Dbf);
      od;
      if Flag: CancelChanging(OWA2); else EndChanging(OWA2); fi;
     Except
      CancelChanging(OWA2);
      Raise;
     end;
     EndChanging(OWA1);
    Except
     CancelChanging(OWA1);
     Raise;
    end;
   Finally
    DbfClose(dbf);
   end;
  Finally
   CloseWorkArea(OWA2);
  end;
 Finally
  CloseWorkArea(OWA1);
  if not sUpd="":
     if ExistFile(sUpd): DeleteFile(sUpd); fi;
  fi;
  CloseProgress;
 end;
 if noMsg:
    if not Wrn:
       Trace("Корректировка "+ExtractWord(WordsCount(fileUpd,"\"),fileUpd,"\")+" успешно проведена. Обработано записей: "+Str(LengthOfArray(Rec_I)+LengthOfArray(Rec_U)+LengthOfArray(Rec_D))+" обновлено: "+Str(LengthOfArray(Rec_U))+" добавлено:"+Str(LengthOfArray(Rec_I))+" удалено: "+Str(LengthOfArray(Rec_D)));
    fi;
   else
    if Wrn:
       Message("При проведении корректировки обнаружены расхождения в базе данных^MРекомендуется перезагрузить справочник",mtWarning);
      else
       Message("Корректировка успешно проведена^MОбработано записей: "+Str(LengthOfArray(Rec_I)+LengthOfArray(Rec_U)+LengthOfArray(Rec_D))+" обновлено: "+Str(LengthOfArray(Rec_U))+" добавлено:"+Str(LengthOfArray(Rec_I))+" удалено: "+Str(LengthOfArray(Rec_D)));
    fi;
 fi;
end;

Func Pzn_Real(val:S):S;
 if val="90": ^"ЛИКВ";
   |val="91": ^"ЛИКВ";
   |val="98": ^"ИСКЛ";
   |val="99": ^"ОТЗВ";
 fi;
 ^"";
end;

Func ОбновитьСправочникРБК:L;
var F,w,ww,z,p,OWA,n,nn:I;
var tmp,pzn,nnp,tnp,namep,newnum,ksnp:S;
var i,u,d:i;
 ClearVariable(RBC_REAL);
 ClearVariable(RBC_NNP);
 ClearVariable(RBC_TNP);
 ClearVariable(RBC_NAMEP);
 ClearVariable(RBC_NEWNUM);
 ClearVariable(RBC_KSNP);
 ClearVariable(RBC_STATE);
 ClearVariable(RBC_REC);
 ClearVariable(RBC_RECDEL);
 F=TextFileOpenRead(fileUpdRBC);
 Try
  ShowProgress(3800,"Загрузка участников расчетов...");
  p=0;
  While not TextFileEndOfFile(F) do
   p=p+1;
   ProgressPos(p);
   tmp=TextFileReadLn(F);
   pzn=""; nnp=""; tnp=""; namep=""; newnum=""; ksnp="";
   ww=WordsCount(tmp,Chr(9));
   for w=1..ww do
    pzn=ExtractWord(1,tmp,Chr(9));
    if ww=3:
       namep=ExtractWord(2,tmp,Chr(9));
       newnum=ExtractWord(3,tmp,Chr(9));
      else
       nnp=ExtractWord(2,tmp,Chr(9));
       tnp=ExtractWord(3,tmp,Chr(9));
       namep=ExtractWord(4,tmp,Chr(9));
       newnum=ExtractWord(5,tmp,Chr(9));
       ksnp=ExtractWord(6,tmp,Chr(9));
    fi;
   od;
   if pzn="**": ww=0; fi;
   if not ww=0:
      z=SearchInArray(RBC_NEWNUM,newnum,True);
      if z=-1:
         z=InsertInArraySort(RBC_NEWNUM,newnum);
         InsertInArray(RBC_REAL,z,Pzn_Real(pzn));
         InsertInArray(RBC_NNP,z,nnp);
         InsertInArray(RBC_TNP,z,tnp);
         InsertInArray(RBC_NAMEP,z,namep);
         InsertInArray(RBC_KSNP,z,ksnp);
         InsertInArray(RBC_STATE,z,"insert");
        else
         Message("Быть такого не может!",mtError);
         ^False;
      fi;
   fi;
  od;
 Finally
  TextFileClose(F);
  CloseProgress;
 end;
 OWA=OpenWorkArea("РПО_BNKSEEK","NEWNUM");
 Try
  nn=Records(OWA);
  ShowProgress(nn,"Синхронизация...");
  for n=1..nn do
   ProgressPos(n);
   z=SearchInArray(RBC_NEWNUM,GetFieldS(OWA,n,"NEWNUM"),True);
   if z=-1:
      AddInArray(RBC_RECDEL,True,False,GetRecordKey(OWA,n));
     else
      if not GetFieldS(OWA,n,"REAL_")=RBC_REAL[z] or
         not GetFieldS(OWA,n,"NNP")=RBC_NNP[z] or
         not GetFieldS(OWA,n,"TNP")=RBC_TNP[z] or
         not GetFieldS(OWA,n,"NAMEP")=RBC_NAMEP[z] or
         not GetFieldS(OWA,n,"KSNP")=RBC_KSNP[z]:
         RBC_STATE[z]="update";
         RBC_REC[z]=GetRecordKey(OWA,n);
        else
         RBC_STATE[z]="equal";
      fi;
   fi;
  od;
  BeginChanging(OWA,False);
  Try
   i=0; u=0; d=0;
   ww=LengthOfArray(RBC_RECDEL);
   CloseProgress;
   ShowProgress(ww*2,"Фиксация...");
   for w=1..ww do
    ProgressPos(w);
    n=GetRecordNumber(OWA,RBC_RECDEL[w]);
    DeleteRecord(OWA,n);
    d=d+1;
   od;
   ww=LengthOfArray(RBC_NEWNUM);
   ShowProgress(ww*2,"Фиксация...");
   for w=1..ww do
    ProgressPos(ww+w);
    if RBC_STATE[w]="insert":
       n=InsertRecord(OWA);
       n=PutFieldS(OWA,n,"VKEY",GetGUID);
       n=PutFieldS(OWA,n,"NEWNUM",RBC_NEWNUM[w]);
       n=PutFieldS(OWA,n,"REAL_",RBC_REAL[w]);
       n=PutFieldS(OWA,n,"NNP",RBC_NNP[w]);
       n=PutFieldS(OWA,n,"TNP",RBC_TNP[w]);
       n=PutFieldS(OWA,n,"NAMEP",RBC_NAMEP[w]);
       n=PutFieldS(OWA,n,"KSNP",RBC_KSNP[w]);
       i=i+1;
      |RBC_STATE[w]="update":
       n=GetRecordNumber(OWA,RBC_REC[w]);
       if not GetFieldS(OWA,n,"REAL_")=RBC_REAL[w]: n=PutFieldS(OWA,n,"REAL_",RBC_REAL[w]); fi;
       if not GetFieldS(OWA,n,"NNP")=RBC_NNP[w]: n=PutFieldS(OWA,n,"NNP",RBC_NNP[w]); fi;
       if not GetFieldS(OWA,n,"TNP")=RBC_TNP[w]: n=PutFieldS(OWA,n,"TNP",RBC_TNP[w]); fi;
       if not GetFieldS(OWA,n,"NAMEP")=RBC_NAMEP[w]: n=PutFieldS(OWA,n,"NAMEP",RBC_NAMEP[w]); fi;
       if not GetFieldS(OWA,n,"KSNP")=RBC_KSNP[w]: n=PutFieldS(OWA,n,"KSNP",RBC_KSNP[w]); fi;
       u=u+1;
    fi;
   od;
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 OWA=OpenWorkArea("РПО_KORREK","DT_IZM;KOR","DT_IZM="+DateToString(ToDay)+" and KOR='????'");
 Try
  BeginChanging(OWA,False);
  Try
   if Records(OWA)=0:
      n=InsertRecord(OWA);
      n=PutFieldD(OWA,n,"DT_IZM",ToDay);
      n=PutFieldS(OWA,n,"KOR","????");
   fi;
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 Message("Обработано записей: "+Str(Max(ww,nn))+", добавлено: "+Str(i)+", обновлено: "+Str(u)+", удалено: "+Str(d));
 ^True;
end;

Func isДата(Val:S):L;
var tmp:D;
 Try
  tmp=StringToDate(Val);
 Except
  ^False;
 end;
 ^True;
end;

Proc СинхронСправDBF(Path:S);
var ver,v1,tmp:S;
var KOR:s;
var DT_IZM,v2:D;
var Flag:L;
  if not ExistFile(Раб.Бюджет2005.Контроль2Слэш(Path+"\BNKSEEK.dbf")):
     Exit;
  fi;
  if not ExistFile(Раб.Бюджет2005.Контроль2Слэш(Path+"\KORREK.dbf")):
     Exit;
  fi;
  ver = ВерсияКоррDBF(Раб.Бюджет2005.Контроль2Слэш(Path+"\KORREK.dbf"));
  Flag = Раб.Семафор.Статус("РПО_BNKSEEK",0)=0;
  if Flag:
     tmp=НомерКорректировки("");
     if Раб.Семафор.Установить("РПО_BNKSEEK",0,0,"",True,1.1.100,0)<=0: Exit; fi;
     fileBnkSeek = Раб.Бюджет2005.Контроль2Слэш(Path+"\BNKSEEK.dbf");
     fileKorrek= Раб.Бюджет2005.Контроль2Слэш(Path+"\KORREK.dbf");
     Try
      if tmp="":
         if EnqOkCancel("Загрузить справочник БИК РФ ?",mtWarning)=cmCancel: Exit; fi;
         ЗагрузитьСправочник(True);
         Message("Загрузка справочника БИК РФ завершено");
        else
           v1=ExtractWord(1,ver," ");
           v2=StringToDate(ExtractWord(3,ver," "));
           if Int(v1)=0 and not v1="????": Exit; fi;
           KOR=ExtractWord(1,tmp," ");
           DT_IZM=StringToDate(ExtractWord(3,tmp," "));
           if (v1="????" and v2>DT_IZM) or (KOR="????" and v2>DT_IZM) or (Int(v1)>0 and Int(KOR)>0 and v1>KOR):
              if EnqOkCancel("Справочник БИК РФ^MОбновить (текущая версия "+KOR+" от "+DateToString(DT_IZM)+") до версии "+v1+" от "+DateToString(v2)+" ?",mtWarning)=cmCancel: Exit; fi;
              ЗагрузитьСправочник(True);
              Message("Обновление справочника БИК РФ завершено");
           fi;
      fi;
     Finally
      Раб.Семафор.Снять("РПО_BNKSEEK",True);
     end;
  fi;

end;

Proc СинхронСправочник;
var Path,File,tmp:S;
var v1:s;
var KOR:s;
var DT_IZM,v2:D;
var F:I;
var Flag:L;
 if not CanInsert("РПО_BNKSEEK") or not CanDelete("РПО_BNKSEEK") or IsReadOnly("РПО_BNKSEEK"): Exit; fi;
 if not CanInsert("РПО_KORREK") or not CanDelete("РПО_KORREK") or IsReadOnly("РПО_KORREK"): Exit; fi;
 Path=PlanVar("Std_Rpo");
 СинхронСправDBF(if(PlanVar("Бух")=".", "", PlanVar("Бух") + "\") + "БИК\" );
 СинхронСправDBF(Раб.Бюджет2005.Контроль2Слэш(Path+"\DBF\БИК\"));

 File=Раб.Бюджет2005.Контроль2Слэш(Path+"\DBF\БИК\РПО_BNKSEEK");
 if not ExistFile(File+".cdf") or not ExistFile(File+".crd"): Exit; fi;
 File=Раб.Бюджет2005.Контроль2Слэш(Path+"\DBF\БИК\БИК.ver");
 if not ExistFile(File): Exit; fi;
 Flag=Раб.Семафор.Статус("РПО_BNKSEEK",0)=0;
 if Flag:
    tmp=НомерКорректировки("");
    if Раб.Семафор.Установить("РПО_BNKSEEK",0,0,"",True,1.1.100,0)<=0: Exit; fi;
    Try
     if tmp="":
        if EnqOkCancel("Загрузить справочник БИК РФ ?",mtWarning)=cmCancel: Exit; fi;
        Заполнить(True);
        Message("Загрузка справочника БИК РФ завершено");
       else
         F=TextFileOpenRead(File);
         Try
          Try
           v1=Trim(TextFileReadLn(F));
           v2=StringToDate(Trim(TextFileReadLn(F)));
          Except
           Exit;
          end;
          if Int(v1)=0 and not v1="????": Exit; fi;
          KOR=ExtractWord(1,tmp," ");
          DT_IZM=StringToDate(ExtractWord(3,tmp," "));
          if (v1="????" and v2>DT_IZM) or (KOR="????" and v2>DT_IZM) or (Int(v1)>0 and Int(KOR)>0 and v1>KOR):
             if EnqOkCancel("Справочник БИК РФ^MОбновить (текущая версия "+KOR+" от "+DateToString(DT_IZM)+") до версии "+v1+" от "+DateToString(v2)+" ?",mtWarning)=cmCancel: Exit; fi;
             Заполнить(True);
             Message("Обновление справочника БИК РФ завершено");
          fi;
         Finally
          TextFileClose(F);
         end;
     fi;
    Finally
     Раб.Семафор.Снять("РПО_BNKSEEK",True);
    end;
 fi;
end;

Func FilesFromXML(XML:S; Mode:S):I;
var F,p,z:I;
var tmp:S;
 ClearVariable(Files);
 ClearVariable(Dates);
 F=TextFileOpenRead(XML);
 Try
  tmp="";
  While not TextFileEndOfFile(F) do
   tmp=tmp+Up(TextFileRead(F,255-Length(tmp)));
   if tmp="":
      if not TextFileEndOfFile(F): tmp=Up(TextFileReadLn(F)); fi;
   fi;
   p=Pos('FILE="',tmp);
   if p=0:
      tmp="";
     else
      tmp=SubStr(tmp,p+6,255); --ставимся на имя файла
      p=Pos('.ZIP"',tmp);
      if not p=0:  --конца файла в этой 255 нету надо дочитывать
         AddInArray(Files,not mode="db",False,SubStr(tmp,1,p+3));
         tmp=SubStr(tmp,p+5,255);
      fi;
   fi;
  od;
 Finally
  TextFileClose(F);
 end;
 ^LengthOfArray(Files);
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Proc cbCaseSens_OnChange(Sender: String);
 if not Настр(True):
    fCaseSens=not fCaseSens;
    cbCaseSens.State=fCaseSens;
 fi;
end;

Proc cbОтклКонтроль_OnChange(Sender: String);
 if fОтклКонтроль:
    if EnqOkCancel("Проверка банковских реквизитов будет отключена. Вы уверены ?",mtWarning)=cmCancel:
       fОтклКонтроль=False;
       cbОтклКонтроль.State=fОтклКонтроль;
    fi;
 fi;
 if not Настр(True):
    fОтклКонтроль=not fОтклКонтроль;
    cbОтклКонтроль.State=fОтклКонтроль;
 fi;
end;

Func Загрузить_OnEnter(FieldName: String; Iter: Integer): logical;
var n,nn:i;
var txt,folder,fileBnkSeek_,fileKorrek_:s;
 if FieldName="Загрузить2":
    Folder=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\"+GetGUID);
    CreateFolder(Folder);
    if not ExistsFolder(Folder): Message("Ошибка создания папки '"+Folder+"'",mtError); ^False; fi;
    if not DownloadInternetFile("http://www.cbr.ru/mcirabis/PluginInterface/GetBicCatalog.aspx?type=db",Folder+"\biclistDB.xml"): Message("Ошибка зарузки 'http://www.cbr.ru/mcirabis/PluginInterface/GetBicCatalog.aspx?type=db'",mtError); ^False; fi;
    if not ExistFile(Folder+"\biclistDB.xml"): Message("Ошибка зарузки '"+Folder+"\biclistDB.xml'",mtError); ^False; fi;
    nn=FilesFromXML(Folder+"\biclistDB.xml","DB");
    for n=1..nn do
     Dates[n]=SubStr(Files[n],8,2)+"."+SubStr(Files[n],10,2)+"."+SubStr(Files[n],12,4);
    od;
    n=Alternate("Выберите дату актуализации базы",Dates,-1,SearchInArray(Dates,DateToString(ToDay),False),12);
    if n=0: DeleteFolder(Folder); ^False; fi;
    if not DownloadInternetFile("http://www.cbr.ru/mcirabis/BIK/"+Files[n],Folder+"\"+Files[n]): Message("Ошибка зарузки 'http://www.cbr.ru/mcirabis/BIK/"+Files[n]+"'",mtError); ^False; fi;
    --ExecuteProgram(Раб.Бюджет2005.Контроль2Слэш(PlanVar("STD_RPO")+"\Bin\7z.exe e -y "+Folder+"\*.zip -o"+Folder),True);
    if Раб.Python.LOADANDIMPORT("zipfile",True):
      try
        Раб.Python.EXEC("arc=zipfile.ZipFile(r'"+Folder+"\"+Files[n]+"','r')");
        Раб.Python.EXEC("arc.extractall(r'"+Folder+"')");
      finally
        Раб.Python.UNLOAD;
      end;
    fi;

    if not ExistFile(Folder+"\BNKSEEK.DBF"): Message("Ошибка распаковки '"+Folder+"\BNKSEEK.DBF'",mtError); ^False; fi;
    if not ExistFile(Folder+"\KORREK.DBF"): Message("Ошибка распаковки '"+Folder+"\KORREK.DBF'",mtError); ^False; fi;
    fileBnkSeek_=fileBnkSeek;
    fileKorrek_=fileKorrek;
    fileBnkSeek=Folder+"\BNKSEEK.DBF";
    fileKorrek=Folder+"\KORREK.DBF";
 fi;
 if fileBnkSeek="": Message("Укажите путь к файлу BNKSEEK.DBF",mtError); Template.Field="fileBnkSeek"; ^False; fi;
 if not ExistFile(fileBnkSeek): Message("Файл "+fileBnkSeek+" не найден",mtError); Template.Field="fileBnkSeek"; ^False; fi;
 Txt="^M(Файл KORREK.DBF необходим для корректной установки обновлений справочника, однако он может быть и пропущен в случае его отсутствия)";
 if fileKorrek="":
    if EnqOkCancel("Укажите путь к файлу KORREK.DBF"+txt,mtWarning)=cmCancel: Template.Field="fileKorrek"; ^False; fi;
   else
    if not ExistFile(fileKorrek):
       if EnqOkCancel("Файл "+fileKorrek+" не найден"+txt,mtWarning)=cmCancel: Template.Field="fileKorrek"; ^False; fi;
    fi;
 fi;
 ЗагрузитьСправочник(False);
 LastUpd=НомерКорректировки("");
 if FieldName="Загрузить2":
    fileBnkSeek=fileBnkSeek_;
    fileKorrek=fileKorrek_;
    DeleteFolder(Folder);
 fi;
 Return False;
end;

Func fileBnkSeek_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var i:i;
var tmp:S;
var f2:L;
 Template.HideEditor(False);
 if ChooseFile(fileBnkSeek,"Открыть базу данных участников расчетов","Файл BNKSEEK.DBF|BNKSEEK.DBF")=cmOk:
    f2=Pos("\\",fileBnkSeek)=1;
    i=WordsCount(fileBnkSeek,"\");
    if i>1:
       tmp=ExtractWords(1,i-1,fileBnkSeek,"\")+"\Korrek.dbf";
       if f2: tmp="\\"+tmp; fi; --если первый двойной слэш восстанавливаем его (WordsCount и не считаеют двойной разделиетль за один)
       if ExistFile(tmp):
          fileKorrek=tmp;
         else
          if i>2:
             tmp=ExtractWords(1,i-2,fileBnkSeek,"\")+"\SPR_KORR\Korrek.dbf";
             if f2: tmp="\\"+tmp; fi; --если первый двойной слэш восстанавливаем его (WordsCount и не считаеют двойной разделиетль за один)
             if ExistFile(tmp):
                fileKorrek=tmp;
             fi;
          fi;
       fi;
    fi;
 fi;
 Return Cur;
end;

Func fileKorrek_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var i:i;
 Template.HideEditor(False);
 i=ChooseFile(fileKorrek,"Открыть базу установленных корректировок","Файл KORREK.DBF|KORREK.DBF");
 Return Cur;
end;

Func Обновить_OnEnter(FieldName: String; Iter: Integer): logical;
var w,xxxx,n,nn,l:i;
var path,vcn,vco,Folder,num,ext,fileUpd_:s;
var f2,Actual,Forward:L;
var dd,dt:d;
 LastUpd=НомерКорректировки("");
 if SubStr(LastUpd,1,4)="????": Message("Текущий справочник загружен в формате 'РБК', обновление справочником форматом 'ЦБР', невозможно",mtError); ^False; fi;
 if FieldName="Обновить3":
    Folder=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\"+GetGUID);
    CreateFolder(Folder);
    if not ExistsFolder(Folder): Message("Ошибка создания папки '"+Folder+"'",mtError); ^False; fi;
    if not DownloadInternetFile("http://cbr.ru/mcirabis/PluginInterface/GetBicCatalog.aspx?type=dc",Folder+"\biclistDC.xml"): Message("Ошибка зарузки 'http://cbr.ru/mcirabis/PluginInterface/GetBicCatalog.aspx?type=dc'",mtError); ^False; fi;
    if not ExistFile(Folder+"\biclistDC.xml"): Message("Ошибка зарузки '"+Folder+"\biclistDC.xml'",mtError); ^False; fi;
    nn=FilesFromXML(Folder+"\biclistDC.xml","DC");
    n=1;
    actual=False; Forward=true;
    dt=if(ToDay>StringToDate(SubStr(LastUpd,9,10)),ToDay,StringToDate(SubStr(LastUpd,9,10)));
    While n<=nn do
     if Match(Files[n],"bik_dc_????_????????.zip"):
        num=SubStr(Files[n],8,4);
        if num=SubStr(LastUpd,1,4): actual=true; fi;
        if Forward:
           Try
            dd=StringToDate(SubStr(Files[n],13,2)+"."+SubStr(Files[n],15,2)+"."+SubStr(Files[n],17,4));
            if dd>dt:
               Forward=EnqOkCancel("Обновление №"+num+" содержит содержит информацию вступающию в силу с "+DateToString(dd)+", вы хотите загрузить данное обновление ?",mtWarning)=cmOk;
            fi;
           Except
            Forward=False;
           end;
        fi;
        if Int(num)=0 or num<=SubStr(LastUpd,1,4) or (dd>dt and not Forward):
           DeleteFromArray(Files,n);
           nn=nn-1;
          else
           n=n+1;
        fi;
       else
        Trace("Получено недоупстимое имя файла '"+Files[n]);
        DeleteFromArray(Files,n);
        nn=nn-1;
     fi;
    od;
    if nn=0: 
       if Actual:
          Message("Обновление не требуется, вы уже имеете актуальную версию справочника");
         else
          Message("Нет данных для загрузки",mtError);
       fi;
       ^False;
    fi;
    ext="_21N.DBF";
    for n=1..nn do
     if not DownloadInternetFile("http://www.cbr.ru/mcirabis/BIK/"+Files[n],Folder+"\"+Files[n]): Message("Ошибка зарузки 'http://www.cbr.ru/mcirabis/BIK/"+Files[n]+"'",mtError); ^False; fi;
     if not ExistFile(Folder+"\"+Files[n]): Message("Ошибка зарузки '"+Folder+"\"+Files[n]+"'",mtError); ^False; fi;
    od;
--    ExecuteProgram(Раб.Бюджет2005.Контроль2Слэш(PlanVar("STD_RPO")+"\Bin\7z.exe e -y "+Folder+"\*.zip -o"+Folder+" ????"+ext),True);
    if Раб.Python.LOADANDIMPORT("zipfile",True):
       ClearVariable(FilesDBF);
       l = 1;
       try
        for n=1..nn do
         Раб.Python.Exec("arc=zipfile.ZipFile(r'"+Folder+"\"+Files[n]+"','r')");
         Раб.Python.Exec("files=arc.namelist()");
         Раб.Python.Exec("files=[name for name in files if name.endswith('"+ext+"')]");
         Раб.Python.Exec("arc.extractall(r'"+Folder+"',files)");
         Раб.Python.ВОбменS("files");
         CopyArray(РАБ.ОБМЕН.BufS1, FilesDBF, 1, l);
         l = LengthOfArray(FilesDBF) + 1;
        od;
       finally
        Раб.Python.UnLoad;
       end;
    fi;
    for n=1..nn do
     --if not ExistFile(Folder+"\"+SubStr(Files[n],8,4)+ext): Message("Ошибка распаковки '"+Folder+"\"+SubStr(Files[n],8,4)+ext+"'",mtError); ^False; fi;
     if not ExistFile(Folder+"\"+FilesDBF[n]): Message("Ошибка распаковки '"+Folder+"\"+FilesDBF[n]+"'",mtError); ^False; fi;
    od;
    fileUpd_=fileUpd;
    fileUpd=Folder+"\"+FilesDBF[1];
    dpos = 1;
 fi;
 if fileUpd="": Message("Укажите путь к файлу корректирови",mtError); Template.Field="fileUpd"; ^False; fi;
 if not ExistFile(fileUpd): Message("Файл "+fileUpd+" не найден",mtError); Template.Field="fileUpd"; ^False; fi;
 if Match(fileUpd,"*.zip"):
    ClearVariable(Files);
    ext="_21N.DBF";
    Folder=ExtractWords(1,WordsCount(fileUpd,"\")-1,fileUpd,"\");
    if FieldName="Обновить2":
       nn=Раб.Бюджет2005.DirList(Folder,"bik_dc_????_????????.zip",1);
       w=0;
       for n=1..nn do
        if ExtractWord(WordsCount(Раб.Бюджет2005.Dir[n],"\"),Раб.Бюджет2005.Dir[n],"\")>=ExtractWord(WordsCount(fileUpd,"\"),fileUpd,"\"):
           w=w+1;
           Files[w]=ExtractWord(WordsCount(Раб.Бюджет2005.Dir[n],"\"),Раб.Бюджет2005.Dir[n],"\");
        fi;
       od;
       nn=w;
      else
       nn=1;
       Files[1]=ExtractWord(WordsCount(fileUpd,"\"),fileUpd,"\");
    fi;
    if Раб.Python.LoadAndImport("zipfile",False):
       try
        ClearVariable(FilesDBF);
        l=1;
        for n=1..nn do
         Раб.Python.Exec("arc=zipfile.ZipFile(r'"+Folder+"\"+Files[n]+"','r')");
         Раб.Python.Exec("files=arc.namelist()");
         Раб.Python.Exec("files=[name for name in files if name.endswith('"+ext+"')]");
         Раб.Python.Exec("arc.extractall(r'"+Folder+"',files)");
         Раб.Python.ВОбменS("files");
         CopyArray(РАБ.ОБМЕН.BufS1, FilesDBF, 1, l);
         l = LengthOfArray(FilesDBF) + 1;
         --if not ExistFile(Folder+"\"+SubStr(Files[n],8,4)+ext): Message("Ошибка распаковки '"+Folder+"\"+SubStr(Files[n],8,4)+ext+"'",mtError); ^False; fi;
         if not ExistFile(Folder+"\"+FilesDBF[n]): Message("Ошибка распаковки '"+Folder+"\"+FilesDBF[n]+"'",mtError); ^False; fi;
        od;
       finally
        Раб.Python.UnLoad;
       end;
      else
       Message("Распоковщик не найден, разархивируйте файлы корректировок вручную, выберите полученный файл корректировки (DBF), повторите операцию",mtWarning); 
       ^False;
    fi;
    fileUpd=Folder+"\"+FilesDBF[1];
    dpos = 1;
 fi;
 if FieldName="Обновить":
    if ВерсияКорректировки:
       ОбновитьСправочник(False);
    fi;
   else
    f2=Pos("\\",fileUpd)=1;
    w=WordsCount(fileUpd,"\");
    path=ExtractWords(1,w-1,fileUpd,"\")+"\";
    if f2: path="\\"+path; fi; --если первый двойной слэш восстанавливаем его (WordsCount и не считаеют двойной разделиетль за один)
    xxxx=Int(SubStr(ExtractWord(w,fileUpd,"\"),1,4));
    vcn="_21N.DBF";
    vco="_21O.DBF";
    w=0;
    While ExistFile(fileUpd) do
     if ВерсияКорректировки:
        ОбновитьСправочник(True);
        w=w+1;
       else
        Break;
     fi;
     xxxx=xxxx+1;
     if dpos > 0:
        dpos = dpos + 1;
        fileUpd=Folder+"\"+FilesDBF[dpos];
       else
        fileUpd=path+Format("%.4D",xxxx)+vco;
        if not ExistFile(fileUpd): fileUpd=path+Format("%.4D",xxxx)+vcn; fi;
     fi;

    od;
    Message("Корректировка завершена, успешно обработано файлов "+Str(w));
 fi;
 LastUpd=НомерКорректировки("");
 if FieldName="Обновить3":
    fileUpd=fileUpd_;
    DeleteFolder(Folder);
 fi;
 dpos = 0;
 Return False;
end;

Func ОбновитьРБК_OnEnter(FieldName: String; Iter: Integer): logical;
var Folder,fileUpdRBC_:S;
 if FieldName="ОбновитьРБК2":
    Folder=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\"+GetGUID);
    CreateFolder(Folder);
    if not ExistsFolder(Folder): Message("Ошибка создания папки '"+Folder+"'",mtError); ^False; fi;
    if not DownloadInternetFile("http://cbrates.rbc.ru/bnk/bnk.exe",Folder+"\bnk.exe"): Message("Ошибка зарузки 'http://cbrates.rbc.ru/bnk/bnk.exe'",mtError); ^False; fi;
    if not ExistFile(Folder+"\bnk.exe"): Message("Ошибка зарузки '"+Folder+"\bnk.exe'",mtError); ^False; fi;
    CreateFile(Folder+"\bnk.bat");
    WriteLn(Folder+"\bnk.bat",SubStr(Folder,1,2)); --имя диска
    WriteLn(Folder+"\bnk.bat","cd "+Folder+"\");
    WriteLn(Folder+"\bnk.bat","bnk.exe >log.txt");
    ExecuteProgram(Folder+"\bnk.bat",True);
    fileUpdRBC_=fileUpdRBC;
    fileUpdRBC=Folder+"\bnkseek.txt";
 fi;
 if fileUpdRBC="": Message("Укажите путь к файлу корректирови",mtError); Template.Field="fileUpdRBC"; ^False; fi;
 if not ExistFile(fileUpdRBC): Message("Файл "+fileUpdRBC+" не найден",mtError); Template.Field="fileUpdRBC"; ^False; fi;
 Try
  ОбновитьСправочникРБК;
  LastUpd=НомерКорректировки("");
 Finally
  if FieldName="ОбновитьРБК2": DeleteFolder(Folder); fileUpdRBC=fileUpdRBC_; fi;
 end;
 Return False;
end;


Proc service_OnExit(FieldName: String; Iter: Integer);
var Std:S;
var Ver:S;
 if service="ТББ" or service="TBB":
    Std=Раб.Бюджет2005.Контроль2Слэш(Раб.Вспом.Импорт_НастрКарт.Dot2Path("",PlanVar("Std_Rpo"))+"\Dbf\БИК\");
    Ver='"'+Std+'БИК.ver"';
    ExportCard(ieCRD,            --  Формат CRD
               "РПО_BNKSEEK",    --  Картотека (браузер)
               Std+"РПО_BNKSEEK",--  Файл (путь)
               false,            --  Учитывать фильтр браузера
               false,            --  Выгружать только видимые поля
               false,            --  Выгружать разыменованные поля
               false,            --  Выгружать c UKEY
               false,            --  Указать столбец для EXCEL
               false,            --  Выгружать служебные поля
               false,            --  Выгружать в DOS-кодировке
               false);           --  Выгружать таблицы по ссылкам
    ExportCard(ieCRD,            --  Формат CRD
               "РПО_KORREK",     --  Картотека (браузер)
               Std+"РПО_KORREK", --  Файл (путь)
               false,            --  Учитывать фильтр браузера
               false,            --  Выгружать только видимые поля
               false,            --  Выгружать разыменованные поля
               false,            --  Выгружать c UKEY
               false,            --  Указать столбец для EXCEL
               false,            --  Выгружать служебные поля
               false,            --  Выгружать в DOS-кодировке
               false);           --  Выгружать таблицы по ссылкам
    ExecuteProgram("attrib -R "+ver,True);
    if ExistFile(Std+"БИК.ver"): DeleteFile(Std+"БИК.ver"); fi;
    WriteLn(Std+"БИК.ver",ExtractWord(1,LastUpd," от "));
    WriteLn(Std+"БИК.ver",ExtractWord(2,LastUpd," от "));
    ExecuteProgram("attrib +R "+ver,True);
    Message("Ok");
 fi;
 service="";
end;

Func fileUpd_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var i:i;
var Field:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 if Field="fileUpd":
    i=ChooseFile(fileUpd,"Открыть файл обновления","Файл корректуры|????_21?.DBF; bik_dc_????_????????.zip");
   else
    i=ChooseFile(fileUpdRBC,"Открыть файл обновления","Файл BNKSEEK.TXT|BNKSEEK.TXT");
 fi;
 LastUpd=НомерКорректировки("");
 Return Cur;
end;

Func ПоискБанка_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 LastUpd=НомерКорректировки("");
 Rec=Раб.Поиск.ВыборИзКартотеки("Поиск банка...","РПО_BNKSEEK","NEWNUM|NAMEP|NNP|KSNP","БИК|Платежное наименование участника расчетов|Наименование населенного пункта|Корреспондентский счет","");
 if not Rec=nil:
    sБИК=GetCardFieldS("РПО_BNKSEEK",Rec,"NEWNUM");
    sНаимПлат=GetCardFieldS("РПО_BNKSEEK",Rec,"NAMEP");
    sНасПункт=Trim(КодВТекст("TNP",GetCardFieldS("РПО_BNKSEEK",Rec,"TNP"))+" "+GetCardFieldS("РПО_BNKSEEK",Rec,"NNP"));
    sКСчет=GetCardFieldS("РПО_BNKSEEK",Rec,"KSNP");
    sСтатус=КодВТекст("REAL",GetCardFieldS("РПО_BNKSEEK",Rec,"REAL_"));
    sДИ=GetCardFieldD("РПО_BNKSEEK",Rec,"DT_IZM");
 fi;
 Return False;
end;

Func ПечатьБанка_OnEnter(FieldName: String; Iter: Integer): logical;
 Раб.Настр_Печать.Prn("","",SelfCfg,"",1);
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;

Proc Страница_onClick(Sender: String);
 LastUpd=НомерКорректировки("");
 if Sender="btnПоиск": Страница=0;
   |Sender="btnЗагрузка": Страница=1;
   |True: Страница=0;
 fi;
 Оформление;
end;

Proc btnВосстан_OnClick(Sender: String);
var F:I;
var File,v1,v2:S;
 File=Раб.Бюджет2005.Контроль2Слэш(PlanVar("Std_Rpo")+"\DBF\БИК\БИК.ver");
 if not ExistFile(File): Message("Нет данных для восстановления",mtError); Exit; fi;
 F=TextFileOpenRead(File);
 Try
  v1=Trim(TextFileReadLn(F));
  v2=Trim(TextFileReadLn(F));
 Finally
  TextFileClose(F);
 end;
 if v1="" or v2="": Message("Нет данных для восстановления",mtError); Exit; fi;
 if EnqOkCancel("Вы уверены, что хотите восстановить справочник БИК РФ до версии "+v1+" от "+v2,mtWarning)=cmCancel: Exit; fi;
 Заполнить(True);
 LastUpd=НомерКорректировки("");
 Message("Обновление справочника БИК РФ завершено");
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 Страница=0;
 Раб.Настр_Печать.Cfg("",SelfCfg);
 Заполнить(False);
 Настр(False);
 LastUpd=НомерКорректировки("");
 Оформление;
end;

Proc OnClose(Destroy: Logical);
 --Настр(True);
end;
--Обработчики событий шаблона -----
--


Конец
