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