Работаем в УПП, пользователей более 300 (активных 70-80) и достаточно часто для пользователей предоставляются роли доступа на временной основе - временное исполнение обязанностей - больничный или отпуск кого-либо, временные работы и т. д. Отслеживать это руками и делать себе напоминалки надоело и решил автоматизировать этот процесс.
Upd: В нашей компании часто возникает противоречие текущих прав доступа с новыми и необходимо на время отключить эти права, а потом не забыть их восстановить.
Создаем регистр сведений, в котором будем хранить информацию по пользователю, временной роли, когда ее нужно убрать и когда восстановить, если такие есть. Регистр не периодический и независимый - ВременныеПраваДоступа.
В общей форме "ФормаПользователяИБ" в таблицу с ролями добавляем колонку с датой завершения, в которой мы будем вносить нашу дату для временной роли. А также колонку с датой возврата роли.
При открытии формы у нас проверяется есть ли для данного пользователя временные права доступа и проставляем в таблицу:
ПоказыватьВСпискеВыбора = ПользовательНастроек.ПоказыватьВСпискеВыбора;
АутентификацияОС = ПользовательНастроек.АутентификацияОС;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Пользователь", Пользователь.Ссылка);
Запрос.Текст = "ВЫБРАТЬ
| ВременныеПраваДоступа.Роль,
| ВременныеПраваДоступа.ДатаЗавершения,
| ВременныеПраваДоступа.ДатаВозврата
|ИЗ
| РегистрСведений.ВременныеПраваДоступа КАК ВременныеПраваДоступа
|ГДЕ
| ВременныеПраваДоступа.Пользователь = &Пользователь";
Результат = Запрос.Выполнить();
ТаблицаРолей = Результат.Выгрузить();
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
СтрокаСпискаДоступныхРолей.Пометка = ПользовательНастроек.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение);
НайденнаяСтрока = ТаблицаРолей.Найти(СтрокаСпискаДоступныхРолей.Значение.Имя, "Роль");
Если НайденнаяСтрока <> Неопределено Тогда
СтрокаСпискаДоступныхРолей.ДатаЗавершения = НайденнаяСтрока.ДатаЗавершения;
СтрокаСпискаДоступныхРолей.ДатаВозврата = НайденнаяСтрока.ДатаВозврата;
КонецЕсли;
КонецЦикла;
При раздаче прав должны напротив временной роли установить дату снятия это роли с пользователя, а для убираемой роли снять галочкуи поставить дату возврата. В функции "ЗаписатьПользователя" вставляем несколько строк - привожу отрывок кода с моей вставкой:
// Роли сохраняем
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
мРоль = СтрокаСпискаДоступныхРолей.Значение;
СодержитРоль = ПользовательИБ.Роли.Содержит(мРоль);
Если СодержитРоль И Не СтрокаСпискаДоступныхРолей.Пометка Тогда
ПользовательИБ.Роли.Удалить(мРоль);
ИначеЕсли Не СодержитРоль И СтрокаСпискаДоступныхРолей.Пометка Тогда
ПользовательИБ.Роли.Добавить(мРоль);
Если ЗначениеЗаполнено(СтрокаСпискаДоступныхРолей.ДатаЗавершения) Тогда
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(Пользователь.Ссылка);
НаборЗаписей.Отбор.Роль.Установить(мРоль.Имя);
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Ложь);
Запись = НаборЗаписей.Добавить();
Запись.Пользователь = Пользователь.Ссылка;
Запись.Роль = мРоль.Имя;
Запись.ДатаЗавершения = СтрокаСпискаДоступныхРолей.ДатаЗавершения;
НаборЗаписей.Записать();
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаСпискаДоступныхРолей.ДатаВозврата) Тогда
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(Пользователь.Ссылка);
НаборЗаписей.Отбор.Роль.Установить(мРоль.Имя);
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Истина);
Запись = НаборЗаписей.Добавить();
Запись.Пользователь = Пользователь.Ссылка;
Запись.Роль = мРоль.Имя;
Запись.ЭтоВозврат = Истина;
Запись.ДатаВозврата = СтрокаСпискаДоступныхРолей.ДатаВозврата;
НаборЗаписей.Записать();
КонецЕсли;
КонецЦикла;
Теперь надо нам проверять на регулярной основе есть ли у нас неубуранные временные права и убирать их, а также восстанавливать те роли, по которым настала дата возврата, очищая регистр по этим пользователям и ролям. Создадим простое регламентированное задание и повесим на него процедуру:
И каждую ночь у меня отрабатывает это задание, убирая временные права и восстанавливая временно запрещенные.
Запрос = Новый Запрос;
//Завершаем права
Запрос.Текст = "ВЫБРАТЬ
| ВременныеПраваДоступа.Пользователь,
| ВременныеПраваДоступа.Роль,
| ВременныеПраваДоступа.ЭтоВозврат
|ИЗ
| РегистрСведений.ВременныеПраваДоступа КАК ВременныеПраваДоступа
|ГДЕ
| (ВременныеПраваДоступа.ДатаЗавершения
| И ВременныеПраваДоступа.ДатаВозврата = &ПустаяДата)
| ИЛИ (ВременныеПраваДоступа.ДатаВозврата
| И ВременныеПраваДоступа.ДатаЗавершения = &ПустаяДата)";
Запрос.УстановитьПараметр("ДатаЗапроса", ТекущаяДата());
Запрос.УстановитьПараметр("ПустаяДата" , Дата('00010101'));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Период = ТекущаяДата();
Пока Выборка.Следующий() Цикл
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(Выборка.Пользователь.Код));
Если Выборка.ЭтоВозврат Тогда
ПользовательИБ.Роли.Добавить(Метаданные.Роли[Выборка.Роль]);
Иначе
Если ПользовательИБ.Роли.Содержит(Метаданные.Роли[Выборка.Роль]) Тогда
ПользовательИБ.Роли.Удалить(Метаданные.Роли[Выборка.Роль]);
КонецЕсли;
КонецЕсли;
ПользовательИБ.Записать();
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(Выборка.Пользователь);
НаборЗаписей.Отбор.Роль.Установить(Выборка.Роль);
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Выборка.ЭтоВозврат);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
КонецЦикла;
Теперь я не пишу напоминалки чтобы убрать временные права и все работает "на ура" - главное правильно раздавать права.
Надеюсь кому-то будет полезна.