В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача визуально акцентировать внимание пользователя на конкретном элементе управления, например, на кнопке. Стандартный механизм СообщениеПользователю отлично работает, когда нам нужно указать на ошибку в конкретном поле ввода (реквизите), но вызывает затруднения, если сообщение нужно "прикрепить" к команде (кнопке), которая не связана напрямую с данными объекта. Разберем подробно, почему так происходит и какие существуют обходные пути для решения этой задачи.
Проанализируем архитектуру объекта СообщениеПользователю. Этот объект спроектирован для работы с путями к данным. Когда мы заполняем свойство Поле, система ищет на форме элемент, связанный с соответствующим реквизитом (например, Объект.ИмяКлиента). Кнопка на форме — это элемент интерфейса, связанный с командой, а не с данными. У команды нет пути к данным в классическом понимании платформы, поэтому прямое указание имени кнопки в свойстве Поле не приведет к желаемому результату: сообщение просто отобразится внизу экрана в общем списке, не "приклеившись" к кнопке.
Рассмотрим по шагам основные способы, которые позволяют добиться визуального эффекта привязки сообщения к команде или эффективно заменить этот механизм.
Это один из самых популярных технических приемов среди разработчиков. Если платформа требует "поле" для привязки сообщения, мы можем создать такое поле искусственно. Разберем этот метод подробнее:
ВспомогательноеПолеДляОшибки) с типом Строка.Видимость в значение Ложь (так как к невидимым элементам сообщения не привязываются).Посмотрим на пример кода:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Необходимо заполнить контактную информацию перед выполнением этой команды!";
Сообщение.Поле = "ВспомогательноеПолеДляОшибки";
Сообщение.УстановитьДанные(ЭтаФорма);
Сообщение.Сообщить();
Этот метод создает визуальную иллюзию того, что сообщение относится к кнопке, так как "облачко" всплывет рядом с ней.
Начиная с версии платформы 8.3, у элементов формы появилось замечательное свойство Расширенная подсказка. Это декорация, которая может содержать форматированный текст, картинки и гиперссылки. Проанализируем, как использовать её вместо стандартного сообщения.
Мы можем создать декорацию типа "Поясняющий текст" рядом с кнопкой и управлять её видимостью. По умолчанию установим Элементы.ГруппаПодсказки.Видимость = Ложь;. В момент нажатия на кнопку, если проверка не пройдена, мы просто включаем видимость этого текста.
Преимущество этого метода в том, что интерфейс выглядит более современно и соответствует стандартам UX/UI, принятым в интерфейсе "Такси". Пользователь видит текст прямо в контексте выполняемого действия.
Выясним причину, почему иногда стоит отказаться от жесткой привязки к кнопке в пользу всплывающих уведомлений. Метод ПоказатьОповещениеПользователя() выводит окно в нижнем углу экрана, которое не блокирует работу пользователя. Это удобно, если действие не является критической ошибкой, а носит информационный характер.
Пример реализации с гиперссылкой для быстрого исправления ситуации:
ТекстОповещения = "Email клиента не заполнен!";
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьПереходКЗаполнению", ЭтотОбъект);
ПоказатьОповещениеПользователя("Внимание", ОписаниеОповещения, ТекстОповещения, БиблиотекаКартинок.Важное);
В этом случае, нажав на текст в окне оповещения, пользователь может сразу попасть в форму заполнения данных, что гораздо удобнее, чем просто прочитать текст у кнопки.
Если наша цель — привлечь внимание, мы можем использовать динамическое оформление. Рассмотрим ситуацию: пользователь нажимает кнопку, данные не заполнены, и вместо стандартного сообщения кнопка меняет свой вид.
Разберем пример кода, который меняет заголовок и делает кнопку текущим элементом:
Если НЕ ДанныеЗаполнены() Тогда
Элементы.КомандаВыполнитьДействие.Заголовок = "ЗАПОЛНИТЕ EMAIL!";
ЭтаФорма.ТекущийЭлемент = Элементы.КомандаВыполнитьДействие;
// Можно также вывести стандартное сообщение без привязки к полю
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Для продолжения необходимо заполнить адрес электронной почты.");
КонецЕсли;
Установка ТекущийЭлемент подсвечивает кнопку стандартной рамкой фокуса, что в сочетании с измененным заголовком однозначно указывает пользователю на проблему.
В некоторых случаях логичнее не выводить сообщение рядом с кнопкой, а спросить пользователя напрямую. Если действие невозможно без ввода данных, мы можем использовать ПоказатьВопрос() или ПоказатьВводДанных(). Рассмотрим логику работы:
Пользователь нажимает "Отправить по Email". Программа проверяет наличие адреса. Если его нет, вместо ошибки выводится диалог: "Email не заполнен. Заполнить сейчас?". При ответе "Да" открывается форма ввода. Это исключает лишние итерации пользователя ("прочитал сообщение" -> "закрыл" -> "нажал на другое поле").
Проанализировав все варианты, важно помнить о гайдлайнах 1С. Основные правила работы с уведомлениями гласят:
Таким образом, хотя прямая привязка СообщениеПользователю к объекту типа КомандаФормы не предусмотрена, использование вспомогательных реквизитов или механизмов оповещения позволяет решить задачу максимально эффективно и понятно для конечного пользователя.