Разработка и Конфигурация · 13 мин
1С: как показать подсказку программно
Как программно показать подсказку в 1С: свойство ПодсказкаВвода, ОтображениеПодсказки, расширенная подсказка и сообщения пользователю. Примеры кода на встроенном языке.
Задача показать подсказку пользователю возникает в 1С постоянно: нужно пояснить, что вводить в поле, предупредить об ограничении, подсветить ошибку заполнения или вывести справочный текст рядом с элементом формы. В зависимости от сценария платформа предлагает несколько разных механизмов — от простого свойства Подсказка до расширенной подсказки с форматированным содержимым и системы сообщений пользователю.
Важно сразу разделить два разных понятия. Первая группа механизмов — это подсказки, привязанные к элементу формы: текст под полем, подсказка ввода в пустом поле, всплывающий текст при наведении, кнопка с вопросительным знаком. Вторая группа — сообщения и оповещения, которые показываются независимо от элементов: Сообщить(), ПоказатьПредупреждение(), ПоказатьОповещениеПользователя(). Выбор зависит от того, должна ли подсказка жить рядом с полем постоянно или появиться однократно по событию.
Свойство «Подсказка»: базовый способ пояснить поле
Самый простой вариант — свойство Подсказка у элемента формы. В зависимости от настройки ОтображениеПодсказки этот текст показывается либо как всплывающая подсказка при наведении курсора, либо как кнопка с вопросительным знаком рядом с полем, либо как текст под элементом. Свойство доступно почти всем элементам управляемой формы: полям ввода, флажкам, кнопкам, таблицам.
Программно значение устанавливается обращением к элементу формы по имени:
Элементы.Комментарий.Подсказка = "Укажите причину возврата товара";
Элементы.Комментарий.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
Режим ОтображениеПодсказки.Кнопка удобен для длинных пояснений: текст не загромождает форму, а пользователь открывает его кликом по значку. Режим ОтображениеПодсказки.Всплывающая подходит для коротких подсказок в одну строку. Значение ОтображатьСнизу выводит текст постоянно под полем — это уже ближе к статичной надписи.
Подсказка ввода: текст внутри пустого поля
Подсказка ввода — это серый текст внутри пустого поля, который исчезает, как только пользователь начинает печатать. Классический пример: «Начните вводить наименование…» в поле поиска. За это отвечает свойство ПодсказкаВвода, доступное полям ввода и полям таблицы.
Элементы.Наименование.ПодсказкаВвода = "Например: Кресло офисное";
Типичный сценарий программного изменения — динамическая подсказка, зависящая от контекста. Например, в документе поступления поле «Договор» может подсказывать разный текст в зависимости от выбранного вида операции:
Если Объект.ВидОперации = Перечисления.ВидыОпераций.Покупка Тогда
Элементы.Договор.ПодсказкаВвода = "Выберите договор с поставщиком";
Иначе
Элементы.Договор.ПодсказкаВвода = "Выберите договор с покупателем";
КонецЕсли;
Подсказка ввода не заменяет проверку заполнения: пользователь может проигнорировать текст и оставить поле пустым. Если значение обязательно, дополнительно включайте отметку незаполненного (ОтметкаНезаполненного) или проверку в обработчике ПроверкаЗаполнения.
Расширенная подсказка: форматированный текст и картинки
Когда обычной строки недостаточно — нужен многострочный текст, форматирование, гиперссылки или картинка — используется расширенная подсказка. У элемента формы есть свойство РасширеннаяПодсказка, которое возвращает объект-расширение с собственными свойствами Заголовок, Картинка и РастягиватьПоГоризонтали.
РасшПодсказка = Элементы.СуммаДокумента.РасширеннаяПодсказка;
РасшПодсказка.Заголовок = "Сумма указывается с НДС. " +
"При превышении лимита документ уходит на согласование.";
Элементы.СуммаДокумента.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
В заголовок расширенной подсказки можно присвоить форматированную строку — объект ФорматированнаяСтрока, собранный из фрагментов с разным шрифтом, цветом и ссылками. Это позволяет, например, встроить в подсказку ссылку на инструкцию, при клике по которой выполняется обработчик навигационной ссылки.
Учтите ограничение: расширенная подсказка отображается только в режимах, где платформа её поддерживает, и в тонком/веб-клиенте поведение может незначительно отличаться. Перед массовым использованием проверьте результат на тех клиентах, с которыми работают пользователи.
Разовые сообщения: предупреждения, оповещения и сообщения пользователю
Если подсказка должна появиться один раз в ответ на действие — например, при ошибке заполнения или после успешной операции — используются другие механизмы.
ПоказатьПредупреждение и ПоказатьВопрос
Метод ПоказатьПредупреждение() выводит модальное окно с текстом и кнопкой. Он блокирует работу до закрытия, поэтому подходит только для действительно важных сообщений. Метод асинхронный: продолжение логики пишется в описании оповещения.
ПоказатьПредупреждение(,
"Не заполнен склад отгрузки. Документ не будет проведён.",
10, // таймаут в секундах, 0 — без ограничения
"Проверка заполнения");
ПоказатьОповещениеПользователя
Метод ПоказатьОповещениеПользователя() показывает немодальное окно в углу экрана, которое не мешает работе и исчезает само. Это оптимальный вариант для информационных подсказок: «Данные сохранены», «Печатная форма сформирована». Оповещению можно задать навигационную ссылку — при клике пользователь перейдёт, например, к созданному документу.
СообщениеПользователю с привязкой к полю
Объект СообщениеПользователю — стандартный способ сообщить об ошибке с подсветкой конкретного поля. Если заполнить свойства Поле и ПутьКДанным, сообщение «привяжется» к элементу формы: при двойном клике по сообщению курсор перейдёт в нужное поле, а само поле будет подсвечено.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Количество не может быть отрицательным";
Сообщение.Поле = "Товары[0].Количество";
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();
Сравнение способов показа подсказки
Постоянная подсказка у поля. Подходит для пояснений формата ввода. Не привлекает внимания при ошибке.
Длинные пояснения с форматированием. Открывается по кнопке, не загромождает форму.
Модальное окно, требует реакции. Только для критичных сообщений — злоупотребление раздражает пользователей.
Немодальное уведомление об успешных действиях. Не подходит для ошибок — легко пропустить.
Ошибки заполнения с привязкой к полю. Стандарт для проверок в обработчиках.
Пошаговый пример: динамическая подсказка на форме документа
Соберём типовую задачу целиком: при изменении вида операции менять подсказку у поля «Договор» и показывать расширенное пояснение. Все действия выполняются в модуле формы документа.
- 1Откройте модуль формы документа и создайте процедуру УстановитьПодсказки() без параметров.
- 2Внутри процедуры задайте Элементы.Договор.ПодсказкаВвода в зависимости от значения Объект.ВидОперации.
- 3Установите Элементы.Договор.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка и заполните Элементы.Договор.РасширеннаяПодсказка.Заголовок.
- 4Вызовите УстановитьПодсказки() из обработчиков ПриСозданииНаСервере и ВидОперацииПриИзменении.
- 5Откройте форму в режиме предприятия и проверьте: подсказка ввода видна в пустом поле, кнопка с вопросом открывает расширенный текст, при смене вида операции текст меняется.
Ключевой момент — обновлять подсказки и при открытии формы, и при изменении данных. Если вызвать установку только в ПриСозданииНаСервере, то после изменения вида операции пользователь увидит устаревший текст.
&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
УстановитьПодсказки();
КонецПроцедуры
&НаСервере
Процедура УстановитьПодсказки()
Если Объект.ВидОперации = Перечисления.ВидыОпераций.Покупка Тогда
Элементы.Договор.ПодсказкаВвода = "Договор с поставщиком";
Элементы.Договор.РасширеннаяПодсказка.Заголовок =
"Доступны только договоры с видом «С поставщиком».";
Иначе
Элементы.Договор.ПодсказкаВвода = "Договор с покупателем";
Элементы.Договор.РасширеннаяПодсказка.Заголовок =
"Доступны только договоры с видом «С покупателем».";
КонецЕсли;
КонецПроцедуры
Частые ошибки и ограничения
Первая типичная ошибка — обращение к Элементы в серверном контексте объекта, а не формы. Свойства элементов формы доступны только в модуле формы; в модуле объекта или менеджера их нет, и попытка обращения приведёт к ошибке исполнения.
Вторая ошибка — использование устаревшего метода Предупреждение() вместо ПоказатьПредупреждение(). Старый синхронный метод не поддерживается в веб-клиенте и при включённом режиме запрета модальности вызовет ошибку. Во всех новых разработках применяйте только асинхронные варианты с описанием оповещения.
Третья проблема — присвоение ПодсказкаВвода элементу, который её не поддерживает, например флажку или полю переключателя. Ошибки компиляции не будет, если обращение идёт динамически, но в рантайме возможно исключение. Проверяйте тип элемента или используйте попытку/исключение при универсальном обходе элементов формы.
Как проверить результат
После внедрения подсказок пройдите форму глазами пользователя. Подсказка ввода должна быть видна только в пустом поле и исчезать при вводе. Кнопка расширенной подсказки должна открывать текст без обрезки — длинные строки проверяйте на минимальном разрешении экрана, которое используется в организации.
Для сообщений с привязкой к полю проверьте двойной клик по сообщению в панели: фокус должен переходить в указанное поле. Если перехода нет — скорее всего, не вызван УстановитьДанные() или неверно указано свойство Поле (для табличных частей путь задаётся с индексом строки, например Товары[2].Цена).
Как проверить результат
Серый текст виден до начала ввода и исчезает при первом символе
Текст не отображается или перекрывает введённое значение
Значок вопроса рядом с полем, по клику открывается полный текст
Кнопки нет — проверьте ОтображениеПодсказки и заполненность Заголовок
Двойной клик по сообщению переводит курсор в нужное поле
Ничего не происходит — не вызван УстановитьДанные или неверный путь в Поле
При смене условий текст подсказки меняется сразу
Текст остаётся старым — обновление вызывается не из всех нужных обработчиков
FAQ
Как показать подсказку программно в обычной форме (не управляемой)?
В обычных формах у элементов управления есть свойство Подсказка, которое задаёт всплывающий текст. Расширенной подсказки и свойства ОтображениеПодсказки там нет — эти механизмы появились только в управляемых формах. Для развёрнутых пояснений в обычных формах используют отдельные надписи или сообщения.
Можно ли показать подсказку у элемента, которого нет на форме?
Нет. Все свойства подсказок относятся к элементам формы, поэтому элемент должен существовать в дереве формы. Если поле не нужно постоянно, добавьте его на форму и управляйте видимостью через свойство Видимость, а подсказку показывайте вместе с появлением элемента.
Чем отличается Подсказка от ПодсказкаВвода?
Подсказка — пояснение к полю, которое показывается при наведении, по кнопке или под элементом, и видно всегда независимо от заполненности. ПодсказкаВвода — серый текст внутри самого поля, который виден только пока поле пустое. Они дополняют друг друга: ввода объясняет формат, обычная подсказка — смысл поля.
Как показать сообщение об ошибке с подсветкой конкретной строки табличной части?
Создайте СообщениеПользователю, в свойстве Поле укажите путь с индексом строки, например Товары[1].Количество (индексация с нуля), вызовите УстановитьДанные(Объект) и затем Сообщить(). При двойном клике по сообщению платформа активирует нужную строку и колонку.
Почему ПоказатьПредупреждение не останавливает выполнение кода?
Потому что метод асинхронный: окно показывается, а код продолжает выполняться дальше. Логику, которая должна выполниться после закрытия окна, помещайте в процедуру, переданную через ОписаниеОповещения первым параметром метода.
Можно ли вставить ссылку внутрь подсказки?
Да, через расширенную подсказку: сформируйте объект ФорматированнаяСтрока с фрагментом-ссылкой и присвойте его свойству Заголовок. Клик по ссылке обрабатывается в обработчике ОбработкаНавигационнойСсылки формы, где можно открыть нужный объект или внешнюю страницу.
Что важно запомнить
Постоянные подсказки у полей задаются свойствами Подсказка, ПодсказкаВвода и РасширеннаяПодсказка с режимом ОтображениеПодсказки. Разовые уведомления показываются через ПоказатьОповещениеПользователя и ПоказатьПредупреждение, а ошибки заполнения — через СообщениеПользователю с привязкой к полю. Все манипуляции выполняются только в модуле формы, а динамические подсказки нужно обновлять в каждом обработчике, меняющем условия.