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