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