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