Как программно изменить всплывающую подсказку и картинку кнопки в управляемых формах 1С 8.3?

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

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

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

Элементы формы против Команд формы: к чему обращаться?

Первая трудность, с которой сталкиваются разработчики — попытка изменить свойство подсказки или картинки у самой команды формы. В коде это часто выглядит так: ЭтаФорма.Команды.МояКоманда.Подсказка = "Текст". Выясним причину, почему такой подход некорректен.

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

Правильное обращение к кнопке будет выглядеть так: Элементы.ИмяКнопки. Менять свойства самой команды на лету после инициализации формы нельзя, так как они становятся недоступными для изменения.

Секрет свойства «Расширенная подсказка»

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

Архитектурно расширенная подсказка представляет собой отдельную подчиненную декорацию формы с типом "Текст". Именно поэтому напрямую присвоить ей текст через свойство Подсказка нельзя — возникнет ошибка доступности. Обращаться к ней нужно через вложенное свойство Заголовок.

Посмотрим на пример правильного назначения текста:


Элементы.КнопкаИзменениеСтатусаДокумента.РасширеннаяПодсказка.Заголовок = "Документ проверен. Проверил: Иванов И.И.";

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

Динамическая смена картинки на кнопке

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

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

Посмотрим на пример кода изменения картинки:


Если ДоступЗапрещен Тогда
    Элементы.КнопкаИзменениеСтатусаДокумента.Картинка = БиблиотекаКартинок.ЗамокЗакрыт;
Иначе
    Элементы.КнопкаИзменениеСтатусаДокумента.Картинка = БиблиотекаКартинок.ЗамокОткрыт;
КонецЕсли;

Элементы.КнопкаИзменениеСтатусаДокумента.Отображение = ОтображениеКнопки.КартинкаИТекст;

Реализация логики получения данных и обновления интерфейса

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

Разберем готовый пример. Предположим, у нас есть функция, которая возвращает структуру с данными из регистра сведений по статусу текущего документа.


&НаСервере
Процедура ОбновитьОтображениеКнопкиСтатуса()
    
    // Получаем данные о проверке из регистра (вымышленная функция для примера)
    ДанныеПроверки = ПолучитьДанныеОСтатусеИзРегистра(Объект.Ссылка);
    
    // Получаем сам элемент формы
    Кнопка = Элементы.КнопкаИзменениеСтатусаДокумента;
    
    Если ДанныеПроверки.Статус = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен Тогда
        // Документ проверен
        ТекстПодсказки = СтрШаблон("Документ проверен, изменение невозможно. Проверил: %1, Дата: %2", 
            ДанныеПроверки.Ответственный, 
            Формат(ДанныеПроверки.ДатаПроверки, "ДЛФ=D"));
            
        Кнопка.РасширеннаяПодсказка.Заголовок = ТекстПодсказки;
        Кнопка.Картинка = БиблиотекаКартинок.ЗамокЗакрыт;
        Кнопка.Отображение = ОтображениеКнопки.КартинкаИТекст;
        
    ИначеЕсли ДанныеПроверки.Статус = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен Тогда
        // Документ не проверен
        Кнопка.РасширеннаяПодсказка.Заголовок = "Документ новый, статус не проверен.";
        Кнопка.Картинка = БиблиотекаКартинок.ЗамокОткрыт;
        Кнопка.Отображение = ОтображениеКнопки.КартинкаИТекст;
        
    Иначе
        // Документ на повторной проверке
        Кнопка.РасширеннаяПодсказка.Заголовок = "Документ находится на повторной проверке.";
        Кнопка.Картинка = БиблиотекаКартинок.ЗамокОткрыт; // Можно использовать другую иконку
        Кнопка.Отображение = ОтображениеКнопки.КартинкаИТекст;
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьДанныеОСтатусеИзРегистра(СсылкаНаДокумент)
    // Выполняем запрос к регистру сведений
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |   ЛП_СтатусыПроверкиДокументов.Проверил КАК Ответственный,
        |   ЛП_СтатусыПроверкиДокументов.ДатаПроверки КАК ДатаПроверки,
        |   ЛП_СтатусыПроверкиДокументов.СтатусПроверки КАК Статус
        |ИЗ
        |   РегистрСведений.ЛП_СтатусыПроверкиДокументов КАК ЛП_СтатусыПроверкиДокументов
        |ГДЕ
        |   ЛП_СтатусыПроверкиДокументов.Документ = &Документ";
        
    Запрос.УстановитьПараметр("Документ", СсылкаНаДокумент);
    РезультатЗапроса = Запрос.Выполнить();
    
    СтруктураВозврата = Новый Структура("Ответственный, ДатаПроверки, Статус");
    
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        ЗаполнитьЗначенияСвойств(СтруктураВозврата, Выборка);
    Иначе
        // Значения по умолчанию, если записей нет
        СтруктураВозврата.Статус = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен;
    КонецЕсли;
    
    Возврат СтруктураВозврата;
КонецФункции

Обратите внимание, что мы вызываем функцию получения данных из базы. В ней мы используем параметр ПЕРВЫЕ 1, чтобы гарантированно получить только актуальную запись, если структура регистра не предполагает иного. Все данные мы собираем в Структура и возвращаем в процедуру, которая занимается исключительно отрисовкой интерфейса (изменением свойств кнопки).

Где вызывать код обновления?

Чтобы пользователь всегда видел актуальную информацию, процедуру ОбновитьОтображениеКнопкиСтатуса() следует вызывать в двух местах:

  1. В обработчике формы ПриСозданииНаСервере или ПриЧтенииНаСервере. Оптимальнее использовать ПриЧтенииНаСервере, так как статус жестко привязан к сохраненным данным самого документа.
  2. В процедуре обработчика нажатия на саму кнопку (после того, как статус будет программно изменен и записан в базу). Это позволит интерфейсу мгновенно отреагировать на действия пользователя без необходимости переоткрывать форму документа.

Используя эти правила работы с элементами формы и расширенными подсказками, вы сможете создавать сложные, адаптивные и понятные для пользователя интерфейсы в 1С:Предприятие 8.3.

← На главную