При настройке прав доступа в конфигурациях на базе БСП (например, ЗУП 3.1, ERP, КА) администраторы и программисты часто сталкиваются с ситуацией, когда пользователю даны права на редактирование объекта (регистра или справочника), но в интерфейсе отсутствуют кнопки сохранения изменений. В частности, распространен сценарий, когда необходимо дать доступ к форме "Дополнительные настройки" (меню Настройка), чтобы пользователь мог управлять опциями вроде "Показывать взаиморасчеты", но при этом не выдавать ему роль "Полные права".
Разберем подробно, почему при наличии прав на регистр сведений кнопка "Записать и закрыть" исчезает, почему копирование роли администратора не помогает, и какие способы решения этой задачи существуют.
Рассмотрим исходную ситуацию. Вы решили предоставить пользователю возможность менять настройки программы, хранящиеся в регистре сведений ДополнительныеНастройкиЗарплатаКадры. Вы выполнили следующие действия:
ДополнительныеНастройкиЗарплатаКадры.Однако, несмотря на наличие прав доступа к данным, на форме отсутствует стандартная кнопка "Записать и закрыть". При этом добавление роли ПолныеПрава моментально возвращает кнопку на место.
Попытка скопировать роль ПолныеПрава в новую роль (например, ПолныеПрава2) и назначить ее пользователю также не приводит к успеху — кнопка все равно отсутствует. Это говорит о том, что проверка прав выполняется не только на уровне платформы (галочки в ролях), но и на программном уровне конфигурации.
В управляемых формах видимость стандартных кнопок (Записать, Провести, Удалить) определяется платформой автоматически. Платформа анализирует:
ТолькоПросмотр программно при создании.В случае с настройками программы, форма часто работает не напрямую с записью регистра, а через механизмы функциональных опций и констант. Если у пользователя нет прав на запись связанных констант или выполнение административных действий (например, обновление параметров интерфейса), платформа может скрыть команду записи, считая действие невыполнимым целиком.
Как выяснилось в ходе разбора ситуации, одним из действенных методов является принудительная настройка видимости команды через конфигуратор или расширение.
Разберем этот метод по шагам:
ДополнительныеНастройкиЗарплатаКадры).Авто попробуйте установить явное значение или проверьте настройки видимости по ролям.В некоторых случаях достаточно изменить свойство Использование у самой команды, чтобы платформа перестала скрывать её автоматически.
Если манипуляции с видимостью кнопок не помогают (например, платформа блокирует запись на уровне попытки сохранения), надежным вариантом является создание собственной логики сохранения через расширение.
Суть метода заключается в том, чтобы дать пользователю интерфейс, а саму запись выполнять "от имени" системы, минуя проверки прав.
Порядок действий:
Пример кода для модуля формы в расширении:
&НаКлиенте
Процедура Расш1_СохранитьНастройки(Команда)
Расш1_СохранитьНастройкиНаСервере();
Закрыть();
КонецПроцедуры
&НаСервере
Процедура Расш1_СохранитьНастройкиНаСервере()
// Устанавливаем режим, игнорирующий проверки прав доступа
УстановитьПривилегированныйРежим(Истина);
// Здесь код записи набора записей регистра или сохранения данных формы
// Например, для регистра сведений:
НаборЗаписей = РегистрыСведений.ДополнительныеНастройкиЗарплатаКадры.СоздатьНаборЗаписей();
// ... заполнение отбором и данными из реквизитов формы ...
НаборЗаписей.Записать();
КонецПроцедуры
Важное замечание: При использовании расширений убедитесь, что в свойствах расширения снят флажок "Безопасный режим", иначе команда УстановитьПривилегированныйРежим(Истина) будет проигнорирована платформой.
Многие пытаются решить проблему, копируя роль ПолныеПрава и пытаясь урезать её. Давайте разберем, почему это часто не срабатывает. Это важный теоретический момент.
В конфигурациях на базе БСП существует общий модуль (обычно Пользователи или УправлениеДоступом), который содержит функции проверки административных прав. Код внутри этих функций часто выглядит примерно так:
Функция ЭтоПолноправныйПользователь(Пользователь = Неопределено) Экспорт
// ...
Если РольДоступна("ПолныеПрава") Или РольДоступна("СистемныйАдминистратор") Тогда
Возврат Истина;
КонецЕсли;
// ...
КонецФункции
Платформа и код конфигурации проверяют наличие роли по имени метаданных. Если вы создаете роль ПолныеПрава2, то с точки зрения платформы у пользователя есть доступ к таблицам базы данных (если вы скопировали галочки), но с точки зрения встроенного кода БСП этот пользователь не является администратором.
Именно поэтому при открытии формы срабатывает код ПриСозданииНаСервере, который проверяет функцию ЭтоПолноправныйПользователь(). Получая Ложь, код принудительно устанавливает элементам формы режим ТолькоПросмотр или скрывает командную панель.
Прежде чем бороться с кнопками на форме, полезно убедиться, что пользователю действительно разрешено писать в регистр на уровне базы данных. Для этого:
ДополнительныеНастройкиЗарплатаКадры.Если в списке редактирование доступно, а в красивой форме настроек — нет, значит проблема исключительно в программном коде формы (как описано в разделе про БСП выше) или свойствах командной панели. Если же редактирование недоступно и в списке ("серые" поля), значит проблема в RLS (ограничении прав на уровне записей) или недостающих правах на связанные объекты.
Для решения задачи "дать доступ к настройкам без полных прав":
ДополнительныеНастройкиЗарплатаКадры.УстановитьПривилегированныйРежим(Истина).