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

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

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

Способ 1. Использование свойств «Гиперссылка» и события «Выбор»

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

  1. В дереве элементов формы выберем нужное поле, которое отображает картинку (вид поля должен быть Поле картинки).
  2. В палитре свойств этого поля найдем флажок Гиперссылка и установим его.
  3. Ниже найдем флажок Гиперссылка ячейки и также установим его в значение Истина.
  4. Теперь перейдем к свойствам самой Таблицы (не колонки, а именно всей таблицы на форме). Найдем событие Выбор и создадим для него обработчик на клиенте.

Важный нюанс, который часто упускают разработчики: свойство Гиперссылка ячейки превращает двойной клик в одиночный только в том случае, если в ячейке есть данные. Если колонка таблицы не связана с путем к данным или в этой ячейке находится Неопределено (пустота), клик не будет распознан как нажатие на гиперссылку.

Разберем пример кода для обработчика события Выбор:


&НаКлиенте
Процедура ТЗВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Проверяем, что нажатие произошло именно по нашей колонке с картинкой
    Если Поле.Имя = "ТЗКартинкаСтатуса" Тогда
        
        // Отменяем стандартное поведение (открытие карточки или переход в режим редактирования)
        СтандартнаяОбработка = Ложь;
        
        // Выполняем нашу полезную логику
        ПоказатьОповещениеПользователя("Действие выполнено по одиночному клику!");
        
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Обработка через событие «ПриАктивацииЯчейки»

Выясним, что делать, если первый способ по каким-то причинам не подходит (например, если ячейка должна оставаться пустой). В этом случае мы можем воспользоваться событием ПриАктивацииЯчейки. Рассмотрим этот механизм подробнее.

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

Проанализируем пример кода с обходом этой проблемы:


&НаКлиенте
Процедура ТЗПриАктивацииЯчейки(Элемент)
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем имя текущей колонки
    Если Элемент.ТекущийЭлемент.Имя = "ТЗКартинкаДействия" Тогда
        
        // Выполняем код обработки нажатия
        ВыполнитьДействиеПоКнопке(ТекущиеДанные);
        
        // Лайфхак: чтобы следующий клик по этой же ячейке снова сработал, 
        // можно программно перекинуть фокус на другую "служебную" колонку.
        // Элементы.ТЗ.ТекущаяКолонка = Элементы.ТЗСлужебнаяКолонка;
        
    КонецЕсли;
    
КонецПроцедуры

Использование этого метода требует осторожности, так как ПриАктивацииЯчейки срабатывает и при навигации по таблице с помощью клавиатуры (стрелками). Для тачскринов это обычно не критично, но в обычном настольном приложении может раздражать пользователя.

Способ 3. Поле картинки с использованием индекса (Картинка значений)

Часто нажатие на картинку должно менять ее состояние (например, кнопка-флажок). Посмотрим, как правильно организовать хранение и отображение таких картинок, чтобы они корректно взаимодействовали с гиперссылкой.

Для реализации динамической смены картинки (например, "Проведен" / "Не проведен") лучше всего использовать свойство колонки Картинка значений. В этом случае в колонке таблицы значений хранится целое число (0, 1, 2...), которое является индексом картинки в коллекции.

Рассмотрим алгоритм настройки:

  1. Создадим в общих картинках коллекцию (набор иконок одинакового размера в один ряд).
  2. В свойствах поля таблицы выберем эту коллекцию в поле Картинка значений.
  3. Убедимся, что ПутьКДанным этого поля указывает на числовой реквизит.
  4. Установим Гиперссылка ячейки = Истина.

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

Рекомендации по работе с Touch-интерфейсами (Тачскринами)

Проанализируем ситуацию с точки зрения юзабилити. Если вы разрабатываете интерфейс для работы пальцем, помните о следующих моментах:

В завершение отметим, что если стандартные возможности таблиц 1С кажутся вам слишком ограниченными или "неповоротливыми" для сложного тач-интерфейса, профессиональным решением будет использование Поля HTML-документа. Там вы сможете сформировать любую сетку кнопок на div и img с мгновенной обработкой события onclick через скрипты и передачей команды обратно в 1С. Однако для большинства типовых задач связки Гиперссылка ячейки + событие Выбор вполне достаточно.

← На главную