Суть доработки сводится к тому, что постоянно анализируется ПротоколРаботыПользователей на наличие записей с привязкой к пользователю за последние N-минут.
выбрать * из регистрсведений.протоколработыпользователей где пользователь=&юзер и дата > &датаубийства
При этом список пользователей формируется из выборки активных сеансов
ПолучитьСеансыИнформационнойБазы()
А дальше из списка на закрытие активного сеанса выкидываются полноправные пользователи, пользователи с сеансом в Конфигураторе и пользователи, поименованные в специальной Роли, у меня для примера она называется "ПользователиНеотключаемыеПоНеактивностиСеанса". Другими словами, если вам надо сделать пользователя, который постоянно может сидеть в приложении и не бояться, что система закроет его сеанс, просто добавьте его в эту роль, это может быть полезно для делопроизводителей, топ-менеджеров.
Дальше происходит отключение сеанса пользователя, находящегося в списке на отключение, делается это с помощью функционала администрирования кластера 1С.
АдминистрированиеКластераКлиентСервер.УдалитьСеансыИнформационнойБазы(ПараметрыАдминистрирования,ПараметрыАдминистрированияИБ, Фильтр);
Для этого вам понадобится две учетных записи: администратор кластера, администратор БД
ПараметрыАдминистрирования = АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(); ПараметрыАдминистрирования.АдресАгентаСервера = "имя_сервера";
ПараметрыАдминистрирования.ПортАгентаСервера = 7540; //по умолчанию в 1С используется 1540
ПараметрыАдминистрирования.ПортКластера = 7541; //по умолчанию в 1С используется 1541
ПараметрыАдминистрирования.ИмяАдминистратораКластера = "имя_администратора_кластера";
ПараметрыАдминистрирования.ПарольАдминистратораКластера = "пароль_администратора_кластера";
ПараметрыАдминистрированияИБ = АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(); ПараметрыАдминистрированияИБ.ИмяВКластере = "имя_базы";
ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы = "имя_администратора_базы"; ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы = "пароль_администратора_базы";
У всей этой доработки есть один несущественный минус - т.к. не все события пишутся в ПротоколРаботыПользователей, то существует ненулевая вероятность, что пользователя "выкинет" даже если он вёл активность в приложении, но процент этих событий мал.
Текст процедуры выкладываю как есть, необходимо только через Конфигуратор добавить регламентное задание и сопоставить его с этой процедурой.
Процедура УбитьСеансыВНочи() Экспорт
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Пользователь");
Таб.Колонки.Добавить("ПользовательСсылка");
Таб.Колонки.Добавить("Номер");
//Таб.Колонки.Добавить("Поле");
СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
НомераСеансов = Новый Массив;
стСписокКРасстрелу = "";
Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл
если не Пользователи.ЭтоПолноправныйПользователь(СеансИБ.Пользователь, Истина) и СеансИБ.ИмяПриложения = "1CV8C" тогда
ЗадачиЗапрос = Новый Запрос; //Не отключаются пользователи с полными правами, конфигураторы и фоновые задания
ЗадачиЗапрос.Текст = "выбрать * из регистрсведений.протоколработыпользователей где пользователь=&юзер и дата > &датаубийства";
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(СеансИБ.Пользователь.ПолноеИмя,Истина);
стРоли = РегистрыСведений.ИсполнителиЗадач.РолиИсполнителя(Пользователь);
стРольПерманентногоПользователя = Справочники.РолиИсполнителей.НайтиПоНаименованию("ПользователиНеотключаемыеПоНеактивностиСеанса",Истина); //тут прописывается имя роли, входящие в нее пользователи не отключаются
стПерманентныйПользователь = Ложь;
Для Каждого ЭлементМассива из стРоли Цикл
если ЭлементМассива.Владелец.Наименование = стРольПерманентногоПользователя.Наименование тогда
стПерманентныйПользователь = Истина;
Прервать;
конецесли;
КонецЦикла;
Если Не стПерманентныйПользователь Тогда
ЗадачиЗапрос.УстановитьПараметр("юзер", Пользователь);
ЗадачиЗапрос.УстановитьПараметр("датаубийства", ТекущаяДата() - 1800);
Результат = ЗадачиЗапрос.Выполнить();
Если Результат.Пустой() Тогда
Сеанс = Таб.Добавить();
Сеанс.Пользователь = СеансИБ.Пользователь.Имя;
стСписокКРасстрелу = стСписокКРасстрелу + СеансИБ.Пользователь.Имя + " ";
Сеанс.Номер = СеансИБ.НомерСеанса;
НомераСеансов.Добавить(СеансИБ.НомерСеанса);
//Сеанс.ПользовательСсылка = НайтиСсылкуПоИдентификаторуПользователя(СеансИБ.Пользователь.УникальныйИдентификатор);
конецесли;
КонецЕсли;
конецесли;
КонецЦикла;
если НомераСеансов.Количество()>0 тогда
ПараметрыАдминистрирования = АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера();
ПараметрыАдминистрирования.АдресАгентаСервера = "имя_сервера";
ПараметрыАдминистрирования.ПортАгентаСервера = 7540; //по умолчанию в 1С используется 1540
ПараметрыАдминистрирования.ПортКластера = 7541; //по умолчанию в 1С используется 1541
ПараметрыАдминистрирования.ИмяАдминистратораКластера = "имя_администратора_кластера";
ПараметрыАдминистрирования.ПарольАдминистратораКластера = "пароль_администратора_кластера";
ПараметрыАдминистрированияИБ = АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера();
ПараметрыАдминистрированияИБ.ИмяВКластере = "имя_базы";
ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы = "имя_администратора_базы";
ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы = "пароль_администратора_базы";
СтруктураСеанса = Новый Структура;
СтруктураСеанса.Вставить("Свойство", "Номер");
СтруктураСеанса.Вставить("ВидСравнения", ВидСравнения.ВСписке);
СтруктураСеанса.Вставить("Значение", НомераСеансов);
Фильтр = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураСеанса);
АдминистрированиеКластераКлиентСервер.УдалитьСеансыИнформационнойБазы(ПараметрыАдминистрирования,ПараметрыАдминистрированияИБ, Фильтр);
ЗаписьЖурналаРегистрации("УдалениеПользователейВНочи", УровеньЖурналаРегистрации.Информация, , , "Список пользователей к отключению: "
+ стСписокКРасстрелу);
конецесли;
КонецПроцедуры