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