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