Обсуждение:Проверка недействительных паспортов по базе ФМС… быстро.

5 (1)
  • Развернуть Обсуждение:Проверка недействительных паспортов по базе ФМС… быстро. ( Обсуждение примера  25.09.2014 16:42 )
    5(1)
    Проверка недействительных паспортов по базе ФМС… быстро.

    Количество паспортов в стоп листе удостоверений личности, который мы ответственно пополняли с файлов ЦБ и впоследствии у прочих поставщиков – около 60 тысяч.

    Количество недействительных паспортов, которые можно скачать у ФМС по ссылке http://services.fms.gov.ru/info-service.htm?sid=2000 – около 90 миллионов.

    Осознав разницу, пришли к выводу, что проверки паспортов клиентов, которые мы сейчас делаем, весьма не полные.

    Конвертировали файл из ФМС в формат Pervasive, чтобы до данных был легкий и быстрый доступ из RSL, написали процедуры проверки. Сделали где нужно проверку. Выполняется полная проверка около минуты, хотя у нас ооочень много счетов.

    Предлагаю в примере макросы с процедурами, которые можно протестировать как есть, и модифицировать под себя.

    При подстройке макросов учитывайте местоположение файла psp_bad.dbt. Рекомендуется вынести этот файл из dbfile и даже корневого каталога RSBANK, поскольку реальный файл со всеми паспортами будет состоять из 4-х частей и занимать почти 8 гигов. Зачем его включать в резервное копирование вместе с боевыми данными RS?

    Полный файл psp_bad.dbt я заархивировал и положил на https://yadi.sk/d/SNI8KOG6bexVH

    Данные конвертированы из одного формата в другой элементарным способом, но в связи с огромным их количеством это занимает довольно много времени (конвертор работает весь день). Поэтому рекомендую воспользоваться уже готовыми файлами.







    Посмотреть пример
    >> Ответить
    • Развернуть Дорогой друг база паспортов по твоей ссылке меняется раз в сутки (добавляется 5-6 тысяч документов) ( deusex  26.09.2014 09:11 )
      0(0)
      По этому то что ты выложил уже устарело безнадежно. Импорт справочника должен идти ежедневно,
      Pervasiv не дает приемлимой скорости работы, я даже тему завел https://isupport.softlab.ru/Portal/InterSupport/topic.asp?id=341995&FilterId=1523&Which=a&SortOrder=0

      >> Ответить
      • Развернуть Интересно было бы посмотреть... НО Тема с ID 341995 не найдена. Возможно, она непублична или удалена ( sergksa  26.09.2014 09:46 )
        0(0)
        Положите пожалуйста инфу. или можно мне на мыло.
        >> Ответить
        • Развернуть Может вот так доступно: ( deusex  26.09.2014 10:39 )
          0(0)
          Что то даже реализовали, только непонятно что
          https://isupport.softlab.ru/Portal/InterSupport/BugList/scr.asp?id=P2N170101

          Со стороны клиента поступил вопрос:
          Есть файл ФМС
          http://www.fms.gov.ru/upload/expired-passports/list_of_expired_passports.csv.bz2
          с базой недействительных паспортов.
          Хотели загрузить в базу РС ниже приведенным макросом.
          --------------------------- Поля файла badpass.dbt -
          ----T-----------------------T-------T-----T-----T---
          Ном¦ Имя поля ¦ Тип ¦Длина¦Точка¦
          ----+-----------------------+-------+-----+-----+---
          10 Seria STRING 5 0
          20 Number STRING 7 0
          
          -------------------------- Ключи файла badpass.dbt ---------
          ----T--------------------T--T----------T------T-----T--T----
          Ном¦Имя поля ¦PK¦Флаги ¦Тип ¦Длина¦NV¦ При
          ----+--------------------+--+----------+------+-----+--+----
          10 Seria DM S E ZSTRING 5 0
          20 Number DM E ZSTRING 7 0
          
          var pass=TBFile("badpass.dbt","W",0,RIK+"badpass.dbt",RIK+"rik.def");
          if (open(in,"..\\Import\\list_of_expired_passports.csv")==false) exit(0); end;
          
          next(in);
          while (next(in))
          
          cnt=cnt+1;
          if (cnt>100000)
          message( pass.NRecords() );
          cnt=0;
          end;
          
          u_splitstr ( Arr , in.Str , ",");
          
          pass.rec.Seria = Arr[0];
          pass.rec.Number = Arr[1];
          if (pass.GetEq()==false)
          pass.rec.Seria = Arr[0];
          pass.rec.Number = Arr[1];
          pass.Insert();
          end;
          end;
          
          За сутки загрузилось всего 31 миллион записей (когда в файле примерно 100 млн), и
          при этом добавление каждой следующей записи идет гораздо медленнее предыдущей.
          
          Вопрос: как это сделать средствами Pervasive минимизировав время загрузки? Или есть какое-то другое решение?
          Обоснование
          Обоснования нет
          Дополнительная информация
          Тип запроса:Вопрос разработке
          Статус запроса:Реализовано
          Найдено в: 5.50.003.048
          Дата создания: 17.09.2014
          Дата закрытия: 24.09.2014
          Модуль:МВОДБ
          

          >> Ответить
        • Развернуть И кстати база идет в UTF8 как ее в OEM Конвертнуть? (А то по докам неохота лазить) ( deusex  26.09.2014 10:47 )
          0(0)
          Not specified
          >> Ответить
      • Развернуть Да.. база устарела.. и не стала недостоверной на 0.15% ( sergksa  26.09.2014 11:57 )
        0(0)
        Сравнил 2 файла скаченных с сайта ФМС с разницей в 5 дней.

        1. в базу добавилось приблизительно 130 тысяч записей
        2. из базы удалили приблизительно 1.5 тысячи записей.
        3. всего в базе паспортов около 90 миллионов записей.

        Объем изменившихся сведений составил ~0.0015 часть…
        Думаю это вполне допустимая погрешность для сверки полной базы клиентов.

        Проверку при заведении свежего паспорта клиента лучше проводить дополнительно с использованием веб сервиса ФМС.


        Работаю над оптимизацией конвертирования файлов. Тогда можно было бы обновляться каждый день. И чтобы время на конвертирование в Pervasive файл было хотя бы полчаса без отключения пользователя от базы.


        >> Ответить
        • Развернуть Наш финмон такой % считает ну О-О-О-чень большим ( oks2001  26.09.2014 14:55 )
          0(0)
          Поэтому мы конвертим базу раз в сутки с помощью средств sql, и проверки в RS идут с помощью запросов sql. Уже пару месяцев так работаем (при этом при проверке выдает дату актуализации базы)
          >> Ответить
          • Развернуть Делитесь господа, делитесь! ( Волшебник  26.09.2014 15:12 )
            0(0)
            Господь завещал делиться...
            У нас пока новых на сайте ФМС проверяют а масштабной проверки и не делали еще вроде по этой базе...
            >> Ответить
          • Развернуть И мы используем MS SQL аналогичным образом для этой задачи. ( sergksa  26.09.2014 15:12 )
            0(0)
            Но поскольку хотел пример проверки положить более простым для тестирования, сделал его с файлами формата pervasive.
            Много коллег знаю, которые как то сторонятся использования MS SQL и других СУБД из под RSBANK.
            Одно другому не мешает.

            Кстати помимо этой задачи, мы активно используем "обратный" доступ к данным RSBank из MS SQL (SQL шлюз не путать с PSQL).
            Выигрыш по скорости обработки сложных selet-ов ооочень большой. :)
            Ну и связные запросы (отчеты) с другими программами, субд которых на sql-серверах (Ibank,АСВК,Золотой шар и т.д.) делать легко...
            >> Ответить
    • Развернуть Самое страшное что загрузка файла кладет базу на лопатки 100% ( deusex  26.09.2014 11:30 )
      0(0)
      Not specified
      >> Ответить
    • Развернуть а что мешает для импорта записей импользовать butil? ( Vic_Tomsk  27.09.2014 10:58 )
      0(0)
      только что проверил:
      - адаптация csv файла для загрузки через butil на RSL - 12-15 минут;
      - загрузка butil'ом - 3 часа 10 минут - легко выполнится за ночь, пробовал на тестовом сервере, он слабее рабочего (2хXeon 2ГГц, 8Гб ОЗУ) + я параллельно обновлял тестовую сборку РСа + строил баланс и прочие отчеты, возможно совсем без нагрузки это время уменьшится.

      При выполнении импорта заметно, что оптимально скорость записи идет на 20-25 миллионах записей, т.е. если справочник побить на 10 файлов в каждом в среднем будет 10-15 миллионов записей, что позволит загрузить их в БД с максимальной скоростью.

      Внешняя БД тоже выход, но не мой вариант - т.к. это лицензии + железо, регламент по настройке, обновлению, модернизации, регламентных проверках и прочих приказах/положениях/назначениях, требования ИБ и т.д. - я ее только "описывать" буду с полгода, поэтому все должно быть в Рсбанке, где есть штатная БД. А вот вынести справочник за папку DbFile - отличная идея!
      >> Ответить
      • Развернуть еще немного покопался... ( Vic_Tomsk  29.09.2014 08:19 )
        0(0)
        RSL тут не вариант, он затыкается уже после 20 млн. записей - причем разницы нет - 1 таблица или их несколько. ntdbsmgr - сжирает всю память.

        Попробовал следующее - разбил файл на несколько (по сериям), получил 10 txt-файлов (серии начинающиеся на 0, на 1, на 2... на 9).
        Загрузка через butil с рестартом первасива (чтобы кэш сбросывать) - за 1,5 часа загрузил все файлы.
        Разбивка файла занимается тоже 1,5 часа, стоит оптимизировать эту процедуру (я делал на RSL) и можно втиснуть всю процедуру в 2 часа.
        >> Ответить
      • Развернуть Требуется подсказка ( shraydy  17.10.2014 11:00 )
        0(0)
        Здравствуйте. Объясните, пожалуйста, вот этот пункт адаптация csv файла для загрузки через butil на RSL. Что надо сделать с исходным файлом, чтобы его понял butil?
        >> Ответить
        • Развернуть В случае с предложенной структурой в файле psp_bad.def ( sergksa  17.10.2014 11:21 )
          0(0)
          нужно преобразовать строки файла к виду:
          11,0597035028
          11,6005071836
          11,0702849854
          11,9200132873
          11,1702824620
          11,3204481101
          11,2503730523
          ... и т.д.

          там в примере скриптик лежит...
          task_update.vbs (Запускать> cscript task_update.vbs)
          который как раз это делает.. но существует конечно много способов, в том числе и на RSL можно макросом
          >> Ответить
    • Развернуть Обновил пример, Добавил конвертор ( sergksa  02.10.2014 18:26 )
      2(1)
      Спасибо за советы Vic_Tomsk
      Нарисовал сценарий обновления через Butil, включил пример.
      На отдельной, не самой скоростной рабочей станции обновлялся 4 часа, для интересующихся оставил лог.

      Самый скоростной способ получения актуального DBT Файла, это пока все равно с использованием, как промежуточного звена MS SQL
      C момента закачки файла укладываюсь в 30 минут.
      >> Ответить
    • Развернуть Это всё замечательно. Но вот у нас ЦБ требует доказательств того, что мы паспортр проверяли. ( Pov  08.10.2014 15:09 )
      0(0)
      Сейчас операционисты распечатывают страничку с сайта ФМС. Дурдом, конечно, но вот требуют и всё тут. Кто как эту проблему решает?
      >> Ответить
      • Развернуть ну распечатывать эт совсем уже - сделали б хотяб скриншоты ( p2p  08.10.2014 16:01 )
        0(0)
        ставите яндекс диск + горячие клавиши.
        я так планировал поначалу.

        но потом сделал на похапе + mysql + апач.
        обновляется за час.
        сохраняет все обращения в лог.

        этот лог смотрит кфмщик.

        вот сейчас думаю надо ли или нет - сделать из рсбанка переход в браузер с введенными данными
        >> Ответить
      • Развернуть Закон что дышло куда повернеш туда и вышло. ( deusex  08.10.2014 17:53 )
        0(0)
        Читаем внимательно:
        2.2. Все документы, позволяющие идентифицировать клиента, а также установить и идентифицировать выгодоприобретателя, должны быть действительными на дату их предъявления.
        Для проверки действительности паспорта физического лица, являющегося гражданином Российской Федерации,
        [b][i]кредитная организация использует информационный сервис "Проверка действительности паспорта гражданина Российской Федерации,
        удостоверяющего личность гражданина Российской Федерации на территории Российской Федерации"
        на официальном сайте Федеральной миграционной службы в сети "Интернет"

        Так вот на момент написания закона, сервис действительно назывался "Проверка действительности паспорта гражданина Российской Федерации".

        Сейчас такого пункта меню уже нет, а вместо него "ПРОВЕРКА ПО СПИСКУ НЕДЕЙСТВИТЕЛЬНЫХ РОССИЙСКИХ ПАСПОРТОВ" и рядом "СПИСОК НЕДЕЙСТВИТЕЛЬНЫХ РОССИЙСКИХ ПАСПОРТОВ",
        так что исполнить закон вы уже не можете, в виду отсутствия сервиса. А использование новых пунктов незаконно по этому что своя проверка что на сайте пофигу.
        Сделайте журналирование с временем и датой, и этого хватит.
        Требование проверки на сайте незаконно в ввиду отсутствия требуемого сервиса на сайте и все.
        >> Ответить
        • Развернуть Ага ( Волшебник  14.10.2014 12:54 )
          0(0)
          Требование проверки на сайте незаконно в ввиду отсутствия требуемого сервиса на сайте и все.
          Вы это потом проверяющим скажите, и их ответ не забудьте здесь выложить...
          :)
          >> Ответить
          • Развернуть Есть рекомендации ЦБ и по нему свобода выбора ( Банкир07  17.10.2014 15:25 )
            0(0)
            По всем этим вопросам, а именно правовым можно просто прочитать ответ от 27.05.2014 № 12-1-5/1125
            Его еще территориальные органы рассылали для ознакомления.
            По нему конечно не будет поблажки в случае нарушений со стороны Банка, но и обезопасите себя от прямого нарушения Закона.
            Так что с предыдущим сообщением я примерно согласен.
            >> Ответить
    • Развернуть Делюсь, и прошу потестировть ( olegbarsky  20.10.2014 10:37 )
      0(0)
      На моей рабочей машине за 7 минут подготавливается база, которая довольно шустро позволяет проверять паспорта.

      Идея следующая: все паспорта доводим до строк длинной в 10 символов (4+6), сортируем и сохраняем в файл с нормальной кодировкой =). В результате получается база с возможностью быстрого поиска.

      В архиве:
      "start.bat" - скачивает, распаковывает, сортирует и подкидывает базу в доступное RS место. Его ставим в планировщик и запускаем каждую ночь. Строка с подкидыванием в нужное место закомментирована, подправьте под себя.
      "curl.exe" - консольная программа для скачивания файла с сайта
      "bzip2.exe" - разархиватор
      "import_cons.exe" - программа написанная на delphi для сортировки файла
      "pasp.mac" - макрос для проверки паспорта. В нём нужно поправить путь к файлу данных. На вход подаются серия и номер паспорта, выдаёт True если паспорт найден в базе.

      https://yadi.sk/d/zUmn_0Gmc9U5Y
      >> Ответить
      • Развернуть некомллект. ( sergksa  20.10.2014 11:23 )
        0(0)
        где взять import "..\\tcb\\mac\\tcbutil.mac"; ?
        >> Ответить
        • Развернуть Просто удалить строчку. Забыл. ( olegbarsky  20.10.2014 11:28 )
          0(0)
          Not specified
          >> Ответить
          • Развернуть Прикольно ( sergksa  20.10.2014 11:50 )
            0(0)
            Мне лично очень понравилось.
            файлик отсортирован как минисубд... И работает и быстро!!!

            единственно, что чуть пугает, это
            "import_cons.exe" - программа написанная на delphi для сортировки файла

            ну не серьезно как то... нужен исходник, да еще и компилятор...
            по крайней мере чтобы было безопасно использовать.
            другое дело макросом на RSL это сделать, интересно было бы алгоритм посмотреть..

            а совсем прикольно, лично для меня, это на скрипте написать...



            Заодно вот Скриптик.vbs для скачивания файла по ссылке.

            
            
            Dim  sLink1, sFileName1
             sLink1     = "http://www.fms.gov.ru/upload/expired-passports/list_of_expired_passports.csv.bz2"
            
             sFileName1 = "list_of_expired_passports.csv.bz2"
            
             Dim Shell
             Set Shell = CreateObject("WScript.Shell")
            ' Shell.Run ("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255")
            
            
             call Shell.run ("cmd.exe /c del ""%userprofile%\AppData\Local\Temporary Internet Files\content.ie5\*"" /F /S /Q"  , 0, True  )
            'wscript.quit
            
             
             URLGet sLink1, sFileName1
            ' WScript.Sleep 100
             
            Function URLGet(URL, SaveAs)
             URL = Replace(URL,"\","/")
             FileName = SaveAs
             Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
             XMLHTTP.Open "GET",URL,"False"
             XMLHTTP.Send
             if XMLHTTP.statustext = "OK" then
              URLGet = "OK"
              Set ADOStream = CreateObject("ADODB.Stream")
              ADOStream.type = 1
              ADOStream.Open
              ADOStream.Write XMLHTTP.responseBody
              Set fso = WScript.CreateObject("Scripting.FileSystemObject")
              if fso.FileExists(FileName) then fso.DeleteFile(FileName)
              ADOStream.SaveToFile FileName, 2
              ADOStream.Close
              Set ADOStream = Nothing
             end if
             Set XMLHTTP = Nothing
            
             WScript.echo date()  & " " & time() &  " скачан файл " & saveAS & "    По ссылке-> " & URL
            
            
            End Function
            
            
            
            

            >> Ответить
            • Развернуть Средствами RSL думал конвертор написать, ( olegbarsky  20.10.2014 11:57 )
              0(0)
              Средствами RSL думал конвертор написать, но не нашел простого способа прочитать UTF-8, в котором исходная база.

              Исходник даю. В принципе можно сделать самому, главное идея.

              При конвертации была проблема с нехваткой памяти, для этого большая часть сортируется как числа.

              program import_cons;
              
              {$APPTYPE CONSOLE}
              
              {$R *.res}
              
              uses
                System.SysUtils,
                System.Generics.Collections;
              
              var f, b, err, w: TextFile;
                  s: string;
                  c, cs, c_all: Integer;
                  ser, num: Int64;
                  serStr, numStr: string;
                  arr: array of Int64;
                  arrStr: array of String;
                  isNum: Boolean;
              
                  function addSp (aStr: string; aNum: integer): string;
                  begin
                    Result:=aStr;
                    while (Length(Result)<aNum) do
                      Result:=' '+Result;
                  end;
              
              begin
                try
                  if ParamCount=1 then
                  begin
                    c:=0;
                    cs:=0;
                    c_all:=0;
                    AssignFile(f, ParamStr(1), 65001);
                    Reset(f);
                    AssignFile(err, ParamStr(1)+'.err');
                    Rewrite(err);
              //      AssignFile(w, ParamStr(1)+'.dos', 866);
              //      Rewrite(w);
                    readln(f, s); // Пропустим заголовок
                    repeat
                      readln(f, s);
              //        Writeln(w, s);
                      Inc(c_all);
                      if ((Length(s)<=11) and (pos(',', s)>0)) then
                      begin
                        serStr:=copy(s, 1, pos(',', s)-1);
                        numStr:=copy(s, pos(',', s)+1);
                        if ((Length(serStr)<>4) or (Length(numStr)<>6)) then
                        begin
                          isNum:=False
                        end
                        else
                        begin
                          try
                            ser:=StrToInt64(serStr);
                            num:=StrToInt64(numStr);
                            isNum:=True;
                          except
                            isNum:=False;
                          end;
                        end;
                        if (isNum) then
                        begin
                          if ((ser>=0) and (ser<=9999) and (num>=0) and (num<=999999)) then
                          begin
                            SetLength(arr, c+1);
                            arr[c]:=ser*1000000+num;
                            Inc(c);
                          end
                          else
                            Writeln(err, s);
                        end
                        else
                        begin
                          if ((Length(serStr)<5) and (Length(numStr)<7)) then
                          begin
                            SetLength(arrStr, cs+1);
                            arrStr[cs]:=addSp(serStr, 4)+addSp(numStr, 6);
                            Inc(cs);
                          end
                          else
                            Writeln(err, s);
                        end;
                      end
                      else Writeln(err, s);
              
              //        if (c_all mod 1000000=0) then
              //        begin
              //          Writeln('Обработано записей: '+inttostr(c_all));
              //        end;
                    until (Eof(f));
                    CloseFile(f);
                    CloseFile(err);
              //      CloseFile(w);
                    writeln('Загрузили данные из файла');
                    TArray.Sort<int64>(arr);
                    TArray.Sort<string>(arrStr);
                    writeln('Отсортировали');
              
                    AssignFile(b, ParamStr(1)+'.dat', 866);
                    Rewrite(b);
                    c:=Low(arr);
                    cs:=Low(arrStr);
                    while ((c<=High(arr)) or (cs<=High(arrStr))) do
                    begin
                      if (c>High(arr)) then
                      begin
                        Write(b, arrStr[cs]);
                        Inc(cs);
                        Continue;
                      end;
              
                      s:=inttostr(arr[c]);
                      while (Length(s)<10) do
                        s:='0'+s;
              
              
                      if (cs>High(arrStr)) then
                      begin
                        Write(b, s);
                        Inc(c);
                        Continue;
                      end;
              
                      if (arrStr[cs]<s) then
                      begin
                        Write(b, arrStr[cs]);
                        Inc(cs);
                      end
                      else
                      begin
                        Write(b, s);
                        Inc(c);
                      end;
                    end;
              
                    CloseFile(b);
                    writeln('Сохранили в файл');
                  end;
                  { TODO -oUser -cConsole Main : Insert code here }
                except
                  on E: Exception do
                    Writeln(E.ClassName, ': ', E.Message);
                end;
              end.
              

              >> Ответить
    • Развернуть У нас переформатированный текстовый файл грузится в RS-Pervasive за 1 секунду :) ( tema  21.11.2014 16:57 )
      0(0)
      Not specified
      >> Ответить
    • Развернуть И где теперь базу брать? Или только через СМЕВ теперь проверять? ( deusex  03.07.2015 16:55 )
      0(0)
      Not specified
      >> Ответить
      • Развернуть Там же где и раньше ( tema  03.07.2015 17:37 )
        0(0)
        http://www.fms.gov.ru/upload/expired-passports/list_of_expired_passports.csv.bz2

        А ФМС уже отдаётся банкам по СМЭВу? Простите невежество, но на новом месте работы меня к смыву не подпускают.
        >> Ответить
    • Развернуть База ФМС ( happy_pride  12.07.2015 18:36 )
      5(1)
      С начала 07.15 года на сайте ФМС тех. работы проводят, проверка паспортов не действительна. Подскажите чайнику как проверить сейчас паспорт? есть может оффлайн база свежая , хотя бы на начало лета. Заранее спасибо!
      >> Ответить
      • Развернуть там же ( sergksa  13.07.2015 09:17 )
        0(0)
        http://www.fms.gov.ru/upload/expired-passports/list_of_expired_passports.csv.bz2
        у мня по логам видно, что файл не менялся с 03-07-2015
        >> Ответить
        • Развернуть База ФМС ( happy_pride  13.07.2015 10:17 )
          0(0)
          Спасибо! Подскажите еще чем открыть такой объемный файл? Кроме Excel есть варианты какие то? Чтобы файл не разбивать на маленькие части.
          >> Ответить
          • Развернуть посмотри на эту тему. ( sergksa  13.07.2015 10:55 )
            0(0)
            https://isupport.softlab.ru/forum/ZoneForum/topic.asp?Forum=7&SubForum=15&ID=56038
            я в обсуждении этого примера, тоже активно участвовал.
            смысл в том, что если файл разархивировать, потом отсортировать, то его можно использовать как поисковый, хотя он и текстовый.
            и через RSL проверять паспорта. (там милисекунды на проверку 1 паспорта уходит)

            >> Ответить
            • Развернуть База ФМС ( happy_pride  13.07.2015 11:29 )
              5(1)
              1. Сортировку в Excel делать?
              2. И что такое RLS и как им пользоваться.
              Извиняюсь за идиотские вопросы, просто не сталкивался с данной ситуацией, но тут возникла необходимость огромная. Спасибо за понимание.
              Если не затруднит разъяснить все как к чему , напишите в ВК. https://vk.com/happy_pride . Буду очень признателен.
              >> Ответить