2 в 1: Проверить действительность паспорта / Получить ИНН по паспорту




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

33 Comments

  1. spenser123

    8.3.12? она же пока в исполнении «только для тестирования» …. или я ошибаюсь?

    Reply
  2. VladimirElohov

    (1) Это да. Но у меня она на боевом сервере стоит. И sql-ные базы с ней прекрасно работают.

    Если кто-то проверит обработку на более низких версиях платформы, пишите в комментариях — не стесняйтесь.

    Reply
  3. Boneman

    Интересный сервис. А где описание API налоговой найти ?

    Reply
  4. VladimirElohov

    (3) Его не существует. Нашёл на одном форуме информацию, что можно через «Инструменты разработчика» в браузере проанализировать, что передаётся в POST-запросе, как посмотреть ответ и т.п. Дальше — свободное творчество.

    Проверку ФМС позаимствовал в конфигурации «1С:Управление МФО и КПК». К API этого сервиса, вероятно, есть какая-то документация.

    Reply
  5. Alias

    а я всегда пишу подключаемые обработки чтобы их можно было запустить через файл-открыть и при этом не было пустой формы 🙂

    тем более что это совсем несложно сделать. Ссылку на физика на форму и пару кнопок.

    Теперь по существу:

    ERP 2.4.2, 8.3.10.

    — если без заполненных данных о паспорте нажать «Получить ИНН» то вылетит ошибка «Преобразование значения к типу Число не может быть выполнено» в Форма(167) потому что тогда Серия=null, и вместо СтруктураДанныхФЛ.Серия + » » + СтруктураДанныхФЛ.Номер лучше было бы написать «» + СтруктураДанныхФЛ.Серия + » » + СтруктураДанныхФЛ.Номер.

    — при ошибке соединения с service.nalog.ru (Форма(208)) лучше было бы не использовать Попытку-Исключение без какого-то сообщения пользователю о причинах этой ошибки. Пока я не вывел там Сообщить(ОписаниеОшибки()) я не узнал что, например, дата рождения это обязательный реквизит для обращения.

    — ну и как-то сигнализировать пользователю о результате заполнения. Потому что сейчас неясно, то ли ИНН получен такой же как и был указан, то ли не получен совсем. И в том и в том случае визуальный результат одинаков.

    — если ФМС на запрос о проверке паспорта возвращает ответ «Не действителен (ЗАМЕНЕН НА НОВЫЙ)» то это интерпретируется в сообщение «Указаны некорректные паспортные данные». Не знаю насколько смысл этих фраз аналогичен, но лучше было бы возвратить ровно тот же ответ что и ФМС.

    — отличие «(:» от «:)» это что, проверка на внимательность? Или чтоб не расстраивать владельцев недействительных паспортов, выдавая им ответ «успешно»?

    А в общем — вроде работает, спасибо. 🙂

    Reply
  6. VladimirElohov

    (6) Александр, благодарю за обратную связь!

    Обязательно учту ваши замечания и постараюсь на выходных выложить улучшенную версию, прикрутив красивые бантики к обработке.

    Reply
  7. Brawler

    (1) Ща требование от Инфостарта такое, обязательно писать на чем конкретно тестилось, вот автор, да как и я, написал, то что у него сейчас под рукой установлено.

    Reply
  8. VladimirElohov

    Опубликовал обновленную версию обработки.

    В исправленной версии учтены все замечания Александра Полетаева. Спасибо ему ещё раз!

    В том числе уточнен метод оповещения о недействительном паспорте.

    Теперь, если паспорт «Не действителен», пользователю выдаётся предупреждение в виде форматированной красной строки типа

    «Не действителен (ЗАМЕНЕН НА НОВЫЙ)», «Не действителен (ИЗЪЯТ, УНИЧТОЖЕН)» ,»Не действителен (ЧИСЛИТСЯ В РОЗЫСКЕ)» и т.п.

    В предыдущей версии ответ сервера зачастую интерпретировался некорректно, выдавая сообщение об успешной проверке.

    Как писал ранее, эта часть проверки была позаимствована в конфигурации «1С:Управление МФО и КПК». И до сегодняшнего дня детально проверить её не было возможности.

    Reply
  9. VladimirElohov

    Добавил версию для УТ 11. Протестировал на релизе 11.4.3.126.

    Основной файл при запуске обработки выдавал ошибку в этой конфигурации. Решил внести изменения, учитывающие особенности УТ, и выложить в виде отдельного файла.

    Reply
  10. MSK_Step

    эх, что же код то не написали, было бы интересней смотреть

    Reply
  11. Karpov_kos

    Правильно я понимаю что проверка производится только после ввода капчи

    Reply
  12. VladimirElohov

    (13)

    Правильно я понимаю что проверка производится только после ввода капчи

    Да, всё верно. Эти онлайн сервисы требуют капчу как защиту от массовых запросов, чтобы их сервера не упали. И работоспособность предложенных инструментов, естественно, зависит от работоспособности официальных сервисов МВД/ФНС.

    Reply
  13. Proplus74

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

    Reply
  14. ExpertAdmin

    (15)

    йств

    Тоже не работает. Не может соединится с сервером для получения ИНН.

    Reply
  15. Vladvectro

    Здравствуйте! проверяю на бухгалтерии 3.0 (разные базы, разные релизы) проблема одна и та же — вылетает на секунду окно с капчей, сразу закрывается и ничего не происходит

    Reply
  16. VladimirElohov

    (16)

    (17)

    Подтверждаю. Получение ИНН перестало работать.

    Пока разбираюсь, с чем это связано: с изменения в новых релизах платформы или же с изменениями на портале ФНС. А может, с тем и другим.

    Как будет результат, дам знать и, вероятно, опубликую новую версию обработки.

    Reply
  17. Vladvectro

    (18) Здравствуйте! Не готова ли еще исправленная версия? Можно ли как-то с Вами связаться по почте?

    Reply
  18. d.marochko

    Получение ИНН не работает, потому что неверно извлекается токен капчи в методе ПолучитьКартинкуКапчиФНС модуля объекта обработки.

    Должно быть:

    captchaToken = Сред(Картинка,23,СтрДлина(Картинка)-32);

    Было:

    captchaToken = Сред(Картинка,24,СтрДлина(Картинка)-33);
    Reply
  19. VladimirElohov

    (20) Благодарю за подсказку. На портале ФНС, действительно, изменился формат поля с капчей. Это было основной причиной, по которой обработка перестала работать в части получения ИНН по паспорту.

    Reply
  20. VladimirElohov

    (19) Добрый день! Исправленную версию (1.2) выложил. Если вы ранее скачивали обработку, а теперь не можете получить новую версию без оплаты, можете написать мне в личку — я вышлю.

    Версию для УТ также постараюсь обновить на днях.

    Reply
  21. VladimirElohov

    (0)

    Reply
  22. Vladvectro

    (23) Здравствуйте еще раз! Скачал новую версию обработки, но проблема все равно осталась — появляется на долю секунды окно с капчей и сразу пропадает. Что в ЗУПе, что в БП. релизы: ЗУП 3.1.5.353, БП 3.0.61.47. Проблема одинаковая на обоих командах — Получить ИНН с портала ФНС и проверить действительность паспорта. Отчего это может быть?

    Reply
  23. VladimirElohov

    (24) Окно с капчей — это просто форма. Она открывается и пока вы её не закроете, она будет висеть открытой. Что её может закрыть, если не вы, можно попытаться понять, только сделав трассировку в отладчике. Я на типовых конфигурациях как в файловом, так и в серверном режиме, не наблюдал подобного поведения своей обработки.

    Reply
  24. Vladvectro

    (25) Здравствуйте! проверяю на 2х разных базах (типовых) на 2х разных компьютерах ЗУП 3.1.8.216 одна рабочая, другая просто демо база — из формы физ лица все работает, а из формы списка ведет как я писал выше — открывается на секунду окно с капчей и исчезает. Может ли это быть связано с какими-то настройками эксплорера например? и второй вопрос — ваша обработка предназначена для проверки только одного физ лица за 1 раз, или можно проверить сразу 10 человек?

    Reply
  25. VladimirElohov

    (26) Текущая версия обработки не заточена под использование её в форме списка. В частности, сейчас получение ИНН предполагает помещение полученного значения в соответствующее поле на форме элемента справочника без принудительной записи. Проверка нескольких человек за раз в HTTP-сервисах, которые использует обработка, не предусмотрена, насколько мне известно, поэтому и обработка этого не умеет. Насчёт работы из формы списка подумаю на досуге.

    Reply
  26. VladimirElohov

    Обновил обработку для УТ 11 до версии 1.2.

    Reply
  27. BoneD

    На сайте ИФНС добавили согласие на обработку персональных данных перед запросом ИНН. Обработка перестала работать.

    Reply
  28. VladimirElohov

    (29) Благодарю за информацию.

    Нет худа без добра: согласие на обработку ПД добавили, а капчу, похоже, убрали))

    Как будет время, подумаю варианты обхода, чтобы реанимировать обработку.

    Reply
  29. VladimirElohov

    Как и обещал ранее, наконец-то, нашёл время и починил обработку. Жду новых отзывов и предложений.

    Reply
  30. user839080

    Доброго времени суток, подскажите а для конфигурации: УПП, 1.3 данная обработка работает?

    Reply
  31. user839080

    или в ней надо подкорректировать код для нормального функционирования

    Reply
  32. VladimirElohov

    (33) Данная обработка заточена под управляемые формы. На УПП работать не будет. Для этого надо переписывать её на обычные формы.

    Reply
  33. Casey1984

    (33) Часть функционала УПП использует УФ в толстом клиенте, можно попробовать встроить обработку в конфигурацию и запустить, авось прокатить 😉

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *