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

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

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

Особенности работы со свойством ВыделенныеСтроки

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

  1. Настройка множественного выделения: Чтобы пользователь мог выбрать несколько строк с помощью клавиш Ctrl или Shift, у элемента формы (таблицы списка) свойство «Режим выделения строки» (РежимВыделенияСтроки) должно быть установлено в значение «Множественный».
  2. Контекст выполнения: Свойство Элементы.ИмяСписка.ВыделенныеСтроки доступно только на клиенте.
  3. Тип данных: Для динамического списка коллекция ВыделенныеСтроки возвращает массив ссылок на документы (Массив), а не объекты базы данных или строки таблицы.
  4. Оптимизация производительности: Не следует в цикле на клиенте или сервере вызывать метод ПолучитьОбъект() для каждой отдельной ссылки. Правильнее передать весь массив ссылок на сервер за один вызов и обработать документы пакетно через запрос или групповые методы.

Вариант 1. Обработка выделенных строк по нажатию кнопки команды

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

Посмотрим на пример клиент-серверного взаимодействия:


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

&НаСервереБезКонтекста
Процедура ОбработатьДокументыНаСервере(МассивСсылок)
    
    // Выполняем групповую обработку документов через запрос
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Док.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.РеализацияТоваровУслуг КАК Док
        |ГДЕ
        |	Док.Ссылка В(&МассивСсылок)";
    
    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
        // Выполняем необходимые действия с объектом
        // ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    КонецЦикла;
    
КонецПроцедуры

Вариант 2. Обработка через событие таблицы «ВыборСтроки»

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

Разберем реализацию в обработчике события ВыборСтроки:


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

Вариант 3. Автоматический отложенный запуск через обработчик ожидания

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

Если запуск должен произойти без нажатия кнопок, применяют шаблон отложенного вызова (Debounce) с помощью метода ПодключитьОбработчикОжидания:


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

&НаКлиенте
Процедура ВыполнитьОтложеннуюОбработку()
    
    МассивВыделенных = Элементы.Список.ВыделенныеСтроки;
    
    Если МассивВыделенных.Количество() > 0 Тогда
        ОбработатьДокументыНаСервере(МассивВыделенных);
    КонецЕсли;
    
КонецПроцедуры

Рекомендация: Для большинства практических задач наиболее надежным и понятным для пользователя решением является создание отдельной команды на форме с назначением горячей клавиши через свойство «Сочетание клавиш».

← На главную