При разработке интерфейсов документов и обработок в 1С на управляемых формах нередко возникает задача: при клике пользователя на определенную ячейку табличной части (например, колонку с номенклатурой) необходимо выполнить произвольное действие (создать связанный документ, открыть специальную форму или запустить обработку), но при этом запретить стандартный ввод и редактирование данных в этой ячейке. Если остальные колонки строки (количество, цена, единица измерения) должны оставаться доступными для правки, простое отключение редактирования всей таблицы не подходит.
Рассмотрим несколько надежных способов реализации такого поведения в управляемых формах.
Проанализируем стандартное событие элемента управляемой формы Таблица под названием Выбор. Это наиболее удобный способ, если действие должно выполняться по двойному клику мыши или по нажатию клавиши Enter.
Разберем по шагам, как это работает:
Выбор на клиенте.Поле, который содержит имя текущей колонки, и булевый флаг СтандартнаяОбработка.СтандартнаяОбработка = Ложь.Посмотрим на пример кода:
&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Поле.Имя = "ТоварыНоменклатура" Тогда
СтандартнаяОбработка = Ложь;
ВыполнитьДействиеДляСтроки(ВыбраннаяСтрока);
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует, что случайные клики при навигации не приведут к срабатыванию логики, а при активации нужной ячейки режим изменения текста будет заблокирован.
Если пользователь пытается активировать редактирование ячейки кликом мыши или нажатием функциональных клавиш, можно перехватить событие таблицы ПередНачаломИзменения.
Разберем пример реализации, предложенный в обсуждении:
&НаКлиенте
Процедура ТоварыПередНачаломИзменения(Элемент, Отказ)
Если Элемент.ТекущийЭлемент.Имя = "ТоварыНоменклатура" Тогда
Отказ = Истина;
ВыполнитьДействиеДляСтроки(Элемент.ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
Параметр Отказ = Истина полностью блокирует переход в режим ввода текста для текущего поля, после чего сразу вызывается требуемая прикладная процедура.
Когда требуется выполнять действие по одиночному клику мыши без ожидания двойного нажатия, оптимальным решением является изменение вида элемента формы.
ТоварыНоменклатура).Поле надписи либо для существующего Поля ввода включим флаг Гиперссылка в значение Истина.Нажатие.Посмотрим на реализацию обработчика:
&НаКлиенте
Процедура ТоварыНоменклатураНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Выполняем добавление строк в другой документ или запуск алгоритма
ОбработатьВыборНоменклатуры(Элементы.Товары.ТекущиеДанные);
КонецПроцедуры
При таком подходе колонка отображается в виде кликабельной ссылки, поле не входит в режим редактирования, а пользователь визуально понимает, что нажатие на текст выполняет команду.
Если в поле ввода необходимо оставить отображение наименования номенклатуры в стандартном стиле, но дать явную точку для клика, включим специальную кнопку:
КнопкаОткрытия (Истина) и снимем флаг КнопкаВыбора, чтобы не открывать справочник.Открытие.Пример кода:
&НаКлиенте
Процедура ТоварыНоменклатураОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СоздатьСтрокиВЗаказе(Элементы.Товары.ТекущиеДанные);
КонецПроцедуры
Важно: события ПриАктивизацииСтроки и ПриАктивизацииПоля вызываются при любых перемещениях фокуса клавиатурой (стрелками, клавишей Tab), а также при программном обновлении формы. Если привязать алгоритм создания документов или модификации данных к этим событиям, система будет выполнять неконтролируемые фоновые вызовы при обычной навигации пользователя по таблице.