<?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='\
Материал будет полезен когда есть проблемы с производительностью.Или нужно на ночь запускать кучу фоновых процессов. Так обычно запускают отдельный процесс, даже в толстом клиенте 1С 8 и стараются 1С вообще не трогать.
Весьма полезно. За реализацию оповещения пользователя о ходе процесса выполнения серверных процедур отдельное спасибо.
В случае БСП лучше использовать подсистему ДлительныеОперации. Там все это уже реализовано.
Правильно я понимаю что данную схему можно будет реализовать в 8.2 и в 8.3, верно?
(5) webdimon, верно, зависимостей от платформы 8.3 нет (в демонстрационном примере есть — ПоказатьПредупреждение)
Хотел бы уточнить, к примеру, у меня есть некий рабочий стол на упр.формах., на котором информация обновляется каждые 30 секунд, получение данных для обновления занимает 5 секунд , и все это время , тоесть 5 секунд, пользователь не может работать так как форма висит.
С вашим методом, как я понял, получиться этого избежать, верно?
(7) webdimon, новых методов я не изобретал, я лишь показал одну из возможных реализаций асинхронных вызов скрывающую детали. Любая такая реализация так или иначе все равно будет использовать один и тот же подход — фоновые задания. Я думаю, что моя реализация или любая другая, можешь вам помочь. Но проще проверить, чем строить догадки. Пробуйте, а потом расскажите о результате 🙂
(4) LsrGroup, длительные операции — это одна из частностей асинхронного вызова, если у вас длительная операция прервется, то вы об этом вряд-ли узнаете и ваша важная задача не выполнится в полном объеме.
Весьма наглядная конфигурация. И конкретно в помощь прямо сейчас! Автору респект!!!
сделал асинхронную функцию ЗапускПриложения() . Работает. Но никак не могу разораться как отследить её состояние 🙁
в самой функции делаю архивацию баз данных с командной строки
(11) ybatiaev, нужно сделать следующие вещи:
1. в самой асинхронной функции/процедуре вызывать АсинхронныеВызовы.ОбновитьЗначениеХодаВыполнения и/или АсинхронныеВызовы.ДобавитьСообщениеХодаВыполнения
2. в форме реализовать экспортную процедуру обработчик хода выполнения
3. при запуске асинхронной функции/процедуры 3-им параметром передать ссылку на форму, а 5-ым имя обработчика хода выполнения
P.S. у всех функций программного интерфейса (т.е. находящихся в модуле АсинхронныеВызовы) есть описания, так что думаю разберетесь
(7) webdimon, тебе подойдут фоновые задания. они точно решат твою проблему.
На примере загрузки курсов валют посмотри )
Уважаемый автор, испытывал ваши механизмы, запуском двух и более одновременных асинхронных вызовов. Мне показалось, что фактически они выполняются поочередно, в последовательности запуска.
Возможно ли достичь действительно параллельного выполнения?
(14) kozlovmv, у вас клиент-серверный или файловый вариант базы?
На вебклиенте такие асинхронные вызовы не проканают ?
(9) По сути реализации — практически одно и то же. В БСП тоже есть возможность подключить обработчик оповещения завершения задания. И суть его реализации точно такая же, как у ТС — через обработчик ожидания на клиенте.
Из преимуществ разработки вижу только не завязанный на БСП, более стройный и лаконичный API. Если же БСП уже есть, то нет смысла плодить сущности.
ЗЫ. Упс, не обратил внимание на дату комментария. С тех пор БСП существенно допиливалась. На тот момент этого функционала могло и не быть.
Интересно, когда уже перестанут фоновое выполнение называть асинхронным? Да, оно, конечно, асинхронно, но т.к. callback-функцию приходится изображать с помощью обработчиков ожиданий, это не тру-асинхронность, которая подразумевается под самим этим понятием асинхронности. О как ))
Прикольная штука, реализовал на ней отправку всяческих почтовых уведомлений, когда чтото там не заполнено кем-то, от которых тащятся мои пользователи автору респект.
Добрый день коллеги
Никто не реализовывал закрытие всех фоновых заданий перед закрытием системы?
В том числе и зависших.
(20) а что вы имеете ввиду под закрытием заданий? прерывание сессий? и перед каким закрытием системы — при любом случае, когда пользователь закрывает программу?
да. закрытие всех открытых фоновых заданий.
в мобильном приложении — бывает зависает одно из заданий и грузит потом всю систему.
(20) Добрый день! Мы тоже боролись, боролись и пришли к выводу, что:
1. отключение, какое реализовано в 1С, работает только в клиент-серверном варианте, в файловом не работает вообще;
2. отключение в 1С 100% НЕ гарантирует прибитие сеансов. Не разобрались, но в консоли они видны. Скорее какой-то механизм стартуется на отключение;
3. прибитие сеансов в консоли, тоже не всегда приводит к нужному результату, поскольку фоновые задания настроены на определённое количество раз перезапуска;
4. Есть фоновые задания, которые запускаются вне описанных регламентных заданий со своим режимом перезапуска в случае аварийного завершения. Показалось, что индексируется данные порциями, т.е. даже если одна порция завершилась корректно, запускается следующая. Отключили полнотекстовый поиск и все, какие возможно, регламентные задания… пофигу… фоновые задания стартуются с завидным постоянством.
Что в итоге. написали некое расширение, которое завершает работу пользователя ИЗ ПОД САМОГО ПОЛЬЗОВАТЕЛЯ. Т.е. как бы сам пользователь себя закрывает. Ну вот кроме DefUser…
По крайней мере эта форма отключения корректнее, чем килять процессы в консоли.
P.S.
1. зависшие процессы не киляются;
2. Если у пользователя открылось окно с вопросом и висит, то корректно сам себя этот юзер закрыть не может;
3. Если у пользователя что-то выполняется, то закрытие произойдёт только после завершения выполнения какой-либо операции. Лучше, конечно, свои операции оборачивать в транзакцию.
Короче ещё тоже думаем.
А у мобильного приложения (на текущей в данный момент версии)- оказывается вовсе — может одновременно выполняться только одно фоновое задание — и это официальная «фича». А остальные «встают в очередь». И наблюдаются бАльшие тормоза при запуске нескольких ФЗ
Добрый день! Можете дать обработку скачать. Срочно нужно.
Мне в пустой конфигурации, надо сделать обработку, которая будет делать запись в ркгистре сведений, не могу понять где это мне надо сделать, в общем модуле в фоне или на сервере до фона. Обработка должна быть асинхронной.