Как назначить горячую клавишу Delete для кнопки в табличном поле обычной формы 1С?

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

В процессе разработки интерфейсов на обычных формах 1С:Предприятие 8 программисты часто сталкиваются с жесткими ограничениями платформы. Одна из таких проблем — невозможность назначить системную клавишу Delete кнопке командной панели, если фокус находится на табличном поле, особенно когда для этого поля установлено свойство ТолькоПросмотр или ТолькоЧтение. В этой статье мы подробно разберем, почему возникает эта сложность, и изучим несколько эффективных способов её решения — от программного «хака» до архитектурных изменений в поведении формы.

Почему стандартный способ назначения клавиши Delete не работает?

Разберем ситуацию: в конфигураторе при попытке выбрать сочетание клавиш для кнопки в выпадающем списке часто отсутствуют системные клавиши, такие как Delete, Insert или Enter, так как они зарезервированы самой платформой для стандартных действий над строками таблицы (удаление, добавление, начало редактирования). Когда мы устанавливаем для табличного поля режим ТолькоЧтение = Истина, платформа блокирует стандартное действие удаления строки, но при этом продолжает перехватывать нажатие клавиши Delete, не передавая его пользовательской кнопке.

Проанализируем ситуацию глубже: платформа 1С на уровне ядра связывает определенные скан-коды клавиш с действиями над коллекциями. Чтобы обойти это поведение и заставить свою кнопку реагировать на нажатие Delete, нам придется прибегнуть к нестандартным методам.

Способ 1: Программное назначение через внутреннюю строку (Самый эффективный)

Как выяснилось в ходе обсуждения, самым лаконичным решением является программная установка свойства СочетаниеКлавиш. Однако напрямую присвоить клавишу через объект Клавиша не всегда получается из-за ограничений объектной модели. Мы можем использовать метод ЗначениеИзСтрокиВнутр, который позволяет задать настройки объекта в обход визуального интерфейса конфигуратора.

Рассмотрим пример кода, который необходимо разместить в обработчике ПриОткрытии вашей формы:


// В обработчике формы ПриОткрытии()
Процедура ПриОткрытии()
    
    // Получаем доступ к нужной кнопке в командной панели табличного поля
    // Замените "КоманднаяПанельТабличногоПоля" и "КнопкаУдалить" на ваши имена элементов
    КнопкаУдалить = ЭлементыФормы.КоманднаяПанель1.Кнопки.УдалитьЗначение;
    
    // Используем внутреннее представление сочетания клавиш (Delete имеет код 46)
    // GUID {69cf4251-8759-11d5-bf7e-0050bae2bc79} отвечает за тип "СочетаниеКлавиш"
    КнопкаУдалить.СочетаниеКлавиш = ЗначениеИзСтрокиВнутр("{""#"",69cf4251-8759-11d5-bf7e-0050bae2bc79,1,{0,46,0}}");
    
КонецПроцедуры

Разберем, что означает эта магическая строка. Внутренний формат 1С хранит описание горячей клавиши в виде структуры, где 46 — это ASCII-код клавиши Delete. Таким образом, мы принудительно внедряем нужную настройку в метаданные формы в оперативной памяти. Этот метод хорош тем, что он не требует внешних библиотек и работает стабильно на платформе 8.3.

Способ 2: Имитация режима «Только чтение» через события

Если программное назначение клавиши по каким-то причинам не подходит, рассмотрим альтернативный подход. Мы можем отключить свойство ТолькоЧтение у табличного поля, тем самым «освободив» клавишу Delete для платформенной обработки, но при этом заблокировать любые изменения данных через обработчики событий.

Выясним, какие события нам понадобятся для полной имитации режима «Только чтение»:

  1. ПередНачаломИзменения: здесь мы будем блокировать вход в режим редактирования ячейки.
  2. ПередУдалением: здесь мы перехватим стандартное удаление строки и выполним свою логику (например, очистку значения в ячейке).
  3. ПередДобавлением: чтобы пользователь не мог создать новую строку.

Посмотрим на пример реализации этого метода:


Процедура ТабличноеПолеПередНачаломИзменения(Элемент, Отказ)
    // Запрещаем редактирование ячеек, как если бы стояло "Только чтение"
    Отказ = Истина;
КонецПроцедуры

Процедура ТабличноеПолеПередУдалением(Элемент, Отказ)
    // Вместо удаления всей строки выполняем очистку значения в текущей ячейке
    ТекущаяКолонка = Элемент.ТекущаяКолонка.Имя;
    ТекущаяСтрока = Элемент.ТекущиеДанные;
    
    Если ТекущаяСтрока <> Неопределено Тогда
        ТекущаяСтрока[ТекущаяКолонка] = Неопределено; // Или другое значение по умолчанию
    КонецЕсли;
    
    // Устанавливаем Отказ в Истина, чтобы сама строка не исчезла из таблицы
    Отказ = Истина;
КонецПроцедуры

Этот способ позволяет использовать стандартную логику 1С по обработке горячих клавиш, сохраняя при этом полный контроль над данными. Пользователь нажимает Delete, срабатывает событие ПередУдалением, мы меняем данные и отменяем само удаление строки.

Способ 3: Использование «Фантомной кнопки»

Проанализируем еще один интересный прием, который часто используется в сложных интерфейсах. Если табличное поле упорно «съедает» нажатие клавиши и не передает его кнопке в своей командной панели, мы можем создать независимую кнопку на самой форме.

Разберем по шагам, как это сделать:

  1. Добавим на форму обычную кнопку (вне командной панели табличного поля).
  2. В свойствах этой кнопки в поле «Сочетание клавиш» выберем Alt+Del или попробуем назначить Del (в некоторых версиях платформы это доступно для кнопок формы, но недоступно для кнопок таблиц).
  3. Установим кнопке свойство Видимость = Истина, но сделаем её практически незаметной: уменьшим размер до 1x1 пикселя или вынесем её за границы видимости формы (например, установив координаты Лево = -100).
  4. В обработчике нажатия этой кнопки пропишем код удаления значения из активной ячейки табличного поля. Для имитации кликов и автоматизации повторяющихся операций в интерфейсе без написания программного кода также применяются программные роботы.

Важный нюанс: Если вы установите Видимость = Ложь, горячая клавиша перестанет работать. Кнопка обязательно должна быть «видимой» для системы, даже если пользователь её не видит.

Способ 4: Низкоуровневый перехват (WinAPI)

Для самых сложных случаев, когда штатные средства бессильны, программисты используют внешние компоненты, такие как FormEx (актуально для 7.7) или специализированные Native API компоненты для 8.3. Эти библиотеки позволяют установить «хук» на сообщения операционной системы Windows. Когда фокус находится в окне 1С и нажимается клавиша, внешняя компонента перехватывает событие WM_KEYDOWN со значением VK_DELETE и вызывает процедуру в модуле формы 1С.

Однако, мы рекомендуем использовать этот метод в последнюю очередь, так как он сильно усложняет поддержку решения и может привести к нестабильности работы клиента на разных версиях ОС.

Сравнение методов и рекомендации

Подведем итог нашему анализу:

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

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

← На главную