Условное оформление 1С программно: примеры кода

Дата: 06.10.2026 16:54:16
Управляемые формы
Условное оформление
Динамический список
Таблица формы
Расширения конфигурации
Программирование 1С
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

Условное оформление 1С программно задают, когда правило зависит от данных и настроек: подсветить просроченные счета, сделать серыми непроведённые документы, написать «<не назначен>» в пустой колонке, спрятать колонки скидки, если скидки в документе не используются. Мышкой в конструкторе формы это тоже делается, но типовые конфигурации пишут оформление кодом. В УТ 11.4 у формы заказа клиента есть процедура УстановитьУсловноеОформление(), её вызывают из ПриСозданииНаСервере. Код проще сравнивать при обновлении, а значения условий можно взять из констант, функциональных опций и запросов.

Ниже — общий модуль с универсальной процедурой (цвет строки, шрифт, текст, скрытие поля) и примеры для табличной части, динамического списка и расширения. Код для платформы 8.3 и управляемых форм; про клиентский и серверный контекст формы подробнее — в статье об управляемой форме.

Где задают условное оформление 1С программно

В 8.3 условное оформление программно добавляют в один из трёх объектов. Тип у них общий — УсловноеОформлениеКомпоновкиДанных, поэтому одна процедура годится и для формы, и для списка. Разница — в том, как записывать поля, и в контексте.

Чьё оформлениеОформляемые поляПоля условияКонтекст
Формы: свойство УсловноеОформлениеИмена элементов формы: ТоварыСуммаПути к данным: Объект.Товары.Сумма, Объект.Склад, имя реквизита формы, Список.СтатусТолько сервер
Динамического списка: Список.КомпоновщикНастроек.Настройки.УсловноеОформлениеПоля списка: СуммаДокумента; без полей — вся строкаПоля списка без префикса: ПроведенКлиент и сервер
Отчёта на СКД: КомпоновщикНастроек.Настройки.УсловноеОформлениеПоля отчётаПоля отчётаСм. статью про поля СКД

Каждое правило — элемент коллекции Элементы из трёх частей:

  • Поля — что оформлять;
  • Отбор — при каком условии; элементы отбора те же, что в отборе динамического списка;
  • Оформление — как. Параметр задают методом УстановитьЗначениеПараметра(), он же включает его использование.

Свойство Представление — имя правила. Оно пригодится при отладке и когда правило нужно найти и удалить.

Универсальная процедура: цвет строки, шрифт, текст, скрытие поля

Создайте общий модуль УсловноеОформлениеСервер с флажком «Сервер». Функция ДобавитьПравило добавляет правило с одним условием за один вызов. Остальные функции нужны для условий «И/ИЛИ» и для строки табличной части целиком.

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

#Область ПрограммныйИнтерфейс

// Добавляет правило оформления и, если задан путь к данным, первое условие.
//
// Параметры:
//   УсловноеОформление - УсловноеОформлениеКомпоновкиДанных - куда добавить правило.
//   ОформляемыеПоля - Строка - имена через запятую: в форме - имена элементов,
//                     в динамическом списке - поля списка; "" - без полей.
//   ПутьКДанным - Строка - поле условия: "Объект.Товары.Количество", "Проведен".
//   ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения.
//   Значение - Произвольный - с чем сравнивать; для ВСписке - СписокЗначений.
//   Оформление - Структура - ключ - имя параметра оформления, значение - его значение.
//   Представление - Строка - имя правила: по нему правило можно найти и удалить.
//
// Возвращаемое значение:
//   ЭлементУсловногоОформленияКомпоновкиДанных - добавленное правило.
//
Функция ДобавитьПравило(УсловноеОформление, Знач ОформляемыеПоля, Знач ПутьКДанным = "",
	Знач ВидСравнения = Неопределено, Знач Значение = Неопределено,
	Знач Оформление = Неопределено, Знач Представление = "") Экспорт

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

	Для Каждого ИмяПоля Из СтрРазделить(ОформляемыеПоля, ",", Ложь) Цикл
		Имя = СокрЛП(ИмяПоля);
		Если Не ПустаяСтрока(Имя) Тогда
			ОформляемоеПоле = Правило.Поля.Элементы.Добавить();
			ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Имя);
		КонецЕсли;
	КонецЦикла;

	Если Не ПустаяСтрока(ПутьКДанным) Тогда
		ДобавитьУсловие(Правило, ПутьКДанным, ВидСравнения, Значение);
	КонецЕсли;

	Если Оформление <> Неопределено Тогда
		Для Каждого Параметр Из Оформление Цикл
			// Неизвестное имя параметра вызывает исключение: опечатка видна сразу.
			Правило.Оформление.УстановитьЗначениеПараметра(Параметр.Ключ, Параметр.Значение);
		КонецЦикла;
	КонецЕсли;

	Возврат Правило;

КонецФункции

// Добавляет условие в правило или в группу условий. Условия одного уровня
// соединяются по И; для ИЛИ сначала создайте группу функцией ДобавитьГруппуИли.
//
// Параметры:
//   Владелец - ЭлементУсловногоОформленияКомпоновкиДанных, ГруппаЭлементовОтбораКомпоновкиДанных.
//   ПутьКДанным - Строка - поле условия.
//   ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения.
//   Значение - Произвольный - для Заполнено и НеЗаполнено не нужно.
//
// Возвращаемое значение:
//   ЭлементОтбораКомпоновкиДанных - добавленное условие.
//
Функция ДобавитьУсловие(Владелец, Знач ПутьКДанным, Знач ВидСравнения, Знач Значение = Неопределено) Экспорт

	Условие = КоллекцияУсловий(Владелец).Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКДанным);
	Условие.ВидСравнения = ВидСравнения;
	Если Значение <> Неопределено Тогда
		Условие.ПравоеЗначение = Значение;
	КонецЕсли;

	Возврат Условие;

КонецФункции

// Добавляет группу «ИЛИ»: правило сработает, если выполнено хотя бы одно условие группы.
//
// Возвращаемое значение:
//   ГруппаЭлементовОтбораКомпоновкиДанных - группа, в которую добавляют условия.
//
Функция ДобавитьГруппуИли(Владелец) Экспорт

	Группа = КоллекцияУсловий(Владелец).Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

	Возврат Группа;

КонецФункции

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

	Исключения = Новый Массив;
	Для Каждого ИмяКолонки Из СтрРазделить(Исключить, ",", Ложь) Цикл
		Исключения.Добавить(СокрЛП(ИмяКолонки));
	КонецЦикла;

	ДобавитьКолонкиГруппы(Правило, ТаблицаФормы.ПодчиненныеЭлементы, Исключения);

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

// Удаляет правила с указанным представлением, например перед повторной установкой.
//
Процедура УдалитьПравила(УсловноеОформление, Знач Представление) Экспорт

	Удаляемые = Новый Массив;
	Для Каждого Правило Из УсловноеОформление.Элементы Цикл
		Если Правило.Представление = Представление Тогда
			Удаляемые.Добавить(Правило);
		КонецЕсли;
	КонецЦикла;

	Для Каждого Правило Из Удаляемые Цикл
		УсловноеОформление.Элементы.Удалить(Правило);
	КонецЦикла;

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция КоллекцияУсловий(Владелец)

	Если ТипЗнч(Владелец) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда
		Возврат Владелец.Отбор.Элементы;
	КонецЕсли;

	Возврат Владелец.Элементы; // ГруппаЭлементовОтбораКомпоновкиДанных

КонецФункции

Процедура ДобавитьКолонкиГруппы(Правило, ПодчиненныеЭлементы, Исключения)

	Для Каждого ЭлементФормы Из ПодчиненныеЭлементы Цикл
		Если ТипЗнч(ЭлементФормы) = Тип("ГруппаФормы") Тогда
			ДобавитьКолонкиГруппы(Правило, ЭлементФормы.ПодчиненныеЭлементы, Исключения);
		ИначеЕсли ТипЗнч(ЭлементФормы) = Тип("ПолеФормы")
			И Исключения.Найти(ЭлементФормы.Имя) = Неопределено Тогда
			ОформляемоеПоле = Правило.Поля.Элементы.Добавить();
			ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ЭлементФормы.Имя);
		КонецЕсли;
	КонецЦикла;

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

#КонецОбласти

Что передавать в структуре Оформление (имена — из синтакс-помощника, тип ОформлениеКомпоновкиДанных):

