Почему не работает запрет интерактивного удаления в расширении 1С и как это исправить

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При разработке расширений для конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда права доступа ведут себя не так, как ожидается. Одной из самых коварных проблем является сохранение возможности интерактивного удаления объектов, даже если в созданной вами роли расширения этот флаг явно снят. Давайте разберем этот кейс на примере реальной ситуации в конфигурации ЗУП 3.1 на платформе 8.3.24 и выясним, как работает механизм расчета прав.

Суть проблемы: права есть, хотя их быть не должно

Представим ситуацию: вы создаете собственное расширение и добавляете в него новый справочник. Для управления доступом вы создаете в этом же расширении новую роль, например, ПрефРасш_ПолныеПрава. В настройках этой роли для вашего справочника вы намеренно снимаете флаг Интерактивное удаление, чтобы пользователи не могли случайно стереть данные из базы, минуя пометку на удаление.

Однако при тестировании под пользователем, которому назначена эта роль (и который обладает полными правами в основной конфигурации), выясняется, что кнопка Удалить (Shift+Del) все равно активна и прекрасно работает. На первый взгляд это кажется программным сбоем или «глюком» платформы, но на самом деле мы имеем дело с четко определенной логикой работы прав доступа в 1С.

Анализируем причину: аддитивность и «наследование» прав

Проанализируем базовый принцип работы системы прав. В 1С права всегда работают по принципу сложения (аддитивности). Если у пользователя есть хотя бы одна роль, разрешающая действие, то действие будет разрешено, независимо от ограничений в других ролях. Но в нашем случае программист утверждает, что во всех ролях расширения флаг снят.

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

Как это работает:

  1. Когда вы создаете новый объект (справочник, документ) внутри расширения, платформа видит его как «новый объект» по отношению к основной конфигурации.
  2. Если у пользователя есть роль из основной конфигурации с флагом «Устанавливать права для новых объектов», платформа автоматически дарует этой роли полные права на ваш новый справочник из расширения.
  3. Поскольку роль ПолныеПрава из основной конфигурации «не знает» о ваших ограничениях в расширении, она просто дает карт-бланш на любые действия, включая Интерактивное удаление.

Решение проблемы: заимствование роли

Рассмотрим, как заставить систему учитывать наши ограничения. Единственный эффективный способ переопределить это поведение — это заимствование типовой роли в ваше расширение. Разберем по шагам, что при этом происходит:

  1. Добавление роли в расширение: Найдите в дереве метаданных основной конфигурации роль ПолныеПрава, нажмите правую кнопку мыши и выберите «Добавить в расширение».
  2. Разрыв автоматической связи: Как только роль ПолныеПрава становится частью расширения, платформа меняет логику. Теперь права для этой роли на объекты данного расширения определяются внутри самого расширения. Автоматическое назначение прав для «новых объектов» на эту роль перестает действовать в контексте этого конкретного расширения.
  3. Настройка прав: Теперь вы можете зайти в заимствованную роль внутри расширения и убедиться, что для вашего нового справочника флаг Интерактивное удаление снят. В некоторых случаях даже простого добавления роли в расширение (без изменения галочек) достаточно, чтобы платформа перешла от «оптимистичного» назначения прав к строгому следованию настройкам расширения.

Особенности платформы 8.3.24 и влияние БСП

Посмотрим на ситуацию со стороны версии платформы. Начиная с версии 8.3.24, алгоритмы расчета прав были дополнительно оптимизированы. Платформа стремится к тому, чтобы администратор системы не потерял доступ к новым подсистемам, которые добавляются через расширения. Именно поэтому «заимствование» роли становится обязательным шагом для тонкой настройки безопасности.

Также важно упомянуть Библиотеку стандартных подсистем (БСП). В современных конфигурациях, таких как ЗУП 3.1, БСП управляет доступом на программном уровне (через профили групп доступа). Однако право ИнтерактивноеУдаление является низкоуровневым правом платформы. Если платформа на уровне ядра разрешает удаление (так как видит активную роль с полными правами), то программные механизмы БСП могут просто не успеть вмешаться до того, как объект будет уничтожен.

Практические рекомендации

Проанализируем алгоритм действий для разработчика, который создает новые объекты в расширении:


// Пример проверки права программным способом
Если ПравоДоступа("ИнтерактивноеУдаление", Метаданные.Справочники.ПрефРасш_ВашСправочник) Тогда
    Сообщить("Внимание! Интерактивное удаление разрешено.");
КонецЕсли;

Резюме: Если вы столкнулись с «лишними» правами в расширении, не спешите грешить на ошибки платформы. Проверьте свойство «Устанавливать права для новых объектов» в типовых ролях и обязательно заимствуйте эти роли в расширение для явного управления доступом к вашим объектам. Это гарантирует предсказуемое поведение системы и безопасность данных.

← На главную