При разработке удобных пользовательских интерфейсов в 1С часто возникает задача визуального отклика формы на действия пользователя — например, подсвечивать всю строку таблицы при простом наведении курсора мыши, как это реализовано на многих веб-сайтах. Проанализируем, как устроена работа с событиями мыши в платформе 1С:Предприятие и какие решения существуют для реализации этой задачи.
В платформе 1С:Предприятие объект ТабличныйДокумент и элемент формы Поле табличного документа не имеют встроенных событий движения или наведения курсора (таких как OnMouseMove или OnHover). Все штатные события — ПриАктивизацииОбласти, Выбор или ОбработкаРасшифровки — срабатывают исключительно при явных действиях пользователя: нажатии клавиш мыши, переходе стрелками с клавиатуры или перетаскивании объектов.
Поэтому подсветить строку в стандартном табличном документе только за счет перемещения мыши без дополнительного инструментария штатно невозможно. Однако существует несколько эффективных способов обхода этого ограничения.
Разберем наиболее универсальный способ, который отлично работает во всех типах клиентов (тонкий, веб-клиент, толстый клиент) и на любых операционных системах (Windows, Linux, macOS).
Вместо вывода данных в обычный табличный документ сформируем таблицу в виде HTML-кода и отобразим ее в элементе формы Поле HTML-документа. Подсветка строки при наведении реализуется средствами CSS с помощью псевдокласса :hover.
Посмотрим на пример оформления CSS-стилей для HTML-таблицы:
tr:hover {
background-color: #f0f0f0; /* Цвет подсветки строки при наведении */
cursor: pointer;
}
Пример формирования HTML-кода в 1С:
HTMLТекст = "
|<html>
|<head>
|<style>
| table { width: 100%; border-collapse: collapse; }
| td, th { border: 1px solid #ccc; padding: 4px; }
| tr:hover { background-color: #e2edf7; }
|</style>
|</head>
|<body>
| <table>
| <tr><th>Код</th><th>Наименование</th><th>Цена</th></tr>
| <tr><td>0001</td><td>Товар 1</td><td>100.00</td></tr>
| <tr><td>0002</td><td>Товар 2</td><td>200.00</td></tr>
| </table>
|</body>
|</html>";
Элементы.ПолеHTML.Документ.write(HTMLТекст);
При таком подходе браузерный движок платформы сам мгновенно подсвечивает нужную строку без отправки серверных вызовов и задержек интерфейса.
Если табличный документ формируется с помощью Системы компоновки данных (СКД), подсвечивание ячеек при наведении мыши можно включить штатными средствами отчета.
Проанализируем по шагам настройку в СКД:
РежимПодсветкиЯчейкиТабличногоДокумента.Строка (или Ячейка, если требуется выделять только одну ячейку).При таком режиме платформа в окне просмотра отчета самостоятельно обрабатывает наведение мыши и подсвечивает всю текущую строку.
Если отказаться от динамического наведения мыши и выполнять выделение по клику или переходу клавишами, можно использовать стандартное событие табличного документа ПриАктивизацииОбласти.
Рассмотрим пример кода обработчика, который подсвечивает выделенную строку фоновым цветом:
&НаКлиенте
Процедура ТабличныйДокументПриАктивизацииОбласти(Элемент)
// Получаем текущую выделенную область
ТекущаяОбласть = Элемент.ТекущаяОбласть;
Если ТекущаяОбласть = Неопределено Тогда
Возврат;
КонецЕсли;
// Определяем номер активной строки
НомерСтроки = ТекущаяОбласть.Верх;
// Сбрасываем цвет выделения у всего документа (или ранее сохраненной строки)
Элемент.Область().ЦветФона = Новый Цвет();
// Задаем цвет фона для всей активной строки
ОбластьСтроки = Элемент.Область("R" + Формат(НомерСтроки, "ЧГ=0"));
ОбластьСтроки.ЦветФона = WebЦвета.СветлоЖелтый;
КонецПроцедуры
Для толстого или тонкого клиента под управлением ОС Windows отслеживание физического положения курсора мыши над окном формы возможно с помощью внешних компонент (с использованием системных хуков WinAPI).
Однако следует учитывать существенные недостатки этого метода:
Выяснив особенности платформы, сделаем вывод: для полноценного отклика на простое перемещение мыши наиболее оптимальным и быстродействующим решением является вывод данных через Поле HTML-документа с применением CSS-стилей :hover. Если же задача решается в рамках стандартного отчета, достаточно настроить свойство Режим подсветки в СКД.