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