Как в форме списка и форме документа убрать возможность пометки на удаление и перехватить клавишу Del?

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

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

Причины появления ошибки прав доступа и отображения кнопок

Проанализируем механику работы платформы «1С:Предприятие» в обычных формах:

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

Шаг 1. Настройка командной панели и контекстного меню

Для того чтобы визуально скрыть кнопки установки и снятия пометки на удаление из панели инструментов и контекстного меню списка, выполним следующие действия:

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

Шаг 2. Перехват нажатия клавиши Del в форме списка

Даже если кнопки удалены из интерфейса, при выделении строки в списке и нажатии пользователем клавиши Del платформа пытается инициировать интерактивное действие. Чтобы перехватить это событие до возникновения системного сообщения о нарушении прав, используем стандартное событие табличного поля списка ПередУстановкойПометкиУдаления.

Посмотрим на пример обработчика в модуле формы списка:


Процедура СписокПередУстановкойПометкиУдаления(Элемент, Отказ)
    // Блокируем стандартное действие платформы
    Отказ = Истина;
    
    // При необходимости можно вывести понятное пользователю предупреждение:
    // ПоказатьПредупреждение(, "Установка пометки на удаление для данного документа запрещена!");
КонецПроцедуры

Установка параметра Отказ = Истина полностью отменяет стандартную попытку изменения статуса объекта, предотвращая вызов проверки ролей и появление системного предупреждения «Нарушение прав доступа».

Шаг 3. Блокировка пометки на удаление в форме самого документа

Если требуется заблокировать возможность пометки на удаление непосредственно из открытой формы редактирования документа, переопределим обработчик события самой формы ПередУстановкойПометкиУдаления:


Процедура ПередУстановкойПометкиУдаления(Отказ)
    Отказ = Истина;
КонецПроцедуры

Данный обработчик отменяет выполнение команды пометки на удаление при вызове ее из главного меню формы «Действия».

Альтернативные способы блокировки в обычных формах

Рассмотрим дополнительные методы управления поведением табличного поля списка:

  1. Свойство ИзменятьСоставСтрок: Если список предназначен исключительно для просмотра или выборки и в нем не требуется создавать, копировать или удалять строки, можно отключить свойство ИзменятьСоставСтрок табличного поля: ЭлементыФормы.Список.ИзменятьСоставСтрок = Ложь; Это автоматически отключит обработку клавиш Del и Insert на уровне элемента управления.
  2. Свойство ТолькоПросмотр: Установка свойства ЭлементыФормы.Список.ТолькоПросмотр = Истина полностью переводит таблицу в режим чтения, блокируя любые интерактивные изменения.
  3. Переопределение горячей клавиши: В командную панель можно добавить собственную кнопку, назначить ей сочетание клавиш с Клавиша.Delete и привязать к пустой процедуре, чтобы полностью перехватить нажатие клавиши в рамках активной формы.

Особенности реализации в Управляемых формах

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

  1. Отключение стандартных команд: В свойствах таблицы формы, отображающей динамический список, в разделе «Командная панель» снимается флаг со стандартной команды Установить пометку на удаление / Снять пометку на удаление.
  2. Событие таблицы: Для перехвата горячей клавиши Del используется событие таблицы формы ПередНачаломУдаления:
    
    &НаКлиенте
    Процедура СписокПередНачаломУдаления(Элемент, Отказ)
        Отказ = Истина;
    КонецПроцедуры
    

Важные ограничения

Следует помнить, что обработчики событий формы (ПередУстановкойПометкиУдаления и ПередНачаломУдаления) предотвращают изменение состояния объекта только при интерактивных действиях пользователя в конкретной форме. Если пометка на удаление устанавливается программно (через метод УстановитьПометкуУдаления() или прямую запись объекта), эти события формы не вызываются. Для полной защиты данных на программном уровне необходимо использовать права доступа (роли) или подписки на события ПередЗаписью на уровне сервера.

← На главную