При разработке интерфейсов на управляемых формах 1С часто возникает задача динамического отображения информации. Например, при навигации по списку записей регистра сведений нам нужно мгновенно выводить значение определенного ресурса или реквизита (например, цены, остатка или комментария) в отдельное поле или в виде оповещения. Рассмотрим подробнее, как реализовать эту задачу несколькими способами, проанализируем возможные ошибки и разберем лучшие практики написания кода.
Это самый распространенный метод, позволяющий обновлять данные «на лету» при перемещении курсора по списку. Рассмотрим по шагам процесс реализации. Основным объектом для работы здесь является свойство таблицы формы ТекущиеДанные. Оно содержит структуру данных той строки, на которой в данный момент находится пользователь.
Проанализируем программный код, который необходимо разместить в модуле формы. Важно помнить, что событие ПриАктивизацииСтроки выполняется на клиенте, что обеспечивает высокую скорость отклика интерфейса.
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
// Обязательно проверяем, что строка выбрана и данные доступны
Если Элемент.ТекущиеДанные <> Неопределено Тогда
// Получаем значение конкретной колонки (например, Цена)
ЗначениеЦены = Элемент.ТекущиеДанные.Цена;
// Выводим информацию пользователю
Состояние("Текущая цена: " + ЗначениеЦены);
КонецЕсли;
КонецПроцедуры
Важное замечание: проверка на Неопределено критически важна. Если список окажется пустым или форма будет находиться в процессе обновления, обращение к свойству напрямую вызовет аварийное завершение работы программы с ошибкой «Значение не является значением объектного типа».
Иногда требуется выводить информацию не при каждом перемещении курсора, а только при целенаправленном действии пользователя — двойном клике мышью или нажатии клавиши Enter. В этом случае мы будем использовать событие Выбор. Выясним причину, по которой это может быть предпочтительнее: это снижает нагрузку на систему, если обработка данных требует сложных вычислений.
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартное открытие карточки записи, если это необходимо
// СтандартнаяОбработка = Ложь;
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
ТекстСообщения = "Вы выбрали товар с ценой: " + ТекущаяСтрока.Цена;
ПоказатьОповещениеПользователю("Информация о цене", , ТекстСообщения);
КонецЕсли;
КонецПроцедуры
Разберем элегантный способ, который предоставляет платформа 1С для управляемых форм. Мы можем отобразить данные текущей строки в отдельном поле, не написав ни одной строки кода. Это реализуется через механизм связей данных.
ЦенаДляОтображения (тип должен соответствовать типу данных в колонке).Элементы.Список.ТекущиеДанные.Цена (где «Список» — имя вашей таблицы на форме).Теперь платформа будет автоматически обновлять значение в этом поле каждый раз, когда пользователь переключается между строками регистра. Это наиболее производительный и правильный с точки зрения архитектуры метод для простого отображения данных.
Посмотрим на ситуацию со стороны пользователя. Простое число «10000» в сообщении выглядит не очень информативно. При выводе числовых данных, особенно цен, рекомендуется использовать функцию Формат(). Рассмотрим пример улучшения кода:
Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда
ЦенаЧислом = Элементы.Список.ТекущиеДанные.Цена;
// Форматируем число: разделяем разряды и добавляем валюту
ТекстЦены = Формат(ЦенаЧислом, "ЧЦ=15; ЧДЦ=2; ЧРГ=' '") + " руб.";
Состояние("Цена позиции: " + ТекстЦены);
КонецЕсли;
Также проанализируем способ вывода. Использование функции Сообщить() не всегда удобно, так как окно сообщений накапливает историю и загромождает экран. Для динамической информации лучше использовать:
Состояние() — текст отображается в статусной строке внизу экрана.ПоказатьОповещениеПользователю() — всплывающее окно, которое исчезает через несколько секунд.Иногда программный код написан верно, но ТекущиеДанные.Цена возвращает пустое значение или вызывает ошибку. Выясним причину. Динамический список оптимизирует запросы к базе данных и получает только те колонки, которые визуально отображены в таблице. Если колонка «Цена» скрыта пользователем через «Изменить форму», данные могут перестать поступать на клиент.
Чтобы гарантировать наличие данных в ТекущиеДанные, выполним следующие действия:
Список (динамический список).Это заставит платформу всегда включать данную колонку в SQL-запрос, независимо от видимости колонки на экране, и вы всегда сможете обратиться к ней из программного кода.
Таким образом, мы рассмотрели все основные подходы к отображению значений при выборе строки. Выбор конкретного метода зависит от ваших задач: для простого вывода значения на форму идеально подходит связь через ПутьКДанным, а для сложной логики обработки клика — события ПриАктивизацииСтроки или Выбор.