В процессе повседневной работы в платформе 1С:Предприятие 7.7 пользователи журналов и списков документов нередко допускают случайные ошибки при наборе команд. Самая распространенная из них — случайное нажатие комбинации Alt+F9 вместо стандартной клавиши F9. Напомним, что по клавише F9 выполняется привычное копирование текущего документа, тогда как комбинация Alt+F9 вызывает команду Ввод на основании. В результате пользователь либо видит модальное окно выбора типа создаваемого документа, либо случайно генерирует ненужный подчиненный документ.
При этом перед разработчиком часто ставится задача: заблокировать именно клавиатурную комбинацию Alt+F9, но оставить пользователю возможность осознанно формировать подчиненные документы стандартным способом через главное или контекстное меню журнала. Выясним причину сложности и подробно разберем возможные способы реализации данной задачи.
Проанализируем стандартное поведение платформы. Первое, что часто приходит в голову разработчику, — использовать предопределенную процедуру ВводНаОсновании() в модуле документа и прервать ее выполнение с помощью оператора СтатусВозврата(0). Однако такое решение не подходит по следующим причинам:
ВводНаОсновании() не передает параметров, позволяющих определить источник вызова: была ли нажата горячая клавиша Alt+F9, выбран ли пункт в контекстном меню или вызов произошел программно.СтатусВозврата(0), платформа заблокирует создание документа на основании абсолютно для всех сценариев, что противоречит исходной задаче.Рассмотрим рабочие способы обойти это платформенное ограничение.
Этот способ является штатным для конфигуратора 1С 7.7 и не требует подключения внешних библиотек. Механизм таблицы акселераторов форм Windows устроен так: если на элемент диалога формы (кнопку) явно назначен хоткей, он перехватывает системную комбинацию журнала на себя.
Разберем по шагам, как настроить такую кнопку:
Теперь при нажатии пользователем комбинации Alt+F9 управление перехватывается скрытой кнопкой, действие не выполняется, а вызов ввода на основании через меню журнала продолжает штатно функционировать.
Если в конфигурации используется библиотека расширения возможностей интерфейса FormEx, задачу подавления нежелательных нажатий можно решить программно и более гибко. Компонента позволяет перехватывать системные события клавиатуры и оконные команды.
Посмотрим на пример перехвата через события клавиатуры формы. В модуле формы журнала мы можем задействовать обработчики клавиатуры компоненты FormEx:
Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФлагСтандартнойОбработки)
// Проверяем нажатие клавиши F9 при зажатом Alt
// Код клавиши F9 равен 120 (0x78)
Если (Alt = 1) И (КодКлавиши = 120) Тогда
// Отменяем стандартную обработку события платформой
ФлагСтандартнойОбработки = 0;
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее логику работы этого кода:
ПриНажатииКнопкиКлавиатуры.Alt и скан-код функциональной клавиши F9.ФлагСтандартнойОбработки = 0 принудительно гасит системное событие, предотвращая отправку платформой команды вызова подчиненного документа. При этом вызов той же операции через меню генерирует другое событие и отрабатывает без ограничений.Кроме того, в более развитых сборках библиотек для 1С 7.7 доступен централизованный перехват команд главного окна конфигурации (на уровне оконных сообщений WM_COMMAND) через процедуру ПриПолученииКомандыГлавнымОкном(). Это позволяет реализовать подавление системного акселератора единожды в глобальном модуле без необходимости модификации каждого конкретного журнала.
Если конфигурацию изменять нельзя или база находится на строгой поддержке без возможности внедрения внешних библиотек, задачу можно решить системными средствами на рабочих местах пользователей или терминальном сервере:
WH_KEYBOARD_LL) или специализированных утилит переназначения клавиатуры настраивается правило перехвата.1cv7.exe или 1cv7s.exe).Таким образом, мы рассмотрели различные подходы к решению проблемы: от быстрого размещения скрытой кнопки в интерфейсе формы до программного перехвата средствами компоненты FormEx и системных фильтров.