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