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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *