При разработке интерфейсов на управляемых формах 1С часто возникает задача обработки нескольких строк, выбранных пользователем с помощью клавиш Ctrl, Shift или сочетания Ctrl + A. Попытка перехватить выделенные строки стандартным образом через событие ПриАктивизацииСтроки нередко приводит к трудностям: при снятии выделения или пакетном выборе состав строк может обрабатываться некорректно. Разберем по шагам, как правильно получать массив выделенных строк, обходить ограничения событий платформы и выводить рассчитанные итоги в подвал таблицы.
Для работы с множественным выделением в управляемой форме не требуется вручную отслеживать клики мыши. Элемент управления таблицы формы предоставляет специальное платформенное свойство ВыделенныеСтроки.
Рассмотрим синтаксис обращения к свойству:
// Получение массива идентификаторов выделенных строк таблицы
МассивИдентификаторов = Элементы.Товары.ВыделенныеСтроки;
Проанализируем особенности работы этого свойства:
ТаблицаЗначений элементами массива являются числовые идентификаторы строк формы.ДинамическийСписок массив содержит ссылки на элементы справочников или документы (ключи записей).Поскольку свойство ВыделенныеСтроки возвращает не сами строки с данными, а их идентификаторы, нам необходимо получить к ним доступ через объектную модель формы. Разберем пример обхода для табличной части документа или обработки:
// Обход выделенных строк табличной части на клиенте
Для Каждого ИдСтроки Из Элементы.Товары.ВыделенныеСтроки Цикл
СтрокаДанных = Объект.Товары.НайтиПоИдентификатору(ИдСтроки);
Если СтрокаДанных <> Неопределено Тогда
// Выполняем действия со строкой, например, расчет суммы
ИтоговаяСумма = ИтоговаяСумма + СтрокаДанных.Сумма;
КонецЕсли;
КонецЦикла;
Если таблица формы связана с динамическим списком, массив ссылок передается на сервер, где необходимые поля и итоги считываются быстрым запросом к базе данных.
Выясним причину, почему при обработке множественного выделения внутри события ПриАктивизацииСтроки могут возникать ошибки и неточности:
Ctrl + A текущая активная строка не меняется, фокус остается на месте, поэтому событие ПриАктивизацииСтроки вообще не вызывается.ВыделенныеСтроки все еще может находиться только что отжатая строка.Чтобы обойти эту проблему и дать платформе завершить обновление интерфейса, применим вызов однократного обработчика ожидания с минимальной задержкой:
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
// Подключаем однократный обработчик с минимальным интервалом
ПодключитьОбработчикОжидания("ОбработатьВыделениеСтрок", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыделениеСтрок()
// К этому моменту состав массива ВыделенныеСтроки полностью актуален
ВсегоВыделено = Элементы.Товары.ВыделенныеСтроки.Количество();
// Дальнейший пересчет и вывод показателей
КонецПроцедуры
Посмотрим на частую задачу: вывод суммы или количества по выделенным строкам в подвал таблицы формы. Для управления отображением итогов выполним следующие настройки:
Истина).ТекстПодвала, а не ПутьКДаннымПодвала (которое служит для жесткой привязки к реквизиту формы).Рассмотрим пример установки рассчитанного значения в подвал колонки:
&НаКлиенте
Процедура ОбновитьПодвалТаблицы(СуммаПоВыделенным)
// Устанавливаем текст подвала для колонки "ТоварыСумма"
Элементы.ТоварыСумма.ТекстПодвала = Формат(СуммаПоВыделенным, "ЧДЦ=2; ЧГ=3,0");
КонецПроцедуры
Таким образом, сочетание свойства ВыделенныеСтроки, отложенного вызова обработчика ожидания и свойства ТекстПодвала позволяет организовать удобный и безошибочный интерфейс подсчета итогов по произвольно выбранным строкам таблицы.