Выгонялка пользователей с визуальным таймером




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

45 Comments

  1. Magister

    А как же тонкий клиент? Веб-клиент?

    Reply
  2. Kavar

    (1) Я с ними, на данный момент, не работаю. В статье подход описан. заточить под свои нужды, я думаю, не проблема.

    Reply
  3. Abadonna

    (1)

    А как же тонкий клиент?

    1. Миракл со всеми бантиками вполне благополучно работает в тонком клиенте (рис.)

    2. Тонкий клиент 1С, по большому счету, — изврат, все нормальные люди в терминале работают, а он и есть тонкий клиент. Даже железо «тонкий клиент» уже есть.

    Reply
  4. SergioVB

    (3) Abadonna,

    Изврат не изврат. Все равно к этому все идет. Посадят на управляемые формы, хочешь или нет.

    Reply
  5. Кафтан

    + за компоненту

    Reply
  6. Abadonna

    Я что-то решил у своих сделать не через Загрузить…

    Функция ЗагрузитьMiracleV8() Экспорт

    Попытка

    ПодключитьВнешнююКомпоненту(«AddIn.MiracleV8»);

    Miracle=Новый COMОбъект(«AddIn.MiracleClass»);

    Исключение

    Miracle=Неопределено;

    Сообщить(«Не удалось подключить MiracleV8»,СтатусСообщения.Информация);

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

    Возврат Miracle;

    КонецФункции

    Reply
  7. Magister

    (3) Хм… тогда может сможете подсказть, как решить такую проблему:

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

    Как это всё дело заставить нормально работать в терминале, без головной боли для админа?

    Сейчас все в толстом клиенте, без терминала — но хотелось бы больше нагрузки перенести на сервер.

    Тонкий клиент это решит, а вот как сделать такую схему управляемой (и расширяемой до произвольного количества пользователей) при использовании терминала? Да, каждый СШК работает как виртуальный COM-порт.

    Спрашиваю не из праздного любопытства, реально есть такая проблема.

    P.S. А то, что Миракл работает и в тонком клиенте — не знал, спасибо за информацию.

    Reply
  8. Abadonna

    (7)

    А то, что Миракл работает и в тонком клиенте — не знал, спасибо за информацию.

    Вообще-то она открытым текстом лежит прям в кратком описании, где ей и положено

    Сервис-М MiracleV8 😉

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

    Для сканеров ШК надо родную ПолучитьИмяКомпьютераТО() заменить на

    // Функция возвращает строку c именем компьютера для нужд торгового оборудования.

    //

    // Возвращаемое значение:

    // Строка — имя компьютера для торгового оборудования.

    //

    Функция ПолучитьИмяКомпьютераТО() Экспорт

    WSS = Новый COMОбъект(«WScript.Shell»);

    WSSE = WSS.Environment(«Process»);

    мИмяКомпьютера = ВРег(WSSE.Item(«ClientName»));

    Если ПустаяСтрока(мИмяКомпьютера) Тогда

    мИмяКомпьютера = ВРег(ИмяКомпьютера());

    КонецЕсли;

    Если мИмяКомпьютера = «CONSOLE» Тогда

    мИмяКомпьютера = ВРег(ИмяКомпьютера());

    КонецЕсли;

    Возврат мИмяКомпьютера;

    КонецФункции // ПолучитьИмяКомпьютераТО()

    Тогда вернется имя компа, с которого проброшен порт в терминал (их родной вернет имя самого терминала)

    Могу сказать, что спокойненько тестировал новый СШК из нашего офиса, подключившись через VPN на терминал клиента.

    Reply
  9. Magister

    (8) Просто последний раз смотрел на Miracle давно-давно, как только она была выложена тут.

    //

    Спасибо, хороший вариант!

    А номер порта какой получится? У каждого клиента будут свои COM1, COM2 и т.д., или нумерация сквозная?

    Reply
  10. klel

    Спасибо огромное долго искал что то подобное 🙂

    Reply
  11. Lukich66

    Ничего не имею против данной реализации, но почему-то подумалось,а что в 1с не понимают,что подобный «сервис» необходим? А так «вламывать» в конфу черт-знает что- смысл? За что деньги плачены?

    Reply
  12. veforg

    (11) Lukich66, 1с поступает правильно. Если бы они всякий функционал встраивали, то нам, программистам, нечего будет есть )

    Reply
  13. Abadonna

    (11) Lukich66,

    но почему-то подумалось,а что в 1с не понимают,что подобный «сервис» необходим?

    В свое время мне подумалось: а что им стоит сделать наипростейший индикатор прогресса на форме 7.7?

    Это было еще на 13-ом релизе движка. Вышел и 27-й, а ведь так и не сделали!

    Именно из-за этого прогресс-бара я и начал писать ВК ;)))

    Или вот: что им стоит сделать в 8.2 индикатор раскладки клавиатуры? В Конфигураторе есть (на фиг там не нужен), а вот в самой проге — нет, хотя в терминальном режиме бывает нужен.

    Reply
  14. Lukich66

    Уровень активности сообщества 1с по 5-ти бальной шкале=1.5, думаю со временем мы сможем заставить «трудяг-производителей» сделать нам «красиво»- вроде все как бы к этому идет,ну с «отскоками» конечно, неоспоримо 8.2>8.1>8.0>7.7>6.0>2.0проф- явно прослеживаются парралели с MicroSoft Win- азарт и прыть оч.похожи. А нам «сообщникам» дел хватит и без «глобальных» замахов.

    Reply
  15. electronik

    В принцепе неплохо

    Reply
  16. jeniav

    Неплохая идея, надо попробовать, а то вечно пользователь ничего не видит и не читает

    Reply
  17. botcc

    Конечно круто, но у меня более 700 челов в 1ске регистрить dll каждому на компе… да меня свора наших сисадминов обгладает…

    Reply
  18. bissov

    Не совсем понимаю, а чтобы с SQL выгоняло надо компоненту у каждого пользователя регестрировать или вообще всем админские права давать?

    Reply
  19. Pashikuss

    надо попробовать

    Reply
  20. Kavar

    (17),(18), Если пользователи в терминале, то достаточно один раз на сервере(ах) 1С с админскими правами запустить.

    А вот если по сети, тогда на каждом компе надо регить.

    Reply
  21. farg066

    Помогите, пожалуйста

    Все сделал, как написано автором, но при завершении работы возникает следующая ошибка

    —————————

    {Обработка.ТОСервер(3321)}: Ошибка при вызове метода контекста (Найти): Неверное имя колонки

    ТО = Оборудование.Найти(Источник, «ИмяИсточникаВнешнегоСобытия»);

    по причине:

    Неверное имя колонки

    —————————

    До возникновения ошибки в переменной источник содержится след инфа “ MiracleV8 ”

    Reply
  22. Kavar

    (21) Добавь условие, что если Источник = “ MiracleV8 ”

    не вызывался этот метод.

    Reply
  23. Abadonna

    (18) bissov,

    надо компоненту у каждого пользователя регестрировать или вообще всем админские права давать?

    Забавно, что новая генерация «чистых восьмерочников» задает вопросы, которые на сто рядов обсосаны семерочниками года эдак с 2000-го. Подключение ВК хоть к семерке, хоть к восьмерке а равно и проблема с правами по большому счету вообще к 1С отношения не имеют. Любой COM (ActiveX) обязан прописаться в реестре Windows, если у пользователя таких локальных прав нема — то и свободен он, как птица в полете;)

    Reply
  24. denj

    неплохая выгонялка! только вот окно маловатенькое библиотеки, пользователи поначалу не замечали ее

    Reply
  25. Kavar

    (24) Окно таймера? Нормальное окно. в глаза сразу бросается. очень сложно его не заметить.

    Reply
  26. denj

    (25) ну видимо пользователи слепые такие, им надо окно на полэкрана чтобы выскакивало наверное

    Reply
  27. Abadonna

    (24) denj,

    только вот окно маловатенькое библиотеки, пользователи поначалу не замечали ее

    А сделай его побольше, эти [цензура] сразу начнут жаловаться, что оно мешает.

    Плавали — знаем!

    Reply
  28. Alex353

    При загрузке компоненты выскакивает сообщение об ошибке, что не найден файл bass.dll. Поиск что это за файл и в какой пакет входит результатов не принес. Что это за файл никто не в курсе?

    Reply
  29. Kavar

    (28)Читайте последний комментарий на страничке ВК.

    Короче, более старую версию надо загрузить.

    Reply
  30. vitn

    Интересная вешь…….

    Reply
  31. shurix

    Для 1С 7.7 работать не будет случаем?

    Reply
  32. eoego1

    Хороший которого не хватало. Спасибо!

    Reply
  33. Kavar

    (31) Эта ВК поддерживает 1С 7.7 так, что работать будет. код только переделать нужно.

    Reply
  34. OrsoBear

    Идея хорошая, но мне к сожалению не помогла.

    Сервер на линуксе. СОМ-объекты и регистрация dll не по адресу.

    Reply
  35. denj

    а на windows 7 не работает? почему то пишет что не подключена библиотека, хотя лежит в папке где полагается..

    Reply
  36. Kavar

    (35) Для регистрации библиотеки первый раз нужно запустить 1С от имени Администратора.

    Reply
  37. denj

    (36) ну я и есть администратор

    Reply
  38. Kavar

    (37) В Win7 если ты работаешь под учеткой администратора, не значит, что ПО у тебя от имени администратора запускается. Либо ПКМ -> «Запуск от имени администратора», либо отключить UAC, что крайне не рекомендуется.

    Reply
  39. AlX0id

    Я правильно понимаю, что для работы этой вещи необходимо наличие оной компоненты на каждом компьютере каждого пользователя?

    Reply
  40. Kavar

    (39) AlX0id, Если 1С сетевая и запускается у каждого пользователя локально — да. если работа идет в терминальном режиме — одна компонента на сервере.

    Reply
  41. AlX0id

    (40)

    тады не вариант.. эт за каждым компом следить надо будет.. перерегистрировать ее в случае чего..

    Reply
  42. Kavar

    (41)Ну дык, платформу то так и так на всех обновляешь. при обновлении ее просто в новую папку перекинуть надо.

    Reply
  43. AlX0id

    (42)

    Ну дык, платформу то так и так на всех обновляешь

    .. и еще десяток компонент обновишь — так что ли?

    Я не в претензии, конечно — просто указываю недостатки подобного подхода.

    Reply
  44. 4ittmk

    — выгоняет всех «без вопросов»(модальные окна не помеха);

    У меня не выгоняет, например, если пользователь нажал перед этим Справка/О программе…

    или

    Просто запустил базу, вылетело окно «Итоги в информационной базе рассчитаны по…» и пользователь больше к базе не прикасался так и не закрыв окно.

    Reply
  45. 4ittmk

    Не понравилось, что если начать выгонять пользователей, а потом отменить секунд через 30, то все равно выгонит, хотя константа уже обнулена.

    Reply

Leave a Comment

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