Этюды по программированию. Разграничение прав

Задача: Имеется конфигурация на базе Библиотеки Стандартных Подсистем(БСП) -практически любая стандартная конфигурация 1С.
Есть, к примеры заказы покупателей. Есть группы менеджеров, каждая из которых должна иметь доступ только к заказам своей группы.

Этюды по программированию. Разграничение прав.

Задача: Имеется конфигурация на базе Библиотеки Стандартных Подсистем(БСП) -практически любая стандартная конфигурация 1С.

Есть, к примеры заказы покупателей. Есть группы менеджеров, каждая из которых должна иметь доступ только к  заказам своей группы.

Если менеджеры могут видеть заказы только своей группы и не могут видеть заказы других групп, то задача решается штатными средствами совсем просто:

1. Включается "Ограничивать доступа на уровне записей".

2. Создаются группы доступа, каждая включает в себя членов соответствующей группы. В настройках группы указывается профиль доступа для менеджеров. В профиле группы на закладке "Ограничения доступа" указывается "Пользователи: Запрещены все, исключения в группах пользователей".

3. В Группах доступа для менеджеров прописываются исключения — пользователи только своей группы. Причем выбирается именно группа а не список пользователей, что бы было легче администрировать.

Если менеджеры должны видеть заказы членов других групп, но не могут их изменять, то задача становится более интересной. 

Первый способ:

Можно создать два профиля . Один с правом доступа на чтение, второй с правом доступа на изменение. В обоих профилях все пользователи запрещены, исключения в группах доступа. Создается группа доступа с профилем на чтение, которая включает всех менеджеров. И по группе доступа на каждую группу менеджеров с профилем на изменение и исключениями для членов своей группы. 

Второй способ, для тек кто любит идти трудным путем:

Это добавить при открытии заказа строку:

ЭтаФорма.ТолькоПросмотр= НЕ мо_ФИРМА_Привилегированный_Сервер.ЗаказКлиентаВозможностьРедактирования(Объект.Менеджер);

Соответственно нужно добавить в конфигурацию привелигелированный общий модуль с возможностью вызова сервера.

Модуль содержит следующую экспортную функцию:   

 

Функция ЗаказКлиентаВозможностьРедактирования(Ответственный) Экспорт
ТекущийПользователь=Пользователи.ТекущийПользователь();
Если  Не ЗначениеЗаполнено(Ответственный) Тогда
Возврат Истина;
КонецЕсли;
Если  Ответственный= ТекущийПользователь Тогда
Возврат Истина;
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
  | ГруппыДоступаПользователи.Ссылка КАК Ссылка
  |ИЗ
  | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
  |ГДЕ
  | (ГруппыДоступаПользователи.Пользователь = &ТекущийПользователь
  |   ИЛИ ГруппыДоступаПользователи.Пользователь В
  |    (ВЫБРАТЬ
  |     ГруппыПользователейСостав.Ссылка КАК Ссылка
  |    ИЗ
  |     Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
  |    ГДЕ
  |     ГруппыПользователейСостав.Пользователь = &ТекущийПользователь))
  | И ГруппыДоступаПользователи.Ссылка.Профиль = &Профиль
  |;
  |
  |////////////////////////////////////////////////////////////////////////////////
  |ВЫБРАТЬ ПЕРВЫЕ 1
  | ГруппыДоступаПользователи.Ссылка КАК Ссылка
  |ИЗ
  | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
  |ГДЕ
  | (ГруппыДоступаПользователи.Пользователь = &Ответственный
  |   ИЛИ ГруппыДоступаПользователи.Пользователь В
  |    (ВЫБРАТЬ
  |     ГруппыПользователейСостав.Ссылка КАК Ссылка
  |    ИЗ
  |     Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
  |    ГДЕ
  |     ГруппыПользователейСостав.Пользователь = &Ответственный))
  | И ГруппыДоступаПользователи.Ссылка.Профиль = &Профиль";

Запрос.УстановитьПараметр("ТекущийПользователь", ТекущийПользователь);
Запрос.УстановитьПараметр("Ответственный", Ответственный);
Запрос.УстановитьПараметр("Профиль", Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("Менеджер по продажам ФИРМА"));

МассивРезультатов = Запрос.ВыполнитьПакет();
Выборка1 = МассивРезультатов[0].Выбрать();
Выборка2 = МассивРезультатов[1].Выбрать();


Если  НЕ Выборка1.Следующий() Тогда  // Пользователь не в группе "Менеджер по продажам ФИРМА"
Возврат Истина;
КонецЕсли;

Если  Выборка2.Следующий() и Выборка1.Ссылка = Выборка2.Ссылка Тогда
Возврат Истина;

КонецЕсли;
Возврат Ложь;

КонецФункции

Обратите внимание, нужны заполненные группы доступа с профилями пользователей с названием "Менеджер по продажам ФИРМА". Надеюсь эта статья окажется Вам полезной.

P.S.: Надеюсь, вам понравится эта и другие мои статьи и разработки на //infostart.ru/profile/48714/.

7 Comments

  1. webester

    Заголовок: ЭтюдЫ по программированию. Разграничение прав.

    Сажусь читать. Очень интересно. Начинаю читать и… после первого «этюда» статья кончается. Как то странно. Это как бы статья из серии статей?

    Reply
  2. 1st

    Как то однобоко ограничивается возможность изменения, «чужой» менеджер не сможет изменить документ только открыв форму, зато все остальные способы изменения документа, где не требуется открытие формы, не защищены. Также не контролируется проведение/отмена проведения.

    Да и что Вам мешает в настройке роли перенести условия ограничения из «Чтение» в «Изменение», что по сути в корне решило бы проблему.

    Reply
  3. Romarius

    Если без «Ограничивать доступа на уровне записей», то все правильно сделал. Только нужно «ПриЗаписи» в модуле проверку также поставить

    Reply
  4. milkers

    (1)(2)(3)(4) Никита Грызлов, видимо абсолютно прав, можно обойтись без изменения конфигурации. Достаточно создать два профиля . Один с правом доступа на чтение, второй с правом доступа на изменение. В обоих профилях все пользователи запрещены, исключения в группах доступа. Создается группа доступа с профилем на чтение, которая включает всех менеджеров. И по группе доступа на каждую группу менеджеров с профилем на изменение и исключениями для членов своей группы. На неделе все перепроверю и перепишу статью.

    Reply
  5. Raminus

    Профили лучше пользовать а если уж пилить конфу то лучше RLS использовать.

    Reply
  6. ineshyk

    RLS — зло.

    Если менеджеры должны видеть заказы членов других групп, но не могут их изменять, то задача становится более интересной. Я не нашел способа решить ее, не меняя конфигурации или не делая расширения. Если кто-нибудь подскажет такой способ буду очень благодарен.

    Имхо, решить можно без доработки типовой БСП. Поставить ограничение, например по автору.

    Посмотрите, как в демо БСП это реализовано в бизнес-процессах. Тут даже RLS можно не использовать

    Reply
  7. Team leader

    (7) т.е. по самому себе а если в группе 5-7 человек, или автора можно брать из списка?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *