Как обработать повторное выделение уже активной строки в табличной части 1С

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

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

Почему стандартные события не всегда подходят?

Проанализируем ситуацию: событие ПриАктивизацииСтроки предназначено для отслеживания изменения текущего индекса строки в данных таблицы. С точки зрения платформы, если ТекущаяСтрока не изменилась, то и событие генерировать не нужно. Это оптимизирует нагрузку, но создает трудности, когда нам нужно, например, обновить аналитические отчеты или связанные таблицы при каждом клике пользователя, даже если он «тыкает» в одну и ту же запись. Выясним, какие обходные пути существуют в арсенале разработчика 1С.

Решение 1: Использование события «Выбор» (Двойной клик или Enter)

Самый простой и не требующий сложных доработок метод — переложить логику на событие Выбор. Это событие срабатывает всегда, когда пользователь делает двойной клик по строке или нажимает клавишу Enter, вне зависимости от того, была ли строка активна до этого момента.

Разберем по шагам, как это реализовать:

  1. Переходим в свойства таблицы на форме.
  2. Находим событие Выбор и создаем обработчик на клиенте.
  3. Внутри обработчика прописываем нужную нам логику.

Пример кода для реализации:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие формы объекта, если это необходимо
    СтандартнаяОбработка = Ложь;
    
    // Выполняем действия, которые должны происходить при повторном клике
    ОбновитьАналитическуюИнформацию(ВыбраннаяСтрока);
    
КонецПроцедуры

Преимущества: Надежность и простота. Недостатки: Требует от пользователя двойного клика вместо привычного одинарного.

Решение 2: Использование интерактивных флажков (CheckBox)

Если бизнес-логика предполагает, что пользователь должен «помечать» строки для обработки, можно добавить в таблицу колонку с типом Булево. Клик по флажку всегда вызывает событие ПриИзменении, даже если строка уже была активна.

Рассмотрим алгоритм настройки:

  1. Добавляем в реквизиты табличной части поле Выбрана (тип Булево).
  2. Выносим это поле на форму, устанавливаем вид «Поле флажка».
  3. В событии ПриИзменении этого поля прописываем вызов необходимых процедур.

Этот подход делает интерфейс более понятным: пользователь явно видит, с какой строкой он работает в данный момент.

Решение 3: Колонки-гиперссылки

Интересный вариант, который позволяет имитировать поведение «одинарного клика» для запуска действий. Если установить у поля таблицы свойство Гиперссылка в значение Истина, то нажатие на текст в этой колонке будет генерировать событие Нажатие.

Проанализируем этот метод:

Когда пользователь нажимает на текст, оформленный как гиперссылка, платформа инициирует событие, даже если строка уже была выделена. Это идеально подходит для ситуаций, когда нужно «провалиться» в детали или обновить связанные данные одним кликом.


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

Решение 4: Использование события «ПриНачалеРедактирования»

Если таблица доступна для редактирования, клик по уже активной строке часто инициирует вход в режим редактирования ячейки. Мы можем использовать это для своих целей, не позволяя пользователю на самом деле менять данные.

Посмотрим на пример реализации:


&НаКлиенте
Процедура СписокПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    
    // Если нам нужно просто выполнить действие, прерываем редактирование
    Отказ = Истина;
    
    // Выполняем полезную работу
    ОбновитьСвязанныеПоказатели();
    
КонецПроцедуры

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

Решение 5: Метод «Невидимой колонки» и отслеживание фокуса

В некоторых случаях предлагается использовать технические приемы с перехватом фокуса. Суть заключается в том, чтобы фиксировать момент «входа» в таблицу. Например, если пользователь переключился на другой элемент формы (кнопку или другое поле), а затем снова нажал на ту же строку в таблице, событие ПриАктивизацииСтроки не сработает, но сработает событие таблицы ПриВходе.

Разберем, как это можно использовать для «травли» (принудительного вызова) логики:

  1. Создаем на форме переменную (реквизит формы) ИдентификаторПоследнейСтроки.
  2. В событии ПриВходе таблицы проверяем текущую строку.
  3. Если текущая строка совпадает с сохраненной, но фокус был только что получен — выполняем действие.

Это позволяет обрабатывать ситуации «возврата» к активной строке, что часто путают с повторным выделением.

Рекомендации по выбору метода

Проанализировав все варианты, мы можем сделать следующие выводы:

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

← На главную