При разработке интерфейсов на управляемых формах нередко возникает задача показать пользователю контекстную подсказку при редактировании конкретного реквизита строки таблицы. Часто разработчики пытаются программно установить свойства Подсказка или ПодсказкаВвода в событии ПриАктивизацииЯчейки, однако сталкиваются с тем, что на экране ничего не появляется. Разберем детально, почему этот механизм не срабатывает штатным образом и какие существуют надежные альтернативные варианты реализации подсказок.
Проанализируем поведение платформы «1С:Предприятие 8.3» при работе со свойствами элементов формы таблицы. В управляемой форме колонка таблицы представлена элементом типа ПолеФормы (вид ПолеВвода), однако его поведение отличается от отдельного поля ввода на форме:
Подсказка: Для колонок таблицы данное свойство привязано исключительно к шапке колонки (заголовку). Всплывающая подсказка отображается только при наведении указателя мыши на заголовок всей колонки. Для строк и ячеек таблицы всплывающие тултипы на уровне отдельных данных платформой не формируются, поэтому динамическое изменение свойства Элементы.ИмяКолонки.Подсказка не вызывает появления окна подсказки над активной ячейкой.ПодсказкаВвода: Это свойство предназначено для вывода замещающего текста (плейсхолдера) непосредственно внутри поля, пока оно не заполнено. Однако согласно документации платформы, ПодсказкаВвода не отображается, если связанный реквизит имеет тип Число или Дата, а также если поле содержит значение, отличное от пустого (для числового типа значение 0 является заполненным числом, а не пустым значением). Соответственно, для реквизитов вроде «Сумма», «Количество» или «Цена» плейсхолдер не появится.Выясним, какие практические способы позволяют обойти данные ограничения и предоставить пользователю понятную подсказку при работе со строками табличной части.
Наиболее наглядный способ привлечь внимание пользователя к конкретной ячейке — сформировать платформенное всплывающее сообщение (облачко), физически привязанное к реквизиту активной строки таблицы. Рассмотрим реализацию в обработчике события таблицы ПриАктивизацииЯчейки на клиенте.
Разберем по шагам логику привязки сообщения:
Объект.ИмяТабличнойЧасти[Индекс].ИмяРеквизита, где индекс строки рассчитывается от 0 (как номер строки минус один).СообщениеПользователю, передаем контекст данных через УстановитьДанные() и выводим сообщение методом Сообщить().Посмотрим на пример программного кода:
&НаКлиенте
Процедура СоставПриАктивизацииЯчейки(Элемент)
ТекущиеДанные = Элементы.Состав.ТекущиеДанные;
ТекущийЭлементФормы = Элементы.Состав.ТекущийЭлемент;
Если ТекущиеДанные = Неопределено Или ТекущийЭлементФормы = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТекущийЭлементФормы.Имя = "СоставСумма" Тогда
ИндексСтроки = ТекущиеДанные.НомерСтроки - 1;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Внимание! Проверьте корректность заполнения суммы без учета НДС.";
Сообщение.Поле = "Объект.Состав[" + Формат(ИндексСтроки, "ЧГ=0") + "].Сумма";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
Если постоянное появление всплывающих сообщений отвлекает пользователя или мешает непрерывному вводу данных с клавиатуры, применим более спокойный интерфейсный паттерн: вывод поясняющего текста в отдельную декорацию рядом с таблицей.
Разберем настройку по шагам:
ПодсказкаКТаблице, задаем ему неяркий цвет текста или стиль подсказки.ПриАктивизацииЯчейки анализируем текущий активный элемент.Посмотрим на пример реализации данного подхода:
&НаКлиенте
Процедура СоставПриАктивизацииЯчейки(Элемент)
ТекущийЭлементФормы = Элементы.Состав.ТекущийЭлемент;
Если ТекущийЭлементФормы <> Неопределено И ТекущийЭлементФормы.Имя = "СоставСумма" Тогда
Элементы.ПодсказкаКТаблице.Заголовок = "Подсказка: Сумма рассчитывается автоматически при изменении количества и цены.";
Элементы.ПодсказкаКТаблице.Видимость = Истина;
Иначе
Элементы.ПодсказкаКТаблице.Заголовок = "";
Элементы.ПодсказкаКТаблице.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Еще один способ проинформировать пользователя — использование метода ПоказатьОповещениеПользователя(). Такое уведомление всплывает в нижнем правом углу экрана, не перекрывает поля ввода и автоматически исчезает через несколько секунд.
Рассмотрим пример вызова оповещения:
&НаКлиенте
Процедура СоставПриАктивизацииЯчейки(Элемент)
ТекущиеДанные = Элементы.Состав.ТекущиеДанные;
ТекущийЭлементФормы = Элементы.Состав.ТекущийЭлемент;
Если ТекущиеДанные <> Неопределено И ТекущийЭлементФормы <> Неопределено Тогда
Если ТекущийЭлементФормы.Имя = "СоставСумма" Тогда
ПоказатьОповещениеПользователя(
"Внимание!",
,
"Для строки № " + ТекущиеДанные.НомерСтроки + " проверьте введенную сумму.",
БиблиотекаКартинок.Информация
);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Когда требуется визуально отметить строки с особыми условиями или предупреждениями, удобнее добавить в таблицу формы отдельную служебную колонку с типом Картинка или Строка. С помощью механизма УсловноеОформление формы можно динамически раскрашивать ячейки или выводить знаки внимания в зависимости от значений других полей строки, что обеспечивает максимальную наглядность без необходимости кликать по конкретным ячейкам.