Проанализируем ситуацию, с которой часто сталкиваются разработчики при работе с управляемыми формами в 1С:Предприятие 8.3. Возникает необходимость динамически изменить текст подсказки у кнопки непосредственно на клиенте (например, при листании списка или смене текущей строки), но обнаруживается, что у объекта КнопкаФормы просто нет свойства Подсказка, доступного для записи на клиенте. Свойство есть только у объекта Команда, но изменить его можно исключительно серверным вызовом.
Разберем по шагам, почему платформа ведет себя именно так, и рассмотрим несколько действенных способов решения этой технической задачи.
На первый взгляд это выглядит нелогично: почему у обычной декорации формы свойство Подсказка доступно на клиенте, а у кнопки командной панели — нет? Выясним причину такого поведения платформы.
Дело кроется в строгом разделении логики управляемого приложения. Стандартная подсказка жестко привязана к объекту Команда. Эта команда может быть глобальной (общей для всей конфигурации) или локальной (принадлежать конкретной форме). Инициализация команд и управление ими осуществляется сервером, так как именно на них завязана маршрутизация прав доступа и базовая функциональность.
Визуальный элемент КнопкаФормы — это всего лишь проекция (отображение) данной команды на интерфейс. Платформа намеренно запрещает менять базовые свойства команды с клиента, чтобы не нарушать консистентность логики (ведь одна и та же команда может быть выведена в виде нескольких кнопок в разных частях формы). Однако платформа разрешает управлять сугубо интерфейсными свойствами конкретного визуального элемента. Посмотрим на рабочие варианты решения.
Рассмотрим самое правильное и современное решение. Начиная с версии платформы 8.3.1, у элементов управления появился функционал расширенных подсказок. Несмотря на то, что базовую подсказку команды с клиента не поменять, мы можем программно обратиться к объекту РасширеннаяПодсказка нашего элемента формы.
Расширенная подсказка технически представляет собой подчиненную декорацию, и ее свойства свободно модифицируются на клиенте. Посмотрим на пример кода, который позволит нам динамически изменять текст при любом клиентском событии:
&НаКлиенте
Процедура ПриИзмененииСтрокиСписка()
// Динамически формируем текст в зависимости от контекста
НовыйТекстПодсказки = "Нажмите для обработки документа № " + ТекущиеДанные.Номер;
// Обращаемся к свойству Заголовок расширенной подсказки элемента
Элементы.ИмяМоейКнопки.РасширеннаяПодсказка.Заголовок = НовыйТекстПодсказки;
КонецПроцедуры
Преимущества расширенной подсказки:
ФорматированнаяСтрока. Текст можно раскрашивать, выделять жирным шрифтом и добавлять в него иконки.ОтображениеПодсказки (например, показывать как всплывающее окошко, как иконку вопроса или как статичный текст рядом с кнопкой).Если по каким-то причинам первый вариант не подходит, рассмотрим популярный обходной путь — отказ от стандартной кнопки в пользу объекта ДекорацияФормы. Как справедливо замечают разработчики, у декорации свойство Подсказка доступно везде.
Разберем процесс настройки:
ДекорацияФормы (вид — Надпись или Картинка).Оформление).Нажатие.
&НаКлиенте
Процедура ПриИзмененииДанныхНаКлиенте()
Элементы.МояДекорацияКнопка.Подсказка = "Новое значение подсказки на клиенте";
КонецПроцедуры
Проанализируем еще один метод, который часто применяют, если вариантов текста подсказки всего несколько (например, два или три статичных состояния).
Суть метода заключается в создании в конфигураторе нескольких отдельных команд и кнопок, каждая из которых имеет свою предустановленную (заполненную заранее на сервере) подсказку. В процессе работы пользователя на клиенте мы просто переключаем их доступность (свойство Доступность) или видимость (свойство Видимость).
&НаКлиенте
Процедура ПереключитьКнопку()
Если ТекущийРежим = 1 Тогда
Элементы.КнопкаВариант1.Видимость = Истина;
Элементы.КнопкаВариант2.Видимость = Ложь;
Иначе
Элементы.КнопкаВариант1.Видимость = Ложь;
Элементы.КнопкаВариант2.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
Внимание: Этот метод стоит использовать только при строгом ограничении вариантов. Если текст подсказки должен формироваться динамически из данных текущей строки, используйте Решение 1.
Если ваша задача — просто проинформировать пользователя о статусе, и текст не слишком длинный, можно напрямую менять свойство Заголовок у самой кнопки на клиенте. Однако, как отмечают на форумах, этот способ подходит не всегда: заголовок может быть уже занят критически важным текстом (например, счетчиками вида «2/5») или ограничен визуальным пространством на форме.
Подводя итог, можно смело сказать: архитектура управляемых форм 1С изначально накладывает определенные рамки, но благодаря объекту РасширеннаяПодсказка у разработчика есть элегантный и мощный инструмент для работы с интерфейсом на клиентской стороне без лишних обращений к серверу.