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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *