К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как покрасить строку в 1С программно

Как программно покрасить строку табличной части, динамического списка или таблицы значений в 1С: условное оформление управляемых форм, ОформлениеСтроки в обычных формах, примеры кода.

Подсветка строк в списках и табличных частях — одна из самых частых задач интерфейсной доработки в 1С. Красным помечают просроченные документы, зелёным — оплаченные заказы, серым — отменённые строки. Способ реализации зависит от того, в каком режиме работает конфигурация: в управляемом приложении используется механизм условного оформления, а в обычных формах — обработчик события ПриПолученииДанных и объект ОформлениеСтроки.

Главная ошибка новичков — попытка «покрасить строку» напрямую, как ячейку Excel. В 1С такого метода нет: оформление всегда привязано либо к настройкам условного оформления формы, либо к программному изменению свойств оформления в событиях вывода строк. Понимание этого принципа снимает большинство вопросов.

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

Какой механизм выбрать: управляемые или обычные формы

Первый шаг — определить, с каким типом формы вы работаете. Откройте конфигуратор и посмотрите на свойства формы объекта: управляемая форма описывается декларативно и не содержит табличных полей в старом смысле, обычная форма строится на элементах типа «ТабличноеПоле». Большинство современных конфигураций (УТ 11, ERP, Бухгалтерия 3.0) работают в режиме управляемого приложения.

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

Для обычных форм единственный корректный способ — событие ПриПолученииДанных табличного поля, где доступна коллекция ОформленияСтрок. Именно там задаётся цвет фона, цвет текста и шрифт для каждой строки.

Маршрут решения

Как выбрать способ

Управляемая форма, условие постоянное (например, строка помечена на удаление)Настройте условное оформление в конфигураторе без кода
Управляемая форма, условие зависит от параметров или прав пользователяСоздавайте элементы условного оформления программно в ПриСозданииНаСервере
Обычная форма (режим обычного приложения)Используйте событие ПриПолученииДанных и ОформлениеСтроки
Нужно перекрасить строки по уже открытой форме по кнопкеМеняйте параметры отбора условного оформления программно и обновляйте список

Окрашивание строк в управляемой форме через конфигуратор

Самый простой сценарий — покрасить строки динамического списка без программирования. Откройте форму списка в конфигураторе, перейдите на закладку «Условное оформление» и добавьте новый элемент. В нём заполняются три части: оформление (что менять), отбор (при каком условии) и оформляемые поля (к каким колонкам применять).

В разделе «Оформление» установите, например, ЦветФона в нужное значение. В разделе «Отбор» добавьте условие вида Ссылка.ПометкаУдаления = Истина или Сумма > 100000. Если оставить список оформляемых полей пустым, подсветка применится ко всей строке; если указать конкретные колонки — только к ним.

Важный нюанс: для табличной части документа условное оформление настраивается на самой форме документа, а поля отбора указываются через имя табличной части, например Объект.Товары.Отменено. Для динамического списка отбор строится по полям запроса списка, поэтому поле, по которому красите, обязательно должно присутствовать в выборке запроса динамического списка — иначе условие просто не сработает.

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

Когда условие вычисляется в момент открытия формы, элементы условного оформления создаются кодом в обработчике ПриСозданииНаСервере. Структура кода повторяет настройки конфигуратора: создаётся элемент, заполняются отбор, оформление и оформляемые поля.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// Условие: строка отменена

ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение =

Новый ПолеКомпоновкиДанных("Объект.Товары.Отменено");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Истина;

ЭлементОтбора.Использование = Истина;

// Оформление: серый фон

ЭлементОформления.Оформление.УстановитьЗначениеПараметра(

"ЦветФона", WebЦвета.СеребристоСерый);

// Применить ко всей табличной части

ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();

ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");

КонецПроцедуры

Обратите внимание на три типовые точки отказа. Во-первых, Использование = Истина у элемента отбора нужно устанавливать явно — без этого условие игнорируется. Во-вторых, в ОформляемоеПоле.Поле указывается имя элемента формы (колонки или таблицы), а не путь к данным. В-третьих, для динамического списка условное оформление добавляется не в УсловноеОформление формы, а в Список.УсловноеОформление — либо в настройки компоновки списка, если список работает на СКД.

Если нужно покрасить строки динамического списка программно, паттерн аналогичен, но левое значение отбора — это поле запроса списка без префикса «Объект»:

ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();

ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Просрочен");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Истина;

ЭлементОтбора.Использование = Истина;

ЭлементОформления.Оформление.УстановитьЗначениеПараметра(

"ЦветТекста", WebЦвета.Красный);

1c
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Отменено");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СеребристоСерый);
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");

Окрашивание строк в обычных формах через ОформлениеСтроки

