Как программно обработать несколько выделенных строк в таблице 1С?

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

В процессе разработки интерфейсов на платформе 1С:Предприятие 8 часто возникает задача предоставить пользователю возможность массовой обработки данных. Типичный пример: пользователь выделяет несколько строк в табличной части документа или динамическом списке и нажимает кнопку (например, «Изменить статус» или «Провести выбранные»). Если обработчик написан только для одной строки через ТекущиеДанные, команда сработает только для активной строки, игнорируя остальные выделенные. Рассмотрим подробно, как правильно реализовать обход множественного выделения, избежать ошибок с индексами и оптимизировать работу системы.

Различие между текущей строкой и выделенными строками

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

Для работы с группой строк необходимо использовать свойство ВыделенныеСтроки. Важно понимать, что это свойство возвращает Массив. Содержимое этого массива зависит от типа источника данных таблицы:

Настройка режима выделения в свойствах таблицы

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

  1. Откроем форму в конфигураторе.
  2. Выберем элемент «Таблица» (вашу табличную часть).
  3. В палитре свойств найдем категорию «Использование».
  4. Убедимся, что свойство Режим выделения (SelectionMode) установлено в значение Множественный.

Если оставить значение Одиночный, пользователь не сможет выделить несколько строк с помощью клавиш Shift или Ctrl, и массив ВыделенныеСтроки всегда будет состоять максимум из одного элемента.

Реализация обхода строк табличной части

Рассмотрим пример кода, который часто вызывает ошибку «Индекс находится за пределами массива». Типичная ошибка новичка — пытаться использовать идентификатор строки как прямой индекс массива коллекции. Выясним причину: идентификатор строки в 1С — это уникальный номер строки, который не всегда совпадает с её порядковым номером (индексом), особенно если строки удалялись или сортировались.

Проанализируем правильный подход к написанию кода на клиенте:


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

В данном примере мы используем метод НайтиПоИдентификатору(). Это критически важно для стабильной работы кода. Использование конструкции Объект.ТабЧасть[Идентификатор] является плохой практикой, так как при программном изменении состава таблицы или после сортировки идентификаторы перестают соответствовать индексам, что неизбежно приведет к аварийному завершению работы программы.

Оптимизация серверных вызовов

Посмотрим на ситуацию со стороны производительности. Часто начинающие программисты совершают ошибку, помещая вызов серверной процедуры внутрь цикла обхода строк на клиенте. Рассмотрим, почему это плохо: каждый вызов «Клиент -> Сервер» требует времени на сериализацию данных, передачу по сети и установку контекста. Если пользователь выделит 100 строк, программа выполнит 100 обращений к серверу.

Правильная стратегия: сначала собрать все необходимые ссылки или данные в один массив на клиенте, а затем один раз передать этот массив на сервер. Разберем пример серверной части:


&НаСервере
Процедура ОбработатьДокументыНаСервере(МассивДокументов)
    
    Для Каждого СсылкаИзСписка Из МассивДокументов Цикл
        // Здесь выполняется логика изменения статуса или проведения
        ОбъектДок = СсылкаИзСписка.ПолучитьОбъект();
        Если ОбъектДок <> Неопределено Тогда
            ОбъектДок.Статус = Перечисления.СтатусыДокументов.Обработан;
            ОбъектДок.Записать();
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Использование командного параметра

Существует еще более элегантный способ работы с выделенными строками, предусмотренный платформой. В свойствах команды формы есть параметр Режим использования параметра. Если установить его в значение Множественный, то при привязке этой команды к кнопке в командной панели таблицы 1С сама передаст массив выделенных элементов в качестве параметра процедуры.

Рассмотрим, как это упрощает код:


&НаКлиенте
Процедура КомандаОбработать(ПараметрКоманды)
    // В ПараметрКоманды уже прилетит массив выделенных строк
    // Если это динамический список — массив ссылок
    // Если таблица — массив идентификаторов
    
    Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда
        // Обрабатываем массив сразу
        ПередатьНаСервер(ПараметрКоманды);
    КонецЕсли;
КонецПроцедуры

Особенности динамических списков

Если вы работаете не с табличной частью документа, а со списком (например, форма списка справочника), то свойство Элементы.Список.ВыделенныеСтроки возвращает не числа, а сразу ссылки на объекты. В этом случае код становится еще проще, так как нам не нужно искать строку в коллекции, мы можем сразу наполнять массив ссылками для передачи в обработку. В качестве альтернативного варианта выбора строк можно использовать способ реализации флажков в динамическом списке на управляемых формах.

Резюмируем основные правила:

Следуя этим рекомендациям, вы создадите надежный и быстрый интерфейс, который позволит пользователям эффективно работать с большими объемами данных в 1С.

← На главную