ПараметрЗначениеПример
ЦветФона, ЦветТекстаЦветWebЦвета.Лимонный, Новый Цвет(255, 235, 235)
ШрифтШрифтНовый Шрифт(, , Истина) — жирный, Новый Шрифт(, , , , , Истина) — зачёркнутый
ТекстСтрока вместо значенияНСтр("ru = '<не указан>'")
ФорматФорматная строка"ЧДЦ=2", "ДЛФ=D"
ВидимостьБулевоЛожь — скрыть колонку
ОтображатьБулевоЛожь — не показывать значение в ячейке
ТолькоПросмотр, Доступность, ОтметкаНезаполненногоБулевоИстина

По синтакс-помощнику Видимость, Отображать, Доступность и ТолькоПросмотр действуют только на поля в таблице, то есть на колонки.

Разбор ключевых строк

  • СтрРазделить(ОформляемыеПоля, ",", Ложь) из пустой строки даёт пустой массив. Правило без полей в динамическом списке оформляет всю строку: так в УТ 11.4 подсвечены заказы с высоким приоритетом.
  • УстановитьЗначениеПараметра() бросает исключение, если параметра с таким именем нет. Опечатка «ЦветФон» вылезет при первом открытии формы, а не через месяц на жалобе пользователя.
  • Проверка Значение <> Неопределено пропускает Ложь и 0, поэтому условие «Проведен = Ложь» работает. Для ВСписке передайте СписокЗначений.
  • ДобавитьКолонкиТаблицы обходит колонки рекурсивно, с учётом групп. В оформлении формы «вся строка таблицы» — это все её колонки. Если колонки добавляются кодом, вызывайте функцию после них.
  • УдалитьПравила нужна, когда правила переустанавливают на открытой форме: без неё каждый вызов добавит дубли.

Табличная часть и таблица формы

Условное оформление табличной части программно — самый частый случай. Пример ниже — форма своего документа с табличной частью «Товары» (Номенклатура, Количество, Цена, ПроцентСкидки, СуммаСкидки, Сумма, Склад) и реквизитами шапки Склад и РучнаяСкидка. Элементы колонок названы по умолчанию: ТоварыКоличество, ТоварыСумма и так далее. Условное оформление формы программно задают в серверной процедуре, которую вызывают из ПриСозданииНаСервере.

// Модуль формы документа с табличной частью «Товары».
// Реквизит формы ЦеныЗафиксированы (Булево) выведен на форму флажком.

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

	УстановитьУсловноеОформление();

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

&НаСервере
Процедура УстановитьУсловноеОформление()

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

	// 2. Крупная сумма - жирный шрифт только в колонке «Сумма».
	УсловноеОформлениеСервер.ДобавитьПравило(УсловноеОформление, Элементы.ТоварыСумма.Имя,
		"Объект.Товары.Сумма", ВидСравненияКомпоновкиДанных.БольшеИлиРавно, 100000,
		Новый Структура("Шрифт", Новый Шрифт(, , Истина)));

	// 3. Склад в строке пуст, но указан в шапке - подсказка вместо пустой ячейки.
	Правило = УсловноеОформлениеСервер.ДобавитьПравило(УсловноеОформление, Элементы.ТоварыСклад.Имя,
		"Объект.Товары.Склад", ВидСравненияКомпоновкиДанных.НеЗаполнено, ,
		Новый Структура("Текст, ЦветТекста", НСтр("ru = '<как в шапке>'"), WebЦвета.Серый));
	УсловноеОформлениеСервер.ДобавитьУсловие(Правило, "Объект.Склад", ВидСравненияКомпоновкиДанных.Заполнено);

	// 4. Ручная скидка в шапке выключена - колонки скидки скрыты целиком.
	УсловноеОформлениеСервер.ДобавитьПравило(УсловноеОформление,
		Элементы.ТоварыПроцентСкидки.Имя + "," + Элементы.ТоварыСуммаСкидки.Имя,
		"Объект.РучнаяСкидка", ВидСравненияКомпоновкиДанных.Равно, Ложь,
		Новый Структура("Видимость", Ложь));

	// 5. Номенклатура не выбрана - цену и сумму в этой строке не показываем.
	УсловноеОформлениеСервер.ДобавитьПравило(УсловноеОформление,
		Элементы.ТоварыЦена.Имя + "," + Элементы.ТоварыСумма.Имя,
		"Объект.Товары.Номенклатура", ВидСравненияКомпоновкиДанных.НеЗаполнено, ,
		Новый Структура("Отображать", Ложь));

	// 6. Флажок на форме - цена только для просмотра, с цветным фоном.
	//    Условие по реквизиту формы: при смене флажка сервер не нужен.
	УсловноеОформлениеСервер.ДобавитьПравило(УсловноеОформление, Элементы.ТоварыЦена.Имя,
		"ЦеныЗафиксированы", ВидСравненияКомпоновкиДанных.Равно, Истина,
		Новый Структура("ТолькоПросмотр, ЦветФона", Истина, WebЦвета.Роса));

