Управление видимостью разделов для разных пользователей.
Возникла задача добавить в интерфейс БП 3.0 новые разделы, причем видно их должно быть только тем пользователям, которым это дозволено.
Вариантов много, но, в рамках задачи, всё укладывалось в расширение в режиме совместимости 8.3.10 (действующей на сегодня). Конфигурацию остаётся на поддержке, а с разделами поступим, как водится , с использованием ролей…
Внезапно, выяснилось, что управлять ролями, созданными в режиме расширения, «традиционными» способами не представляется возможным (ежели кто умеет, прошу покорно рассказать, как это делается). Это есть повод для драки размышлений, пришла идея использовать для установки пользователю роли из расширения программно, по значению дополнительного сведения пользователя.
В общем, по итогам вышло так:
1. Создаём дополнительное сведение для справочника «Пользователи», например «Доступный раздел», с типом значения «Дополнительное значение». Значениями которого сделаем «Вот такой раздел» и «Совсем другой раздел».
Как сделать? Администрирование – Общие настройки – «Дополнительные реквизиты и сведения» устанавливаем одноимённый флаг, затем гиперссылка «Дополнительные сведения». Ищем справочник «Пользователи», жмём «Создать», в поле наименование пишем «Доступный раздел», жмём «Записать», потом на закладке «Значения» создаём две, поименованные выше, строки.
2. Создаем расширение «СкрытьПоказатьРазделыПользователям»
Как сделать? В конфигураторе «Конфигурация» - «Расширения конфигурации» жмём «Добавить». В имени пишем «СкрытьПоказатьРазделыПользователям», Префикс «_еаю», назначение «Дополнение»:
Галки делаем как на картинке.
3. В модуле управляемого приложения расширения создаём процедуру:
&После ("ПриНачалеРаботыСистемы")
Процедура _ПриНачалеРаботыСистемы()
еаю_ОбработчикиКлиент.ПроверитьПравоПользователя();
КонецПроцедуры
Как сделать? ПКМ на первой строке расширения «Открыть модуль управляемого приложения». Туда копируем приведённый выше текст.
4. Добавляем в расширение все измерения и ресурс регистра сведений «ДополнительныеСведения»
Как сделать? В дереве конфигурации ветка «Регистры сведений» находим «ДополнительныеСведения», открываем вету «Измерения», и на каждом измерении» ПКМ выбираем «Добавить в расширение», затем это же делаем с ресурсом, получим:
5. Добавляем в расширение два справочника, например «Контрагенты» и «Номенклатура». Добавление аналогично п.4, только никаких реквизитов не добавляем, для примера нам достаточно только справочников.
6. Создаем две подсистемы в расширении «еаю_ВотТакаяПодсистема» и «еаю_СовсемДругаяПодсистема». В состав первой добавляем справочник «Контрагенты», с состав второй «Номенклатура». В обеих подсистемах устанавливаем флаг «Включать в командный интерфейс».
7. Добавляем две роли в расширение «еаю_ВТР» и «еаю_СДР», в ревой делаем доступной подсистему «еаю_ВотТакаяПодсистема», во второй «еаю_СовсемДругаяПодсистема»
Как сделать? В конфигураторе в ветке «Роли» открываем нужную роль, и с дереве прав в ветке подсистемы устанавливаем флаг «Просмотр» для соответствующей подсистемы:
8. Создаем два общих модуля еаю_ОбработчикиКлиент (галка «Клиент (Управляемое приложение)») и еаю_ОбработчикиСервер (галки «Сервер» и «Вызов сервера»)
еаю_ОбработчикиКлиент:
Процедура ПроверитьПравоПользователя() Экспорт
Перезапуск = еаю_ОбработчикиСервер.ПроверитьПравоПользователяСервер();
Если Перезапуск Тогда
ЗавершитьРаботуСистемы(Ложь, Истина);
КонецЕсли;
КонецПроцедуры
еаю_ОбработчикиСервер:
Функция ПроверитьПравоПользователяСервер() Экспорт
Перезапуск = Ложь;
Пользователь = Пользователи.ТекущийПользователь();
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДополнительныеСведения.Значение КАК Значение
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект = &Объект
| И ДополнительныеСведения.Свойство.Заголовок = ""Доступный раздел"""
);
Запрос.УстановитьПараметр("Объект", Пользователь);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ИмяРоли = Выборка.Значение;
Иначе
ИмяРоли = Неопределено;
КонецЕсли;
Если Не ИмяРоли = Неопределено Тогда
нПользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Пользователь.ИдентификаторПользователяИБ);
Если "" + ИмяРоли = "Вот такой раздел" Тогда //так, конечно, пишу только для примера. в боевом коде можно сделать покрасивше)))
УстановитьРоль = Метаданные.Роли.Найти("еаю_ВТР");
ИначеЕсли "" + ИмяРоли = "Совсем другой раздел" Тогда
УстановитьРоль = Метаданные.Роли.Найти("еаю_СДР");
Иначе
УстановитьРоль = Неопределено;
КонецЕсли;
Если Не УстановитьРоль = Неопределено Тогда
Если Не нПользователь.Роли.Содержит(УстановитьРоль) Тогда
нПользователь.Роли.Добавить(УстановитьРоль); //Вот как раз тут устанавливаем роль, как сделать это по другому я не знаю
нПользователь.Записать();
Перезапуск = Истина; //Для принятия изменений программу нужно перезапустить
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Перезапуск;
КонецФункции
Затем нужным пользователем выбираем в дополнительных сведениях нужный ему раздел, и после перезапуска наслаждаемся его наличием в панели разделов))))
Для другого(их) пользователя(ей) можно установить другой раздел, если в доп.сведении ничего не выбрано, панель разделов останется типовой.