Как организовать скроллинг по элементам формы и перехватить прокрутку колеса мыши в 1С?

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

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

Ограничения платформы 1С: почему не работает изначальная задумка

Проанализируем ситуацию с точки зрения архитектуры 1С. В платформе отсутствует стандартное событие перехвата прокрутки колеса мыши (например, что-то вроде ПриПрокруткеКолесаМыши) для элементов типа «Группа», «Кнопка» или обычных декораций.

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

Однако, мы можем решить эту бизнес-задачу, заменив кнопки на другие элементы управления, которые умеют реагировать на скролл. Разберем по шагам альтернативные варианты.

Вариант 1: Использование Таблицы формы (самый надежный штатный метод)

Вместо группы с отдельными кнопками слева мы разместим элемент «Таблица формы», который будет привязан к таблице значений или дереву значений. Это наиболее правильный подход в парадигме 1С.

  1. Настройка данных: В таблицу построчно выводятся наименования разделов. Таблица штатно поддерживает прокрутку колесом мыши.
  2. Обработка событий: При прокрутке пользователем меняется выделенная строка. Для обновления текста в правой части формы мы используем событие таблицы ПриАктивизацииСтроки. В обработчике этого события получаем данные текущей строки и программно обновляем содержимое многострочного текста.
  3. Оформление интерфейса: Чтобы наша таблица визуально выглядела эстетично и напоминала панель разделов (а не классическую таблицу), нам нужно отключить у нее свойства ОтображатьЗаголовки и ОтображатьСетку, а также скрыть стандартную командную панель.

Вариант 2: Использование Поля регулирования (Ползунка)

Если разделов не очень много, посмотрим на пример использования специализированного поля ввода. Слева или между панелями можно добавить элемент вида «Поле ввода» с измененными настройками.

В свойствах элемента необходимо установить Вид в значение Поле регулирования. На форме это будет отображаться как классический ползунок с кнопками "вверх" и "вниз". Если навести курсор на этот элемент и покрутить колесо мыши, его числовое значение будет увеличиваться или уменьшаться. В событии ПриИзменении этого поля мы можем сопоставлять его текущее числовое значение с индексом раздела (1, 2, 3...) и обновлять текст справа.

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

Если требуется нестандартный дизайн панелей, рассмотрим интеграцию веб-технологий. Левую панель с разделами можно реализовать через элемент «Поле HTML документа».

В HTML-макет встраивается JavaScript-код, который отрисовывает красивые плашки разделов и слушает события прокрутки браузера (например, onwheel или mousewheel). При скролле JavaScript вычисляет направление (вверх или вниз), определяет следующий или предыдущий раздел и передает сигнал обратно в 1С. Сигнал можно передать через имитацию клика по скрытой ссылке навигации или вызов window.external. 1С перехватит это действие (например, при обработке навигации) и обновит текст в соседней группе.

Вариант 4: Использование внешних компонент (Native API)

Если по техническому заданию принципиально важно сохранить именно элементы интерфейса «Кнопка» и перехватывать скролл над ними, потребуется внешняя компонента (dll).

Компонента подключается к клиенту 1С, перехватывает системные сообщения ОС Windows (события мыши, в частности WM_MOUSEWHEEL) и генерирует событие ВнешнееСобытие в самой форме 1С, передавая туда параметры направления прокрутки.

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

← На главную