Каталог решений - Освобождение лицензий. Регламентное задание

Освобождение лицензий. Регламентное задание

Освобождение лицензий. Регламентное задание

В наличии

(Разработано для 1С:Документооборот). Доработка решает проблему недостатка лицензий при сравнительно бОльшем количестве активных пользователей. Реализуется путем наблюдения «Протокола работы пользователей» и при отсутствии активности пользователя — отключение его сеанса на сервере.
У нас данная доработка включена как рег. задание в 1С:Документооборот.
Убиваются все сеансы с неактивностью за последние 30 минут, запускать рег. задание можно соответственно каждые 35 минут.

Категория:

Описание

Суть доработки сводится к тому, что постоянно анализируется ПротоколРаботыПользователей на наличие записей с привязкой к пользователю за последние N-минут.

выбрать * из регистрсведений.протоколработыпользователей где пользователь=&юзер и дата > &датаубийства

При этом список пользователей формируется из выборки активных сеансов 

ПолучитьСеансыИнформационнойБазы()

А дальше из списка на закрытие активного сеанса выкидываются полноправные пользователи, пользователи с сеансом в Конфигураторе и пользователи, поименованные в специальной Роли, у меня для примера она называется "ПользователиНеотключаемыеПоНеактивностиСеанса". Другими словами, если вам надо сделать пользователя, который постоянно может сидеть в приложении и не бояться, что система закроет его сеанс, просто добавьте его в эту роль, это может быть полезно для делопроизводителей, топ-менеджеров.

Дальше происходит отключение сеанса пользователя, находящегося в списке на отключение, делается это с помощью функционала администрирования кластера 1С.

АдминистрированиеКластераКлиентСервер.УдалитьСеансыИнформационнойБазы(ПараметрыАдминистрирования,ПараметрыАдминистрированияИБ, Фильтр);

Для этого вам понадобится две учетных записи: администратор кластера, администратор БД

ПараметрыАдминистрирования = АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера(); ПараметрыАдминистрирования.АдресАгентаСервера = "имя_сервера";
ПараметрыАдминистрирования.ПортАгентаСервера = 7540; //по умолчанию в 1С используется 1540
ПараметрыАдминистрирования.ПортКластера = 7541; //по умолчанию в 1С используется 1541
ПараметрыАдминистрирования.ИмяАдминистратораКластера = "имя_администратора_кластера";
ПараметрыАдминистрирования.ПарольАдминистратораКластера = "пароль_администратора_кластера";
ПараметрыАдминистрированияИБ = АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера(); ПараметрыАдминистрированияИБ.ИмяВКластере = "имя_базы";
ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы = "имя_администратора_базы"; ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы = "пароль_администратора_базы";

У всей этой доработки есть один несущественный минус — т.к. не все события пишутся в ПротоколРаботыПользователей, то существует ненулевая вероятность, что пользователя "выкинет" даже если он вёл активность в приложении, но процент этих событий мал. 

Текст процедуры выкладываю как есть, необходимо только через Конфигуратор добавить регламентное задание и сопоставить его с этой процедурой.

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

 

has been added to your cart:
Оформление заказа