КонецПроцедуры
  • Поле правила — Элементы.ТоварыСумма.Имя, а не строка «ТоварыСумма». Если элемент переименуют, форма упадёт при открытии с понятной ошибкой.
  • Условие Объект.Товары.Сумма проверяется для каждой строки, Объект.Склад — одно на всю таблицу. Правило 3 сочетает оба: оно сработает в пустых строках, только если склад указан в шапке.
  • Правила 4 и 5 показывают разницу между параметрами. Видимость с условием по шапке скрывает колонку целиком. Отображать с условием по строке оставляет колонку, но не показывает значение в подходящих строках. Так же устроены типовые правила УТ 11.4: колонки НДС скрываются по налогообложению из шапки, единица измерения не выводится в строках с заполненной упаковкой.
  • Правило 6 зависит от реквизита формы. Поменяли флажок на клиенте — оформление пересчиталось, обработчик ПриИзменении с вызовом сервера не нужен.

Условное оформление таблицы формы, связанной с реквизитом типа ТаблицаЗначений, пишется так же: условие — ТаблицаОстатков.Остаток, поле — имя элемента колонки. Как вывести такую таблицу, рассказано в статье о таблице значений на форме.

Динамический список

Условное оформление динамического списка программно пишут в его компоновщик: в правилах участвуют только поля списка. Пример — форма списка документа «Счёт».

// Модуль формы списка документа «Счёт» (реквизиты СуммаДокумента,
// СуммаОплаты, СрокОплаты, Ответственный, Срочный). Основной реквизит - Список.

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

	УстановитьОформлениеСписка();

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

&НаСервере
Процедура УстановитьОформлениеСписка()

	// Правила самого списка: поля - без префикса «Список.»,
	// правило без оформляемых полей красит всю строку.
	ОформлениеСписка = Список.КомпоновщикНастроек.Настройки.УсловноеОформление;

	// Не проведён и не помечен на удаление - серый текст.
	Правило = УсловноеОформлениеСервер.ДобавитьПравило(ОформлениеСписка, "",
		"Проведен", ВидСравненияКомпоновкиДанных.Равно, Ложь,
		Новый Структура("ЦветТекста", WebЦвета.Серый), "Счёт не проведён");
	УсловноеОформлениеСервер.ДобавитьУсловие(Правило, "ПометкаУдаления",
		ВидСравненияКомпоновкиДанных.Равно, Ложь);

	// Помечен на удаление - зачёркнутый шрифт (шестой параметр конструктора).
	УсловноеОформлениеСервер.ДобавитьПравило(ОформлениеСписка, "",
		"ПометкаУдаления", ВидСравненияКомпоновкиДанных.Равно, Истина,
		Новый Структура("Шрифт", Новый Шрифт(, , , , , Истина)), "Помечен на удаление");

	// Срок оплаты прошёл, а оплаты нет. Вместо ТекущаяДатаСеанса() -
	// стандартная дата «начало этого дня», как в БСП.
	Правило = УсловноеОформлениеСервер.ДобавитьПравило(ОформлениеСписка, "СрокОплаты",
		"СрокОплаты", ВидСравненияКомпоновкиДанных.Меньше,
		Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоЭтогоДня),
		Новый Структура("ЦветТекста, Шрифт", WebЦвета.ТемноКрасный, Новый Шрифт(, , Истина)),
		"Оплата просрочена");
	УсловноеОформлениеСервер.ДобавитьУсловие(Правило, "СрокОплаты", ВидСравненияКомпоновкиДанных.Заполнено);
	УсловноеОформлениеСервер.ДобавитьУсловие(Правило, "СуммаОплаты", ВидСравненияКомпоновкиДанных.Равно, 0);

	// Срочный ИЛИ крупный счёт - фон всей строки.
	Правило = УсловноеОформлениеСервер.ДобавитьПравило(ОформлениеСписка, "", , , ,
		Новый Структура("ЦветФона", WebЦвета.Лимонный), "Срочные и крупные");
	ГруппаИли = УсловноеОформлениеСервер.ДобавитьГруппуИли(Правило);
	УсловноеОформлениеСервер.ДобавитьУсловие(ГруппаИли, "Срочный",
		ВидСравненияКомпоновкиДанных.Равно, Истина);
	УсловноеОформлениеСервер.ДобавитьУсловие(ГруппаИли, "СуммаДокумента",
		ВидСравненияКомпоновкиДанных.БольшеИлиРавно, 1000000);

	// Текст в колонке - правилом формы, как в УТ 11.4: поле - имя элемента,
	// условие - путь «Список.<поле>».
	УсловноеОформлениеСервер.ДобавитьПравило(УсловноеОформление, Элементы.СписокОтветственный.Имя,
		"Список.Ответственный", ВидСравненияКомпоновкиДанных.НеЗаполнено, ,
		Новый Структура("Текст, ЦветТекста", НСтр("ru = '<не назначен>'"), WebЦвета.Серый));

