Как в управляемой форме 1С обработать клик по ячейке таблицы без входа в режим редактирования?

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

При разработке интерфейсов документов и обработок в 1С на управляемых формах нередко возникает задача: при клике пользователя на определенную ячейку табличной части (например, колонку с номенклатурой) необходимо выполнить произвольное действие (создать связанный документ, открыть специальную форму или запустить обработку), но при этом запретить стандартный ввод и редактирование данных в этой ячейке. Если остальные колонки строки (количество, цена, единица измерения) должны оставаться доступными для правки, простое отключение редактирования всей таблицы не подходит.

Рассмотрим несколько надежных способов реализации такого поведения в управляемых формах.

Способ 1. Использование события таблицы «Выбор»

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

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

  1. В палитре свойств таблицы формы перейдем к событиям и создадим обработчик Выбор на клиенте.
  2. В параметрах события передается параметр Поле, который содержит имя текущей колонки, и булевый флаг СтандартнаяОбработка.
  3. Проверим имя колонки и при совпадении с целевой ячейкой отключим открытие формы выбора или редактирования через установку СтандартнаяОбработка = Ложь.

Посмотрим на пример кода:


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

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

Способ 2. Перехват события «ПередНачаломИзменения»

Если пользователь пытается активировать редактирование ячейки кликом мыши или нажатием функциональных клавиш, можно перехватить событие таблицы ПередНачаломИзменения.

Разберем пример реализации, предложенный в обсуждении:


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

Параметр Отказ = Истина полностью блокирует переход в режим ввода текста для текущего поля, после чего сразу вызывается требуемая прикладная процедура.

Способ 3. Превращение колонки в гиперссылку (клик в одно нажатие)

Когда требуется выполнять действие по одиночному клику мыши без ожидания двойного нажатия, оптимальным решением является изменение вида элемента формы.

  1. В дереве элементов формы выберем поле колонки (например, ТоварыНоменклатура).
  2. Установим вид элемента Поле надписи либо для существующего Поля ввода включим флаг Гиперссылка в значение Истина.
  3. Создадим для данного элемента обработчик события Нажатие.

Посмотрим на реализацию обработчика:


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

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

Способ 4. Использование кнопки открытия в поле ввода

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

  1. В свойствах поля колонки включим флаг КнопкаОткрытия (Истина) и снимем флаг КнопкаВыбора, чтобы не открывать справочник.
  2. Создадим обработчик события Открытие.

Пример кода:


&НаКлиенте
Процедура ТоварыНоменклатураОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	СоздатьСтрокиВЗаказе(Элементы.Товары.ТекущиеДанные);
КонецПроцедуры

Почему не стоит использовать события «ПриАктивизацииСтроки» и «ПриАктивизацииПоля»

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

← На главную