При разработке сложных интерфейсов мы часто сталкиваемся с тем, что пользователи теряются на форме. Особенно остро эта проблема стоит, когда на одной управляемой форме размещено сразу несколько объемных списков, табличных частей или деревьев значений. Визуальное оформление активной и неактивной таблицы в 1С практически не различается, из-за чего пользователь может не понимать, в какой именно таблице он сейчас работает. Давайте разберем по шагам, почему возникает эта сложность и как мы можем помочь пользователям, визуально выделив активную область.
Проанализируем ситуацию подробнее. Пользователи обычно испытывают наибольшие трудности в следующих случаях:
Insert или Delete) или нажимают кнопки общей командной панели, но не осознают, к какой из таблиц применится команда. В результате строки могут быть добавлены или удалены совсем не там, где ожидалось.Главное техническое ограничение: В управляемых формах 1С отсутствует прямая поддержка событий получения и потери фокуса. В платформе нет привычных для многих других языков событий вроде ПриПолученииФокуса или ПриПотереФокуса для элементов управления. Из-за этого мы не можем штатным образом перехватить сам факт клика по таблице или перехода в нее по клавише Tab, если при этом пользователь не сменил активную строку или ячейку. Тем не менее, выясним, какие обходные пути у нас есть.
Любая управляемая форма в 1С имеет системное свойство ТекущийЭлемент (обращение происходит через ЭтаФорма.ТекущийЭлемент). В этом свойстве всегда содержится ссылка на тот элемент формы, который в данный момент времени находится в фокусе. В коде мы можем программно проверять его имя.
Посмотрим на пример. Эту проверку мы можем встроить в различные доступные обработчики на форме, чтобы контекстно определять, работает ли пользователь сейчас с табличной частью:
Если ЭтаФорма.ТекущийЭлемент.Имя = "ТаблицаТовары" Тогда
// Включаем видимость декорации-индикатора для таблицы товаров
Элементы.ИндикаторТовары.Видимость = Истина;
Иначе
Элементы.ИндикаторТовары.Видимость = Ложь;
КонецЕсли;
Поскольку прямого события фокуса нет, мы можем использовать события смены строки или ячейки внутри самой таблицы. Разберем этот способ. У таблицы есть события ПриАктивизацииСтроки и ПриАктивизацииЯчейки. Также у самой формы доступно событие ОбработкаАктивизации.
В обработчиках этих событий мы можем программно изменять видимость специальных декораций. Например, мы можем разместить над таблицей яркую надпись «Таблица активна», показывать специальную картинку (иконку карандаша) или программно менять шрифт заголовка таблицы на жирный.
Ограничение метода: При таком подходе нам будет сложно отследить потерю фокуса. Если пользователь кликнет вне таблицы в обычное поле ввода, события таблицы не сработают. Чтобы снять индикацию активности (например, скрыть надпись «Таблица активна»), нам придется прописывать снятие подсветки в обработчиках других элементов формы — в их событиях ПриИзменении или при активизации строк других таблиц.
Рассмотрим вариант с периодическим опросом формы. Мы можем использовать глобальный метод ПодключитьОбработчикОжидания.
Если мы подключим процедуру, которая будет вызываться, скажем, каждую секунду или полсекунды, внутри этой процедуры мы сможем проверять ЭтаФорма.ТекущийЭлемент. В зависимости от того, какой элемент сейчас активен, мы будем обновлять декорации-индикаторы на форме. Этот метод дает почти непрерывный контроль за фокусом, но важно помнить, что частый вызов обработчика ожидания может создать излишнюю фоновую нагрузку на клиентское приложение.
Если бизнес-задача категорически требует идеального контроля фокуса с немедленной визуальной подсветкой всей области при клике (и моментальным снятием подсветки при клике мимо), мы можем пойти нестандартным путем. Список или таблицу можно реализовать через элемент ПолеHTMLДокумента.
Внутри веб-окружения HTML-документа полноценно и без задержек работают стандартные JavaScript-события focus и blur. С их помощью мы можем менять CSS-стили таблицы (например, задавать яркую рамку или менять цвет фона) и передавать в 1С сигналы об изменении активности через события поля HTML-документа. Это самый трудозатратный подход, так как он требует верстки и написания JavaScript-кода, но он полностью снимает интерфейсные ограничения управляемых форм 1С.
Используйте рассмотренные подходы в зависимости от требований к интерфейсу вашей конфигурации. В большинстве типовых задач достаточно использовать комбинацию свойства ТекущийЭлемент и событий ПриАктивизацииСтроки для включения декораций-подсказок.