КонецПроцедуры
  • В оформлении самого списка префикс «Список.» не пишут, а в оформлении формы — пишут. Последнее правило листинга добавлено в оформление формы: поле — элемент СписокОтветственный, условие — Список.Ответственный. Так в УТ 11.4 подменяется текст в колонке статуса заказа.
  • Условие по реквизиту формы в оформление списка не добавить: компоновщик списка знает только свои поля.
  • СтандартнаяДатаНачала вместо ТекущаяДатаСеанса() — приём из БСП (СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата). Дата, вычисленная в коде, застынет на момент открытия формы.
  • Формы заказа клиента в УТ 11.4 начинают оформление с Элементы.Очистить() и стирают правила, заданные в конструкторе. В своей форме очищать не обязательно.

Когда условия отбором не выразить

Элемент отбора сравнивает поле со значением. «Оплачено меньше половины» — уже выражение над двумя полями. Есть два пути: добавить в запрос списка поле ВЫБОР КОГДА Счет.СуммаОплаты * 2 < Счет.СуммаДокумента ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ и оформлять по нему обычным правилом либо красить строки в обработчике ПриПолученииДанныхНаСервере.

// Обработчик события ПриПолученииДанныхНаСервере таблицы «Список»
// (назначается в палитре свойств таблицы). Платформа 8.3.10 и выше.
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)

	Для Каждого КлючИЗначение Из Строки Цикл

		СтрокаСписка = КлючИЗначение.Значение;
		Данные = СтрокаСписка.Данные;

		// Оплачено меньше половины: выражение над двумя полями,
		// элементом отбора такое условие не записать.
		Если Данные.СуммаДокумента = 0 Или Данные.СуммаОплаты = 0
			Или Данные.СуммаОплаты * 2 >= Данные.СуммаДокумента Тогда
			Продолжить;
		КонецЕсли;

		// Оформление есть только у видимых ячеек: красим все - выходит вся строка.
		Для Каждого Ячейка Из СтрокаСписка.Оформление Цикл
			Ячейка.Значение.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЖелтый);
			Если Ячейка.Ключ = "СуммаОплаты" Тогда
				Ячейка.Значение.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , Истина));
			КонецЕсли;
		КонецЦикла;

	КонецЦикла;

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

Обработчик доступен с платформы 8.3.10 и по синтакс-помощнику должен иметь директиву &НаСервереБезКонтекста. Коллекция Оформление содержит только видимые ячейки. Поля, которые читает код, выведите в колонки или отметьте «Использовать всегда». Обработчик срабатывает при каждом получении данных списком: никаких запросов в цикле, при необходимости — один запрос по Строки.ПолучитьКлючи().

Условное оформление через расширение

В типовой форме модуль не правят, а правила добавляют из расширения. Пример — УТ 11.4, форма ФормаСписка документа ЗаказКлиента. Типовая УстановитьУсловноеОформление() вызывается из ПриСозданииНаСервере. Она очищает оформление списка и формы и заново добавляет типовые правила: цвета приоритетов, текст статуса, формат даты. Всё, что расширение добавило раньше (в обработчике «Перед» или в конструкторе заимствованной формы), исчезнет. Поэтому правила вешают аннотацией &После прямо на типовую процедуру.

// Расширение с префиксом Расш1_. Заимствована форма ФормаСписка
// документа ЗаказКлиента; имена сверены по УТ 11.4.

