Выгонялка пользователей.


Данная разработка это первое что я решил выложить на этот дивный сайт. Она позволяет отключать пользователей штатными средствами. А так же их информирования о процессе отключения.

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

Обработка позволяет:

  • просматривать список пользователей;
  • задавать кто не будет отключен для сервисной работы;
  • возможность быстрого отключения;
  • установка монопольного режима;
  • выдержка времени не подключения;
  • запрет подключения к базе в течении определенного времени;
  • отключение не всех пользователей.

Доработка конфигурации:

  • Обработка настройки отключения (в приложении);
  • Регистр сведений;
  • Модуль приложения.

Регистр сведений

ргОтключениеПользователей, непереодический, с независимым режимом записи.

Измерения:

Пользователь - справочник пользователи, ведущее или основной отбор

Ресурсы:

  • Отключить - Булево;
  • ЗапретПодключения - Булево;
  • БыстроеОтключение - Булево;
  • СостояниеОтключения - Строка, 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: Откорректировал процедуру кнопки отключить, заполнение регистра значений. Заполняется все отмеченные пользователи а не только последний.

Ребята читаем комментарии! Все вопросы по ошибкам там уже обсуждались! Следуя всем замечаниям перенес обработку из УТП в УПП (без дополнительного модуля) все заработало с первого раза.

Файлы обработки:

-