Разработка и Конфигурация · 12 мин
Как покрасить строку в 1С программно
Как программно покрасить строку табличной части, динамического списка или таблицы значений в 1С: условное оформление управляемых форм, ОформлениеСтроки в обычных формах, примеры кода.
Подсветка строк в списках и табличных частях — одна из самых частых задач интерфейсной доработки в 1С. Красным помечают просроченные документы, зелёным — оплаченные заказы, серым — отменённые строки. Способ реализации зависит от того, в каком режиме работает конфигурация: в управляемом приложении используется механизм условного оформления, а в обычных формах — обработчик события ПриПолученииДанных и объект ОформлениеСтроки.
Главная ошибка новичков — попытка «покрасить строку» напрямую, как ячейку Excel. В 1С такого метода нет: оформление всегда привязано либо к настройкам условного оформления формы, либо к программному изменению свойств оформления в событиях вывода строк. Понимание этого принципа снимает большинство вопросов.
Ниже разобраны оба подхода с рабочими примерами кода, различия между динамическим списком и табличной частью, типичные ошибки и способы проверить результат.
Какой механизм выбрать: управляемые или обычные формы
Первый шаг — определить, с каким типом формы вы работаете. Откройте конфигуратор и посмотрите на свойства формы объекта: управляемая форма описывается декларативно и не содержит табличных полей в старом смысле, обычная форма строится на элементах типа «ТабличноеПоле». Большинство современных конфигураций (УТ 11, ERP, Бухгалтерия 3.0) работают в режиме управляемого приложения.
Для управляемых форм существует два пути: настройка условного оформления в конфигураторе без единой строки кода и программное создание элементов условного оформления в обработчике ПриСозданииНаСервере. Первый вариант проще и предпочтительнее, если условие статично. Второй нужен, когда условие вычисляется динамически — например, порог просрочки берётся из настроек пользователя.
Для обычных форм единственный корректный способ — событие ПриПолученииДанных табличного поля, где доступна коллекция ОформленияСтрок. Именно там задаётся цвет фона, цвет текста и шрифт для каждой строки.
Как выбрать способ
Окрашивание строк в управляемой форме через конфигуратор
Самый простой сценарий — покрасить строки динамического списка без программирования. Откройте форму списка в конфигураторе, перейдите на закладку «Условное оформление» и добавьте новый элемент. В нём заполняются три части: оформление (что менять), отбор (при каком условии) и оформляемые поля (к каким колонкам применять).
В разделе «Оформление» установите, например, ЦветФона в нужное значение. В разделе «Отбор» добавьте условие вида Ссылка.ПометкаУдаления = Истина или Сумма > 100000. Если оставить список оформляемых полей пустым, подсветка применится ко всей строке; если указать конкретные колонки — только к ним.
Важный нюанс: для табличной части документа условное оформление настраивается на самой форме документа, а поля отбора указываются через имя табличной части, например Объект.Товары.Отменено. Для динамического списка отбор строится по полям запроса списка, поэтому поле, по которому красите, обязательно должно присутствовать в выборке запроса динамического списка — иначе условие просто не сработает.
Программное условное оформление в управляемой форме
Когда условие вычисляется в момент открытия формы, элементы условного оформления создаются кодом в обработчике ПриСозданииНаСервере. Структура кода повторяет настройки конфигуратора: создаётся элемент, заполняются отбор, оформление и оформляемые поля.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Условие: строка отменена
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение =
Новый ПолеКомпоновкиДанных("Объект.Товары.Отменено");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
// Оформление: серый фон
ЭлементОформления.Оформление.УстановитьЗначениеПараметра(
"ЦветФона", WebЦвета.СеребристоСерый);
// Применить ко всей табличной части
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");
КонецПроцедуры
Обратите внимание на три типовые точки отказа. Во-первых, Использование = Истина у элемента отбора нужно устанавливать явно — без этого условие игнорируется. Во-вторых, в ОформляемоеПоле.Поле указывается имя элемента формы (колонки или таблицы), а не путь к данным. В-третьих, для динамического списка условное оформление добавляется не в УсловноеОформление формы, а в Список.УсловноеОформление — либо в настройки компоновки списка, если список работает на СКД.
Если нужно покрасить строки динамического списка программно, паттерн аналогичен, но левое значение отбора — это поле запроса списка без префикса «Объект»:
ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Просрочен");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра(
"ЦветТекста", WebЦвета.Красный);
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Отменено");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СеребристоСерый);
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");Окрашивание строк в обычных формах через ОформлениеСтроки
В обычном приложении (типично для УТ 10.3, УПП 1.3 и старых самописных конфигураций) оформление строк выполняется в событии табличного поля ПриПолученииДанных. Это событие вызывается при выводе видимой порции строк, и в нём доступна коллекция ОформленияСтрок, где каждому элементу соответствует строка данных.
Процедура ТабличноеПолеСписокПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
Если ДанныеСтроки.ПометкаУдаления Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.СеребристоСерый;
ИначеЕсли ДанныеСтроки.СуммаДокумента > 100000 Тогда
ОформлениеСтроки.ЦветТекста = WebЦвета.ТемноКрасный;
ОформлениеСтроки.Шрифт = Новый Шрифт(,, Истина); // жирный
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Через ОформлениеСтроки.Ячейки.ИмяКолонки можно красить не всю строку, а отдельную ячейку, а также менять текст, картинку и доступность. Помните, что событие срабатывает только для видимых строк — это нормально, платформа сама вызовет его при прокрутке, и дополнительно «перекрашивать всё» не требуется.
Не размещайте в этом обработчике запросы к базе данных: событие вызывается очень часто, и обращение к СУБД на каждую строку приведёт к заметным тормозам списка. Все данные для условия должны уже находиться в ДанныеСтроки.
Проверка результата и типичные ошибки
После внедрения кода откройте форму и проверьте три сценария: строка, удовлетворяющая условию, покрашена; строка, не удовлетворяющая условию, осталась стандартной; при изменении данных строки (например, снятии флага «Отменено») цвет обновляется. Для динамического списка дополнительно проверьте поведение после команды «Обновить» и после изменения отбора списка.
Если подсветка не появилась, идите по цепочке: существует ли поле отбора в данных списка, верно ли написан путь к полю (регистр букв не важен, но важны точки и имена), установлено ли Использование = Истина, не перекрывает ли ваш элемент оформления другой элемент, добавленный позже. Элементы условного оформления применяются по порядку, и более поздний с тем же параметром побеждает.
Производительность и ограничения
Условное оформление в управляемых формах выполняется платформой на стороне клиента по уже полученным данным, поэтому десятки элементов оформления обычно не влияют на скорость. Проблемы начинаются, когда условие требует данных, которых нет в выборке: разработчики добавляют соединения в запрос динамического списка, и тормозит уже сам запрос, а не оформление. Следите за планом запроса списка, если после доработки список стал открываться медленнее.
Ещё одно ограничение: в динамических списках нельзя использовать в условном оформлении вычисляемые на клиенте значения — только поля компоновки. Если нужна сложная логика (например, сравнение даты документа с текущей датой), добавьте в запрос списка вычисляемое поле через ВЫБОР КОГДА ... ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ КАК Просрочен и красьте уже по нему.
В обычных формах ограничение другое: ПриПолученииДанных работает только для табличных полей, связанных с данными. Для дерева значений или таблицы значений, выведенной вручную, используются события ПриВыводеСтроки, где аналогично доступен параметр ОформлениеСтроки.
Как проверить результат
Цвет фона или текста изменился сразу после открытия формы
Цвет не меняется — проверяйте поле отбора и флаг Использование
После снятия/установки условия цвет обновляется без переоткрытия формы
Цвет «застревает» — условие ссылается на устаревшие данные, обновите список
Прокрутка и открытие списка не изменились после доработки
Список тормозит — в запрос добавились тяжёлые соединения или в обработчике есть обращения к базе
Частые вопросы
Можно ли покрасить только одну ячейку, а не всю строку?
Да. В управляемой форме укажите в оформляемых полях конкретную колонку вместо всей таблицы. В обычной форме обратитесь к ячейке через ОформлениеСтроки.Ячейки.ИмяКолонки.ЦветФона. Остальные ячейки строки останутся со стандартным оформлением.
Почему условное оформление динамического списка не срабатывает, хотя код без ошибок?
Чаще всего поле, по которому построено условие, отсутствует в запросе динамического списка. Добавьте его в выборку запроса — выводить колонкой не обязательно. Вторая причина: не установлено свойство Использование у элемента отбора или у самого параметра оформления.
Как задать произвольный цвет, которого нет в WebЦвета?
Используйте конструктор Новый Цвет(Красный, Зеленый, Синий) с компонентами от 0 до 255, например Новый Цвет(255, 230, 230) для мягкого красного фона. В конфигураторе цвет выбирается через палитру в свойствах оформления.
Как покрасить строки по условию, которое зависит от текущей даты?
В запросе динамического списка добавьте вычисляемое поле: ВЫБОР КОГДА СрокОплаты < &ТекущаяДата ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ, передайте параметр и красьте по этому полю. Вычислять дату внутри условного оформления нельзя — оно работает только с полями данных.
Работает ли условное оформление в отчётах на СКД?
Да, у схемы компоновки данных есть собственная закладка «Условное оформление» в настройках отчёта. Там задаются те же отбор, оформление и область применения. Программно настройки меняются через КомпоновщикНастроек.Настройки.УсловноеОформление.
Что важно запомнить
Прямого метода покраски строки в 1С нет: в управляемых формах используется условное оформление (в конфигураторе или кодом с отбором, оформлением и оформляемыми полями), в обычных — событие ПриПолученииДанных и ОформлениеСтроки. Поле условия обязано быть в данных списка, свойство Использование должно быть включено, а запросы к базе в обработчиках вывода строк недопустимы.