Работаем в УПП, пользователей более 300 (активных 70-80) и достаточно часто для пользователей предоставляются роли доступа на временной основе — временное исполнение обязанностей — больничный или отпуск кого-либо, временные работы и т. д. Отслеживать это руками и делать себе напоминалки надоело и решил автоматизировать этот процесс.
Upd: В нашей компании часто возникает противоречие текущих прав доступа с новыми и необходимо на время отключить эти права, а потом не забыть их восстановить.
Создаем регистр сведений, в котором будем хранить информацию по пользователю, временной роли, когда ее нужно убрать и когда восстановить, если такие есть. Регистр не периодический и независимый — ВременныеПраваДоступа.
В общей форме «ФормаПользователяИБ» в таблицу с ролями добавляем колонку с датой завершения, в которой мы будем вносить нашу дату для временной роли. А также колонку с датой возврата роли.
При открытии формы у нас проверяется есть ли для данного пользователя временные права доступа и проставляем в таблицу:
ПоказыватьВСпискеВыбора = ПользовательНастроек.ПоказыватьВСпискеВыбора;
АутентификацияОС = ПользовательНастроек.АутентификацияОС;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«Пользователь», Пользователь.Ссылка);
Запрос.Текст = «ВЫБРАТЬ
| ВременныеПраваДоступа.Роль,
| ВременныеПраваДоступа.ДатаЗавершения,
| ВременныеПраваДоступа.ДатаВозврата
|ИЗ
| РегистрСведений.ВременныеПраваДоступа КАК ВременныеПраваДоступа
|ГДЕ
| ВременныеПраваДоступа.Пользователь = &Пользователь»;
Результат = Запрос.Выполнить();
ТаблицаРолей = Результат.Выгрузить();
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
СтрокаСпискаДоступныхРолей.Пометка = ПользовательНастроек.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение);
НайденнаяСтрока = ТаблицаРолей.Найти(СтрокаСпискаДоступныхРолей.Значение.Имя, «Роль»);
Если НайденнаяСтрока <> Неопределено Тогда
СтрокаСпискаДоступныхРолей.ДатаЗавершения = НайденнаяСтрока.ДатаЗавершения;
СтрокаСпискаДоступныхРолей.ДатаВозврата = НайденнаяСтрока.ДатаВозврата;
КонецЕсли;
КонецЦикла;
При раздаче прав должны напротив временной роли установить дату снятия это роли с пользователя, а для убираемой роли снять галочкуи поставить дату возврата. В функции «ЗаписатьПользователя» вставляем несколько строк — привожу отрывок кода с моей вставкой:
// Роли сохраняем
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
мРоль = СтрокаСпискаДоступныхРолей.Значение;
СодержитРоль = ПользовательИБ.Роли.Содержит(мРоль);
Если СодержитРоль И Не СтрокаСпискаДоступныхРолей.Пометка Тогда
ПользовательИБ.Роли.Удалить(мРоль);
ИначеЕсли Не СодержитРоль И СтрокаСпискаДоступныхРолей.Пометка Тогда
ПользовательИБ.Роли.Добавить(мРоль);
Если ЗначениеЗаполнено(СтрокаСпискаДоступныхРолей.ДатаЗавершения) Тогда
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(Пользователь.Ссылка);
НаборЗаписей.Отбор.Роль.Установить(мРоль.Имя);
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Ложь);
Запись = НаборЗаписей.Добавить();
Запись.Пользователь = Пользователь.Ссылка;
Запись.Роль = мРоль.Имя;
Запись.ДатаЗавершения = СтрокаСпискаДоступныхРолей.ДатаЗавершения;
НаборЗаписей.Записать();
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаСпискаДоступныхРолей.ДатаВозврата) Тогда
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(Пользователь.Ссылка);
НаборЗаписей.Отбор.Роль.Установить(мРоль.Имя);
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Истина);
Запись = НаборЗаписей.Добавить();
Запись.Пользователь = Пользователь.Ссылка;
Запись.Роль = мРоль.Имя;
Запись.ЭтоВозврат = Истина;
Запись.ДатаВозврата = СтрокаСпискаДоступныхРолей.ДатаВозврата;
НаборЗаписей.Записать();
КонецЕсли;
КонецЦикла;
Теперь надо нам проверять на регулярной основе есть ли у нас неубуранные временные права и убирать их, а также восстанавливать те роли, по которым настала дата возврата, очищая регистр по этим пользователям и ролям. Создадим простое регламентированное задание и повесим на него процедуру:
И каждую ночь у меня отрабатывает это задание, убирая временные права и восстанавливая временно запрещенные.
Запрос = Новый Запрос;
//Завершаем права
Запрос.Текст = «ВЫБРАТЬ
| ВременныеПраваДоступа.Пользователь,
| ВременныеПраваДоступа.Роль,
| ВременныеПраваДоступа.ЭтоВозврат
|ИЗ
| РегистрСведений.ВременныеПраваДоступа КАК ВременныеПраваДоступа
|ГДЕ
| (ВременныеПраваДоступа.ДатаЗавершения
| И ВременныеПраваДоступа.ДатаВозврата = &ПустаяДата)
| ИЛИ (ВременныеПраваДоступа.ДатаВозврата
| И ВременныеПраваДоступа.ДатаЗавершения = &ПустаяДата)»;
Запрос.УстановитьПараметр(«ДатаЗапроса», ТекущаяДата());
Запрос.УстановитьПараметр(«ПустаяДата» , Дата(‘00010101’));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Период = ТекущаяДата();
Пока Выборка.Следующий() Цикл
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(Выборка.Пользователь.Код));
Если Выборка.ЭтоВозврат Тогда
ПользовательИБ.Роли.Добавить(Метаданные.Роли[Выборка.Роль]);
Иначе
Если ПользовательИБ.Роли.Содержит(Метаданные.Роли[Выборка.Роль]) Тогда
ПользовательИБ.Роли.Удалить(Метаданные.Роли[Выборка.Роль]);
КонецЕсли;
КонецЕсли;
ПользовательИБ.Записать();
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(Выборка.Пользователь);
НаборЗаписей.Отбор.Роль.Установить(Выборка.Роль);
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Выборка.ЭтоВозврат);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
КонецЦикла;
Теперь я не пишу напоминалки чтобы убрать временные права и все работает «на ура» — главное правильно раздавать права.
Надеюсь кому-то будет полезна.
маладца, хороший подход
всегда радуют простые и эффективные решения
Мне тоже понравилось. +1
желательно еще учитывать не только дату завершения, но и дату, с которой будет назначена роль.
просто бывает, что заранее сообщают даты отпуска сотрудника, и сразу роль заместителю не поставишь, потому что сотрудник еще пока работает, а потом можно забыть)
(0) Молодец, но почему код как картинка-то?
выложи нормальный код, хотя бы в файлы 🙁
а лучше Разукрашкой раскрась код и замени картинки на этот код.
Тогда плюсану.
выложи нормальный код, хотя бы в файлы 🙁
а лучше Разукрашкой раскрась код и замени картинки на этот код.
Тогда плюсану.
Сори, первая моя публикация и к своему стыду не знаю как нормально выложить код с расскраской. Выложу файлы кода.
(5) открываешь сайт, в строке поиска пишешь Разукрашка, первый же вариант открываешь, читаешь, изучаешь, качаешь, юзаешь.
все просто 🙂
Простое и изящное решение!
отличное решение), выложи одним файлом, плиз
Просто супер только не понятно В регисте у роли какой тип будет ????
Просто строка
Да у меня тоже Строка.Тогда у меня не выходит в регистр не перезаписывается если я у пользователя другую роль ставлю в регистре остается та которая была раньше. И как работают регламентрые задания ??? Они зависят от конкретного пользователя или сами по себе запускаются ?
Выходит надо еще регистр создать Журнал изменений прав пользователей???
А еще у меня то 8.2
Вообще у меня есть регистр по изменениям прав доступа, но для этой разработки он не нужен и это совсем другая история — возможно это будет следующая публикация.
Принцип такой: при изменении ролей у пользователя если для роли стоит дата завершения, то для этого пользователя для этой роли делаем запись в регистре сведений (права на регистр только у роли администрирования пользователей). Далее на регламентном задании (пользователь от чьего имени делается не важно для клиент-сервера) проверяет есть ли в регистре записи с датой завершения сегодня и просто удаляет у пользователя эти роли и из регистра сведений.
Они же сами должны удаляться при запуске пользователя у которого у данной роли истек срок ??? Или ручками регистр чистить ? Заранее благодарю!
. Далее на регламентном задании (пользователь от чьего имени делается не важно для клиент-сервера) проверяет есть ли в регистре записи с датой завершения сегодня и просто удаляет у пользователя эти роли и из регистра сведений.
Регистр чистится по регламентному заданию каждое утро — на регламентном задании процедура висит из картинки №5.
У меня такая же тема Бух 8.2 Регламентрые задания не запускаются. Может дело в том что на SQL сервере база. ???
Все получилось спасибо всем за помошь. Это была проблема в свойствах сервера 1С Предприятия. Там регламентные задания отключаются.
Спасибо
Интересная идея