<?php // Полная загрузка сервисных книжек, создан 2025-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='\
Часто встречаю вопросы на форумах типа «Как заблокировать/закрыть сеанс 1С при простое», поэтому появилась такая вот безделица… )
хорошо бы этот функционал полностью внешний
(2) Можно если, разве что, сделать в виде внешней обработки и её открытой у пользователя держать всё время… Что, согласись, не красиво.
А так изменения вносимые в конфигурацию минимальны, только подключение обработчика ожидания при начале работы, остальные все объекты добавляются.
Отлично за идею, на досуге опробую.
Это из серии — работаешь, работаешь, и тут бац — заставка!
(5) В смысле?… )
Хотя, лично у меня, не возникало необходимости в подобных утилитах… Сам бывает «медитирую» над кодом пока заставка не появится… )
Но раз люди спрашивают, значит кому-то это необходимо. Вон бывает ключиков на всех не хватает )
А у меня отчет формируется два часа без нажатий мыши и клавиатуры. Тоже получится простой?
(7) Надо отчеты оптимальней писать, товарищ! ))
А если серьезно, то да, если пользователь вообще не будет трогать клавиатуру и мышь эти 2 часа, уйдет например куда-нибудь — то это простой. А если он свернет окошко 1С и будет другими делами заниматься, то простоя не будет.
(8) Если выполняется отчет, опрос «по бездействию» пользователя не производится до тех пор, пока отчет не выполнится? Тогда, имхо, логично к накапливаемому общему времени простоя добавлять не время выполнения отчета, а просто один период опроса, или, обобщенно, [кол-во опросов за время выполнения чего-л] х [период опроса]
(9) Да, опрос времени бездействия выполняется через ОбработчикОжидания, поэтому, естественно, в период формирования отчета/выполнения обработки он не делается. Суть в том что считается время простоя системы, а не 1С. Поэтому формирование отчета в общем случае не является простоем, что вполне логично, ИМХО.
ИМХО считаю лишним делать три константы ПериодОпросаПростоя, ВремяПростоя, ДействиеПриПростое. Я бы обошёлся одной константой «НатройкаПриПростое» типа строка неограниченной длины. Туда можно запихивать структуру с нужным количеством полей.
Возможно это тема для форума, но мне лень идти на форум…
(11) Конечно, можно вообще все константы таким образом «упаковать». Но это, на мой взгляд, не совсем методически грамотно. Да и здесь главное сделать наглядно, что бы был понятен принцип. А дальше каждый может модернизировать как считает нужным…
а как насчет того, чтобы простоем считать неактивность сессии (не елозит мышь в окне 1С, не нажимаются клавиши в активном окне 1С и при этом загрузка процессора процессом 1с = 0?
дело в том, что многие юзверя понаоткрывают окон 1С на рабочем столе и в это время трут в асе или шарят в нете — а ресурсы заняты в это время.
(13) Ну а что же вы хотите от БЕСПЛАТНОЙ разработки? ) Можно сделать и это. У софтпоинта, вроде, есть подобное решение, которое считает именно активность процесса 1С, но это и денег стоит не малых я думаю…
(13) 1С всегда загружает проц, либо это обработки ожидания, либо в открытых списках идет обновление информации.
заинтересовала Ваша обработка …
подскажите, а для терминального сервера можно доработать? Т.е. человек удаленно по rdp заходит в сессию ….. срабатывает блокиратор, но после закрытии 1С через пару секунд и закрывается сеанс пользователя с сервером….
(16) да, это возможно сделать )
(17) к сожалению, shutdown -l не поддерживает указание времени задержки в 5 секунд … [shutdown -l -t 5]
на сервере запущена программа, которая «контролирует» закрытие 1с, а потом уже разрешает закрыть сессию …. и вот без этой задержки идея и накрылась =(
(18) скрипт написать, вызывающий shutdown, куда вставить sleep(5000)
(19) вот, подсказали кусок кода … как бы сюда вставить задержку?
Set objWMIService = GetObject(«winmgmts:\.
ootcimv2:Win32_Process»)
errResult = objWMIService.Create(«B:1cv8.exe», null, int1cID)
Set objWMIService = GetObject(«winmgmts:\.
ootcimv2»)
Set colProcesses = objWMIService.ExecNotificationQuery _ («Select * From __InstanceDeletionEvent Within 1 Where TargetInstance ISA ‘Win32_Process'»)
Do Until False = True
Set objProcess = colProcesses.NextEvent
If objProcess.TargetInstance.ProcessID = int1cID Then
Exit Do
End If
Loop
Set objShell = CreateObject(«Wscript.Shell»)
objShell.run «shutdown /l»
(20) Настрой сеанс терминала (в настройках пользователя), на запуск 1С при входе на сервер. Тогда сеанс RDP будет автоматически закрываться сам при окончании работы в программе.
😀
Какая-то польза от новой системы, наверное, есть. Напомнили, что надо воздать должное авторам. (На теперь есть значки-напоминалки)
Скачал эту разработку уже давно. Аж 25.10.08.
Прикрутил к корпоративной УПП, кое-что допилил: добавил предупреждения юзерам о скором закрытии сеансов, лог в журнал регистрации, и после закрытии сеанса с помощью AutoIt выводится сообщение о том, что сеанс 1С закрыт из-за простоя (Чтоб юзера не паниковали).
Эффект: У нас 110 ключей было. Их стало не хватать, но на новые в бюджете тек. года средств не было. После того, как прикрутил эту обработку, и мертвые сеансы стали автоматом завершаться через 2 часа, выснилось, что реально работающих пользователей в среднем 80 человек.
Теперь у нас нет проблем с нехваткой ключей.
то, что доктор прописал!
Используем, сначала юзвери ворчали, потом привыкли. Нормально
Спасибо. Применил идею завершения работы в 1С.
Спасибо. Пригодиться — оптимизировать работу пользователей, бывает из 1С-ки не выходят и ПК не отключают.
Спасибо, полезно. А то черти эти вечно забывают выходить как положено
Отличная публикация. Сделал с ее помощью выход в режим ожидания программы, а то складские работники вечно оставляют все открытым и по свим делам ходят.
Столкнулся с похожей проблемой, ключей не хватает, сервак тормозит, а юзеры по 3 часа висят неактивные…..
Может кто загонялся над таким вопросом , может можно подключаться к диспетчеру служб терминалов как к КОМ-объекту? Чтобы от туда получать простои пользователя, и на основании этого выкидывать их…
Спасибо!
Прямо вот сегодня такую задачу поставили.
Отлично!
Взял файл по ссылке на Народ.
Блокировка не работает ни в оригинальной конфе , ни при объединении с другой базой.
Проверял только в файловом режиме.
ОС : Виста.
Платформа : 8.1.13.41.
В чем может быть причина отсутствия блокировок ?
+ 33 Все работает. Вопрос снят.
Реализовано красиво.
(22) fillin, а не хотели бы поделиться допиленной версией?
Автору респект! Подсистема помогла!
Спасибо за разработку, а главное за то, что скачивание бесплатное! Сконвертировал для 1С 8.2 — все работает без нареканий.
А с терминальной сессией дружит обработка?Понимает она что 1С запущенна, но терминал свернут?
Добрый день! Подскажите, пожалуйста, возможно ли в качестве времени простоя считать время простоя 1С, а не всей системы?
Возьмем на заметку. Спасибо — ставлю плюс!
в 8.0.18.2 выдает ошибку: {ОбщийМодуль.ПроверкаПростоя(8)}: Метод объекта не обнаружен (ВремяПростоя)
ВремяПростоя=Блокиратор.ВремяПростоя()/1000; // в секундах
Для SQL-ного варианта такая фича будет когда-нибудь?
Хотя уже не надо. Написал сам для документооборота на уФ.
просто и эффективно, наткнулся на эту разработку в БД клиента и только потом уже тут нашел подробное описание и обсуждение.
у меня только один вопрос — в обработке «Блокиратор» в макете зашит файл EXE и естественно возник вопрос а что он делает?
Скачала. Не могу воспользоваться:
«Структура конфигурации несовместима с текущей версией программы»