В процессе разработки интерфейсов на платформе 1С часто возникает задача сделать работу пользователя более информативной и удобной. Один из классических сценариев — дублирование важной информации о товаре (например, артикула, полного наименования или остатка) в отдельной панели в нижней части формы. Это позволяет пользователю видеть ключевые детали, не прокручивая таблицу товаров вправо. Рассмотрим подробно, как реализовать такой механизм в управляемом приложении.
Для начала нам необходимо определить, где именно будет отображаться информация. Поскольку стандартная «панель состояния» в управляемых формах имеет свои ограничения и предназначена скорее для системных сообщений, мы создадим собственный элемент управления. Разберем этот процесс по шагам:
ИнфоОТоваре.Строка. Если же мы хотим выделить цену цветом или сделать название жирным, лучше выбрать тип ФорматированнаяСтрока.Проанализируем настройки элемента формы. Чтобы надпись выглядела как информационная панель, в свойствах созданного элемента (вида «Поле надписи» или «Декорация») стоит установить флаг Растягивать по горизонтали и, при необходимости, изменить шрифт или цвет текста, чтобы он визуально отделялся от основных данных.
Чтобы информация обновлялась мгновенно при перемещении пользователя по строкам таблицы, нам нужно «поймать» момент изменения текущей строки. Для этого у элемента формы типа «Таблица» существует стандартное событие — ПриАктивизацииСтроки.
Выясним причину, почему стоит использовать именно его: это событие срабатывает каждый раз, когда пользователь кликает мышкой по новой строке или перемещается по списку с помощью стрелок на клавиатуре. Рассмотрим пример кода, который необходимо прописать в модуле формы:
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
// Получаем данные строки, на которой стоит курсор
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
// Обязательно проверяем, не пуста ли строка (например, при удалении всех строк)
Если ТекущиеДанные = Неопределено Тогда
ИнфоОТоваре = "";
Возврат;
КонецЕсли;
// Формируем текст для вывода
ИнфоОТоваре = "Товар: " + ТекущиеДанные.Номенклатура + " | Артикул: " + ТекущиеДанные.Артикул;
КонецПроцедуры
Просто текст — это удобно, но ФорматированнаяСтрока позволяет сделать интерфейс по-настоящему профессиональным. Мы можем программно задать разные цвета для различных частей сообщения. Посмотрим на пример реализации:
&НаКлиенте
Процедура ОбновитьИнфоНаФорме(ДанныеСтроки)
ЦветБренда = ЦветаСтиля.ПоясняющийТекст;
ЖирныйШрифт = Новый Шрифт(,,Истина);
// Конструируем красивую строку
МассивЧастей = Новый Массив;
МассивЧастей.Добавить("Выбран товар: ");
МассивЧастей.Добавить(Новый ФорматированнаяСтрока(Строка(ДанныеСтроки.Номенклатура), ЖирныйШрифт, ЦветСреднесерый));
МассивЧастей.Добавить(" | Текущая цена: ");
МассивЧастей.Добавить(Новый ФорматированнаяСтрока(Строка(ДанныеСтроки.Цена), , ЦветаСтиля.ЦветТекстаПроблемы));
ИнфоОТоваре = Новый ФорматированнаяСтрока(МассивЧастей);
КонецПроцедуры
Важный технический нюанс: событие ПриАктивизацииСтроки генерируется очень часто. Если пользователь быстро пролистывает список, зажимая клавишу «вниз», код внутри процедуры будет выполняться для каждой строки. Если внутри процедуры есть сложные вычисления или обращения к серверу, интерфейс начнет заметно «подтормаживать».
Проанализируем профессиональное решение этой проблемы — использование обработчика ожидания. Мы будем обновлять информацию не мгновенно, а с микро-задержкой (например, 0.1 секунды). Если пользователь листает список быстрее, обработчик просто не успеет сработать до следующего перемещения, что снимет нагрузку с системы.
Разберем по шагам реализацию этого метода:
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
// Отключаем предыдущий обработчик, если он еще не сработал
ОтключитьОбработчикОжидания("ВыполнитьОбновлениеПанели");
// Подключаем новый обработчик с минимальной задержкой
// Параметр Истина означает однократное выполнение
ПодключитьОбработчикОжидания("ВыполнитьОбновлениеПанели", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОбновлениеПанели()
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ИнфоОТоваре = "";
Возврат;
КонецЕсли;
// Основная логика заполнения реквизита
ИнфоОТоваре = "Артикул: " + ТекущиеДанные.Артикул + " | Склад: " + ТекущиеДанные.Склад;
КонецПроцедуры
Мы рассмотрели, как с помощью простых манипуляций с реквизитами формы и обработчиками событий создать динамическую информационную панель. Подведем итог ключевым моментам:
Неопределено для ТекущиеДанные, чтобы избежать ошибок при очистке таблицы.Строка или ФорматированнаяСтрока, выведенный как Поле надписи.Состояние() может быть полезна для временных уведомлений, но для постоянного отображения данных о строке она неудобна, так как перекрывается другими системными сообщениями.Используя этот подход, мы создаем отзывчивый и современный интерфейс, который помогает пользователю быстрее ориентироваться в данных документа.