Как реализовать изменение количества в ячейке таблицы 1С при нажатии кнопок мыши

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

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

Штатный механизм: Кнопки регулирования и колесо мыши

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

  1. Откроем форму документа и выберем нужный элемент — поле ввода в колонке табличной части.
  2. В палитре свойств найдем параметр КнопкаРегулирования и установим его в значение Да.
  3. Теперь в правой части ячейки появятся две стрелки (вверх и вниз).
  4. Настроим событие ПриИзменении для этого поля. В обработчике мы сможем отлавливать новый результат и выполнять сопутствующие расчеты.

Важным преимуществом этого метода является поддержка колеса мыши. Как только пользователь входит в режим редактирования ячейки (активирует её), прокрутка колеса мыши вверх будет увеличивать число, а вниз — уменьшать. Это полностью закрывает потребность в быстром изменении количества без написания сложного кода.

Использование контекстного меню для обработки правой кнопки мыши (ПКМ)

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

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

Для элемента формы (Таблица) создадим группу команд в контекстном меню. При нажатии ПКМ будет всплывать меню, где пользователь выберет нужное действие. Это не является «перехватом» в чистом виде, но позволяет программно реагировать на клик правой кнопкой.

Продвинутый метод: Использование HTML-полей для полного контроля

Если штатных кнопок регулирования недостаточно и требуется «ловить» клики в любой области ячейки, рассмотрим вариант с использованием Поля 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С, превращая клик в браузере в полноценное событие платформы.

Использование Drag-and-Drop как «хака» для перехвата нажатия

Существует специфический прием, позволяющий отследить момент зажатия кнопки мыши. Разберем ситуацию: если для таблицы включено свойство РазрешитьНачалоПеретаскивания, то при попытке кликнуть и чуть сдвинуть курсор сработает событие НачалоПеретаскивания.

В этом обработчике мы можем сразу отменить само перетаскивание, но зафиксировать факт клика. Однако этот метод не позволяет надежно отличить ЛКМ от ПКМ и может раздражать пользователя из-за визуальных эффектов «захвата» элемента.

Взаимодействие с Windows API через внешние компоненты

Для тех случаев, когда требуется максимальная точность (например, в толстом клиенте), программисты используют внешние компоненты. Они позволяют устанавливать так называемые системные хуки (Windows Hooks) через функции SetWindowsHookEx или проверять состояние кнопок через GetAsyncKeyState из библиотеки user32.dll.

Посмотрим на пример логики, которую реализует такая компонента:

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

Важно: Использование WinAPI напрямую в коде 1С через COMОбъект("WScript.Shell") или аналоги ограничено. Чаще всего требуется написание Native API компоненты на C++ или C#, что значительно усложняет поддержку решения.

Реализация через горячие клавиши и модификаторы

Если перехват именно правой кнопки мыши программно затруднен, мы можем предложить пользователю комбинированный метод. Проанализируем использование клавиш-модификаторов (Ctrl, Shift, Alt).

В обработчике события Выбор или ПриНачалеРедактирования мы можем проверить, не зажата ли в данный момент какая-либо клавиша. Хотя штатных функций для проверки состояния клавиатуры в «чистом» управляемом приложении немного, часто используются вспомогательные методы для анализа контекста клика.

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


Процедура ТабличнаяЧастьВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // В некоторых контекстах мы можем проверить дополнительные свойства
    // Если это невозможно напрямую, используем вспомогательные флаги
    Если МодификаторыКлавиш.Shift Тогда
        ТекущиеДанные.Количество = ТекущиеДанные.Количество - 1;
    Иначе
        ТекущиеДанные.Количество = ТекущиеДанные.Количество + 1;
    КонецЕсли;
КонецПроцедуры

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

Выяснив все доступные варианты, можно сделать следующие выводы для выбора оптимального решения:

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

← На главную