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

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

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

Почему динамический список плохо подходит для флажков?

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

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

Альтернатива №1: Использование Таблицы значений

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

Рассмотрим, как это реализовать:

  1. Создайте реквизит формы с типом ТаблицаЗначений.
  2. Добавьте колонку Отметка с типом Булево.
  3. При открытии формы заполните таблицу результатами запроса к базе данных:

// Пример заполнения таблицы значений
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ЛОЖЬ КАК Отметка, Т.Ссылка, Т.Наименование ИЗ Справочник.Номенклатура КАК Т";
РезультатЗапроса = Запрос.Выполнить();
ЭтаФорма.ОбъектТаблицы.Загрузить(РезультатЗапроса.Выгрузить());

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

Альтернатива №2: Связка СКД и Таблицы значений

Если вам нужны сложные отборы, которые уже настроены в ДинамическийСписок, вы можете реализовать комбинированный подход с использованием СистемаКомпоновкиДанных (СКД).

Это позволит пользователю гибко настраивать отборы, а вам — получать результат в виде готовой таблицы:

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

Такой подход обеспечивает высокую скорость работы и предоставляет пользователю привычные механизмы фильтрации, присущие стандартному динамическому списку, но избавляет от проблем с «исчезающими галочками».

Рекомендации по проектированию интерфейса

Если использование динамического списка критически важно (например, при работе с миллионами записей), рассмотрите возможность смены концепции UX (опыта взаимодействия):

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

← На главную