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