Как реализовать выполнение команды сразу при нажатии кнопки мыши в 1С, не дожидаясь её отпускания?

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

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

Анализ стандартного поведения платформы

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

Решение №1: Использование Поля HTML-документа

Это наиболее гибкий и кроссплатформенный метод, не требующий регистрации сторонних библиотек в системе. Мы заменим стандартную кнопку 1С на элемент управления, отрисованный внутри Поля HTML-документа. Современные версии платформы 8.3 используют движки WebKit или Chromium, что дает нам полный доступ к событиям объектной модели документа (DOM).

Рассмотрим по шагам процесс реализации:

  1. Добавим на форму реквизит с типом "Строка" (например, ТекстHTML) и вынесем его на форму как Поле HTML-документа.
  2. Сформируем HTML-код с кнопкой, у которой прописан обработчик события onmousedown.
  3. Реализуем механизм "проброса" события из JavaScript в код 1С.

Для передачи сигнала в 1С в старых релизах часто использовали смену location.href, но в современных конфигурациях мы рекомендуем использовать событие ПриНажатии или специализированные механизмы взаимодействия. Посмотрим на пример HTML-кода:


<html>
<body>
    <button onmousedown="sendTo1C('MouseDown')" onmouseup="sendTo1C('MouseUp')">
        Нажми меня!
    </button>

    <script>
    function sendTo1C(action) {
        // Имитируем переход по ссылке, который перехватит 1С
        window.location.href = "v8action://" + action;
    }
    </script>
</body>
</html>

В модуле управляемой формы нам необходимо перехватить это действие в обработчике события поля HTML-документа ПриНажатии (или OnRoute в зависимости от версии и типа клиента):


&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    АдресПерехода = ДанныеСобытия.Href;
    
    Если Найти(АдресПерехода, "v8action://MouseDown") > 0 Тогда
        СтандартнаяОбработка = Ложь;
        // Здесь пишем логику, которая должна сработать МГНОВЕННО
        Сообщить("Кнопка нажата! Выполняем действие...");
    КонецЕсли;
    
КонецПроцедуры

Разберем подробнее: метод postMessage также доступен в современных релизах платформы, что позволяет организовать еще более быстрый обмен данными между JavaScript и встроенным языком 1С без перезагрузки страницы или изменения адреса.

Решение №2: Использование внешних компонент (Native API)

Если нам критически важно оставить стандартные кнопки 1С, но при этом реагировать на их нажатие особым образом, придется использовать "тяжелую артиллерию" — внешние компоненты на C++ или C#. Выясним причину необходимости такого подхода: только низкоуровневый перехват сообщений Windows (Windows Hooks) позволяет узнать о состоянии мыши до того, как его обработает сама платформа.

Проанализируем алгоритм работы такой компоненты:

  1. Компонента подключается при создании формы через ПодключитьВнешнююКомпоненту.
  2. С помощью функции WinAPI SetWindowsHookEx компонента начинает мониторить системную очередь сообщений.
  3. При обнаружении события WM_LBUTTONDOWN (левая кнопка мыши нажата), компонента генерирует ВнешнееСобытие, которое мгновенно попадает в 1С.

Пример обработки внешнего события в модуле формы:


&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    Если Событие = "MouseDownDetected" Тогда
        // Срочная обработка нажатия
        ОбработатьМгновенныйКлик();
    КонецЕсли;
КонецПроцедуры

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

Альтернативный метод: Горячие клавиши

Иногда задача "быстрой реакции" решается проще. Выяснено, что обработка нажатия клавиш клавиатуры платформой 1С зачастую субъективно воспринимается быстрее, чем клик мышью. Рассмотрим возможность назначения кнопке свойства СочетаниеКлавиш.

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

Проблема "дребезга" и двойного срабатывания

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

Чтобы этого избежать, при использовании HTML-поля важно использовать метод event.preventDefault() в JavaScript или обнулять стандартную обработку в 1С. Если вы используете внешнюю компоненту, убедитесь, что основная команда кнопки на форме 1С пуста, а вся логика перенесена в обработчик внешнего события.

Особенности работы в Веб-клиенте

Рассмотрим специфику работы через браузер. Здесь мы ограничены "песочницей". Использование Native API будет невозможно без установки расширения для браузера. В данном случае Поле HTML-документа остается единственным надежным способом управления событиями мыши на низком уровне. Помните, что задержка сети (latency) в веб-клиенте может нивелировать всю выгоду от использования onmousedown, так как сигнал до сервера все равно будет идти определенное время.

Подводя итог, можно сказать: хотя платформа 1С "из коробки" не предоставляет события на нажатие кнопки, сочетание Поля HTML-документа и JavaScript позволяет реализовать интерфейсы любой сложности, включая мгновенную реакцию на действия пользователя.

← На главную