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

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

Часто возникает задача: вывести список документов (например, заказов), добавить колонку с флажком, чтобы пользователь мог отметить нужные строки и по нажатию кнопки выполнить для них какое-либо действие (например, массово создать подчиненные документы). Попытка просто добавить в произвольный запрос динамического списка поле ЛОЖЬ КАК СоздатьДокументы и вынести его на форму приводит к тупику: интерактивно установить флажок нельзя, а обойти динамический список циклом Для Каждого не позволяет платформа.

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

Почему не работают стандартные подходы?

Динамический список не является универсальной коллекцией значений (как Массив или ТаблицаЗначений) и не хранит все данные в памяти. Он считывает информацию из базы данных небольшими порциями только для отображения видимой части на экране. Из-за этого:

  1. Нет итератора. Платформа не позволяет использовать цикл обхода динамического списка, так как не знает заранее, сколько в нем строк. Вызовет ошибку: "Итератор для значения не определен".
  2. Запрет на редактирование. Поля произвольного запроса, которые физически не существуют в базе данных (виртуальные колонки), нельзя редактировать в таблице формы.

Рассмотрим несколько правильных подходов для реализации множественного выбора и обработки строк.

Способ 1. Использование штатного множественного выделения строк

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

  1. В свойствах таблицы формы (элемента списка) установим свойство МножественныйВыбор = Истина.
  2. Пользователь сможет выделять нужные документы стандартным способом (удерживая клавиши Ctrl или Shift).
  3. При нажатии на кнопку обработки мы обращаемся к выделенным строкам, которые уже содержат массив ключей (ссылок).

Посмотрим на пример кода для обработчика кнопки:


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

Способ 2. Имитация флажков через Условное оформление и массив

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

  1. Создадим на форме реквизит (например, типа Массив или СписокЗначений), в котором будем хранить ссылки на выбранные документы.
  2. Добавим команду формы (например, двойной клик по строке или отдельную кнопку-картинку), которая будет добавлять ссылку текущей строки в этот массив или удалять её оттуда.
  3. Настроим Условное оформление формы: если поле Ссылка находится в нашем реквизите-массиве, то для специально добавленной текстовой колонки выводится символ галочки (или меняется картинка).

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

Способ 3. Переход на Таблицу Значений

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

Таблица значений загружается в память целиком. Вы сможете без проблем добавить колонку с типом Булево, пользователь сможет ставить флажки напрямую, а вы — обходить таблицу циклом Для Каждого Строка Из ТаблицаДокументов Цикл.

Способ 4. Выгрузка данных списка через СКД (если нужны все отфильтрованные строки)

Иногда нужно обработать не только выделенные пользователем строки, а вообще все строки динамического списка с учетом наложенных им отборов и поиска. Разберем, как программно прочитать эти данные.

Для этого используется Система компоновки данных (СКД):

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

Полученную таблицу можно свободно обойти циклом и выполнить создание подчиненных документов.

← На главную