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