Активные пользователи




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

61 Comments

  1. coder1cv8

    Делал для себя, но возможно, кому-то будет полезно… )

    Reply
  2. Dwiss

    Сообщения не приходят, вопрос почему, пробую на

    Управление производственным предприятием, редакция 1.2 (1.2.14.1) 1С:Предприятие 8.1 (8.1.10.50)

    Режим Серверный.

    Reply
  3. coder1cv8

    (2) Для реализации сообщений здесь использован самый простейший подход, с использованием команды «net send». Для её работы необходимо что бы как на компьютере С которого посылается сообщение, так и на компьютере НА который посылается сообщение была запущена «Служба сообщений». Проверить это можно открыв оснастку «Службы» (Мой компьютер>Управление>Службы и приложения). Так же данный способ оповещения не подходит в том случае, если пользователи работают с 1С через терминал.

    Reply
  4. Поручик

    В качестве извратства: добавить возможность отправки сообщений и прерывания работы выбранных пользователей.

    Reply
  5. coder1cv8

    (4) Код открытый, так что если есть желание, каждый может добавить что-то для себя ) Я же задумывал обработку, как максимально простую «выгонялку»…

    Reply
  6. Danila-Master

    Там используется «Net send». А эта команда работает не на всех сетях. 🙁

    Reply
  7. pevpol

    А в какую папку надо сохранять обработки, чтобы они работали, а то наш админ ничего мне говорить не хочет

    Reply
  8. coder1cv8

    (7) Если у вас нет права «Интерактивное открытие внешних обработок», то в хоть какую папку сохраняй, всё-равно не поможет… )

    Reply
  9. coder1cv8

    Добавил отправку сообщения всем пользователям.

    Reply
  10. Archangel1

    У меня 8.1 Конфигурация «Управление торговлей 10.3». Не работают сообщения… В целом очень полезная штука…

    Reply
  11. coder1cv8

    (10) Как я тут уже говорил, дело не в конфигурации, вероятно не запущена служба сообщений.

    Reply
  12. Lyekka

    Вот спасибо, так спасибо! Намного удобнее, чем обзванивать всех пользователей или просто долбить net send на всех в офисе.

    Reply
  13. coder1cv8

    (12) Ну дык, для вас стараемся! )

    Reply
  14. molot

    Спасибо.

    Reply
  15. Just

    а в файловом варианте это реализуемо?

    Reply
  16. coder1cv8

    (15) Для файлового обычно используется один общепринятый механизм, основанный на ОбработкеОжидания() (так сделано во всех типовых). Может быть можно сделать и по-другому, навскидку не скажу…

    Reply
  17. coder1cv8

    +(16) Для файлового режима смотрим здесь: http://infostart.ru/projects/2514/

    Reply
  18. optimalsv

    Спасибки, очень нужная вешчь, давно собирался сделать, да все руки не доходили

    Reply
  19. rasswet

    а для тех кто через терминал есть что-нибудь?

    Reply
  20. poselyagina

    А как запустить эту службу сообщений?

    Reply
  21. poselyagina

    сорри. нашла. спс

    Reply
  22. kravius12

    Клево. У меня сработало, после запуска на обоих компах службы сообщений. Спасибо.

    Reply
  23. Jogeedae

    У меня «Прервать» не заработало…

    Админ кластера не авторизован говорит.

    Может это быть из-за того что установлен пароль для администратора сервера 1с и также установлен пароль для администратора кластера,

    а авторизация в обработке как будто только админа кластера авторизует?

    Reply
  24. chev

    Не плохое решение. Спасибо.

    Reply
  25. Borisych

    ОбщийМодуль.УправлениеСоединениямиИБ

    🙂

    Reply
  26. mss_sarvarbek

    Есть ли версия для v8.0 🙁

    Reply
  27. zoro-z

    У меня не работает отсоединение, запрашивает пароль и логин. Что туда вбивать?

    Reply
  28. Aprilnn

    Здорово.

    Для отсоединения запрашивает пароль и логин — администратора видимо. Срабатывает через раз. При этом окно у пользователя не закрывается, а выдается сообщение «Рассогласование транспорта интеряейса. Завершить — Перезапустить». В списке активных пользователей появляется пользователь администратор, в графе приложение COMConsole. Так и должно работать?

    Reply
  29. coder1cv8

    (27) Логин/пароль пользователя 1С с административными правами.

    (28) Нет, так не должно работать. У вас проблемы с сетью или с базой… Здесь использованы штатные приемы работы с сервером 1С, поэтому к «Рассогласование транспорта…» это ни в коем случае не должно приводить. И работает обработка абсолютно стабильно. На счет приложения COMConsole — все нормально, так и должно быть.

    Reply
  30. zoro-z

    Что значит с сервером? А если у меня стоит просто винда и там установлена база и все к ней обращаются, то эта обработка работать не будет?

    Reply
  31. coder1cv8

    (30) 1С может работать в двух режимах: файловом и клиент-серверном. Так вот эта обработка только для клиент-серверного режима. О чем написано в описании.

    Reply
  32. newax

    Очень удобно, нелогично, что не типового механизма такого 🙂

    Reply
  33. Gerat2

    У меня РАБОТАЕТ в файловом базе, только надо поменять код

    отправляя не на ИмяКомпьютера а на Пользователь:

    Процедура КоманднаяПанель1ОтправитьСообщение(Кнопка)

    ТекСтр=ЭлементыФормы.СписокПользователей.ТекущаяСтрока;

    Если ТекСтр<>Неопределено И ТекСтр.ИмяКомпьютера<>»» Тогда

    ОтправитьСообщение(ТекСтр.Пользователь);//!!!

    КонецЕсли;

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

    но Имена пользователей, при этом, должны совпадать с ЮзерНэйм на терм.сервере.

    Если coder1cv8 не возражает, добавлю историю сообщений

    и отстрелить в файловой базе тоже кажись можно.

    Reply
  34. coder1cv8

    (33) Я не возражаю ) Тут есть где-то уже вариант этой обработки, который развивал один человек, поищи его лучше…

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

    Для не типовой файловой конфы я тут выкладывал вариант, без модификации, но он такой… шуточный скорее )

    Reply
  35. higs

    А мне помогло и пригодилось. Возможно, далее докручу, но сейчас — спасибо!

    Reply
  36. Mortal

    Спасибо, хорошая вещь. Однако в один прекрасный момент стала выдавать такую ошибку:

    _________________________________

    {Форма.Форма(70)}: Ошибка при вызове метода контекста (Authenticate): Произошла исключительная ситуация: Ошибка информационной базы

    Администратор кластера не аутентифицирован

    ________________________________

    Что это значит и как можно победить? Запускаю на сервере

    Reply
  37. coder1cv8

    (36) Этот прекрасный момент настал, когда установили админа кластера серверов 1С ) Обычно он не устанавливается. У меня авторизация сделана только для админа базы…

    Как можно победить:

    а) удалить админа кластера

    б) добавить имя/пароль в авторизации на кластер в коде обработки

    Reply
  38. Sintson

    Симпатично 🙂

    Reply
  39. Morfine

    ❗ со временем прибежала трабла под названием windows seven в нем нет службы сообщений есть что-то такое-же делающее это средствами самого 1С?

    Reply
  40. stif

    Привет всем!!!

    А подскажите нет ли у кого нить такой вот обработки (с такими функциями) только под 1С 8.2

    Поделитесь пожалуйста, буду очень признателен

    Reply
  41. romashka_stv

    что-то не сработало…

    Reply
  42. tonger

    Большое Спасибо!

    Очень полезная обработка

    Reply
  43. Danie-d

    Прерывание не срабатывает:

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

    Reply
  44. andervers2005
    Danie-d пишет:

    Прерывание не срабатывает:

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

    Аналогичная ситуация! я попробывал V81.COMConnector поменять на V82.COMConnector вроде как сработала но стало выводиться другое сообщение об ошибке

    {Форма.Форма.Форма(70)}: Ошибка при вызове метода контекста (Authenticate): Произошла исключительная ситуация: Ошибка информационной базы

    Администратор кластера не аутентифицирован

    Я в водил все имена которые админят сервак и базу но результат тоже!

    Reply
  45. Mala2011

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

    Reply
  46. EugeneR1c

    Благодарю!

    Reply
  47. AruslanM

    Удобная «выгонялка». Пользуюсь при необходимости )

    Reply
  48. wowkai

    спасибо за обработку. пользуюсь часьл, но не решает только одну проблему — зависшие сеансы(

    Reply
  49. PetMal

    Штука нужная всем одинесникам(жаль мне не подходит), выгнать пользователей, особенно трудно, если вы находитесь удаленно. Иногда просто вырубаю сеансы. А для оповещения пользуюсь задачами или делаю на горячей базе,если структуру не менять то 1с сама попросит пользователя перегрузить программу.

    Некоторые сеансы у нас зависают. Сначала грешил на антивирус НОД. Установил Касперского 6 для файловых серверов. Стало вроде меньше зависать, но все равно зависает. Может это результат подключения к терминалу из линукса. Может кто знает как бороться с зависаниями сесий юзеров в терминальном режиме?

    Reply
  50. Scukosan

    спасибо

    за сегодня это уже пятый вариант для отключения пользователей скачанный с инфостарта..

    будем тестить)

    Reply
  51. ODmitriy

    Спасибо.

    Открыл, попробовал — работает 🙂

    Правда пришлось почитать комментарии сначала, что-бы заработали все функции.

    Спасибо автору и всем, кто активно обсуждает эту тему.

    Reply
  52. leon111

    Спасибо! а есть возможность отправлять пользователям смс?

    Reply
  53. danya1606

    Большое Спасибо!

    Очень полезная обработка

    Reply
  54. Scukosan

    вопрос к автору и сообществу

    как в семерке и 2008 сервере реализовать отсылку сообщений?

    без предупреждений использовать обработку будет не корректно(

    Reply
  55. elik1972

    Спасибо!

    Очень выручила

    Reply
  56. anv77

    спасибо!

    Reply
  57. kirmancino

    Спасибо. Отличная обработка. Приходилось всех обзванивать, подключаться и физически выключать. А с этой обработкой быстро и успешно получилось выгнать пользователей из базы)

    Reply
  58. bahcha8

    Спасибо удобно и особенно радует, что бесплатно))

    Reply
  59. lesenoklenok

    Спасибо огромное! Очень нужная штука. Еще бы найти что нибудь подобное для файлового варианта.

    Reply
  60. EugenLiquor

    Cкачал, воспользовался — все работает, но жалко нельзя писать сообщения, все работают в терминальном режиме.

    Reply
  61. MrAzat

    Спасибо большое!

    Reply

Leave a Comment

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