При разработке интерфейсов управляемых форм в платформах 1С:Предприятие 8.3 часто возникает необходимость узнать, какая именно колонка табличной части или таблицы формы активна в данный момент. К примеру, это требуется при вызове командной кнопки, действие которой зависит от контекста выбранной колонки.
В обычных формах 1С для этих целей использовалось свойство ТекущаяКолонка. В управляемом интерфейсе подход изменился: концепция работы с элементами формы строится иначе. Разберем по шагам, как правильно получать активную колонку и каких распространенных ошибок следует избегать.
Для определения активной колонки таблицы в управляемой форме используется свойство ТекущийЭлемент конкретного элемента формы типа ТаблицаФормы. Чтобы обратиться к имени элемента текущей колонки на клиенте, применяют следующую конструкцию:
&НаКлиенте
Процедура ИмяКоманды(Команда)
ТекущаяКолонка = Элементы.ТаблицаТовары.ТекущийЭлемент;
Если ТекущаяКолонка <> Неопределено Тогда
ИмяЭлементаКолонки = ТекущаяКолонка.Имя;
// Дальнейшая обработка
КонецЕсли;
КонецПроцедуры
Рассмотрим важные детали работы данной конструкции:
Элементы.ТаблицаТовары), а не к объекту ЭтаФорма.ТекущийЭлемент. Если пользователь нажимает отдельную кнопку на форме, фокус ввода в момент выполнения нажатия перемещается на эту кнопку. В таком случае ЭтаФорма.ТекущийЭлемент вернет само нажатое поле кнопки, а Элементы.ТаблицаТовары.ТекущийЭлемент сохранит ссылку на последнюю активную колонку в этой таблице.Имя необходимо всегда делать проверку на Неопределено, так как если таблица пуста или пользователь еще не активизировал в ней ни одной строки/колонки, свойство ТекущийЭлемент может не содержать значения.Проанализируем распространенное заблуждение разработчиков, начинающих работать с управляемыми формами. Свойство ТекущийЭлемент.Имя возвращает **имя элемента формы** (визуального объекта ПолеФормы), а не имя реквизита источника данных табличной части.
По умолчанию при автогенерации элементов или перетаскивании реквизитов на форму платформа присваивает элементам имена по шаблону ИмяТаблицыИмяРеквизита (например, для таблицы Товары и реквизита Количество элемент формы получит имя ТоварыКоличество).
Если вам требуется получить значение из текущей строки именно по выбранной колонке, нельзя напрямую подставлять ТекущийЭлемент.Имя в индексатор строки ТекущиеДанные, если имена элементов формы и реквизитов различаются. Посмотрим на примере:
&НаКлиенте
Процедура ОбработатьВыбраннуюКолонку()
ДанныеСтроки = Элементы.Товары.ТекущиеДанные;
ТекущаяКолонка = Элементы.Товары.ТекущийЭлемент;
Если ДанныеСтроки = Неопределено Или ТекущаяКолонка = Неопределено Тогда
Возврат;
КонецЕсли;
// Получаем имя элемента формы
ИмяЭлемента = ТекущаяКолонка.Имя;
// Внимание: если ИмяЭлемента = "ТоварыНоменклатура",
// а реквизит в ДанныеСтроки называется "Номенклатура",
// обращение ДанныеСтроки[ИмяЭлемента] вызовет ошибку!
КонецПроцедуры
Элементы.ТЧ_Имя), а не другое табличное поле, находящееся на той же форме.ПутьКДанным элемента формы. Обратите внимание, что доступ к этому свойству доступен на сервере.ГруппаКолонок), свойство ТекущийЭлемент таблицы всегда вернет конкретный внутренний элемент ввода, в котором находился курсор ввода, а не родительскую группу.