Как получить текущую колонку табличной части в управляемой форме 1С?

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

При разработке интерфейсов управляемых форм в платформах 1С:Предприятие 8.3 часто возникает необходимость узнать, какая именно колонка табличной части или таблицы формы активна в данный момент. К примеру, это требуется при вызове командной кнопки, действие которой зависит от контекста выбранной колонки.

В обычных формах 1С для этих целей использовалось свойство ТекущаяКолонка. В управляемом интерфейсе подход изменился: концепция работы с элементами формы строится иначе. Разберем по шагам, как правильно получать активную колонку и каких распространенных ошибок следует избегать.

Основной способ получения активной колонки

Для определения активной колонки таблицы в управляемой форме используется свойство ТекущийЭлемент конкретного элемента формы типа ТаблицаФормы. Чтобы обратиться к имени элемента текущей колонки на клиенте, применяют следующую конструкцию:


&НаКлиенте
Процедура ИмяКоманды(Команда)
    
    ТекущаяКолонка = Элементы.ТаблицаТовары.ТекущийЭлемент;
    Если ТекущаяКолонка <> Неопределено Тогда
        ИмяЭлементаКолонки = ТекущаяКолонка.Имя;
        // Дальнейшая обработка
    КонецЕсли;

КонецПроцедуры

Рассмотрим важные детали работы данной конструкции:

  1. Обращаться нужно именно к элементу таблицы на форме (например, Элементы.ТаблицаТовары), а не к объекту ЭтаФорма.ТекущийЭлемент. Если пользователь нажимает отдельную кнопку на форме, фокус ввода в момент выполнения нажатия перемещается на эту кнопку. В таком случае ЭтаФорма.ТекущийЭлемент вернет само нажатое поле кнопки, а Элементы.ТаблицаТовары.ТекущийЭлемент сохранит ссылку на последнюю активную колонку в этой таблице.
  2. Перед обращением к свойству Имя необходимо всегда делать проверку на Неопределено, так как если таблица пуста или пользователь еще не активизировал в ней ни одной строки/колонки, свойство ТекущийЭлемент может не содержать значения.

Различие между именем элемента формы и именем реквизита

Проанализируем распространенное заблуждение разработчиков, начинающих работать с управляемыми формами. Свойство ТекущийЭлемент.Имя возвращает **имя элемента формы** (визуального объекта ПолеФормы), а не имя реквизита источника данных табличной части.

По умолчанию при автогенерации элементов или перетаскивании реквизитов на форму платформа присваивает элементам имена по шаблону ИмяТаблицыИмяРеквизита (например, для таблицы Товары и реквизита Количество элемент формы получит имя ТоварыКоличество).

Если вам требуется получить значение из текущей строки именно по выбранной колонке, нельзя напрямую подставлять ТекущийЭлемент.Имя в индексатор строки ТекущиеДанные, если имена элементов формы и реквизитов различаются. Посмотрим на примере:


&НаКлиенте
Процедура ОбработатьВыбраннуюКолонку()

    ДанныеСтроки = Элементы.Товары.ТекущиеДанные;
    ТекущаяКолонка = Элементы.Товары.ТекущийЭлемент;
    
    Если ДанныеСтроки = Неопределено Или ТекущаяКолонка = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем имя элемента формы
    ИмяЭлемента = ТекущаяКолонка.Имя;
    
    // Внимание: если ИмяЭлемента = "ТоварыНоменклатура", 
    // а реквизит в ДанныеСтроки называется "Номенклатура", 
    // обращение ДанныеСтроки[ИмяЭлемента] вызовет ошибку!

КонецПроцедуры

Частые ошибки и способы их решения

  1. Ошибки в названии элемента таблицы: Если метод всегда возвращает одну и ту же колонку или вызывает ошибку, убедитесь, что в коде указано имя таблицы формы (Элементы.ТЧ_Имя), а не другое табличное поле, находящееся на той же форме.
  2. Получение имени реквизита вместо имени элемента: Если вам требуется узнать именно путь к данным реквизита, привязано к колонке, обращайтесь к свойству ПутьКДанным элемента формы. Обратите внимание, что доступ к этому свойству доступен на сервере.
  3. Использование групп колонок: В случае, если колонки объединяются в визуальные группы (вид ГруппаКолонок), свойство ТекущийЭлемент таблицы всегда вернет конкретный внутренний элемент ввода, в котором находился курсор ввода, а не родительскую группу.
← На главную