Своя индикация длительной операции во внешней обработке




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

18 Comments

  1. herfis

    А БСП 2.4 зачем? Что они там опять поменяли?

    Я аналогичную фигню для 2.2/2.3 делал, причем без копирования общих модулей и допилок. Правда давно было, подробностей уже не помню 🙂

    Reply
  2. vadim1011985

    (1) Если честно не сильно вникал что там поменялось (просто смутило то что на its.1c для версия БСП 2.3 и БСП 2.4 немного по разному было описан механизм запуска фоновых заданий для дополнительных обработок), возможно и для БСП 2.3 будет работать , на счет копирования — копируется всего одна функция общего модуля к себе в обработку , дописывается 2 строчки и пишется процедура обработчик прогресса и все — не надо думать как передать результат с сервера на клиент , как как получить фоновое задание для проверки,его выполнения, на нужно писать подключаемые обработчики для проверки выполнения фонового задания или для считывания прогресса — все это уже реализовано.

    По мне так это очень простой и эффектный способ решения , ради которого можно потратить 2 минуты (или меньше) своего времени и скопировать процедуру к себе в обработку.

    Reply
  3. herfis

    (2) Согласен. Усилий минимальное количество. Плюсанул.

    Reply
  4. Xershi

    Отличная статья, чуть раньше разбирался по https://infostart.ru/public/842660/.

    Но автор опустил много подробностей, которые существенно влияют на разработку.

    Как я там комментировал, то прогресс через БСП не реализуется. Нужна своя индикация в виде элементов или можно передавать в процедуру состояние.

    Reply
  5. vadim1011985

    (4) Указал ссылку на мою же статью )))

    Reply
  6. Xershi

    (5) не смотрел на автора. А для чего было дублировать статью?) Я думаю стоит указать там ссылку на шаблон!

    Reply
  7. vadim1011985

    (6) нет, ты не понял ты указал ссылку на ЭТУ статью

    Reply
  8. Xershi

    (7) понял, исправил!

    Reply
  9. vadim1011985

    (4)

    то прогресс через БСП не реализуется. Нужна своя индикация в виде элементов или можно передавать в процедуру состояние.

    Опять же , если смотреть в типовой конфигурации , там тоже проценты прогресс выводится через элементы формы

    Reply
  10. Xershi

    (9) есть форма прогресса без процентов, с кружочком, туда можно запихнуть статический текст и кружок будет крутиться. А прогресс отдельно на форме что ли будет выводиться в типовом варианте? Это через сообщить прогресс?

    Reply
  11. vadim1011985

    (10) Нет , имеется ввиду что на форме просто размещается поле Индикатор в котором выводится прогресс, для примера можно посмотреть типовую обработку — ВыполнениеОбменаДанными. т.е. сами 1с-ки используют элементы формы для отображения прогресса, по сути это и есть БСП с помощью СообшитьПрогресс передать информацию о ходе выполнения операции и графически отобразить ее с помощью поля индикатор

    Reply
  12. Franchiser

    (2) не понял из статьи: на основании чего рассчитывается прогресс, откуда известно сколько данных в выборке будет обработано в фоновом задании? Нужно как-то описывать расчет прогресса?

    Reply
  13. vadim1011985

    (12) Да, подсчет прогресса вы организовываете сами при выполнении длительной операции . В модуле объекта обработки должны быть процедура ВыполнитьКоманду в который Вы описываете ваш алгоритм длительной операции (например создание документов по данным из файлов ) и в любом месте Вы можете вызвать метод ДлительныеОперации.СообщитьПрогресс где будуту передавать прогресс выполнения либо текст например так

    Процедура ВыполнитьКоманду(ИдентификаторКоманды,ПараметрыВыполнения) Экспорт
    
    ДлительныеОперации.СообщитьПрогресс(5,»Начало загрузки»);
    
    ТабЗагрузки.Очистить();
    НайденныеФайлы = НайтиФайлы(ПараметрыВыполнения.Каталог,»*.csv»,);
    
    Обработано = 0;
    
    Для каждого ТекФайл Из НайденныеФайлы Цикл
    
    
    ТекстСопровождения = «Обработано «+Обработано+ » из «+НайденныеФайлы.Количество();
    
    ПроцентОбработки = Цел(Обработано/НайденныеФайлы.Количество()*100);
    
    ДлительныеОперации.СообщитьПрогресс(ПроцентОбработки,ТекстСопровождения);
    ПрочитатьФайл(ТекФайл.ПолноеИмя,ПроцентОбработки);
    КонецЦикла;
    
    КонецПроцедуры
    
    Процедура ПрочитатьФайл(ТекИмяФайла,ТекущийПроцент) Экспорт
    ….
    ….
    …..
    
    ТекстСообщения = «Читаем файл  «+ ТекИмяФайла;
    
    ДлительныеОперации.СообщитьПрогресс(ТекущийПроцент, ТекИмяФайла);
    КонецПроцедуры
    
    

    Показать

    Reply
  14. Franchiser

    (13) понял, спасибо.

    Reply
  15. Date

    Добрый день.

    Скачал вашу обработку. Что то не взлетает шаблон у меня.

    Добавил индикатор на форму. Процедуру ПрогрессВыполнения() вставил вашу.

    Но ничего не происходит. И отладить не понятно как внешнюю обработку добавленную во внешние отчеты и обработки.

    Если через файл открывать, то отладить конечно можно, но код вообще тогда не работоспособен.

    Не понимаю, что не так.

    Раньше делал через фоновое задание: Сообщение пользователю — ПолучитьСообщенияПользователю, но использовал общий модуль.

    Захотелось, что бы весь код был в модуле обработки + на БСП, но, что то понять не могу что не так.

    Может быть нужно еще что то прописать?

    Reply
  16. vadim1011985

    (15) можете прислать Вашу обработку я посмотрю что не так

    Reply
  17. Date

    (16)Напишите пожалуйста почту, я не вижу ее в профиле.

    Reply
  18. Date

    (17)Спасибо, действительно дело было в установленном параметре запуска: «РежимОтладки «.

    Reply

Leave a Comment

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