Как привязать СообщениеПользователю к кнопке или команде на форме 1С?

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

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

Почему СообщениеПользователю не работает с кнопками напрямую?

Проанализируем архитектуру объекта СообщениеПользователю. Этот объект спроектирован для работы с путями к данным. Когда мы заполняем свойство Поле, система ищет на форме элемент, связанный с соответствующим реквизитом (например, Объект.ИмяКлиента). Кнопка на форме — это элемент интерфейса, связанный с командой, а не с данными. У команды нет пути к данным в классическом понимании платформы, поэтому прямое указание имени кнопки в свойстве Поле не приведет к желаемому результату: сообщение просто отобразится внизу экрана в общем списке, не "приклеившись" к кнопке.

Рассмотрим по шагам основные способы, которые позволяют добиться визуального эффекта привязки сообщения к команде или эффективно заменить этот механизм.

Решение 1: Использование вспомогательного невидимого реквизита

Это один из самых популярных технических приемов среди разработчиков. Если платформа требует "поле" для привязки сообщения, мы можем создать такое поле искусственно. Разберем этот метод подробнее:

  1. Добавим на форму новый реквизит (например, с именем ВспомогательноеПолеДляОшибки) с типом Строка.
  2. Разместим этот реквизит на форме как можно ближе к целевой кнопке.
  3. В свойствах элемента формы (поля ввода) установим минимальные размеры и отключим заголовок. Идеальный вариант — сделать его практически незаметным, но не устанавливать свойство Видимость в значение Ложь (так как к невидимым элементам сообщения не привязываются).
  4. При возникновении ошибки программно вызываем сообщение, указывая это поле.

Посмотрим на пример кода:


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Необходимо заполнить контактную информацию перед выполнением этой команды!";
Сообщение.Поле = "ВспомогательноеПолеДляОшибки";
Сообщение.УстановитьДанные(ЭтаФорма);
Сообщение.Сообщить();

Этот метод создает визуальную иллюзию того, что сообщение относится к кнопке, так как "облачко" всплывет рядом с ней.

Решение 2: Программное управление расширенной подсказкой

Начиная с версии платформы 8.3, у элементов формы появилось замечательное свойство Расширенная подсказка. Это декорация, которая может содержать форматированный текст, картинки и гиперссылки. Проанализируем, как использовать её вместо стандартного сообщения.

Мы можем создать декорацию типа "Поясняющий текст" рядом с кнопкой и управлять её видимостью. По умолчанию установим Элементы.ГруппаПодсказки.Видимость = Ложь;. В момент нажатия на кнопку, если проверка не пройдена, мы просто включаем видимость этого текста.

Преимущество этого метода в том, что интерфейс выглядит более современно и соответствует стандартам UX/UI, принятым в интерфейсе "Такси". Пользователь видит текст прямо в контексте выполняемого действия.

Решение 3: Метод ПоказатьОповещениеПользователя

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

Пример реализации с гиперссылкой для быстрого исправления ситуации:


ТекстОповещения = "Email клиента не заполнен!";
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьПереходКЗаполнению", ЭтотОбъект);
ПоказатьОповещениеПользователя("Внимание", ОписаниеОповещения, ТекстОповещения, БиблиотекаКартинок.Важное);

В этом случае, нажав на текст в окне оповещения, пользователь может сразу попасть в форму заполнения данных, что гораздо удобнее, чем просто прочитать текст у кнопки.

Решение 4: Динамическое изменение заголовка кнопки и подсветка

Если наша цель — привлечь внимание, мы можем использовать динамическое оформление. Рассмотрим ситуацию: пользователь нажимает кнопку, данные не заполнены, и вместо стандартного сообщения кнопка меняет свой вид.

Разберем пример кода, который меняет заголовок и делает кнопку текущим элементом:


Если НЕ ДанныеЗаполнены() Тогда
    Элементы.КомандаВыполнитьДействие.Заголовок = "ЗАПОЛНИТЕ EMAIL!";
    ЭтаФорма.ТекущийЭлемент = Элементы.КомандаВыполнитьДействие;
    
    // Можно также вывести стандартное сообщение без привязки к полю
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Для продолжения необходимо заполнить адрес электронной почты.");
КонецЕсли;

Установка ТекущийЭлемент подсвечивает кнопку стандартной рамкой фокуса, что в сочетании с измененным заголовком однозначно указывает пользователю на проблему.

Решение 5: Использование модальных (блокирующих) вопросов

В некоторых случаях логичнее не выводить сообщение рядом с кнопкой, а спросить пользователя напрямую. Если действие невозможно без ввода данных, мы можем использовать ПоказатьВопрос() или ПоказатьВводДанных(). Рассмотрим логику работы:

Пользователь нажимает "Отправить по Email". Программа проверяет наличие адреса. Если его нет, вместо ошибки выводится диалог: "Email не заполнен. Заполнить сейчас?". При ответе "Да" открывается форма ввода. Это исключает лишние итерации пользователя ("прочитал сообщение" -> "закрыл" -> "нажал на другое поле").

Рекомендации по стандартам разработки (UX)

Проанализировав все варианты, важно помнить о гайдлайнах 1С. Основные правила работы с уведомлениями гласят:

Таким образом, хотя прямая привязка СообщениеПользователю к объекту типа КомандаФормы не предусмотрена, использование вспомогательных реквизитов или механизмов оповещения позволяет решить задачу максимально эффективно и понятно для конечного пользователя.

← На главную