Почему для нового документа в расширении 1С появляется команда "Удалить" (непосредственное удаление) и как ее убрать?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

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

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

Выясняем причину: магия флага "Устанавливать права для новых объектов"

Основная причина появления "лишних" прав на объекты в расширениях — это наличие в основной конфигурации ролей с установленным свойством "Устанавливать права для новых объектов". В большинстве типовых конфигураций, включая "1С:Бухгалтерия", этот флаг по умолчанию включен для системной роли Полные права.

Что делает этот флаг? Когда пользователь, в набор прав которого входит роль с этим флагом (например, администратор с ролью Полные права), работает с системой, платформа 1С автоматически предоставляет все права на любые новые объекты, добавленные через расширения. Это сделано для удобства, чтобы после добавления расширения администратор сразу мог работать с новыми объектами без дополнительной настройки прав. Однако это удобство имеет обратную сторону: "все права" включают и такие опасные, как Интерактивное удаление, которое позволяет безвозвратно удалять данные, минуя контроль ссылочной целостности.

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

Решение 1 (Рекомендуемое): Заимствование и настройка ролей в расширении

Это самый правильный, контролируемый и безопасный способ решения проблемы. Мы не меняем основную конфигурацию, а явно указываем в расширении, какие права нужны для наших объектов.

Разберем по шагам:

  1. Откройте ваше расширение в конфигураторе.
  2. В дереве объектов расширения найдите ветку "Роли". Кликните по ней правой кнопкой мыши и выберите пункт "Добавить из конфигурации...".
  3. В открывшемся списке найдите и выберите роль, которая является причиной проблемы. Чаще всего это Полные права. Платформа скопирует (позаимствует) эту роль в ваше расширение.
  4. Теперь откройте заимствованную роль Полные права уже внутри вашего расширения. Вы увидите список всех объектов конфигурации.
  5. Найдите в списке ваш новый документ (или другой объект, для которого нужно ограничить права).
  6. В правой части окна вы увидите список всех доступных прав для этого объекта. Найдите право Интерактивное удаление и снимите с него галочку.
  7. Важный момент: После заимствования роли и снятия одного флага, возможно, придется явно проставить другие нужные права (Чтение, Просмотр, Редактирование и т.д.) для ваших объектов и их реквизитов, табличных частей и команд. Это происходит потому, что теперь права для объектов расширения определяются не автоматически, а согласно настройкам в заимствованной роли. Это может показаться утомительным, но зато вы получаете полный контроль над правами.

После сохранения расширения и перезапуска сеанса команда "Удалить" у администратора для вашего документа исчезнет. Вы решили проблему на уровне прав доступа, что является наилучшей практикой.

Решение 2 (Альтернативное): Управление видимостью команды на форме

Этот способ можно рассматривать как быстрый "косметический" ремонт. Он не убирает само право, а лишь скрывает кнопку с формы. Этот подход считается "гнилым решением" с точки зрения архитектуры безопасности, но может быть полезен в редких случаях.

Проанализируем ситуацию: мы можем программно скрыть стандартные команды формы. Для этого нужно в модуле формы объекта или формы списка, в серверной процедуре-обработчике события ПриСозданииНаСервере, написать простой код.

Посмотрим на пример:


Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Скрываем стандартную команду непосредственного удаления из командной панели формы
    // Имя элемента может отличаться, его можно посмотреть в редакторе формы. 
    // Обычно это "ФормаУдалить".
    Элементы.ФормаУдалить.Видимость = Ложь;
КонецПроцедуры

Ключевой недостаток этого метода: вы лишь спрятали кнопку. Само право Интерактивное удаление у пользователя осталось. Это значит, что он все еще может удалить объект, например, выделив его в списке и нажав комбинацию клавиш Shift + Del. Поэтому для надежной защиты данных этот способ использовать не следует.

Решение 3 (Не рекомендуется): Изменение основной конфигурации

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

Почему это плохая идея:

Этот путь ведет к созданию хрупкой и трудноподдерживаемой системы. Всегда старайтесь решать проблемы в рамках расширения, не затрагивая ядро основной конфигурации.

← На главную