При разработке расширений для конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда права доступа ведут себя не так, как ожидается. Одной из самых коварных проблем является сохранение возможности интерактивного удаления объектов, даже если в созданной вами роли расширения этот флаг явно снят. Давайте разберем этот кейс на примере реальной ситуации в конфигурации ЗУП 3.1 на платформе 8.3.24 и выясним, как работает механизм расчета прав.
Представим ситуацию: вы создаете собственное расширение и добавляете в него новый справочник. Для управления доступом вы создаете в этом же расширении новую роль, например, ПрефРасш_ПолныеПрава. В настройках этой роли для вашего справочника вы намеренно снимаете флаг Интерактивное удаление, чтобы пользователи не могли случайно стереть данные из базы, минуя пометку на удаление.
Однако при тестировании под пользователем, которому назначена эта роль (и который обладает полными правами в основной конфигурации), выясняется, что кнопка Удалить (Shift+Del) все равно активна и прекрасно работает. На первый взгляд это кажется программным сбоем или «глюком» платформы, но на самом деле мы имеем дело с четко определенной логикой работы прав доступа в 1С.
Проанализируем базовый принцип работы системы прав. В 1С права всегда работают по принципу сложения (аддитивности). Если у пользователя есть хотя бы одна роль, разрешающая действие, то действие будет разрешено, независимо от ограничений в других ролях. Но в нашем случае программист утверждает, что во всех ролях расширения флаг снят.
Выясним причину глубже. Главный секрет кроется в свойстве типовой роли ПолныеПрава (или аналогичных административных ролей), которая находится в основной конфигурации. У таких ролей обычно включено свойство «Устанавливать права для новых объектов».
Как это работает:
ПолныеПрава из основной конфигурации «не знает» о ваших ограничениях в расширении, она просто дает карт-бланш на любые действия, включая Интерактивное удаление.Рассмотрим, как заставить систему учитывать наши ограничения. Единственный эффективный способ переопределить это поведение — это заимствование типовой роли в ваше расширение. Разберем по шагам, что при этом происходит:
ПолныеПрава, нажмите правую кнопку мыши и выберите «Добавить в расширение».ПолныеПрава становится частью расширения, платформа меняет логику. Теперь права для этой роли на объекты данного расширения определяются внутри самого расширения. Автоматическое назначение прав для «новых объектов» на эту роль перестает действовать в контексте этого конкретного расширения.Посмотрим на ситуацию со стороны версии платформы. Начиная с версии 8.3.24, алгоритмы расчета прав были дополнительно оптимизированы. Платформа стремится к тому, чтобы администратор системы не потерял доступ к новым подсистемам, которые добавляются через расширения. Именно поэтому «заимствование» роли становится обязательным шагом для тонкой настройки безопасности.
Также важно упомянуть Библиотеку стандартных подсистем (БСП). В современных конфигурациях, таких как ЗУП 3.1, БСП управляет доступом на программном уровне (через профили групп доступа). Однако право ИнтерактивноеУдаление является низкоуровневым правом платформы. Если платформа на уровне ядра разрешает удаление (так как видит активную роль с полными правами), то программные механизмы БСП могут просто не успеть вмешаться до того, как объект будет уничтожен.
Проанализируем алгоритм действий для разработчика, который создает новые объекты в расширении:
ПолныеПрава в свое расширение, если вы добавляете новые структуры данных.АдминистраторСистемы или специализированные полные права для профилей), их также стоит заимствовать.
// Пример проверки права программным способом
Если ПравоДоступа("ИнтерактивноеУдаление", Метаданные.Справочники.ПрефРасш_ВашСправочник) Тогда
Сообщить("Внимание! Интерактивное удаление разрешено.");
КонецЕсли;
Резюме: Если вы столкнулись с «лишними» правами в расширении, не спешите грешить на ошибки платформы. Проверьте свойство «Устанавливать права для новых объектов» в типовых ролях и обязательно заимствуйте эти роли в расширение для явного управления доступом к вашим объектам. Это гарантирует предсказуемое поведение системы и безопасность данных.