Получение лицензий из ЛК ФСРАР




Принцип обмена данными из 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='\

14 Comments

  1. M_W_W

    Добрый день! Скачал, работает, даже встроил в свою конфу для автоматического обновления справочника лицензий у контрагента.

    Единственный вопрос — а можно как-то вытащить данные, кем выдана лицензия?

    Ведь далеко не все лицензии выдаются ФСРАР, некоторые выдаются различными «Министерство потребительского рынка», и т.п… Есть вообще там эта информация? При входе на страницу проверки лицензий в ЛК ее не видно, но и тип лицензии тоже не виден, но тем не менее Вы его вытягиваете, может и «кем выдана» можно вытащить???

    Reply
  2. M_W_W

    Уже сам посмотрел… Сохранил ответ в файл, и все увидел:(

    Нет там этого поля… Все как всегда и во всем, что связано с ФСРАР и ЕГАИС… Через жо…

    Ставить всем «ФСРАР» — ??? Или по первым символам, если буква и пробел, то ФСРАР, если с двухзначного числа серия начинается, то это как правило код региона, и с большой долей вероятности можно предположить, что это «Министерство потребительского рынка» в этом регионе — ???

    Или все-таки не заморачиваться, и всем ФСРАР ставить? В таком случае, будет в декларации ошибка, или это допустимо? Как Вы из этой ситуации выходите?

    Reply
  3. knstanta

    Действительно, такой информации нет. Да и не проверяет ее ФСРАР в автоматическом режиме, т.к. написать в это поле можно и сокращенно, и полностью, и с ошибками. Главными данными являются номер лицензии, даты ее действия. Таким образом заполняйте как вам удобно. (ФСРАР например)

    Reply
  4. M_W_W

    (3)

    Да, спасибо, я уже несколько лицензий(около десятка) выборочно проверил там-же, на сайте, но не через ЛК, а через поиск в реестре. Там более полная информация, и везде стоит орган выдавший лицензию — «Росалкогольрегулирование». Так и сделал, во все лицензии подставляю такую строку.

    Можно было-бы сделать загрузку из реестра, но автоматом не получится, там в отличии от ЛК, капча требуется…

    Reply
  5. M_W_W

    Не знаю, может что-то поменялось в ФСРАР, но с недавних пор, перестал правильно работать запрос лицензий… Точнее, работает, но, как-то нестабильно, через раз…

    Высыпает ошибку:

    WinHttp.SetRequestHeader(«Cookie»,»f5_cspm=1234; «+Кука+»; f5avraaaaaaaaaaaaaaaa=»+f5a);

    {Справочник.Контрагенты.Форма.Модуль(1983)}: WinHttp.WinHttpRequest: Параметр задан неверно.

    На «Справочник.Контрагенты.Форма.Модуль(1983)}: » не смотрим, у меня просто это все в модуле формы справочника Контрагенты размещено, для непосредственного обновления реквизитов лицензий, это не принципиально…

    Стал разбираться, что там происходит, и выяснил, что неправильно формируется параметр «f5a» —

    f5a = «CTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»><ht ml xmlns=»http://www.w3.org/1999/xhtml»> <head> <met a http-equiv=»Content-Type» content=»text/html; charset=utf-8″ /> <title>Портал с»

    Тогда, когда это не отрабатывает, вот здесь:

    НомерВх= Найти(WinHttp.ResponseText,»f5_p:'»);

    НомерВх = 0 почему-то…

    Хоть и не люблю я безусловные переходы, но пришлось добавить вот такое:


    ******************

    НомерВх= Найти(WinHttp.ResponseText,»f5_p:'»);

    Если НомерВх = 0 Тогда

    Перейти ~Начало;

    КонецЕсли;

    f5a = Сред(WinHttp.ResponseText,НомерВх+6);

    ******************

    Так вроде работает стабильно, но, чувствую, что что-то тут не так(не зациклится он до бесконечности???), может есть более правильные варианты исправления данной ситуации, может что-то в запросе поправить надо?

    Reply
  6. knstanta

    (5) M_W_W,

    Да, есть такая проблема с этим «f5a». Будем разбираться.

    Reply
  7. M_W_W

    Спасибо!

    Пока, я вижу для себя только вариант ограничить количество попыток, скажем 10-тью, после чего, в случае неудачи, выдавать сообщение об ошибке, на понятном для пользователя языке, и прерывать процедуру…

    Reply
  8. knstanta

    (7) M_W_W,

    На первое время действительно, это решение. Думаю, что временно можно смириться с некоторой нестабильностью авторизации.

    ФСРАР не оставляет попыток лишить нас запрашивать данные минуя Web-браузера. Последние изменения связаны именно с попыткой отсечь тех, кто работает не в браузере.

    Reply
  9. KillHunter

    К сожалению данная обработка не заработала с электронной подписью, так что однозначно минус ! Не качайте если отсутствует ИНН и пароль лк к ФСРАР. Если возможно верните мои $m.

    Reply
  10. knstanta

    (9) KillHunter,

    Для работы требуется действующая учетная запись (ИНН, Пароль) — написано в описании.

    Интересно куда Вы собирали приладить цифровую подпись?

    Минус, тоже отзыв. Спасибо и на этом.

    Reply
  11. M_W_W

    (9) KillHunter,

    «Не качайте если отсутствует ИНН и пароль лк к ФСРАР.»

    А в чем собственно проблема восстановить этот пароль????

    Дело ровно двух минут, при наличии ЭП. На странице авторизации в ЛК по ЭП, нажимаете «Восстановить пароль», вводите любой, доступный Вам Е-Майл(совсем не обязательно тот, который при регистрации указывали), подтверждаете вход в кабинет с помощью тоступной Вам ЭП, тут-же на это мыло приходит пароль… И пользуйтесь на здоровье…

    PS Другое дело, если нет пароля, и ЭП не доступна… Ну, тут уж, извиняйте…

    PSS У меня ни один клиент не знал своего пароля… Все при декларировании заходили по ЭП и о пароле даже и не вспоминали. Всем восстанавливать пришлось, но это не создало ни малейших проблем. Я подумал — ну, не знают, пусть и дальше не знают… Добавил в конфу константу, ПарольЛК, на всякий случай убрал с нее все права у всех, в том числе и на просмотр, что-бы пароль не светить, и простенькой обработкой из трех строк записал в нее пароль. В эту обработку и проверку марок пароль из нее подтягиваю, для пользователей это совершенно прозрачно…

    Reply
  12. KillHunter

    (11) M_W_W,

    PSS У меня ни один клиент не знал своего пароля… Все при декларировании заходили по ЭП и о пароле даже и не вспоминали. Всем восстанавливать пришлось, но это не создало ни малейших проблем. Я подумал — ну, не знают, пусть и дальше не знают… Добавил в конфу константу, ПарольЛК, на всякий случай убрал с нее все права у всех, в том числе и на просмотр, что-бы пароль не светить, и простенькой обработкой из трех строк записал в нее пароль. В эту обработку и проверку марок пароль из нее подтягиваю, для пользователей это совершенно прозрачно…

    Я тоже думал вначале что можно восстановить пароль, но кнопка «Восстановить пароль» по началу не находила себя, (так как было только 2 варианта — Восстановить: электронную подпись и ключ), но потом выдернув ЭП из слота USB и о чудо она появилась, так , что я поторопился с отрицательным отзывом. Усе работает, в данный момент переделываю обработку под управляемые формы 8.3, возможно выложу на портал!

    Reply
  13. Protman

    (12) Переделали свою обработку?

    Reply
  14. KillHunter

    (13)

    (12) Переделали свою обработку?

    Да имеется могу выложить на портал !

    Reply

Leave a Comment

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