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

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

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

Почему прямая установка цвета в событии ПриИзменении не работает

Проанализируем ситуацию, с которой столкнулся автор темы. В коде обработчика события ЗапасыРозничнаяЦенаПриИзмененииПосле(Элемент) он использует конструкцию:

Элемент.ЦветТекста = Новый Цвет(173, 255, 47);

В управляемых формах 1С параметр Элемент, передаваемый в процедуру, — это объект типа ПолеФормы. Этот объект представляет собой визуальный компонент (колонку), который отображает данные для всех строк таблицы. Когда мы меняем свойство ЦветТекста у этого элемента, платформа применяет его ко всему визуальному компоненту целиком. Именно поэтому цвет меняется во всей колонке, а не в конкретной строке, где пользователь изменил значение.

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

Решение для Управляемых форм: Условное оформление

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

Способ 1: Интерактивная настройка в конфигураторе

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

  1. Откроем форму документа или справочника в конфигураторе.
  2. Перейдем на закладку "Условное оформление" (она находится в нижней части окна свойств формы).
  3. Нажмем кнопку "Добавить".
  4. В появившемся окне настроим три ключевых параметра:
    • Оформление: Выберем свойство ЦветТекста и установим нужный нам цвет (например, зеленый или красный).
    • Условие: Здесь мы указываем, при каком значении данных цвет должен измениться. Например, Объект.Запасы.Цена > 1000.
    • Оформляемые поля: Выберем конкретную колонку нашей табличной части (например, ЗапасыРозничнаяЦена), которую нужно раскрасить. Если поле не выбрать, будет раскрашена вся строка.

Способ 2: Программная настройка Условного оформления

Иногда условие раскраски заранее неизвестно или оно слишком сложное. В таком случае мы можем настроить правила программно в процедуре ПриСозданииНаСервере. Рассмотрим пример кода:


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

Теперь, чтобы цвет поменялся в момент изменения значения пользователем, нам достаточно в событии ПриИзменении установить значение нашего вспомогательного реквизита:


&НаКлиенте
Процедура ЗапасыРозничнаяЦенаПриИзменении(Элемент)
    ТекущаяСтрока = Элементы.Запасы.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        // Устанавливаем флаг, на который реагирует Условное оформление
        ТекущаяСтрока.ЦенаИзменена = Истина;
    КонецЕсли;
КонецПроцедуры

Особенности работы в Обычных формах

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

Выясним, как это реализовать. В обычной форме у элемента "Табличное поле" есть событие ПриВыводеСтроки(ОформлениеСтроки, ДанныеСтроки). Оно вызывается платформой для каждой строки, которая попадает в видимую область экрана.


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

Важный нюанс: Не используйте сложные запросы внутри события ПриВыводеСтроки, так как это критически замедлит прокрутку таблицы. Все данные для условий должны быть уже в объекте ДанныеСтроки.

Работа с Динамическими списками

Если ваша таблица — это не просто табличная часть документа, а Динамический список (например, список заказов), то подход с Условным оформлением остается приоритетным. Вы можете настроить его так же, как описано выше, но непосредственно в свойствах динамического списка в редакторе формы. Это работает быстрее и эффективнее, чем программная обработка каждой строки на сервере.

Резюме и рекомендации

Подведем итоги нашего разбора:

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

← На главную