Как получить выделенную строку таблицы формы, если фокус перешел на другой элемент?

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

При разработке управляемых форм в 1С часто возникает ситуация, когда на форме размещено несколько ТаблицаФормы, привязанных к разным реквизитам типа ТаблицаЗначений. Типичная задача — при нажатии на кнопку выполнить действие с выделенной строкой той таблицы, с которой работал пользователь. Однако, если пользователь успел переключить фокус на другое поле ввода, команда ЭтаФорма.ТекущийЭлемент.ТекущиеДанные может указывать уже не на таблицу, а на этот самый элемент ввода. Давайте разберем, как правильно решить эту задачу.

Развенчание мифа: «ТекущиеДанные» не пропадают

Первое, что необходимо уяснить — свойство ТекущиеДанные у элемента ТаблицаФормы не обнуляется автоматически при переключении фокуса на другой элемент управления. Если строка в таблице была выбрана пользователем ранее, она остается «текущей» в памяти объекта формы. Поэтому, если у вас в коде вдруг возникло значение Неопределено, стоит проверить логику получения ссылки на элемент. Мы можем напрямую обращаться к элементам формы по их именам, минуя свойство ТекущийЭлемент.

Решение 1: Обращение к элементам по имени

Самый простой способ получить данные — это точно знать имя элемента ТаблицаФормы. Вы можете получить его из коллекции Элементы:


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

Решение 2: Динамическое определение таблицы через «ПутьКДанным»

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

На стороне сервера мы можем разобрать строку ПутьКДанным и получить доступ к объекту коллекции динамически:


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

Рекомендации по архитектуре формы

Чтобы избежать путаницы в будущем, рекомендуем придерживаться следующих правил:

  1. Унификация имен: Используйте строгие шаблоны именования, например, Таблица_Контрагенты и Реквизит_Контрагенты. Это позволит обращаться к ним через коллекцию: ЭтаФорма[\"Реквизит_\" + Суффикс].
  2. Событийная модель: Если вы хотите сделать систему максимально надежной, в обработчике события ПриАктивизацииСтроки запоминайте текущую строку или ссылку в переменной модуля формы. Это избавит вас от зависимости от текущего активного элемента.
  3. Использование параметров команд: Если вы используете команды формы, всегда смотрите, что приходит в параметрах. Часто можно передать контекст таблицы прямо в обработчик команды через КомандныйИсточник.
  4. Избегайте избыточности: Если данные в ваших таблицах однотипные, возможно, стоит использовать одну ТаблицаФормы и менять только ФиксированныйОтбор или источник данных (ДинамическийСписок), вместо создания десятка отдельных таблиц на разных вкладках.

Таким образом, мы выяснили, что ключ к решению проблемы кроется в прямом обращении к Элементы и использовании служебных свойств элементов формы, таких как ПутьКДанным, для доступа к связанным ДанныеФормыКоллекция. Это позволяет писать лаконичный и поддерживаемый код, который не ломается при смене фокуса ввода.

← На главную