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