Как отключить сочетание клавиш Alt+F9 в 1С 7.7, сохранив ввод на основании через меню?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе повседневной работы в платформе 1С:Предприятие 7.7 пользователи журналов и списков документов нередко допускают случайные ошибки при наборе команд. Самая распространенная из них — случайное нажатие комбинации Alt+F9 вместо стандартной клавиши F9. Напомним, что по клавише F9 выполняется привычное копирование текущего документа, тогда как комбинация Alt+F9 вызывает команду Ввод на основании. В результате пользователь либо видит модальное окно выбора типа создаваемого документа, либо случайно генерирует ненужный подчиненный документ.

При этом перед разработчиком часто ставится задача: заблокировать именно клавиатурную комбинацию Alt+F9, но оставить пользователю возможность осознанно формировать подчиненные документы стандартным способом через главное или контекстное меню журнала. Выясним причину сложности и подробно разберем возможные способы реализации данной задачи.

Почему не подходит стандартный метод СтатусВозврата(0)?

Проанализируем стандартное поведение платформы. Первое, что часто приходит в голову разработчику, — использовать предопределенную процедуру ВводНаОсновании() в модуле документа и прервать ее выполнение с помощью оператора СтатусВозврата(0). Однако такое решение не подходит по следующим причинам:

  1. Платформа 1С 7.7 внутри процедуры ВводНаОсновании() не передает параметров, позволяющих определить источник вызова: была ли нажата горячая клавиша Alt+F9, выбран ли пункт в контекстном меню или вызов произошел программно.
  2. Если прописать СтатусВозврата(0), платформа заблокирует создание документа на основании абсолютно для всех сценариев, что противоречит исходной задаче.
  3. Сочетание Alt+F9 зашито в таблицу акселераторов платформы на уровне системного окна журнала, и стандартными средствами конфигуратора эту привязку удалить нельзя.

Рассмотрим рабочие способы обойти это платформенное ограничение.

Способ 1. Перехват горячей клавиши с помощью скрытой кнопки диалога

Этот способ является штатным для конфигуратора 1С 7.7 и не требует подключения внешних библиотек. Механизм таблицы акселераторов форм Windows устроен так: если на элемент диалога формы (кнопку) явно назначен хоткей, он перехватывает системную комбинацию журнала на себя.

Разберем по шагам, как настроить такую кнопку:

  1. Открываем форму требуемого журнала или списка документов в конфигураторе.
  2. Добавляем на форму диалога обычную экранную кнопку.
  3. В свойствах кнопки в поле Заголовок указываем знак амперсанда перед символом вызова, либо в свойствах формулы настраиваем привязку клавиши на Alt+F9.
  4. В формуле кнопки оставляем пустую функцию-заглушку или не указываем действие вовсе.
  5. Чтобы пользователь не видел лишний управляющий элемент и не кликал по нему мышью, выносим кнопку за границы видимой области формы диалога (задаем координаты размещения далеко за пределами видимости) либо задаем ей нулевую ширину и высоту.
  6. Важный момент: обязательно проверяем порядок обхода элементов формы по клавише Tab и исключаем данную кнопку из переходов фокуса (снимаем соответствующий признак доступности фокусировки), чтобы фокус оператора при перемещении по форме не проваливался в невидимый элемент.

Теперь при нажатии пользователем комбинации Alt+F9 управление перехватывается скрытой кнопкой, действие не выполняется, а вызов ввода на основании через меню журнала продолжает штатно функционировать.

Способ 2. Использование возможностей внешней компоненты FormEx

Если в конфигурации используется библиотека расширения возможностей интерфейса FormEx, задачу подавления нежелательных нажатий можно решить программно и более гибко. Компонента позволяет перехватывать системные события клавиатуры и оконные команды.

Посмотрим на пример перехвата через события клавиатуры формы. В модуле формы журнала мы можем задействовать обработчики клавиатуры компоненты FormEx:


Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФлагСтандартнойОбработки)
    // Проверяем нажатие клавиши F9 при зажатом Alt
    // Код клавиши F9 равен 120 (0x78)
    Если (Alt = 1) И (КодКлавиши = 120) Тогда
        // Отменяем стандартную обработку события платформой
        ФлагСтандартнойОбработки = 0;
    КонецЕсли;
КонецПроцедуры

Рассмотрим подробнее логику работы этого кода:

  1. При нажатии любой клавиши компонента вызывает процедуру ПриНажатииКнопкиКлавиатуры.
  2. Мы проверяем флаг зажатия системной клавиши Alt и скан-код функциональной клавиши F9.
  3. Сброс параметра ФлагСтандартнойОбработки = 0 принудительно гасит системное событие, предотвращая отправку платформой команды вызова подчиненного документа. При этом вызов той же операции через меню генерирует другое событие и отрабатывает без ограничений.

Кроме того, в более развитых сборках библиотек для 1С 7.7 доступен централизованный перехват команд главного окна конфигурации (на уровне оконных сообщений WM_COMMAND) через процедуру ПриПолученииКомандыГлавнымОкном(). Это позволяет реализовать подавление системного акселератора единожды в глобальном модуле без необходимости модификации каждого конкретного журнала.

Способ 3. Перехват на уровне операционной системы

Если конфигурацию изменять нельзя или база находится на строгой поддержке без возможности внедрения внешних библиотек, задачу можно решить системными средствами на рабочих местах пользователей или терминальном сервере:

  1. С помощью низкоуровневых клавиатурных хуков Windows (WH_KEYBOARD_LL) или специализированных утилит переназначения клавиатуры настраивается правило перехвата.
  2. В правиле указывается фильтр по имени исполняемого файла программы (1cv7.exe или 1cv7s.exe).
  3. Сочетание клавиш Alt+F9 для данного процесса блокируется или переназначается на пустое действие.

Таким образом, мы рассмотрели различные подходы к решению проблемы: от быстрого размещения скрытой кнопки в интерфейсе формы до программного перехвата средствами компоненты FormEx и системных фильтров.

← На главную