Как изменить цвет ячейки или текста в таблице значений при выборе пользователем в 1С

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

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

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

Главный принцип: отделение визуального оформления от данных

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

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

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

Решение для обычных форм (событие ПриПолученииДанных)

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

Рассмотрим реализацию задачи по шагам:

  1. Добавим в исходную таблицу значений числовую или строковую колонку ВыбраннаяКолонка (или булевы реквизиты выбора).
  2. В обработчике выбора ячейки или клика изменим значение этого реквизита. Не рекомендуется использовать событие ПриАктивизацииЯчейки для фиксации выбора, так как оно срабатывает при любой навигации стрелками клавиатуры. Лучше использовать событие Выбор (двойной клик/Enter) или отдельный флажок.
  3. После изменения данных выполним принудительное обновление строк табличного поля методом ОбновитьСтроки().
  4. В процедуре ПриПолученииДанных установим цвет текста или фона для нужной ячейки.

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


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

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

Обратите внимание: когда фокус находится на ячейке, системное выделение может перекрывать стандартный ЦветТекста. Чтобы цвет сохранялся даже при активном фокусе, необходимо обязательно указывать свойство ЦветВыделенногоТекста у объекта ОформлениеЯчейки.

Решение для управляемых форм (УсловноеОформление)

В управляемом интерфейсе прямого доступа к ячейкам через события отрисовки нет. Вся раскраска выполняется через механизм УсловноеОформление формы. При этом нет необходимости создавать правила динамически при каждом клике — достаточно один раз настроить правила условного оформления при создании формы, связав их с колонкой-признаком.

Разберем по шагам создание правил условного оформления программным способом в событии ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Настройка оформления для первой колонки цены
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // 1. Указываем оформляемое поле
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаДанныхЦенаПоставщика1");
    
    // 2. Устанавливаем условие (когда колонка ВыбраннаяКолонка = 1)
    ОтборОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТаблицаДанных.ВыбраннаяКолонка");
    ОтборОформления.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборОформления.ПравоеЗначение = 1;
    
    // 3. Задаем параметры оформления (цвет текста или цвет фона)
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
    
КонецПроцедуры

При таком подходе на клиенте в обработчике события Выбор или через флаг достаточно изменить значение реквизита строки на клиенте:


&НаКлиенте
Процедура ТаблицаДанныхВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    ТекСтрока = Элементы.ТаблицаДанных.ТекущиеДанные;
    
    Если ТекСтрока <> Неопределено Тогда
        Если Поле.Имя = "ТаблицаДанныхЦенаПоставщика1" Тогда
            ТекСтрока.ВыбраннаяКолонка = 1;
        ИначеЕсли Поле.Имя = "ТаблицаДанныхЦенаПоставщика2" Тогда
            ТекСтрока.ВыбраннаяКолонка = 2;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

Последующая обработка данных

Когда пользователь завершит анализ и выбор данных, итоговый обход таблицы значений выполняется максимально просто и быстро, так как мы проверяем значение реквизита, а не цвет оформления:


ИтогоСумма = 0;

Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
    Если СтрокаТЗ.ВыбраннаяКолонка = 1 Тогда
        ИтогоСумма = ИтогоСумма + СтрокаТЗ.ЦенаПоставщика1;
    ИначеЕсли СтрокаТЗ.ВыбраннаяКолонка = 2 Тогда
        ИтогоСумма = ИтогоСумма + СтрокаТЗ.ЦенаПоставщика2;
    КонецЕсли;
КонецЦикла;

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

← На главную