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