В обычном приложении (типично для УТ 10.3, УПП 1.3 и старых самописных конфигураций) оформление строк выполняется в событии табличного поля ПриПолученииДанных. Это событие вызывается при выводе видимой порции строк, и в нём доступна коллекция ОформленияСтрок, где каждому элементу соответствует строка данных.

Процедура ТабличноеПолеСписокПриПолученииДанных(Элемент, ОформленияСтрок)

Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл

ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;

Если ДанныеСтроки.ПометкаУдаления Тогда

ОформлениеСтроки.ЦветФона = WebЦвета.СеребристоСерый;

ИначеЕсли ДанныеСтроки.СуммаДокумента > 100000 Тогда

ОформлениеСтроки.ЦветТекста = WebЦвета.ТемноКрасный;

ОформлениеСтроки.Шрифт = Новый Шрифт(,, Истина); // жирный

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Через ОформлениеСтроки.Ячейки.ИмяКолонки можно красить не всю строку, а отдельную ячейку, а также менять текст, картинку и доступность. Помните, что событие срабатывает только для видимых строк — это нормально, платформа сама вызовет его при прокрутке, и дополнительно «перекрашивать всё» не требуется.

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

Проверка результата и типичные ошибки

После внедрения кода откройте форму и проверьте три сценария: строка, удовлетворяющая условию, покрашена; строка, не удовлетворяющая условию, осталась стандартной; при изменении данных строки (например, снятии флага «Отменено») цвет обновляется. Для динамического списка дополнительно проверьте поведение после команды «Обновить» и после изменения отбора списка.

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

Типичные ошибки
01
Поле условия не включено в запрос динамического списка — оформление молча не срабатывает
02
Не установлено Использование = Истина у элемента отбора — условие игнорируется
03
В ОформляемоеПоле.Поле указан путь к данным вместо имени элемента формы — подсветка не привязывается к колонке
04
Оформление добавлено в УсловноеОформление формы, хотя красить нужно динамический список со своей коллекцией оформления
05
Запрос к базе внутри ПриПолученииДанных — список тормозит при каждой прокрутке
06
Попытка красить строки в цикле по ТабличнойЧасти напрямую — у строк данных нет свойства цвета, оформление задаётся только через условное оформление или события вывода

Производительность и ограничения

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

Ещё одно ограничение: в динамических списках нельзя использовать в условном оформлении вычисляемые на клиенте значения — только поля компоновки. Если нужна сложная логика (например, сравнение даты документа с текущей датой), добавьте в запрос списка вычисляемое поле через ВЫБОР КОГДА ... ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ КАК Просрочен и красьте уже по нему.

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

Контрольные точки

Как проверить результат

Строка с выполненным условием
Норма

Цвет фона или текста изменился сразу после открытия формы

Тревожный признак

Цвет не меняется — проверяйте поле отбора и флаг Использование

Изменение данных строки
Норма

После снятия/установки условия цвет обновляется без переоткрытия формы

Тревожный признак

Цвет «застревает» — условие ссылается на устаревшие данные, обновите список

Скорость списка
Норма

Прокрутка и открытие списка не изменились после доработки

Тревожный признак

Список тормозит — в запрос добавились тяжёлые соединения или в обработчике есть обращения к базе

Частые вопросы

Можно ли покрасить только одну ячейку, а не всю строку?

Да. В управляемой форме укажите в оформляемых полях конкретную колонку вместо всей таблицы. В обычной форме обратитесь к ячейке через ОформлениеСтроки.Ячейки.ИмяКолонки.ЦветФона. Остальные ячейки строки останутся со стандартным оформлением.

Почему условное оформление динамического списка не срабатывает, хотя код без ошибок?

Чаще всего поле, по которому построено условие, отсутствует в запросе динамического списка. Добавьте его в выборку запроса — выводить колонкой не обязательно. Вторая причина: не установлено свойство Использование у элемента отбора или у самого параметра оформления.

Как задать произвольный цвет, которого нет в WebЦвета?

Используйте конструктор Новый Цвет(Красный, Зеленый, Синий) с компонентами от 0 до 255, например Новый Цвет(255, 230, 230) для мягкого красного фона. В конфигураторе цвет выбирается через палитру в свойствах оформления.

Как покрасить строки по условию, которое зависит от текущей даты?

В запросе динамического списка добавьте вычисляемое поле: ВЫБОР КОГДА СрокОплаты < &ТекущаяДата ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ, передайте параметр и красьте по этому полю. Вычислять дату внутри условного оформления нельзя — оно работает только с полями данных.

Работает ли условное оформление в отчётах на СКД?

Да, у схемы компоновки данных есть собственная закладка «Условное оформление» в настройках отчёта. Там задаются те же отбор, оформление и область применения. Программно настройки меняются через КомпоновщикНастроек.Настройки.УсловноеОформление.

Итог

Что важно запомнить

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