Этюды по программированию. Разграничение прав.
Задача: Имеется конфигурация на базе Библиотеки Стандартных Подсистем(БСП) -практически любая стандартная конфигурация 1С.
Есть, к примеры заказы покупателей. Есть группы менеджеров, каждая из которых должна иметь доступ только к заказам своей группы.
Если менеджеры могут видеть заказы только своей группы и не могут видеть заказы других групп, то задача решается штатными средствами совсем просто:
1. Включается "Ограничивать доступа на уровне записей".
2. Создаются группы доступа, каждая включает в себя членов соответствующей группы. В настройках группы указывается профиль доступа для менеджеров. В профиле группы на закладке "Ограничения доступа" указывается "Пользователи: Запрещены все, исключения в группах пользователей".
3. В Группах доступа для менеджеров прописываются исключения - пользователи только своей группы. Причем выбирается именно группа а не список пользователей, что бы было легче администрировать.
Если менеджеры должны видеть заказы членов других групп, но не могут их изменять, то задача становится более интересной.
Первый способ:
Можно создать два профиля . Один с правом доступа на чтение, второй с правом доступа на изменение. В обоих профилях все пользователи запрещены, исключения в группах доступа. Создается группа доступа с профилем на чтение, которая включает всех менеджеров. И по группе доступа на каждую группу менеджеров с профилем на изменение и исключениями для членов своей группы.
Второй способ, для тех, кто любит идти трудным путем:
Это добавить при открытии заказа строку:
ЭтаФорма.ТолькоПросмотр= НЕ мо_ФИРМА_Привилегированный_Сервер.ЗаказКлиентаВозможностьРедактирования(Объект.Менеджер);
Соответственно нужно добавить в конфигурацию привелигелированный общий модуль с возможностью вызова сервера.
Модуль содержит следующую экспортную функцию:
Функция ЗаказКлиентаВозможностьРедактирования(Ответственный) Экспорт ТекущийПользователь=Пользователи.ТекущийПользователь(); Если Не ЗначениеЗаполнено(Ответственный) Тогда Возврат Истина; КонецЕсли; Если Ответственный= ТекущийПользователь Тогда Возврат Истина; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ГруппыДоступаПользователи.Ссылка КАК Ссылка |ИЗ | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи |ГДЕ | (ГруппыДоступаПользователи.Пользователь = &ТекущийПользователь | ИЛИ ГруппыДоступаПользователи.Пользователь В | (ВЫБРАТЬ | ГруппыПользователейСостав.Ссылка КАК Ссылка | ИЗ | Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав | ГДЕ | ГруппыПользователейСостав.Пользователь = &ТекущийПользователь)) | И ГруппыДоступаПользователи.Ссылка.Профиль = &Профиль |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ПЕРВЫЕ 1 | ГруппыДоступаПользователи.Ссылка КАК Ссылка |ИЗ | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи |ГДЕ | (ГруппыДоступаПользователи.Пользователь = &Ответственный | ИЛИ ГруппыДоступаПользователи.Пользователь В | (ВЫБРАТЬ | ГруппыПользователейСостав.Ссылка КАК Ссылка | ИЗ | Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав | ГДЕ | ГруппыПользователейСостав.Пользователь = &Ответственный)) | И ГруппыДоступаПользователи.Ссылка.Профиль = &Профиль"; Запрос.УстановитьПараметр("ТекущийПользователь", ТекущийПользователь); Запрос.УстановитьПараметр("Ответственный", Ответственный); Запрос.УстановитьПараметр("Профиль", Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("Менеджер по продажам ФИРМА")); МассивРезультатов = Запрос.ВыполнитьПакет(); Выборка1 = МассивРезультатов[0].Выбрать(); Выборка2 = МассивРезультатов[1].Выбрать(); Если НЕ Выборка1.Следующий() Тогда // Пользователь не в группе "Менеджер по продажам ФИРМА" Возврат Истина; КонецЕсли; Если Выборка2.Следующий() и Выборка1.Ссылка = Выборка2.Ссылка Тогда Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции
Обратите внимание, нужны заполненные группы доступа с профилями пользователей с названием "Менеджер по продажам ФИРМА". Надеюсь эта статья окажется Вам полезной.
P.S.: Надеюсь, вам понравится эта и другие мои статьи и разработки на //infostart.ru/profile/48714/.