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

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

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

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

Выясняем причину: почему обработчик «ПриВыводеСтроки» не работает в управляемом приложении

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

Попытка перенести этот подход в управляемые формы — одна из самых частых ошибок начинающих разработчиков. Архитектура управляемого приложения построена на жестком разделении обязанностей между клиентом и сервером. Сами данные находятся и обрабатываются на стороне сервера, а отрисовка интерфейса и представление этих данных пользователю происходят исключительно на тонком или веб-клиенте. Если бы система вызывала событие для каждой строки при ее отрисовке на экране, это привело бы к колоссальным задержкам производительности из-за непрерывных клиент-серверных вызовов. По этой причине в управляемых формах события ПриВыводеСтроки и ПриПолученииДанных были упразднены.

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

Интерактивная настройка условного оформления в Конфигураторе

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

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

Выполним следующие шаги:

  1. Откроем управляемую форму в конфигураторе.
  2. В окне структуры элементов формы (обычно расположено вверху справа) найдем и выделим самый верхний корневой элемент с именем Форма.
  3. В окне свойств (справа внизу) прокрутим список до категории "Оформление" и найдем строку Условное оформление. Нажмем на кнопку с многоточием «...».
  4. Перед нами откроется окно настройки условного оформления формы. Нажмем кнопку Добавить для создания нового правила.
  5. Настроим новое правило на трех ключевых вкладках:
    • Оформление: Здесь мы указываем, какие визуальные параметры должны измениться при выполнении условий. Мы можем настроить ЦветФона, ЦветТекста, Шрифт (сделать его жирным или курсивом), а также параметры видимости и доступности. Зададим нужный цвет фона (например, мягкий зеленый или светло-красный).
    • Условие: Задаем логическое правило, при котором оформление сработает. Нажмем «Добавить новый элемент отбора». В колонке Левое значение укажем реквизит табличной части (например, Объект.Товары.Сумма), в колонке Вид сравнения выберем логический оператор (например, Больше), а в колонке Правое значение укажем конкретное число или другой реквизит.
    • Оформляемые поля: Укажем, какие именно колонки должны быть окрашены. Нажмем «Добавить» и выберем нужные элементы формы. Критически важно: если мы хотим окрасить всю строку целиком, то список оформляемых полей нужно оставить абсолютно пустым. В этом случае платформа автоматически применит оформление ко всем колонкам строки.

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

Программная настройка условного оформления на сервере

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

Рассмотрим подробнее пример программного создания условного оформления на языке 1С. Этот код необходимо размещать в процедурах, выполняющихся на сервере, например, в предопределенном обработчике события формы ПриСозданииНаСервере.


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

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

Решение сложных сценариев: расчетные служебные реквизиты

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

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

Разберем по шагам алгоритм решения этой задачи:

  1. В структуру нашей табличной части (или таблицы значений) добавляем новый реквизит (колонку), например, с именем ИндексЦвета (тип данных: Число или Булево). При этом выводить этот элемент на форму для пользователя не обязательно — он может оставаться чисто служебным.
  2. При загрузке данных в табличную часть или при изменении ее строк программно запускаем серверный алгоритм расчетов. Этот алгоритм выполняет все необходимые запросы к базе данных, вычисляет сложные математические формулы и записывает результат (например, логическую Истина или числовые индексы 1, 2, 3) в нашу служебную колонку ИндексЦвета для каждой строки.
  3. В настройках условного оформления (в конфигураторе или программно) создаем максимально простое и быстрое правило: если значение колонки ИндексЦвета равно 1 — красим строку в желтый, если 2 — в красный.

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

Решение проблемы с цветом активной (выделенной) строки

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

Как обойти это ограничение и сохранить информативность интерфейса? Разберем два надежных решения:

Вариант 1: Использование шрифтов и цвета текста

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

Вариант 2: Использование картинок состояния

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

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

← На главную