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