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