При разработке интерфейсов на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с тем, что при нажатии на кнопку вокруг нее появляется тонкая пунктирная или сплошная рамка. Это стандартное поведение операционной системы и платформы, сигнализирующее о том, что элемент находится в фокусе (является активным). Однако с точки зрения современного дизайна такая рамка может портить внешний вид формы. Рассмотрим подробнее, как можно обойти это ограничение и сделать интерфейс более эстетичным.
Самый простой и распространенный способ убрать выделение с кнопки — сразу после выполнения основного кода команды принудительно передать фокус другому элементу формы, который визуально не отображает состояние активности. Проанализируем, как это работает. В 1С фокус ввода всегда принадлежит объекту, указанному в свойстве формы ТекущийЭлемент.
Для реализации этого метода нам понадобится элемент, который не имеет видимых границ при получении фокуса. Хорошо подходит обычная Декорация с типом Надпись. Разберем по шагам:
НадписьЗаголовок).Посмотрим на пример кода:
&НаКлиенте
Процедура МояКоманда(Команда)
// Основная логика вашей команды
Сообщить("Команда выполнена!");
// Переносим фокус на декорацию, чтобы убрать рамку с кнопки
ЭтаФорма.ТекущийЭлемент = Элементы.НадписьЗаголовок;
КонецПроцедуры
В данном случае, как только пользователь нажмет на кнопку, программный код выполнит полезное действие и мгновенно "уведет" фокус на текстовое поле. Поскольку у простой декорации-надписи нет свойства "Рамка фокуса" (если она не является гиперссылкой), визуально выделение просто исчезнет.
Если мы хотим полностью исключить появление рамки, стоит рассмотреть вариант отказа от элемента Кнопка в пользу элемента Декорация с типом Картинка или Надпись. Выясним причину, почему это эффективно: декорации в 1С по умолчанию не являются элементами, участвующими в обходе фокуса (Tab Order) в классическом понимании кнопок. Они могут реагировать на нажатие, но не удерживают на себе системный фокус ввода.
Чтобы имитировать кнопку через декорацию, выполним следующие действия:
Картинка или Надпись.Нажатие.Важно помнить, что гиперссылки также могут подсвечиваться, но их выделение обычно выглядит гораздо аккуратнее, чем стандартная прямоугольная рамка кнопки. Если же использовать декорацию-картинку без включенного флага гиперссылки, но с назначенным событием Нажатие, рамка не появится вовсе.
Платформа 1С по-разному отрисовывает кнопки в зависимости от того, в какой группе они находятся. Проанализируем ситуацию: если кнопка располагается непосредственно на форме, она отрисовывается как стандартный объект Windows. Если же поместить кнопку в группу с типом Командная панель, стиль ее отображения меняется.
Разберем этот вариант:
Командная панель.В режиме Командная панель кнопки часто ведут себя как элементы меню. При нажатии на них фокус либо не фиксируется так явно, либо выделение происходит цветом всей области кнопки, что выглядит органично и не создает эффекта "лишней рамки".
Существует более сложный, но эффективный хак для интерфейсов с высокими требованиями к дизайну. Мы можем создать невидимый (прозрачный) элемент, который будет принимать фокус на себя. Выясним, как это реализовать:
На форме создается поле ввода, у которого в свойствах установлена минимальная ширина и высота (например, 1 пиксель), а также отключены все границы и заголовки. В коде каждой кнопки мы прописываем установку фокуса на это поле. Таким образом, рамка активности будет перемещаться на элемент, который фактически не виден пользователю.
Если стандартные средства платформы не позволяют добиться идеального результата, можно использовать Поле HTML-документа. Рассмотрим этот метод как радикальное решение проблемы дизайна. В HTML-поле мы можем полностью управлять стилями элементов через CSS.
В CSS существует специальное свойство outline, которое отвечает за рамку фокуса. Установив его в значение none, мы навсегда избавимся от рамки при нажатии:
button:focus {
outline: none !important;
}
Однако этот метод требует написания логики взаимодействия между JavaScript в HTML-поле и программным кодом 1С через событие ПриНажатии или внешние события. Это значительно усложняет разработку, но дает 100% контроль над визуальной составляющей.
Проанализируем системную причину появления рамки. В ОС Windows это часть функционала Accessibility (доступность для людей с ограниченными возможностями). Фокусная рамка необходима пользователям, которые управляют программой с клавиатуры, чтобы понимать, на каком элементе они сейчас находятся. Поэтому полное отключение фокуса может затруднить работу пользователям, привыкшим использовать клавишу Tab.
Рекомендация: Если вы решили убрать рамку программно, убедитесь, что ваш интерфейс остается интуитивно понятным. Лучшим решением будет не простое удаление фокуса, а его перемещение на логически следующий или нейтральный элемент формы.