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