Почему у элемента КнопкаФормы в 1С нет свойства Подсказка на клиенте и как это решить?

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

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

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

Архитектурная причина «парадокса»

На первый взгляд это выглядит нелогично: почему у обычной декорации формы свойство Подсказка доступно на клиенте, а у кнопки командной панели — нет? Выясним причину такого поведения платформы.

Дело кроется в строгом разделении логики управляемого приложения. Стандартная подсказка жестко привязана к объекту Команда. Эта команда может быть глобальной (общей для всей конфигурации) или локальной (принадлежать конкретной форме). Инициализация команд и управление ими осуществляется сервером, так как именно на них завязана маршрутизация прав доступа и базовая функциональность.

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

Решение 1: Использование механизма «Расширенная подсказка»

Рассмотрим самое правильное и современное решение. Начиная с версии платформы 8.3.1, у элементов управления появился функционал расширенных подсказок. Несмотря на то, что базовую подсказку команды с клиента не поменять, мы можем программно обратиться к объекту РасширеннаяПодсказка нашего элемента формы.

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


&НаКлиенте
Процедура ПриИзмененииСтрокиСписка()
    // Динамически формируем текст в зависимости от контекста
    НовыйТекстПодсказки = "Нажмите для обработки документа № " + ТекущиеДанные.Номер;
    
    // Обращаемся к свойству Заголовок расширенной подсказки элемента
    Элементы.ИмяМоейКнопки.РасширеннаяПодсказка.Заголовок = НовыйТекстПодсказки;
КонецПроцедуры

Преимущества расширенной подсказки:

  1. Она поддерживает объект ФорматированнаяСтрока. Текст можно раскрашивать, выделять жирным шрифтом и добавлять в него иконки.
  2. Ей можно назначить разные режимы через свойство ОтображениеПодсказки (например, показывать как всплывающее окошко, как иконку вопроса или как статичный текст рядом с кнопкой).
  3. Не требует серверных вызовов, что экономит ресурсы системы и ускоряет работу интерфейса.

Решение 2: Замена кнопки на Декорацию формы

Если по каким-то причинам первый вариант не подходит, рассмотрим популярный обходной путь — отказ от стандартной кнопки в пользу объекта ДекорацияФормы. Как справедливо замечают разработчики, у декорации свойство Подсказка доступно везде.

Разберем процесс настройки:

  1. Создаем на форме элемент с типом ДекорацияФормы (вид — Надпись или Картинка).
  2. Стилизуем ее так, чтобы она визуально напоминала гиперссылку или кнопку (например, с помощью свойства Оформление).
  3. Подключаем обработчик события Нажатие.
  4. Теперь при любом клиентском действии просто переопределяем подсказку:

&НаКлиенте
Процедура ПриИзмененииДанныхНаКлиенте()
    Элементы.МояДекорацияКнопка.Подсказка = "Новое значение подсказки на клиенте";
КонецПроцедуры

Решение 3: Управление видимостью или доступностью кнопок

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

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


&НаКлиенте
Процедура ПереключитьКнопку()
    Если ТекущийРежим = 1 Тогда
        Элементы.КнопкаВариант1.Видимость = Истина;
        Элементы.КнопкаВариант2.Видимость = Ложь;
    Иначе
        Элементы.КнопкаВариант1.Видимость = Ложь;
        Элементы.КнопкаВариант2.Видимость = Истина;
    КонецЕсли;
КонецПроцедуры

Внимание: Этот метод стоит использовать только при строгом ограничении вариантов. Если текст подсказки должен формироваться динамически из данных текущей строки, используйте Решение 1.

Решение 4: Использование заголовка кнопки

Если ваша задача — просто проинформировать пользователя о статусе, и текст не слишком длинный, можно напрямую менять свойство Заголовок у самой кнопки на клиенте. Однако, как отмечают на форумах, этот способ подходит не всегда: заголовок может быть уже занят критически важным текстом (например, счетчиками вида «2/5») или ограничен визуальным пространством на форме.

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

← На главную