Task manager 1C — менеджер запущенных приложений 1С




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

40 Comments

  1. mirco

    Класс ❗ , давно хочу такую штучку сбацать.

    Сейчас буду качать и тетстить 😀

    Reply
  2. IronDemon

    Пути не определяются для серверных баз 8.х. 😥

    Reply
  3. Alraune

    (2) Так автор же про это написал.

    (0) Работает, понравилось.

    Reply
  4. vcv

    Не хватает определения 1Сного и/или виндового пользователя. Что бы с терминале «убивать» нужного пользователя.

    Reply
  5. salexdv

    (4) Ну виндового, думаю, добавлю. С 1С-ным уже хуже

    Reply
  6. Serj1C

    +, развивай еще!

    PS: c Гаджетом «Memory 1C» данные сошлись ))

    Reply
  7. Serj1C

    (5) Заголовок окна 1С можешь вывести?

    Reply
  8. salexdv

    (7) Сделаю сегодня

    Reply
  9. ACE$

    класс! этого мне и не хватало

    Reply
  10. Душелов

    Нормально! Так держать! 🙂 Побольше б таких разработчиков! :))

    Reply
  11. salexdv

    (10)(11) Спасибо! 🙂 Надо будет глянуть.

    Reply
  12. Abadonna

    (10)

    Нормально! Так держать! Побольше б таких разработчиков! )

    Согласен, но с кое-какими но:

    1.

    Для работы необходим установленный Microsoft .NET Framework 3.5.

    2.

    При работе программы используется приложение Handle, разработчик Mark Russinovich

    Поставленная задача спокойно решается использованием psapi, и в таком случае не надо никаких Microsoft .NET Framework 3.5, а равно и Руссовичей.

    IMHO, экзюк должен быть «энергонезависимым».

    Reply
  13. Abadonna

    Продолжу мысль (13).

    Заманчиво, например, закинуть на флеху разработку автора http://infostart.ru/public/68783/

    Пришел фрилансер, аутсорсер (или даже, чур меня!, франч 😀 ) к клиенту, а у того и в помине нет никакого Microsoft .NET Framework, и всё, амба! 😥

    И даже поставить его не всегда можно в зависимости от доменной политики у клиента.

    Reply
  14. Abadonna

    Замечена особенность:

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

    Если же запускать TaskManager1C после уже работающих задач — всё ОК (рис.2)

    Reply
  15. salexdv

    (15) Точно-точно, это мое упущение, обязательно поправлю

    (13) А вот за psapi спасибо! 😉 Надо будет его взять на вооружение

    Reply
  16. Abadonna

    (16)

    А вот за psapi спасибо!

    Не за что. А вот Душелова ты не шибко слушай (11), проггер он высококласснейший, но уж больно подсевший на Microsoft .NET Framework 😉

    Reply
  17. Abadonna

    Нарыл классную прогу Process Viewer, даже memory dump может делать.

    Прилагаю, вдруг кому понадобится. Пароль на архив: 123

    Reply
  18. Abadonna

    +(18). Вид

    Reply
  19. salexdv

    (18) Из того же разряда process explorer — вещь!

    Reply
  20. Abadonna

    (20) Ключевые слова memory dump 😉

    Reply
  21. alyuev

    Еще бы сортировку прикрутить по полю «База». Но и без этого программа полезная! Спасибо!

    Я в терминале выкручиваюсь создаванием нескольких файлов 1cv77.exe переименованных под имя базы типа 1cv77_plan.exe. И в ярлыке запуска базы прописываю тот exe, который нужен. Но это всё — костыли. А «Task manager 1C» — это уже интересней!

    Ещё я пользуюсь в «Диспетчере служб терминалов» полем «Время простоя», чтобы отключать в первую очередь тех, кто давно не работает с базой. Эту информацию можно вывести в «Task manager 1C»?

    Reply
  22. salexdv

    (22) Нее, не получится 🙁

    Reply
  23. alyuev

    (23) Не получится что? Сортировка по полю «База» или вывести время простоя?

    Reply
  24. salexdv

    (24) Вывести время простоя

    Reply
  25. alyuev

    А сортировка получится?

    Reply
  26. salexdv

    (26) Сделаю

    Reply
  27. alyuev

    Пасиба! 😀

    Reply
  28. bulpi

    Не работает у меня 😥 Ошибку выдает стандартную Windows с предложением послать Microsoft. У меня ХР СП2, NetFrame 3.5 установил.

    Reply
  29. salexdv

    (29) В какой момент выдает ошибку, в момент запуска, в процессе работы, при закрытии?

    Reply
  30. bulpi

    (30) В момент запуска. Handle запускал, согласился, с этим все в порядке. Антивирусник пробовал отключать, не помогло.

    Reply
  31. 4ish

    При попытке запустить прога пишет «Не обнаружен один из модулей программы. Дальнейшая работа невозможна!»

    NetFrame 3.5 стоит, Handle запускал, с условиями использования соглашался.

    И что делать?

    Reply
  32. salexdv

    (32) Такое сообщение выдается в 2 случаях:

    • В каталоге с программой отсутствует папка Modules
    • В папке Modules отсутствует файл Handle.exe
    Reply
  33. 4ish

    Да, все заработало. 🙂

    Спасибо.

    Reply
  34. Autodafe

    Автору респект. Вот еще бы добавить возможность сворачивания в трей, как у диспетчера задач. 🙂

    Reply
  35. xpym-xpym

    хорошо 💡 удобно 🙂

    PID процесса туда бы еще прикрутить ))

    и возможность не получать список файлов и модулей

    з.ы. при большом количестве открытых баз на терминальном серваке немного задумывается)

    Reply
  36. Trof@

    якшо після запуска Task manager вийти з 1с, то в список файлів і модулів не очищається, дрібниці, але косяк 😀

    Reply
  37. alyuev

    А когда же сортировку получится сделать? Было бы очень удобно!

    Reply
  38. Veduin

    Практичная штука… Очень полезна. Спасибо!

    Reply
  39. izz

    Мне понравилась, пользуюсь очень давно!

    Reply
  40. salexdv

    (44) Спасибо!

    Reply

Leave a Comment

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