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