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