"Мигаем" интерфейсом, или цепочки асинхронных вызовов




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

13 Comments

  1. kraynev-navi

    1С могло бы уже наконец, что-то платформенное добавить в наш интерактивный век.

    Вот еще на тему привлечения внимания: анимация фона https://infostart.ru/public/330799/

    Reply
  2. brr

    Класс, спасибо!

    Reply
  3. protexprotex

    Хорошо было бы чтоб была возможность из 1С запустить несколько потоков с барьерной синхронизацией — например, распараллелить умножение матриц друг на друга.

    Reply
  4. Yashazz

    (1) 1С соорудила нахрен не нужную систему внутренних оповещений, а потом сообразила, что с её помощью таки можно «мигать интерфейсом». Читайте зазеркалье. Десяти лет не пройдёт, как будет нам щастье.

    По сути публикации — ничего нового.

    Reply
  5. GreenDragon

    (4) Таки не 1С сообразила с морганием интерфейсом, а топикстартер. 1С дала сервер взаимодействия, если читать зазеркалье. По сути статья о некоем резиновом костыле (гибком решении), который вполне себе может прекратить работать с любым релизом. Причём обрезание возможности указывать нецелочисленные значения в параметрах вызова с 99% вероятностью даже не будет заявлено в фиксах. В общем, на свой страх и риск.

    P.S. Есть что-то неуловимо схожее у этой статьи и тем анекдотом про удаление аппендикса ложкой…

    Reply
  6. Yashazz

    (5) Это да) Согласен)

    Reply
  7. Chrizt

    (5) Не думаю, что интерфейсные «мигания» настолько важны, чтобы отслеживать выпиливание нецелочисленных значений интервала.

    Пример для того и дан, чтобы показать всю несерьёзность использования. А то, если кого-то понесёт костылить из этого что-то более серьёзное…

    например, распараллелить умножение матриц друг на друга.

    А если отвалится «мигалка» — да ну и хрен бы с ней!

    Reply
  8. bonv

    (3) матрицы умножайте во внешней компоненте или в крайнем случае запросом. Но уж точно не встроенным языком

    Reply
  9. protexprotex

    (8) Ну а так я о том и пишу — сделали бы команду умножения матриц друг на друга. Хотя, это уже к 1С-ке мало как относится.

    Reply
  10. Krasnyj

    Мигание интерфейсом — чем плохо, например, мигнуть нужной кнопкой, когда пользователь жмет не туда? 🙂

    Reply
  11. Chrizt

    Статья с Хабра:

    «Параллелизм против многопоточности против асинхронного программирования: разъяснение».

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

    Reply
  12. Бубузяка

    Прикольно.

    Однако, «съезжает» ТекущаяОбласть в «мигающую» ячейку, неудобно. Проверил на форме. Фокус клавиатуры в формах не переместился на «мигалку». Можно применять.

    Reply
  13. sa1m0nn

    Спасибо, КЭП

    Reply

Leave a Comment

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