Поискав и не найдя того что мне нужно для отключения забывчивых пользователей из базы данных решил написать данную обработку.
Обработка позволяет:
- просматривать список пользователей;
- задавать кто не будет отключен для сервисной работы;
- возможность быстрого отключения;
- установка монопольного режима;
- выдержка времени не подключения;
- запрет подключения к базе в течении определенного времени;
- отключение не всех пользователей.
Доработка конфигурации:
- Обработка настройки отключения (в приложении);
- Регистр сведений;
- Модуль приложения.
Регистр сведений
ргОтключениеПользователей, непереодический, с независимым режимом записи.
Измерения:
Пользователь - справочник пользователи, ведущее или основной отбор
Ресурсы:
- Отключить - Булево;
- ЗапретПодключения - Булево;
- БыстроеОтключение - Булево;
- СостояниеОтключения - Строка, 3 символа, фиксированная;
- Сообщение - Строка, 300 символов, переменная;
- ДатаВремяПуска - Дата, Дата и время;
- ОтключениеМинут - Число, 2 разряда; // до 99 минут
- ПаузаДоОтключения - Число, 1 разряд. // от 3 до 5 минут
Модуль приложения
// Процедура контроля возможности подключения.
//
Процедура СтартПроверкиОтключения(Отказ) Экспорт
Пользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
Зп = Новый Запрос;
Зп.УстановитьПараметр("Пользователь",Пользователь);
Зп.Текст = "ВЫБРАТЬ
| ргОтключениеПользователей.Пользователь,
| ргОтключениеПользователей.ЗапретПодключения,
| ргОтключениеПользователей.ДатаВремяПуска,
| ргОтключениеПользователей.ОтключениеМинут,
| ргОтключениеПользователей.ПаузаДоОтключения
|ИЗ
| РегистрСведений.ргОтключениеПользователей КАК ргОтключениеПользователей
|ГДЕ
| ргОтключениеПользователей.Пользователь = &Пользователь";
РезультатЗп = Зп.Выполнить().Выбрать();
Если РезультатЗп.Следующий() Тогда
Если РезультатЗп.ЗапретПодключения Тогда
НеПодключать = Ложь;
// Расчет времени не подключения
ТекДата = ТекущаяДата();
СтартДата = РезультатЗп.ДатаВремяПуска;
ВремяПаузы = (РезультатЗп.ОтключениеМинут + РезультатЗп.ПаузаДоОтключения) * 60;
ДельтаПаузы = ТекДата - СтартДата;
Если ВремяПаузы > ДельтаПаузы Тогда
НеПодключать = Истина;
КонецЕсли;
// Конец Расчета времени не подключения
Если НеПодключать Тогда
#Если Клиент Тогда
Предупреждение("Подключение запрещено. Ведутся сервисные работы.", 5, "Подключение...");
#КонецЕсли
//Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Проверка и опрос состояния отключения
ПодключитьОбработчикОжидания("ЦиклическийВызов",15);
КонецПроцедуры // СтартПроверкиОтключения()
// Процедура контроля отключения. Конечный автомат состояний отключения.
//
Процедура ЦиклическийВызов() Экспорт
ОтклПользователей = РегистрыСведений.ргОтключениеПользователей;
Отбор = Новый Структура("Пользователь");
Отбор.Пользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
ВыборкаРегистра = ОтклПользователей.Выбрать(Отбор);
Пока ВыборкаРегистра.Следующий() Цикл
Запись = ВыборкаРегистра.ПолучитьМенеджерЗаписи();
Запись.Прочитать();
СостОткл = Запись.СостояниеОтключения;
ВремяОткл = Запись.ПаузаДоОтключения;
Пр = Лев(СостОткл,1);
Если Пр = "А" Тогда
СостОткл = "Б" + Строка(ВремяОткл*4);
Запись.СостояниеОтключения = СостОткл;
Запись.Записать();
#Если Клиент Тогда
Сигнал();
Сигнал();
Сигнал();
Предупреждение(Запись.Сообщение,15,"Предупреждение");
#КонецЕсли
ИначеЕсли Пр = "Б" Тогда
Время = Число(Прав(СостОткл,2));
Время = Время - 1;
Если Время = 0 Тогда
СостОткл = "В";
Иначе
СостОткл = "Б" + Строка(Время);
КонецЕсли;
Запись.СостояниеОтключения = СостОткл;
Запись.Записать();
ИначеЕсли Пр = "В" Тогда
СостОткл = "Г" + Строка(ВремяОткл-1);
Запись.СостояниеОтключения = СостОткл;
Запись.Записать();
#Если Клиент Тогда
Сигнал();
Сигнал();
Сигнал();
Предупреждение(Запись.Сообщение,15,"Предупреждение!");
#КонецЕсли
ИначеЕсли Пр = "Г" Тогда
Время = Число(Прав(СостОткл,2));
Время = Время - 1;
Если Время = 0 Тогда
СостОткл = "Д";
Иначе
СостОткл = "Г" + Строка(Время);
КонецЕсли;
Запись.СостояниеОтключения = СостОткл;
Запись.Записать();
ИначеЕсли Пр = "Д" Тогда
СостОткл = "Ш";
Запись.СостояниеОтключения = СостОткл;
Запись.Записать();
#Если Клиент Тогда
Сигнал();
Сигнал();
Сигнал();
Предупреждение("Извините но вы не предприняли никаких действий.",5,"Отключение.");
ЗавершитьРаботуСистемы();
#КонецЕсли
ИначеЕсли Пр = "Ш" Тогда
СтопПроверкиОтключения();
#Если Клиент Тогда
Сигнал();
Сигнал();
Сигнал();
Предупреждение("Тушим...",5,"Отключение.");
ПрекратитьРаботуСистемы();
#КонецЕсли
КонецЕсли;
КонецЦикла;
КонецПроцедуры // ЦиклическийВызов()
// Процедура контроля отключения.
//
Процедура СтопПроверкиОтключения() Экспорт
ОтклПользователей = РегистрыСведений.ргОтключениеПользователей;
Отбор = Новый Структура("Пользователь");
Отбор.Пользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
ВыборкаРегистра = ОтклПользователей.Выбрать(Отбор);
Пока ВыборкаРегистра.Следующий() Цикл
Запись = ВыборкаРегистра.ПолучитьМенеджерЗаписи();
Запись.Отключить = Ложь;
Запись.СостояниеОтключения = "К";
Запись.Записать();
КонецЦикла;
КонецПроцедуры // СтопПроверкиОтключения()
Процедура ПередНачаломРаботыСистемы(Отказ)
// Типовый вызовы
СтартПроверкиОтключения(Отказ);
КонецПроцедуры
Процедура ПриЗавершенииРаботыСистемы()
// Типовый вызовы
СтопПроверкиОтключения();
КонецПроцедуры
PS Первая проба пера. Если что не так пишите откорректирую.
UPD: Спасибо за рейтинг. Скачал Разукрашку. Обновил код.
UPD2: Поправил обязательную настройку регистра.
UPD3: Откорректировал процедуру кнопки отключить, заполнение регистра значений. Заполняется все отмеченные пользователи а не только последний.
Ребята читаем комментарии! Все вопросы по ошибкам там уже обсуждались! Следуя всем замечаниям перенес обработку из УТП в УПП (без дополнительного модуля) все заработало с первого раза.