ПрогрессБар в строке состояния




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

19 Comments

  1. Serj1C

    в принципе и на 8.х заработает

    Reply
  2. sytkosa

    (1) На 8-ке есть штатный через компановку

    Reply
  3. anig99

    Шепот Теней уже давно такой пример статус бара приводил

    Reply
  4. Boog

    Тормозить будет……………………………………………..

    Reply
  5. via

    дополнительно конечно оказывает небольшую нагрузку (на каждые 100 000 операций + 5 секунд)…

    я сейчас вставляю этот «прогрессор» везде.

    … без него ощущаю себя ослом перед зеркалом.

    … помогает оценить объем работ.

    Если обработка робит долго (например, больше часа, то юзаю уже http://infostart.ru/public/78034/ )

    Reply
  6. gucci76

    Процедура глПрогрессор(Сообщение,Всего,Текущ,ТекущийПроцент) Экспорт

    Если Всего>0 Тогда

    Процент=Цел(Текущ/Всего*100);

    Если Процент = ТекущийПроцент Тогда

    Возврат; // не надо лишний раз перерисовывать

    КонецЕсли;

    Если Процент > Цел((Текущ-1)/Всего*100) Тогда

    Состояние(Сообщение + «: «+Формат(Процент,»Ч(0)2»)+»% «+СтрЗаменить(Формат(«»,»С»+Мин(99,Процент)),» «,»l»)+СтрЗаменить(Формат(«»,»С»+Мин(99,99-Процент)),» «,»‘»)+»l»);

    КонецЕсли;

    КонецЕсли;

    КонецПроцедуры

    Reply
  7. via

    не уверен что скорость увеличится пропорционально навороченным наворотам 😉

    Reply
  8. krupp

    Всегда считал, что красивое должно быть минималистским.

    Супер!

    Reply
  9. artbear

    (0) Тормозить будет, нужно с какими-то перерывами 🙁

    Reply
  10. via

    … ага, с перекурами 😉

    Reply
  11. gucci76

    (7) Возможно что и не увеличится, т.к. используется Состояние();

    Я просто использую подобное в форме через Форма..Заголовок(), и в нем перерисовка заметно увеличивает время.

    Поэтому и написал.

    Признаю свою невнимательность!!!

    Reply
  12. via

    (11) Проверка на изменение процента уже есть:

    Если Процент > Цел((Текущ-1)/Всего*100) Тогда

    другое дело, что предыдущий процент каждый раз пересчитывается… Но я проверял — нагрузка при этом не большая.. Обычно нагрузку на процессор на 99,999 % оказывают другие «операторы».

    Reply
  13. gucci76

    (13) Дейстительно! Можно и так проверить изменение процента! А я не догадался! 😀

    Reply
  14. SashaA

    Подскажите пожалуйста как встроить:

    Для ин=1 По 100000 Цикл

    глПрогрессор(«Тест»,100000,ин);

    КонецЦикла;

    в например:

    Процедура XXXXX()

    СПР=СоздатьОбъект(«Справочник.Контрагенты»);

    СПР.ВыбратьЭлементы ();

    Пока СПР.ПолучитьЭлемент () = 1 Цикл

    ТРАЛИ ВАЛИ

    КонецЦикла;

    КонецПроцедуры

    Заранее спасибо.

    Reply
  15. romanuil

    Работает, и очень просто в программировании.

    Reply
  16. via

    (14) SashaA,

    Прогрессбары встраиваются туда, где известно общее кол-во «итераций»

    Я иногда сначала пробегаю по справочнику (документам), узнаю общее кол-во элементов, а затем уже (вторым циклом) использую прогрессбар (глПрогрессор(«Обработка»,ЭлементовВсего,ин))

    Reply
  17. Rockman

    Просто и наглядно.

    Reply
  18. kostya_whiskas

    Объясните плиз, что за конструкция Формат(«»,»С»+Мин(99,Процент)

    Пытаюсь реализовать на 8.х. С 7.х не работал

    Reply
  19. eshtrey

    (18) Формат(«»,»С»+Мин(99,Процент)) — функция форматирования строки. Второй параметр задает длину строки. Если параметр равен, например С99, то на выходе получим строку длиной 99 символов.

    Т.к. первый параметр пустая строка, то на выходе будет строка состоящая из 99 пробелов.

    Reply

Leave a Comment

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