Активные пользователи: посмотреть, оповестить, выгнать из базы (updated)




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

52 Comments

  1. Арчибальд

    + за просьбу не плюсовать 😀

    Reply
  2. cleaner_it

    Поставил плюс http://www.infostart.ru/public/15688/.

    Но раз уж так — дай ссылку на свою доработку на форуме http://www.infostart.ru/public/15688/, или попроси coder1cv8 сделать ссылку на твою публикацию. Иначе потеряется твоя полезняшка, и

    которая кому-то может оказаться полезна

    — останется лишь мечтой

    Reply
  3. Yashazz

    Ах да, есть ещё всякие мелочи. Например, если дата начала сессии не сегодняшняя, то подсветится красным, так «висяки» сразу видно. Возможно, прикручу и время бездействия для каждого юзверя…

    Reply
  4. w-divin

    Плюсанул и там и тут… весчь полезная — доработки нужные )))

    Reply
  5. markers

    Было бы не плохо скриншотик какой-нить, и описание по лучше…

    ЗЫ: Мой давнишний вариант обработки coder1cv8 (за что ему спасибо!): http://infostart.ru/public/21475/

    Reply
  6. MadRabbit

    Замечательная штука — возьму на вооружение. Правда, на работе пользователи через терминальный клиент citrix’a подключаются — обработка не работает 😥

    Reply
  7. Yashazz

    (5) Ага, хорошо, что ты проявился — я что-то не сумел откопать прямой линк на твой вариант. Тебе спасибо тоже!

    Reply
  8. v.l.

    Плюс за полезности и отсутствие наглости.

    Reply
  9. lookindenis

    просьба

    на 7.7 что-то подобное.

    Reply
  10. woozee

    Скачал… запустил.. «Только клиент-серверный вариант»…. лимит скачиваний исчерпан. спасибо! 👿

    Reply
  11. Yashazz

    (10) Упс, поправлю, конечно. Виноват. 🙁

    Reply
  12. Zen13

    +1. Немного подработал под свои нужды.

    Reply
  13. robotq

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

    Reply
  14. uropek

    Интересно, почему 1с штатно в системе этого не реализует. Вещь то незаменимая

    Reply
  15. smok1986

    рахмет за штуку такую, очень полезная вещь!

    Reply
  16. edyardg

    Поленая вещь! У меня не работает в файлом варианте!

    Reply
  17. Serggray

    Хочется скачать, а не могу балов не хватает 🙂

    Reply
  18. vremennii

    а есть ли такая фитча для файлового варианта?

    Reply
  19. SNT

    Не работает через сервер терминалов. А вообщем вещь полезная.

    Reply
  20. cs25

    Выдаёт ошибку (клиент-сервер):

    {Форма.Форма.Форма(221)}: Ошибка при вызове метода контекста (ConnectAgent): Произошла исключительная ситуация (V81.COMConnector.1): Различаются версии клиента и сервера (8.1.15.14 — 8.2.14.519), клиентское приложение: COM-администратор

    Что может быть ?

    Reply
  21. Yakud3a
    cs25 пишет:

    Выдаёт ошибку (клиент-сервер):

    {Форма.Форма.Форма(221)}: Ошибка при вызове метода контекста (ConnectAgent): Произошла исключительная ситуация (V81.COMConnector.1): Различаются версии клиента и сервера (8.1.15.14 — 8.2.14.519), клиентское приложение: COM-администратор

    Что может быть ?

    Пришлось на форуме пофлудить чтоб скачать, и тож самое)

    Reply
  22. Yakud3a

    Решение было на поверхности V82.COMConnector.1

    Reply
  23. maxpostal

    На 8.2 пойдет?

    Reply
  24. Fialka88

    на 8,2 подойдет Управление Торговлей

    Reply
  25. maxpostal

    Спасибо! Вещь очень полезная, много функций, которых так не хватает в штатной конфигурации!

    Reply
  26. Гость
    Fialka88 пишет:

    на 8,2 подойдет Управление Торговлей

    Что значат ваши слова? На 8.2 УТ 10.3 внешняя обработка не может быть прочитана текущей версией программы.

    Reply
  27. afavor

    Очень полезная вещь.

    Reply
  28. petrovaUL

    Спасибо, пригодится. Будет ли доработана?

    Reply
  29. greenvitla

    🙂 вот это вещь

    Reply
  30. bonzo84

    Спасибо, пригодилось!

    Чтобы сообщение передавалось по локальной сети, на компьютере с Windows XP пользователя должна быть включена служба Messenger — некоторые умельцы-олптимизаторы отключают ее. 🙂

    Хорошее дополнение для вот этой обработки:

    http://infostart.ru/public/21475/

    Reply
  31. pvlunegov

    Автору спасибо за хорошую обработку!

    У меня все заработало в 1С 8.2.14 КА. Сообщения отправляются, пользователи выгоняются…

    Reply
  32. Maks888

    Автор молодец, очень социально-ответственный человек =) Весьма нужная обработка!

    Reply
  33. dimaxx

    (26) Гость, Это означает, что отличается версия программы 1С. Решение: открыть в своем конфигураторе и сохранить.

    Reply
  34. sammas

    спасибо. выручает периодически.

    Reply
  35. yavasilek

    На 1С:Предприятие 8.2 (8.2.14.540) не заводится. После конвертации выдает:

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

    Reply
  36. Yashazz

    (35) Знаю. У себя переделал, а выложить обновлённую забыл, замотался. Извиняюсь. Выложу на днях.

    Reply
  37. yavasilek

    (36) отпишись плиз в теме — чтоб люди по подписке увидели обновление

    Reply
  38. nick_e

    Эта штука выгоняет не важно из sql или файловых баз?

    Reply
  39. nick_e

    Что то не могу понять, клиент — северный режим это что?

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

    Reply
  40. yavasilek

    (39) nick_e, файловый.

    Reply
  41. Yashazz

    Короче говоря, времени у меня нетути, поэтому, кому нужно, поправляйте строку V81.ComConnector на V82.ComConnector соответственно. Там есть ещё тонкости, но это точно не сейчас. Приношу извинения, но я и так работаю по 14 часов в сутки.

    Reply
  42. ponaroshku

    Спасибо за обработку

    Reply
  43. dyak84

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

    Reply
  44. Yashazz

    (44) Честно сказать — не пробовал. Уже не помню. 🙁

    Reply
  45. maxpostal

    (41) Очень жаль, что у автора нет времени на доработку обработки под платформу 8.2. Предложенный вариант с заменой строки почему то не сработал, может есть еще какие тонкости?..

    Reply
  46. Small sa

    Для 8.2 выгонялка хорошо описана здесь: http://infostart.ru/public/77671/

    Reply
  47. vremennii

    а есть уже готовый вариант чтоб опробовать на деле?

    Reply
  48. vremennii

    кстати этот http://infostart.ru/public/90241/ вариант еще никто не пробовал?

    Reply
  49. Small sa

    Если надо отключить всех, кроме себя, то код ниже подойдет:

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Пользователь=»Администратор»;
    Пароль=»»;
    
    Попытка
    СписокОтключенныхПользователей=Новый СписокЗначений;
    СписокНЕОтключенныхПользователей=Новый СписокЗначений;
    СтрокаСоединения=СтрокаСоединенияИнформационнойБазы();
    ЭтоСоединение=НомерСоединенияИнформационнойБазы();
    Сервер=НСтр(СтрокаСоединения,»Srvr»);
    Если СтрДлина(Сервер)>1 И Сред(Сервер,СтрДлина(Сервер),1) = «1» Тогда
    Сервер = Сред(Сервер,1,СтрДлина(Сервер)-1);
    Сервер = Сервер+»0″;
    КонецЕсли;
    База=НСтр(СтрокаСоединения,»Ref»);
    КОМ = Новый COMОбъект(ИмяКонектора());
    Агент=КОМ.ConnectAgent(Сервер);
    Кластеры=Агент.GetClusters();
    Кластер=Кластеры.GetValue(0);
    Агент.Authenticate(Кластер,»»,»»);
    РабочиеПроцессы=Агент.GetWorkingProcesses(Кластер);
    
    Для Каждого Процесс Из РабочиеПроцессы Цикл
    Если Процесс.Running = 0 Тогда
    Продолжить; // Если процесс не запущен, то слетает 1С
    КонецЕсли;
    СтрокаСоединенияРП=Процесс.HostName+»:»+Формат(Процесс.MainPort,»ЧГ=»);
    СоединениеРП=КОМ.ConnectWorkingProcess(СтрокаСоединенияРП);
    СоединениеРП.AddAuthentication(Пользователь,Пароль);
    ОписаниеИБ=СоединениеРП.CreateInfoBaseInfo();
    ОписаниеИБ.Name=База;
    Соединения=СоединениеРП.GetInfoBaseConnections(ОписаниеИБ);
    
    Для Каждого Соединение Из Соединения Цикл
    Если Соединение.AppID = «backgroundjob» ИЛИ Соединение.AppID = «designer» ИЛИ Соединение.AppID = «comconsole» ИЛИ
    Соединение.UserName=»exchange» ИЛИ Соединение.UserName = ИмяПользователя() Тогда
    Если СписокНЕОтключенныхПользователей.НайтиПоЗначению(Соединение.UserName)=Неопределено Тогда
    СписокНЕОтключенныхПользователей.Добавить(Соединение.UserName);
    КонецЕсли;
    Продолжить;
    КонецЕсли;
    Если Соединение.ConnID<>ЭтоСоединение и Соединение.AppID=»1CV8″  Тогда //на всякий случай
    Если СписокОтключенныхПользователей.НайтиПоЗначению(Соединение.UserName)=Неопределено Тогда
    СписокОтключенныхПользователей.Добавить(Соединение.UserName);
    КонецЕсли;
    
    //СоединениеРП.Disconnect(Соединение);
    Сообщить («могли бы отключить «+ Соединение.UserName)  ;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    
    КОМ=Неопределено;
    Исключение
    Сообщить (ОписаниеОшибки());
    КонецПопытки;
    
    КонецПроцедуры
    
    Функция ИмяКонектора()
    
    СисИнфо = Новый СистемнаяИнформация;
    ПодстрокиВерсии = РазложитьСтрокуВМассивПодстрок(СисИнфо.ВерсияПриложения,».»);
    
    Возврат «v»+ПодстрокиВерсии[0]+ПодстрокиВерсии[1]+».COMConnector»;
    
    КонецФункции

    Показать

    Reply
  50. letchik2000

    С чем может быть связана вот такая ошибка:

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

    Reply
  51. Yashazz

    (51) Ну как я могу сказать навскидку, не видя саму строку с указанием класса?

    Reply
  52. Small sa

    Скорее всего не установлена COM-компонента 1с.

    Либо вызываете не ту версию коннектора.

    Reply

Leave a Comment

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