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