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