При разработке интерфейсов на платформе 1С:Предприятие 8.3 часто возникает задача отображения специфической справочной информации для каждой конкретной строки таблицы. Стандартный механизм свойства Подсказка у колонки таблицы ограничен: текст, заданный в конфигураторе, отображается одинаково для всех ячеек этой колонки. В этой статье мы разберем, как обойти это ограничение и предоставить пользователю релевантные данные по каждой строке.
Прежде чем мы перейдем к решениям, важно прояснить технический нюанс. В управляемых формах 1С отсутствует событие «наведения курсора» на ячейку, которое можно было бы перехватить программно для мгновенной подмены текста. Платформа отображает стандартную всплывающую подсказку только на основании статических данных элемента формы. Поэтому большинство «динамических» решений завязаны на событии ПриАктивизацииСтроки, то есть на моменте, когда пользователь кликает по строке или перемещается по таблице с помощью клавиатуры.
Рассмотрим наиболее надежный и удобный с точки зрения юзабилити вариант — создание выделенной области под табличной частью или рядом с ней. Это позволяет не заставлять пользователя ждать появления всплывающего окна, а сразу показывать нужные данные при навигации по списку.
Для реализации этого метода выполним следующие шаги:
Строка (например, ТекстИнфоПанели).Поле надписи или Поле ввода с видом Поле надписи.ПриАктивизацииСтроки нашей таблицы пропишем обновление этого поля.Проанализируем пример кода:
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Допустим, мы хотим выводить описание номенклатуры
ТекстИнфоПанели = "Информация: " + ТекущиеДанные.НоменклатураНаименованиеПолное;
Иначе
ТекстИнфоПанели = "";
КонецЕсли;
КонецПроцедуры
Если вы хотите сохранить механику всплывающего окошка, можно попробовать менять свойство Подсказка самого элемента формы (колонки) при смене строки. Важно понимать: подсказка обновится только для той ячейки, которая станет активной (в которую пользователь «встанет» курсором).
Разберем, как это работает программно:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ТекущаяСтрока = Элементы.Список.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
// Устанавливаем текст всплывающей подсказки для конкретной колонки
Элементы.СписокНаименование.Подсказка = "Код товара: " + ТекущаяСтрока.Код;
КонецЕсли;
КонецПроцедуры
Важный момент: Этот метод может работать с задержкой, так как платформе требуется время на перерисовку интерфейса. Однако для простых текстовых данных это вполне рабочее решение.
В современных версиях платформы 8.3 у элементов формы появилось свойство РасширеннаяПодсказка. Это не просто строка, а полноценный объект. Мы можем программно управлять его заголовком. Преимущество расширенной подсказки в том, что она поддерживает форматированные строки.
Посмотрим на пример реализации:
&НаКлиенте
Процедура ТЧПриАктивизацииСтроки(Элемент)
Данные = Элементы.ТЧ.ТекущиеДанные;
Если Данные = Неопределено Тогда
Возврат;
КонецЕсли;
// Обращаемся к объекту расширенной подсказки
ТекстПодсказки = "Остаток на складе: " + Данные.Остаток + " " + Данные.ЕдИзм;
Элементы.ТЧКоличество.РасширеннаяПодсказка.Заголовок = ТекстПодсказки;
КонецПроцедуры
Если справочная информация по строке объемная (например, должна содержать картинку товара, таблицу аналогов или форматированный текст), лучше всего использовать Поле HTML-документа. Разместим его на форме и будем динамически генерировать HTML-код при активации строки. Для подготовки и редактирования такого форматированного описания подойдёт редактор HTML-текста для 1С.
Рассмотрим алгоритм формирования контента:
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
ДанныеСтроки = Элементы.Товары.ТекущиеДанные;
Если ДанныеСтроки <> Неопределено Тогда
HTMLКод = "<html><body>"
+ "<h3>" + ДанныеСтроки.Номенклатура + "</h3>"
+ "<p style='color:blue;'>Спецификация: " + ДанныеСтроки.ТехОписания + "</p>"
+ "</body></html>";
СодержимоеHTML = HTMLКод; // Реквизит формы, связанный с полем HTML
КонецЕсли;
КонецПроцедуры
Для пустых ячеек, в которые пользователь должен ввести данные, полезно использовать свойство ПодсказкаВвода. Это серый текст, который исчезает при начале редактирования. Его также можно менять динамически, чтобы подсказать, какой именно параметр ожидается в данной строке в зависимости от контекста (например, в зависимости от выбранного типа операции в соседней колонке).
Пример программной установки:
Элементы.КолонкаЗначение.ПодсказкаВвода = "Введите " + ТекущиеДанные.ТипИнформации;
Частый вызов события ПриАктивизацииСтроки может привести к замедлению работы интерфейса, если внутри него выполняются тяжелые запросы к базе данных (для их анализа и оптимизации пригодится набор инструментов разработчика для отладки в 1С). Чтобы этого избежать, придерживайтесь следующих правил:
Выяснив причину ограничений платформы, мы проанализировали несколько альтернативных путей. Выбор конкретного метода зависит от того, насколько критично для вас именно всплывающее окно и насколько велик объем отображаемой информации. Наиболее «чистым» решением для пользователя остается отдельная информационная панель или расширенная подсказка, обновляемая при навигации.