Контроль окна "Авторизация доступа"




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

28 Comments

  1. VV

    Оч. хорошо! А вот такой случай обработает программка: периодично запускается обработка в разделенном режиме, все нормально, пока не вышел последний юзер. И вот в очередной раз запускается обрабока, а кто-то из юзеров вышел некорректно — «Работа базы завершена аварийно….» — будет висеть, пока ОК не нажмется. Как с этим случаем?

    Reply
  2. Abadonna

    To VV: спасибо, что напомнил, что еще существуют базы на dbf (у меня даже отладочная на SQL). Приделал убивалку и такого окна («Программы была завершена..»). Нажимает кнопку ДА (переиндексировать).

    Если еще кого убить надо — пиши 😉

    Reply
  3. VV

    Отлично! А у меня — все дбф. И есть еще окно, когда база уже запущена монопольно (регламентная обработка, но не успела закончится к сроку), а также автоматом запускается другая обработка в разделенном: «Каталог пользователя занят!»

    Еще чего вспомню — напишу. Спасибо за оперативность, будет полезная штука.

    Reply
  4. VV

    Извиняюсь, «Кталог … занят» — убивает!

    Reply
  5. VV

    Теперь она убивает все противные окна 1С, что и требовалось! Товарищи, плюсуем рейтинг за свою спокойную жизнь!

    Reply
  6. VV

    Я вот еще думаю: часто бывает нужно, чтобы после определенного времени (указанного в ини) все вылетели по-любому — ночь наступила, обновление сделать или еще что. Раз уж процесс болтается, может и это делать его научишь?

    Reply
  7. brr

    Маст хэв, однозначно!

    Reply
  8. Abadonna

    2VV: «Убивец» 1С http://1c.proclub.ru/modules/mydownloads/personal.php?cid=6&lid=2043

    моя разработка, лежит в проклубе с 25/12/2002

    Reply
  9. VV

    Ха! Я уже давно скачал твоего убивца и юзаю. Вот и хотел объединить их — одну программку запустил и забыл. Только время выставил, чтоб в авил, чтоб в планировщик не засовывать.

    Reply
  10. Abadonna

    2VV: ладно, приделаю

    — фирма Abadonna Technology принимает заказы на убийства 😉 🙂

    Reply
  11. VV

    Спасибо, жду. А то я уже путаться начал во всех ВК и программках на серванте 🙂 А так — на одну станет меньше, а предназначение — одно — килять усех.

    Reply
  12. Abadonna

    Люди! поторопился немного!!!

    Доработка под другие модальные окна привела к тому, что и внутри 1С она их убивает

    Предупреждение(«») — убьет.

    не качайте пока!!! скоро доработаю

    Reply
  13. Abadonna

    УФФФФФФФФФФФФФФФ.

    Исправил. В общем, убивает только модальные окна «Авторизация доступа», «Программа была завершена аварийно»,

    «Каталог пользователя занят!» и «Пароль набран неверно»

    Всякие там Предупреждения и вводы значений не трогает

    Reply
  14. Abadonna

    Спасибо VV, что не дает мне скучать! 😉

    Еще одна доработка — теперь процесс 1С убивается совершенно корректно, даже если внутри 1С есть модальные окна

    типа «Предупреждение»

    Теперь, думаю, это финишная версия

    Reply
  15. VV

    Не за что, тебе спасибо!

    Полностью подтверждаю слова автора: убивает все подряд без переиндексации! Запустил свежеустановленнную ТиС, открылась с «Советом дня» и рекламкой 8.0. Ждем-с.. В установленное время — «Хотите закрыть программу: да+Нет», ну , думаю — а вот это он не учел. Ан нет — чуть погодя нажалось «Да» и 1С закрылась корректно, переиндексацию не попоросила.

    Так что проблема:»Как корректно выгнать пользователей?» — решена, наконец. Спасибо автору, жалко еще плюсануть рейтинг не могу.

    Reply
  16. VV

    🙁 Ну, чтоб не скучал: не открыт период в ТиС, соответственно при запуске окно «Период не открыт. Закончить работу программы? Да+Нет». Ждем-с.. Закрылась 1С, заупскаем разделенно — «Каталог пользователя занят!», потом «1с выполнило недопустимую операцию…. память не может быть рид… коврик будет свернут…» При повторном запуске просит переиндексацию. Может, это только у меня так?

    Reply
  17. VV

    Ну и вдогонку: а чего это прграммка после убийства 1С сама закрывается? Ну, убила ночью всех, кто не вышел, а днем кто работать будет? Опять запускать? Или она будет из автозагрузки грузиться?

    А время можно было бы задавать не одно, а несколько: 12:12;18:13;00:00;

    Reply
  18. Abadonna

    и чего я только не узнаю 😉 🙂

    Я уж понял в чем дело: закрыла он корректно, но раз уж ты в базу попал, там образовался файл 1Cv7.LCK, когда прога КОРРЕКТО закрыла 1С файл это там остался, вот при старте она и посчитала, что ты в базе. Можно, конечно, и их потом программой почистить, но это уж совсем лениво

    Reply
  19. Abadonna

    2VV:

    чувствую ты меня прям на разработку комплекса по всевозможным способам убийства

    толкаешь 😉 А так коротко-просто начиналось…

    Сделаю, пожалуй, но теперь не так оперативно

    Reply
  20. vasilykushnir

    Ну что скажешь? Класс!

    Reply
  21. Огромное спасибо, а то мне эту проблему решать уже просто надоело!!!

    Reply
  22. VV

    Скачал свежую версию. Все равно не закрывает тех окон, которые я вчера по почте выслал, процесс есть, а толку нет.

    Reply
  23. CheBurator

    ну так закрывает или нет?

    Reply
  24. Abadonna

    >ну так закрывает или нет?

    Ну так пробуй!

    Reply
  25. Знакомый

    Большой и жирный плисик за прогу )

    Reply
  26. quick

    нашел немного другое решение

    psfile.exe d:aseusrdefusers.usr -c

    просто закрываю открытый файл.

    Reply
  27. Abadonna

    (26) Она ж не только авторизацию мочит, а, например, диалог запроса переиндексации базы и другие 1С-модальные

    Reply
  28. Fisco

    Плюсовую, вещь нужная и безусловно полезная в хозяйстве. Может я где-то недопонял использование, но у меня вот такой нюанс…. Требуется принудительно нажимать «Да» при запросе переиндексации базы. Пауза по умолчанию в в ini-файле позволяет пользователю успеть нажать «Нет». Делаю минимальную паузу, чтобы пользователь не успел этого сделать, но тогда пользователь не успевает ввести пароль в окне авторизации! )))

    Есть ли возможность задать разные задержки для различных окон?

    Reply

Leave a Comment

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