Как обработать одинарный клик по уже активной ячейке динамического списка в 1С?

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

В разработке на платформе 1С часто возникает задача, требующая реакции на каждый клик пользователя по ячейке списка, например, для установки или снятия флажка. Однако стандартное поведение управляемых форм создает проблему: если ячейка уже активна (на ней стоит курсор), повторный клик по ней не вызывает никаких событий. Система считает, что активация уже произошла, и событие ПриАктивизацииЯчейки не срабатывает. Разберем, как обойти это ограничение и реализовать эффективный интерфейс для взаимодействия с данными.

Проанализируем несколько подходов для решения этой задачи, а также рассмотрим важный аспект выбора между Динамическим списком (ДС) и Таблицей значений (ТЗ).

Решение 1: "Обман" системы с помощью дополнительной колонки-маркера

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

Рассмотрим по шагам:

  1. Добавляем колонку-маркер. В состав колонок Динамического списка на форме добавьте новую, служебную колонку. Назовем ее, например, "Маркер". Чтобы не перегружать интерфейс, можно использовать программное изменение формы для добавления этого элемента. Эту колонку можно сделать невидимой для пользователя или установить ей минимальную ширину.
  2. Создаем обработчик события. Для Динамического списка создайте обработчик события ПриАктивизацииЯчейки. Весь код будет находиться здесь.
  3. Пишем код обработки. Внутри обработчика необходимо выполнить несколько действий:
    • Проверить, что клик был сделан не по нашей служебной колонке "Маркер". Это нужно, чтобы избежать зацикливания.
    • Выполнить полезное действие. Например, инвертировать значение флажка для текущей строки.
    • Программно сместить фокус. Сразу после выполнения действия нужно изменить текущую ячейку списка, переведя курсор на нашу колонку "Маркер". Подобное динамическое управление элементами формы позволяет обойти стандартные ограничения платформы.

Посмотрим на пример кода:

Допустим, у нас есть Динамический список с именем СписокНоменклатуры, а целевая колонка, по которой мы хотим отслеживать клики, называется Номенклатура.


&НаКлиенте
Процедура СписокНоменклатурыПриАктивизацииЯчейки(Элемент)
    // Получаем имя текущей колонки
    ИмяТекущейКолонки = Элемент.ТекущаяКолонка.Имя;

    // Если активирована служебная колонка, ничего не делаем
    Если ИмяТекущейКолонки = "Маркер" Тогда
        Возврат;
    КонецЕсли;

    // --- Здесь ваше полезное действие ---
    // Например, обрабатываем установку "галочки"
    ОбработатьОтметкуСтроки(Элемент.ТекущиеДанные);
    // ---------------------------------

    // "Обманываем" систему: программно переводим курсор на колонку-маркер
    // чтобы следующий клик по колонке "Номенклатура" снова вызвал это событие
    Элементы.СписокНоменклатуры.ТекущаяЯчейка = Новый ИдентификаторЭлементаСписка(Элемент.ТекущаяСтрока, "Маркер");

КонецПроцедуры

Этот метод позволяет сохранить стандартный внешний вид списка и обеспечить надежную реакцию на каждый клик мыши.

Решение 2: Использование поля-гиперссылки

Более простой в реализации подход. Если представить данные в ячейке не как текст, а как гиперссылку, то каждый клик по ней будет вызывать событие ОбработкаВыбора, независимо от того, была ли ячейка активна ранее. Это еще один способ реализации флажков в динамическом списке, который часто применяется на практике.

Как это сделать:

  1. В настройках колонки Динамического списка установите свойство Вид в значение "Поле гиперссылки".
  2. Создайте для поля обработчик события ОбработкаВыбора.
  3. Внутри обработчика напишите код, который должен выполняться при клике.

Преимущества:

Недостатки:

Дискуссия: Динамический список (ДС) или Таблица значений (ТЗ)?

В процессе обсуждения часто возникает вопрос: а может, для задачи с массовой отметкой строк лучше использовать не Динамический список, а старую добрую Таблицу значений? Рассмотрим плюсы и минусы каждого подхода.

Преимущества Динамического списка (ДС)

Преимущества Таблицы значений (ТЗ)

Ключевая проблема ДС и как ее решить: "Проблема F5"

Главный риск при работе с отметками в Динамическом списке — это рассинхронизация. Представим ситуацию: пользователь долго и внимательно отбирал и отметил 100 документов. В это время другой пользователь изменил один из этих документов так, что он перестал удовлетворять условиям отбора. Первый пользователь нажимает F5 (Обновить), список перечитывается, и отмеченный документ исчезает из вида.

Грамотное решение этой проблемы заключается в том, чтобы хранить не просто флажки, а уникальные идентификаторы (ссылки, УИДы) отмеченных объектов.

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

Пример доработки запроса ДС:

Добавьте в запрос вычисляемое поле, которое будет служить флагом для условного оформления.


ВЫБРАТЬ
    РегистрСведенийТовары.Номенклатура,
    РегистрСведенийТовары.УИДЗапроса,
    ВЫБОР
        КОГДА РегистрСведенийТовары.УИДЗапроса В (&СписокВыбранныхУИД)
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК Выбран
ИЗ
    РегистрСведений.ТоварыДляЗаказаПоставщикам КАК РегистрСведенийТовары

В этом случае, даже после нажатия F5, все отмеченные строки сохранят свою отметку. Это самый надежный способ реализации механизма отметок в Динамическом списке.

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

← На главную