Как отобразить значение колонки при нажатии на строку в Регистре сведений?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на управляемых формах 1С часто возникает задача динамического отображения информации. Например, при навигации по списку записей регистра сведений нам нужно мгновенно выводить значение определенного ресурса или реквизита (например, цены, остатка или комментария) в отдельное поле или в виде оповещения. Рассмотрим подробнее, как реализовать эту задачу несколькими способами, проанализируем возможные ошибки и разберем лучшие практики написания кода.

Способ 1. Использование события ПриАктивизацииСтроки

Это самый распространенный метод, позволяющий обновлять данные «на лету» при перемещении курсора по списку. Рассмотрим по шагам процесс реализации. Основным объектом для работы здесь является свойство таблицы формы ТекущиеДанные. Оно содержит структуру данных той строки, на которой в данный момент находится пользователь.

Проанализируем программный код, который необходимо разместить в модуле формы. Важно помнить, что событие ПриАктивизацииСтроки выполняется на клиенте, что обеспечивает высокую скорость отклика интерфейса.


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    
    // Обязательно проверяем, что строка выбрана и данные доступны
    Если Элемент.ТекущиеДанные <> Неопределено Тогда
        
        // Получаем значение конкретной колонки (например, Цена)
        ЗначениеЦены = Элемент.ТекущиеДанные.Цена;
        
        // Выводим информацию пользователю
        Состояние("Текущая цена: " + ЗначениеЦены);
        
    КонецЕсли;
    
КонецПроцедуры

Важное замечание: проверка на Неопределено критически важна. Если список окажется пустым или форма будет находиться в процессе обновления, обращение к свойству напрямую вызовет аварийное завершение работы программы с ошибкой «Значение не является значением объектного типа».

Способ 2. Вывод данных через событие Выбор

Иногда требуется выводить информацию не при каждом перемещении курсора, а только при целенаправленном действии пользователя — двойном клике мышью или нажатии клавиши Enter. В этом случае мы будем использовать событие Выбор. Выясним причину, по которой это может быть предпочтительнее: это снижает нагрузку на систему, если обработка данных требует сложных вычислений.


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие карточки записи, если это необходимо
    // СтандартнаяОбработка = Ложь;
    
    ТекущаяСтрока = Элемент.ТекущиеДанные;
    
    Если ТекущаяСтрока <> Неопределено Тогда
        ТекстСообщения = "Вы выбрали товар с ценой: " + ТекущаяСтрока.Цена;
        ПоказатьОповещениеПользователю("Информация о цене", , ТекстСообщения);
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Реализация без программирования (Связь по типу)

Разберем элегантный способ, который предоставляет платформа 1С для управляемых форм. Мы можем отобразить данные текущей строки в отдельном поле, не написав ни одной строки кода. Это реализуется через механизм связей данных.

  1. Откроем редактор формы регистра сведений.
  2. Создадим новый реквизит формы, например, ЦенаДляОтображения (тип должен соответствовать типу данных в колонке).
  3. Перетащим этот реквизит на форму, чтобы создать поле ввода или поле надписи.
  4. В свойствах созданного элемента формы найдем поле ПутьКДанным.
  5. Укажем путь в формате: Элементы.Список.ТекущиеДанные.Цена (где «Список» — имя вашей таблицы на форме).

Теперь платформа будет автоматически обновлять значение в этом поле каждый раз, когда пользователь переключается между строками регистра. Это наиболее производительный и правильный с точки зрения архитектуры метод для простого отображения данных.

Тонкости форматирования и удобства интерфейса

Посмотрим на ситуацию со стороны пользователя. Простое число «10000» в сообщении выглядит не очень информативно. При выводе числовых данных, особенно цен, рекомендуется использовать функцию Формат(). Рассмотрим пример улучшения кода:


Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда
    ЦенаЧислом = Элементы.Список.ТекущиеДанные.Цена;
    
    // Форматируем число: разделяем разряды и добавляем валюту
    ТекстЦены = Формат(ЦенаЧислом, "ЧЦ=15; ЧДЦ=2; ЧРГ=' '") + " руб.";
    
    Состояние("Цена позиции: " + ТекстЦены);
КонецЕсли;

Также проанализируем способ вывода. Использование функции Сообщить() не всегда удобно, так как окно сообщений накапливает историю и загромождает экран. Для динамической информации лучше использовать:

Возможные проблемы с Динамическим списком

Иногда программный код написан верно, но ТекущиеДанные.Цена возвращает пустое значение или вызывает ошибку. Выясним причину. Динамический список оптимизирует запросы к базе данных и получает только те колонки, которые визуально отображены в таблице. Если колонка «Цена» скрыта пользователем через «Изменить форму», данные могут перестать поступать на клиент.

Чтобы гарантировать наличие данных в ТекущиеДанные, выполним следующие действия:

  1. Зайдем в свойства реквизита формы Список (динамический список).
  2. Откроем настройку «Настройка списка» или «Выбранные поля».
  3. Найдем нужное поле (Цена) и установим для него свойство Использовать всегда.

Это заставит платформу всегда включать данную колонку в SQL-запрос, независимо от видимости колонки на экране, и вы всегда сможете обратиться к ней из программного кода.

Таким образом, мы рассмотрели все основные подходы к отображению значений при выборе строки. Выбор конкретного метода зависит от ваших задач: для простого вывода значения на форму идеально подходит связь через ПутьКДанным, а для сложной логики обработки клика — события ПриАктивизацииСтроки или Выбор.

← На главную