Как программно изменить заголовок кнопки в управляемой форме 1С

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

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

Базовый механизм изменения заголовка кнопки

В управляемом интерфейсе за визуальное отображение отвечает коллекция Элементы. Чтобы изменить текст на кнопке, нам достаточно обратиться к свойству Заголовок конкретного элемента. Рассмотрим стандартную ситуацию, когда у нас есть кнопка с именем КнопкаВыполнить. Код для изменения её текста на клиенте будет выглядеть следующим образом:


&НаКлиенте
Процедура ИзменитьЗаголовок()
    Элементы.КнопкаВыполнить.Заголовок = "Запустить процесс сейчас";
КонецПроцедуры

Важно понимать, что это действие является чисто визуальным и должно выполняться в контексте &НаКлиенте. Платформа 1С оптимизирована таким образом, что изменение свойств интерфейса не требует обязательного обращения к серверу, если текст заголовка уже известен на стороне клиента.

Изменение заголовков в автогенерируемых формах

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

Рассмотрим пример, когда нам нужно изменить заголовок второй кнопки в стандартной командной панели формы:


&НаКлиенте
Процедура ИзменитьЗаголовокАвтокнопки()
    // Обращаемся к командной панели формы и получаем элемент по индексу
    Попытка
        Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.Получить(1).Заголовок = "Новое имя кнопки";
    Исключение
        Сообщить("Элемент не найден или недоступен для изменения");
    КонецПопытки;
КонецПроцедуры

Проанализируем ситуацию: в автогенерируемых формах имена элементов могут быть неочевидными (например, ФормаЗаписатьИЗакрыть). Для точного определения имени элемента рекомендуется использовать отладчик и просматривать дерево коллекции Элементы непосредственно во время работы приложения.

Связь кнопки и команды: важный нюанс

В управляемых формах 1С кнопка — это лишь оболочка, которая вызывает Команду. У кнопки есть важное свойство — "Использовать заголовок команды". Если этот флаг установлен, прямое изменение заголовка элемента формы может не сработать, так как приоритет отдается тексту, прописанному в самой команде.

Выясним, как поступить в таком случае. У нас есть два пути:

  1. Снять в конфигураторе флаг "Использовать заголовок команды" у кнопки. Тогда Элементы.ИмяКнопки.Заголовок будет работать безупречно.
  2. Изменить заголовок самой команды, если эта команда используется только в этой кнопке:

&НаКлиенте
Процедура ИзменитьТекстКоманды()
    ЭтаФорма.Команды.ИмяКомандыФормы.Заголовок = "Текст для всех кнопок этой команды";
КонецПроцедуры

Типичная ошибка: передача контекста формы на сервер

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

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

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


&НаКлиенте
Процедура ОбновитьЗаголовокПоДаннымБД()
    
    // НЕПРАВИЛЬНО: передавать весь "Объект" 
    // Элементы.Версия.Заголовок = ПолучитьТекстНаСервере(Объект); 
    
    // ПРАВИЛЬНО: передавать только Ссылку или простые типы
    СсылкаНаОбъект = Объект.Ссылка;
    Элементы.КнопкаВерсия.Заголовок = ПолучитьТекстНаСервере(СсылкаНаОбъект);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьТекстНаСервере(Ссылка)
    // Здесь выполняем запрос к БД
    Возврат "Версия № " + Ссылка.Номер; 
КонецФункции

Важный момент: использование директивы &НаСервереБезКонтекста позволяет максимально быстро выполнить код, так как на сервер не передаются все данные формы, а только необходимые параметры.

Работа с заголовками в Толстом клиенте (обычные формы)

Хотя основное обсуждение касается управляемых форм, вспомним, как это реализовано в обычном приложении. Там заголовок меняется через коллекцию ЭлементыФормы. Если код ЭлементыФормы.Кнопка1.Заголовок = "Тест" не дает результата, проверьте следующее:

Динамическое обновление интерфейса

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

Рассмотрим пример правильной логики:


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

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

← На главную