В процессе разработки интерфейсов в 1С часто возникает задача сделать взаимодействие пользователя с табличными частями максимально оперативным. Типичный пример — распределение товара, где пользователю удобно было бы просто кликать по ячейке, увеличивая или уменьшая значение, не прибегая к вводу цифр с клавиатуры. Разберем, как реализовать перехват нажатий кнопок мыши (ЛКМ и ПКМ) и какие механизмы платформы нам в этом помогут.
Прежде чем переходить к сложным программным хукам, проанализируем стандартные возможности платформы 1С. Для числовых полей ввода предусмотрен специальный механизм — регулирование. Рассмотрим по шагам, как его настроить:
КнопкаРегулирования и установим его в значение Да.ПриИзменении для этого поля. В обработчике мы сможем отлавливать новый результат и выполнять сопутствующие расчеты.Важным преимуществом этого метода является поддержка колеса мыши. Как только пользователь входит в режим редактирования ячейки (активирует её), прокрутка колеса мыши вверх будет увеличивать число, а вниз — уменьшать. Это полностью закрывает потребность в быстром изменении количества без написания сложного кода.
Если задача стоит именно в разделении действий между левой и правой кнопкой мыши, мы столкнемся с ограничением: в управляемых формах 1С правая кнопка мыши жестко зарезервирована за вызовом контекстного меню. Проанализируем, как обойти это ограничение штатным способом.
Мы можем создать собственное контекстное меню для таблицы. Если добавить в него команду «Уменьшить на 1» и сделать её основной, пользователь сможет быстро менять значение. Выясним, как это реализовать:
Для элемента формы (Таблица) создадим группу команд в контекстном меню. При нажатии ПКМ будет всплывать меню, где пользователь выберет нужное действие. Это не является «перехватом» в чистом виде, но позволяет программно реагировать на клик правой кнопкой.
Если штатных кнопок регулирования недостаточно и требуется «ловить» клики в любой области ячейки, рассмотрим вариант с использованием Поля HTML-документа. Это один из самых мощных инструментов для кастомизации интерфейса в 1С.
Суть метода заключается в том, чтобы вместо стандартной таблицы 1С отобразить HTML-таблицу. Внутри HTML-кода мы можем прописать обработчики на языке JavaScript для любых событий мыши. Проанализируем пример кода на стороне HTML/JS:
// Внутри HTML-кода ячейки
<div onmousedown="handleMouseDown(event)">
Значение: 10
</div>
<script>
function handleMouseDown(event) {
if (event.button == 0) {
// Левая кнопка мыши (ЛКМ)
window.external.SelectValue("Increase");
} else if (event.button == 2) {
// Правая кнопка мыши (ПКМ)
window.external.SelectValue("Decrease");
}
}
</script>
В коде 1С мы подписываемся на событие ПриНажатии (или аналогичное для взаимодействия с внешним объектом) и получаем строковый параметр, по которому определяем действие. Рассмотрим подробнее механизм window.external: он позволяет передать управление обратно в модуль формы 1С, превращая клик в браузере в полноценное событие платформы.
Существует специфический прием, позволяющий отследить момент зажатия кнопки мыши. Разберем ситуацию: если для таблицы включено свойство РазрешитьНачалоПеретаскивания, то при попытке кликнуть и чуть сдвинуть курсор сработает событие НачалоПеретаскивания.
В этом обработчике мы можем сразу отменить само перетаскивание, но зафиксировать факт клика. Однако этот метод не позволяет надежно отличить ЛКМ от ПКМ и может раздражать пользователя из-за визуальных эффектов «захвата» элемента.
Для тех случаев, когда требуется максимальная точность (например, в толстом клиенте), программисты используют внешние компоненты. Они позволяют устанавливать так называемые системные хуки (Windows Hooks) через функции SetWindowsHookEx или проверять состояние кнопок через GetAsyncKeyState из библиотеки user32.dll.
Посмотрим на пример логики, которую реализует такая компонента:
WM_LBUTTONDOWN или WM_RBUTTONDOWN она проверяет, находится ли курсор над окном 1С и конкретной ячейкой.ВнешнееСобытие, которое 1С ловит в обработчике ВнешнееСобытие формы или приложения.Важно: Использование WinAPI напрямую в коде 1С через COMОбъект("WScript.Shell") или аналоги ограничено. Чаще всего требуется написание Native API компоненты на C++ или C#, что значительно усложняет поддержку решения.
Если перехват именно правой кнопки мыши программно затруднен, мы можем предложить пользователю комбинированный метод. Проанализируем использование клавиш-модификаторов (Ctrl, Shift, Alt).
В обработчике события Выбор или ПриНачалеРедактирования мы можем проверить, не зажата ли в данный момент какая-либо клавиша. Хотя штатных функций для проверки состояния клавиатуры в «чистом» управляемом приложении немного, часто используются вспомогательные методы для анализа контекста клика.
Например, в некоторых типах диаграмм и графических схем 1С доступны свойства события, содержащие информацию о кнопках. Посмотрим на примерную структуру логики:
Процедура ТабличнаяЧастьВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// В некоторых контекстах мы можем проверить дополнительные свойства
// Если это невозможно напрямую, используем вспомогательные флаги
Если МодификаторыКлавиш.Shift Тогда
ТекущиеДанные.Количество = ТекущиеДанные.Количество - 1;
Иначе
ТекущиеДанные.Количество = ТекущиеДанные.Количество + 1;
КонецЕсли;
КонецПроцедуры
Выяснив все доступные варианты, можно сделать следующие выводы для выбора оптимального решения:
Регулирование. Это самый надежный способ, который не ломается при обновлении платформы и корректно работает в веб-клиенте.Поля HTML-документа. Это позволит реализовать любую логику кликов, включая двойные клики, зажатия и правую кнопку мыши, без использования внешних библиотек.Рассмотренные методы позволяют гибко настроить поведение формы под нужды пользователя, делая работу с данными в 1С более интуитивной и быстрой.