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