Внешняя компонента — Показать сообщение в трэе




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

36 Comments

  1. dance000

    Большое спасибо, кстати давно думал чем выводить оповещения для 1С аськи, если 1С свернуто. А можно ли сделать окошки другого вида или размера?

    Reply
  2. zaverax

    можно сделать

    Reply
  3. Evg-Lylyk

    Очень нужно чтобы в трей выводилось только если неактивно окно 1С

    Reply
  4. Evg-Lylyk

    Еще бы размер DLL уменьшить почему такая большая?

    Reply
  5. coder1cv8

    А чем AutoIt не устраивает?… Там есть это и многое другое…

    И состояние окна, кстати, можно определить.

    Reply
  6. Evg-Lylyk

    (5) да я его и использую, но только проверка активного окна и вывод в трей так что можно и сменить на эту

    Reply
  7. pupkinSana

    Так-то прикольно. но когда в ХРюше нажимаешь свернуть все окна, сообщение с треем тоже сворачивается…А это не есть хорошо.

    Reply
  8. Душелов

    А еще есть http://infostart.ru/projects/3277/

    Reply
  9. Душелов

    (5) Кстати, AutoIt не всегда выводит. На одних машинах выводит, на других нет. Закономерности не нашел.

    Reply
  10. O-Planet

    (0) Недавно видел заказ на эту ВК на фрилансе… Не ты его случайно сделал? 😉

    Reply
  11. MNevgeny

    Очень полезная ВК, спасибо!

    Reply
  12. klan

    Спасибо

    Reply
  13. vvS@m

    Спасибо за компоненту. Плюс поставил. Только не понятно про интервал, что ноль, что любое другое — интервал показа один. И еще — при закрытии конфига, в трее остается значок. Чтоб он убрался — надо мышкой по нему просто провести, тогда уберется. Если пользователь открывает и закрывает несколько раз конфиг — значки в трее просто плодятся. Думаю, выход — добавить оператор (команду) выгрузки компоненты.

    А так — нужная вещь!!! Спасибо! И если будет в компоненте больше функций, хорошо бы сделать als, описаловку. Новая дополненная версия если выйдет, думаю, обрадуюсь не только я.

    Reply
  14. zaverax

    подправил по 13 комменту 😉

    Reply
  15. bashta.aleksey

    Спасибо.

    (14) в трее остается значок если несколько раз перезапускать 1С в режиме отладки.

    У сообщений можно задавать заголовок кроме 1С.

    Reply
  16. zaverax

    <У сообщений можно задавать заголовок кроме 1С

    нет

    Reply
  17. Ivon

    При выводе сообщения вместо русского текста знаки вопроса. Я бы полученный текст преобразовывал в UTF8. Тогда у всех русские буквы были бы одинаково. Система Windows 7 x64 Eng

    Reply
  18. Ivon

    Обновленный модуль версии 2 на Windows 7 вообще ничего не выводит…

    Reply
  19. betepon

    Обновленный модуль версии 2 на Windows XP c 1C v 8.1 выводит значек в трей но ничего не показывает.

    Reply
  20. betepon

    использовал так

    Процедура ПриОткрытии()

    Попытка

    ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+»vkshow.dll»);

    ВК = Новый(«AddIn.vkshow»);

    ВК.ShowTray(«Компонента » + КаталогПрограммы() + «vkshow.dll Загружена»);

    Исключение

    Сообщить(«»Компонента » + КаталогПрограммы() + «vkshow.dll Не загружена»);

    КонецПопытки;

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

    Reply
  21. zaverax

    betepon

    на вход функции Showtray нужно подать 3 параметра…

    ВК.ShowTray(<Title>,<Message>,<TimeOut>)

    Пример:

    ВК.ShowTray(«Загрузка»,»Компонента » + КаталогПрограммы() + «vkshow.dll Загружена»,10)

    Reply
  22. zaverax

    на Windows 7 не тестил…ибо такую ОС пока еще наставил…

    Reply
  23. betepon

    ПутьККомпоненте = КаталогПрограммы() + «vkshow.dll»;

    Попытка

    ЗагрузитьВнешнююКомпоненту(ПутьККомпоненте);

    ВК = Новый («AddIn.vkshow»);

    BK.ShowTray(«Загрузка»,»Компонента » + ПутьККомпоненте + «Загружена»,10);

    Исключение

    Сообщить(«Не удалось загрузить компоненту: » + ПутьККомпоненте );

    КонецПопытки;

    При выполнении строчки

    ЗагрузитьВнешнююКомпоненту(ПутьККомпоненте);

    1С вылетает без объяснения причин. Версия 1С 8.1.12.98

    Reply
  24. Ёпрст

    (23) КаталогПрограммы уже идёт с «» на конце… это для начала…

    Reply
  25. betepon

    (24) Не важно. Делал и так и так (кстати надо обратить внимание на пример).

    Reply
  26. betepon

    Сменил версию платформы на 1С 8.1.14.72

    При выполнении строчки

    ЗагрузитьВнешнююКомпоненту(ПутьККомпоненте);

    1С вылетает без объяснения причин

    ПутьККомпоненте = «C:Program Files1cv81invkshow.dll»

    Следует обратить внимание на то, что если-бы попытка не удалась, тогда сработало бы исключение. (23)

    Однако исключение не срабатывает (не успевает). 1С просто завершает работу при вызове внешней компоненты.

    Reply
  27. zaverax

    Перекомпилировал и теперь работает…

    Reply
  28. betepon

    1С больше не вылетает.

    Подключение проходит штатно.

    В трее появляется значек 1С …

    И ВСЕ…

    Какие-бы сообщения не отправлялись и какой-бы таймаут не выставлялся. Сообщения не появляются.

    Для контроля подключил Вашу обработку.

    Эффект тот-же.

    Может в системе не хватает какой-то библиотеки?

    Reply
  29. zaverax

    <Может в системе не хватает какой-то библиотеки?

    Операционка какая?

    Reply
  30. betepon

    Win XP SP2

    Reply
  31. zaverax

    значит глюк у тебя какой-то…никаких дополнительный библиотек не надо…только стандартный набор операционки…

    Reply
  32. betepon

    Проверил на разных машинах.

    Эффект одинаковый. На всех машинах стоит Win XP Alternative SP3

    Reply
  33. Душелов

    (32) Попробуй мою http://infostart.ru/projects/3277/

    Если не заведется, то дело в системе…

    Reply
  34. winsnik

    Как быть???

    Пишет что в строке «ВК = Новый(«AddIn.vkshow»);»

    процедура вызывается как функция… И все больше ничего…

    Reply
  35. yus12

    А можно посмотреть скрин работы компоненты?

    Reply
  36. vladen

    хм… / а что может быть причиной ошибки «Ошибка при загрузке внешней компоненты» при открытии обработки???

    Reply

Leave a Comment

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