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

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

При разработке интерфейсов на управляемых формах 1С часто возникает задача обработки нескольких строк, выбранных пользователем с помощью клавиш Ctrl, Shift или сочетания Ctrl + A. Попытка перехватить выделенные строки стандартным образом через событие ПриАктивизацииСтроки нередко приводит к трудностям: при снятии выделения или пакетном выборе состав строк может обрабатываться некорректно. Разберем по шагам, как правильно получать массив выделенных строк, обходить ограничения событий платформы и выводить рассчитанные итоги в подвал таблицы.

Получение массива выделенных строк через свойство таблицы

Для работы с множественным выделением в управляемой форме не требуется вручную отслеживать клики мыши. Элемент управления таблицы формы предоставляет специальное платформенное свойство ВыделенныеСтроки.

Рассмотрим синтаксис обращения к свойству:


// Получение массива идентификаторов выделенных строк таблицы
МассивИдентификаторов = Элементы.Товары.ВыделенныеСтроки;

Проанализируем особенности работы этого свойства:

  1. Тип возвращаемого значения: свойство возвращает коллекцию (массив), содержащую идентификаторы выбранных строк. Свойство доступно только для чтения.
  2. Разница между источниками данных:
    • Для табличных частей и коллекций типа ТаблицаЗначений элементами массива являются числовые идентификаторы строк формы.
    • Для ДинамическийСписок массив содержит ссылки на элементы справочников или документы (ключи записей).

Обход строк и получение данных по идентификаторам

Поскольку свойство ВыделенныеСтроки возвращает не сами строки с данными, а их идентификаторы, нам необходимо получить к ним доступ через объектную модель формы. Разберем пример обхода для табличной части документа или обработки:


// Обход выделенных строк табличной части на клиенте
Для Каждого ИдСтроки Из Элементы.Товары.ВыделенныеСтроки Цикл
    СтрокаДанных = Объект.Товары.НайтиПоИдентификатору(ИдСтроки);
    Если СтрокаДанных <> Неопределено Тогда
        // Выполняем действия со строкой, например, расчет суммы
        ИтоговаяСумма = ИтоговаяСумма + СтрокаДанных.Сумма;
    КонецЕсли;
КонецЦикла;

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

Особенности события ПриАктивизацииСтроки и асинхронная обработка

Выясним причину, почему при обработке множественного выделения внутри события ПриАктивизацииСтроки могут возникать ошибки и неточности:

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

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


&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
    // Подключаем однократный обработчик с минимальным интервалом
    ПодключитьОбработчикОжидания("ОбработатьВыделениеСтрок", 0.1, Истина);
КонецПроцедуры

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

Динамическое изменение подвала колонки

Посмотрим на частую задачу: вывод суммы или количества по выделенным строкам в подвал таблицы формы. Для управления отображением итогов выполним следующие настройки:

  1. Убедимся, что у самой таблицы формы включено свойство ОтображатьПодвал (значение Истина).
  2. Для программного изменения отображаемого текста в подвале конкретной колонки используем свойство элемента ТекстПодвала, а не ПутьКДаннымПодвала (которое служит для жесткой привязки к реквизиту формы).

Рассмотрим пример установки рассчитанного значения в подвал колонки:


&НаКлиенте
Процедура ОбновитьПодвалТаблицы(СуммаПоВыделенным)
    // Устанавливаем текст подвала для колонки "ТоварыСумма"
    Элементы.ТоварыСумма.ТекстПодвала = Формат(СуммаПоВыделенным, "ЧДЦ=2; ЧГ=3,0");
КонецПроцедуры

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

← На главную