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