Разберем нестандартную, но интересную задачу по проектированию пользовательского интерфейса. Представим ситуацию: на форме элементы расположены в двух группах. Слева находится панель с нумерованными разделами (кнопками), а справа — многострочный текст с содержимым выбранного раздела. Требуется сделать так, чтобы при наведении курсора на левую панель и прокрутке колеса мыши, разделы переключались автоматически (имитируя нажатие кнопок по порядку). Выясним причину, почему это сложно сделать "в лоб", и рассмотрим подробнее рабочие варианты реализации.
Проанализируем ситуацию с точки зрения архитектуры 1С. В платформе отсутствует стандартное событие перехвата прокрутки колеса мыши (например, что-то вроде ПриПрокруткеКолесаМыши) для элементов типа «Группа», «Кнопка» или обычных декораций.
Платформа обрабатывает скролл только аппаратно и исключительно для тех элементов, которые изначально его поддерживают (списки, таблицы, многострочные текстовые поля), при условии, что курсор находится непосредственно над ними. Следовательно, отследить направление вращения колеса мыши над обычной группой кнопок штатными средствами платформы 1С невозможно.
Однако, мы можем решить эту бизнес-задачу, заменив кнопки на другие элементы управления, которые умеют реагировать на скролл. Разберем по шагам альтернативные варианты.
Вместо группы с отдельными кнопками слева мы разместим элемент «Таблица формы», который будет привязан к таблице значений или дереву значений. Это наиболее правильный подход в парадигме 1С.
ПриАктивизацииСтроки. В обработчике этого события получаем данные текущей строки и программно обновляем содержимое многострочного текста.ОтображатьЗаголовки и ОтображатьСетку, а также скрыть стандартную командную панель.Если разделов не очень много, посмотрим на пример использования специализированного поля ввода. Слева или между панелями можно добавить элемент вида «Поле ввода» с измененными настройками.
В свойствах элемента необходимо установить Вид в значение Поле регулирования. На форме это будет отображаться как классический ползунок с кнопками "вверх" и "вниз". Если навести курсор на этот элемент и покрутить колесо мыши, его числовое значение будет увеличиваться или уменьшаться. В событии ПриИзменении этого поля мы можем сопоставлять его текущее числовое значение с индексом раздела (1, 2, 3...) и обновлять текст справа.
Если требуется нестандартный дизайн панелей, рассмотрим интеграцию веб-технологий. Левую панель с разделами можно реализовать через элемент «Поле HTML документа».
В HTML-макет встраивается JavaScript-код, который отрисовывает красивые плашки разделов и слушает события прокрутки браузера (например, onwheel или mousewheel). При скролле JavaScript вычисляет направление (вверх или вниз), определяет следующий или предыдущий раздел и передает сигнал обратно в 1С. Сигнал можно передать через имитацию клика по скрытой ссылке навигации или вызов window.external. 1С перехватит это действие (например, при обработке навигации) и обновит текст в соседней группе.
Если по техническому заданию принципиально важно сохранить именно элементы интерфейса «Кнопка» и перехватывать скролл над ними, потребуется внешняя компонента (dll).
Компонента подключается к клиенту 1С, перехватывает системные сообщения ОС Windows (события мыши, в частности WM_MOUSEWHEEL) и генерирует событие ВнешнееСобытие в самой форме 1С, передавая туда параметры направления прокрутки.
Важные ограничения метода: Этот способ работает только в толстом или тонком клиенте (в веб-клиенте работать не будет). Кроме того, потребуются права на установку и вызов внешних компонент на рабочих местах всех пользователей, что усложняет администрирование базы.