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

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

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

Причина сложности: почему флажки не работают "из коробки"

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

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

Способ 1. Использование Таблицы Значений (универсальный подход)

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

Разберем этот метод по шагам:

  1. Создадим реквизит формы с типом ТаблицаЗначений.
  2. Добавим в эту таблицу колонку Пометка с типом Булево и необходимые данные (например, Номенклатура, Склад).
  3. Выведем таблицу на форму. Для колонки Пометка установим вид "Поле флажка".
  4. При создании формы или по нажатию кнопки "Обновить" будем заполнять эту таблицу запросом.

Рассмотрим пример кода для обработки выбранных строк:


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

Этот метод хорош тем, что мы можем легко добавить кнопки "Пометить все" и "Снять все пометки", просто обходя таблицу в цикле и устанавливая значение Истина или Ложь.

Способ 2. Вспомогательный регистр для динамического списка (профессиональный подход)

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

Рассмотрим алгоритм реализации:

  1. Создадим независимый непериодический РегистрСведений.ВыбранныеОбъекты с измерениями Пользователь и Объект (ссылка или ключ записи).
  2. В запросе динамического списка добавим ЛЕВОЕ СОЕДИНЕНИЕ с этим регистром по условию совпадения объекта и текущего пользователя.
  3. Вычисляемое поле в запросе будет выглядеть так: ВЫБОР КОГДА ВыбранныеОбъекты.Объект ЕСТЬ НЕ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК Пометка.
  4. Чтобы пользователь мог переключать флажок, перехватим событие таблицы Выбор или ПриАктивацииЯчейки.

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


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

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

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

Способ 3. Работа с выделенными строками (стандартный механизм)

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

Несмотря на то, что автор темы посчитал это неудобным (выделение может "слететь"), этот метод является самым производительным. Чтобы сделать его более надежным, мы можем применить Условное оформление. Например, при нажатии кнопки "Зафиксировать выбор" мы можем копировать выделенные строки во внутренний массив формы, а в условном оформлении задать для этих строк особый цвет фона. Таким образом, даже если текущее выделение мышью пропадет, пользователь будет видеть, какие строки уже "отобраны" для обработки.

Визуализация через Условное Оформление

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

  1. Добавляем в динамический список поле, возвращающее число (0 или 1).
  2. В настройках Условного оформления формы добавляем новое правило.
  3. В оформлении выбираем свойство Текст (очищаем его) и свойство Картинка (выбираем иконку установленного флажка).
  4. В условии указываем, что наше числовое поле равно 1.
  5. Повторяем для значения 0 (пустой квадрат или отсутствие картинки).

Это создаст современный и отзывчивый интерфейс, который будет работать стабильно даже в веб-клиенте.

Итоги и рекомендации

Подводя итог, выделим главное: если вам нужен простой список для обработки здесь и сейчас — используйте ТаблицаЗначений. Если же вы работаете с огромными массивами данных в справочниках или регистрах и вам нужны мощные фильтры динамического списка — выбирайте вариант со вспомогательным регистром пометок. Это гарантирует, что ваши пометки не пропадут при случайном закрытии формы или обновлении страницы, так как они физически записаны в базу данных под конкретного пользователя.

← На главную