&НаСервере
&После("УстановитьУсловноеОформление")
Процедура Расш1_УстановитьУсловноеОформлениеПосле()

	// Типовая процедура уже очистила оформление и добавила свои правила.
	// Наши правила идут после неё, поэтому Очистить() их не сотрёт.
	ОформлениеСписка = Список.КомпоновщикНастроек.Настройки.УсловноеОформление;

	// Заказ не согласован, а желаемая дата отгрузки уже наступила - красным.
	Правило = ОформлениеСписка.Элементы.Добавить();
	Правило.Представление = НСтр("ru = 'Расш1: пора отгружать, заказ не согласован'");

	Условие = Правило.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
	Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	Условие.ПравоеЗначение = Перечисления.СтатусыЗаказовКлиентов.НеСогласован;

	Условие = Правило.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЖелаемаяДатаОтгрузки");
	Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	Условие.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоСледующегоДня);

	Условие = Правило.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЖелаемаяДатаОтгрузки");
	Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;

	Правило.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

	// Крупный заказ - сумма жирным, только в своей колонке.
	Правило = ОформлениеСписка.Элементы.Добавить();
	Правило.Представление = НСтр("ru = 'Расш1: крупный заказ'");

	ОформляемоеПоле = Правило.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("СуммаДокумента");

	Условие = Правило.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СуммаДокумента");
	Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
	Условие.ПравоеЗначение = 500000;

	Правило.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , Истина));

КонецПроцедуры
  • Метод расширения повторяет директиву типового — &НаСервере. Имя типовой процедуры в аннотации записано строкой, поэтому после обновления конфигурации проверяйте, что она на месте.
  • Здесь использован «голый» API без общего модуля: расширение не зависит от модуля из первого листинга. Если модуль нужен, создайте его в самом расширении.
  • Если в форме нет отдельной процедуры оформления, добавьте обработчик ПриСозданииНаСервере с вызовом «После». Как заимствовать форму и назначить обработчик, разобрано в статье о расширении формы.

Типичные ошибки

  • В оформляемых полях формы — путь к данным. Новый ПолеКомпоновкиДанных("Объект.Товары.Сумма") в Поля ничего не оформит, ошибки тоже не будет. В полях формы пишут имя элемента, в условии — путь к данным.
  • Префикс «Список.» не там. В оформлении самого списка он лишний, в оформлении формы обязателен.
  • Оформление формы из клиентской процедуры. Свойство формы УсловноеОформление есть только на сервере. В процедуре &НаКлиенте модуль не скомпилируется: «Переменная не определена (УсловноеОформление)». У динамического списка свойство УсловноеОформление доступно и на клиенте.
  • Опечатка в имени параметра. «ЦветФон» вместо «ЦветФона» — исключение при открытии формы. Сверяйте имена с таблицей выше.
  • Попытка скрыть поле шапки. Видимость и Отображать действуют на колонки таблиц. Поле шапки скрывают свойством элемента: Элементы.Склад.Видимость = Ложь.
  • Дубли правил. Процедуру оформления вызывают ещё и из обработчиков изменения реквизитов, и после каждого серверного вызова правил становится больше, а форма медленнее. Устанавливайте правила один раз в ПриСозданииНаСервере или удаляйте старые по представлению.
  • Дата в условии. ТекущаяДатаСеанса() в правом значении запоминает момент, когда правило добавили. Для «сегодня» берите СтандартнаяДатаНачала.
  • Правило из расширения пропадает. Если правило добавлено до типовой процедуры оформления, её Элементы.Очистить() правило сотрёт. Добавляйте правила после неё.

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

Как поменять оформление, когда форма уже открыта?

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

Как покрасить строку динамического списка целиком?

Не добавляйте оформляемые поля в правило самого списка. В оформлении формы строку таблицы красят перечислением всех колонок — для этого в модуле есть ДобавитьКолонкиТаблицы.

Можно ли сравнить два поля одной строки?

По синтакс-помощнику правым значением элемента отбора может быть поле: Условие.ПравоеЗначение = Новый ПолеКомпоновкиДанных("СуммаДокумента"). Арифметику (половина суммы, разница дат в днях) так не записать — нужно поле в запросе списка или обработчик ПриПолученииДанныхНаСервере.

А в обычной форме?

В обычных формах толстого клиента у табличного поля есть событие ПриВыводеСтроки. В нём меняют ОформлениеСтроки.ЦветФона или оформление отдельной ячейки через ОформлениеСтроки.Ячейки. Код из этой статьи — для управляемых форм.

Когда проще заказать

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

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.