Как переключать иконки в табличной части по клику мыши в обычных формах 1С

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

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

Архитектура отображения данных в табличном поле

Выясним причину, по которой попытка изменить оформление напрямую из событий активизации вызывает затруднения. Параметр ОформлениеСтроки доступен исключительно в контексте событий отрисовки — ПриВыводеСтроки и ПриПолученииДанных. Обратиться к нему напрямую из обработчиков ПриАктивизацииЯчейки или ПриАктивизацииСтроки невозможно.

Правильный подход заключается в разделении логики на два этапа:

  1. В обработчике события клика или изменения мы модифицируем значение реквизита в источнике данных текущей строки (ТекущиеДанные).
  2. В обработчике ПриВыводеСтроки на основании обновленного значения реквизита динамически устанавливаем нужную картинку в ячейку.

Способ 1. Перехват клика через событие ПередНачаломИзменения

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

Разберем по шагам реализацию данного механизма:

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

Способ 2. Использование механизма флажков колонки

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

  1. В свойствах колонки табличного поля очистим свойство Данные и укажем имя реквизита в свойстве ДанныеФлажка.
  2. Установим для колонки свойство РежимРедактирования в значение Непосредственно.
  3. В таком режиме клик мыши по ячейке будет штатно переключать булево значение без вызова редакторов.
  4. В событии ПриВыводеСтроки настраиваем визуальное отображение значков через методы УстановитьКартинку или УстановитьФлажок.

Способ 3. Переключение по двойному клику (Событие Выбор)

Если по бизнес-логике переключение состояния должно происходить по двойному клику мыши или нажатию клавиши Enter, применим обработчик события Выбор:


Процедура ТабличнаяЧастьВыбор(Элемент, ВыбраннаяКолонка, СтандартнаяОбработка)
    
    Если ВыбраннаяКолонка = ЭлементыФормы.ТабличнаяЧасть.Колонки.ВидКТП Тогда
        СтандартнаяОбработка = Ложь;
        
        ТекущаяСтрока = Элемент.ТекущиеДанные;
        Если ТекущаяСтрока <> Неопределено Тогда
            ТекущаяСтрока.ВидКТП = ?(ТекущаяСтрока.ВидКТП = Перечисления.ВидКТП.Плюс, 
                                     Перечисления.ВидКТП.Минус, 
                                     Перечисления.ВидКТП.Плюс);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Принудительное обновление строк без перезапуска формы

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

ЭлементыФормы.ТабличнаяЧасть.ОбновитьСтроки();

Метод ОбновитьСтроки() перерисовывает видимую область таблицы без сброса курсора и без мерцания интерфейса.

← На главную