Запрет на запись документов/справочников/РегистрСведений (ТолькоПросмотр)

Частенько приходится слушать от руководства: "запретить этому пользователю, запись этого документасправочника"… А через какое-то время, почему тот-то не может записать справочник/документ. Вот и родилась идея оперативного запрета/разрешения записи документа/справочника/рс.

Навеяно: Простой доступ только для чтения.

Данное решение работоспособно в типовых решениях, где присутсвует справочник «ГруппыПользователей».

  

Алгоритм механизма следующий:

1. Создаются подписки на событие ПередЗаписью на все документы/справочники/рс (в чем есть необходимость).

2. В справочнике «ГруппыПользователей» создается элемент, например: «Запрет на запись документа«.

3. Далее, в эту группу («Запрет на запись документа«)  добавляются элементы, для которых необходимо запретить запись, с именем = Имя справочника/документа/рс .

4. В обработчтике подписки на событие вставляем код:

    ИмяОбъекта = Источник.Метаданные().Имя;

    ГруппаЗапрета = Справочники.ГруппыПользователей.НайтиПоНаименованию(«Запрет на запись документов», Истина);

    ОбъектЗапрета = Справочники.ГруппыПользователей.НайтиПоНаименованию(ИмяОбъекта, Истина, ГруппаЗапрета);

    Если НЕ ОбъектЗапрета = Справочники.ГруппыПользователей.ПустаяСсылка() Тогда
       
Запрос = Новый Запрос;
       
Запрос.Текст = «ВЫБРАТЬ
        |   ГруппыПользователейПользователиГруппы.Ссылка
        |ИЗ
        |   Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователейПользователиГруппы
        |ГДЕ
        |   ГруппыПользователейПользователиГруппы.Пользователь = &Пользователь
        |   И ГруппыПользователейПользователиГруппы.Ссылка = &Ссылка»
;

        Запрос.УстановитьПараметр(«Пользователь», ПараметрыСеанса.ТекущийПользователь);
       
Запрос.УстановитьПараметр(«Ссылка», ОБъектЗапрета);

        Результат = Запрос.Выполнить();

        Если НЕ Результат.Пустой() Тогда
           
Отказ = Истина
        КонецЕсли;

    КонецЕсли;

В итоге имеем механизм, оперативного запрета/разрешения записи любого документа/справочника/РегистраСведений.

P.S. У данного решения остается вопрос с производительность при большом докуметообороте и включенном РЛС. Протестировать пока не представляется возможным.

14 Comments

  1. KonstB

    Частенько приходится слушать от руководства: «запретить этому пользователю, запись этого документасправочника»… А через какое-то время, почему тот-то не может записать справочник/документ. Вот и родилась идея оперативного запрета/разрешения записи документа/справочника/рс.

    Перейти к публикации

    Reply
  2. ninch

    Довольно не плохой способ ограничения прав. При случае надо проверить в деле:)

    Reply
  3. kapustinag

    Нужно на всякий случай проверить вот что:

    — Остальные группы «разрешительные», а эти — «запретительные».

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

    — Рассмотренный механизм добавляет (потенциально) еще много пересечений пользователя с другими пользователями. В смысле — пользователь может быть членом нескольких разрешительных групп, наряду с, например, 20 своими коллегами. А теперь он стал еще членом нескольких запретительных групп, наряду с 10 нарушителями каких-то там правил.

    — В результате этот пользователь или другие нарушители могут незапланированно получить доступ к тем документам (не видам документов, а именно конкретным документам), к которым не получали доступ через разрешительные группы.

    То есть опасность эта может быть, если включен и настроен доступ на уровне записей. Или если доступ регулируется другими (самодельными) механизмами, но с использованием вызовов функции ГруппыТекущегоПользователя().

    Reply
  4. kapustinag

    Как уже отметили в обсуждении темы «Простой доступ только для чтения», есть еще один вариант, сравнимый с этим:

    — Использовать не группы, а дополнительные права пользователя. В этом случае можно одной строкой запретить и группе целиком, а не только одному пользователю.

    Reply
  5. KonstB

    (2) kapustinag, Спасибо за коммент!

    Но на самом деле не шибко я понял, что Вы написали (видимо выходные сказываются) 🙂 Суть такова: если у пользователь состоит в группе, то он и не сможет записать этот объект.

    Например:

    -Запрет на запись Справочников

    — Номенклатура

    если пользователь включен в группу номен., то он и не запишет туда ничего.

    По сути если даже есть, какой-то свой механизм или ограничения на уровне записей, то нахождение пользователя в группе вызовет Отказ записи, и запись произведена не будет (данный механизм ограничивает только Запись).

    (3) kapustinag, До этого места я не дочитал. Вариант предложенный AuroraNorilsk мне больше нравится. Что-то я не подумал(до читал) об этом.

    Reply
  6. kapustinag

    (4) Наверно, я слишком косноязычен.

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

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

    Побочный эффект может заключаться в том, что, например, пользователь Вася получит доступ на просмотр не только тех документов «Реализация товаров и услуг», которые делал Петя (Вася и Петя находятся в одной разрешительной группе), но и к тем документам, которые делал Гриша (Вася и Гриша находятся в одной запретительной группе).

    Но, может быть, во многих ИБ ничего такого не произойдет.

    Reply
  7. chmod660

    кроме упомянутых неоднозначностей, второй момент:

    если я правильно понял, имена метаданных — это подгруппы в вашей группе запрета?

    тогда что произойдет, если есть одноименные метаданные, и я захочу одно запретить, а другое разрешить?

    например, справочник «СобытияОС» и регистр сведений «СобытияОС» ?

    Reply
  8. V.Nikonov

    Способ относительно простой и достаточно эффективный. Единственное замечание по реализации: Раз уж начали править Конфу, то эффективнее, вместо поиска (тем более по Наименованию), использовать Предопределённые значения. Соглашусь с (3) kapustinag

    Использовать не группы, а дополнительные права пользователя

    это заметно нагляднее при объявленной постановке задачи.

    Теперь по потребности в подобных закрытиях… Гораздо чаще, включают условные запреты, Например, Номенклатуру «из этой группы» можно править, а «в другие не лезь»… Или на одном Складе можно проводить документы, а на другом нельзя!

    Полные же запреты на виды действий, чаще «лечатся присвоением Роли с ограничением»…

    Reply
  9. KonstB

    (6) chmod660, Да все верно, имена метаданных — это подгруппы в группе запрета.

    ОбъектЗапрета ищется по родителю. Т.е. если отрабатывается подписка на событие ПередЗаписью документов, предполагается, что существует группа «Запрет на запись документов» (соот. для подписки на справочник группа «Запрет на запись справочников») — данный метод отсекет НЕ уникальность имен в различных метаданных.

    (7) V.Nikonov, Спасибо, про предопределенные, что то не подумал 🙂

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

    Reply
  10. itt

    как вариант надо будет проверить

    Reply
  11. taasha25

    Коллега!

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

    Сейчас буду тестировать.

    Reply
  12. a4a

    Интересный вариант, если использовать группы пользователей. Но, как правило, в базе бывает несколько пользователей с полными правами и каждый из них может вмешаться и изменить группы в режиме предприятия. В конфигуратор, как правило, все же заходят далеко не все. Хотя это, наверное, частная проблема.

    Reply
  13. ray-xp

    Спасибо за идею, использовать справочник «ГруппыПользователей»!

    Reply
  14. rm123

    Всё работает. Спасибо!

    Reply

Leave a Comment

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