Разработка и Конфигурация · 12 мин
Как раскрасить строки табличной части в управляемых формах 1С
Как раскрасить строки табличной части в управляемых формах 1С через условное оформление формы и программно. Примеры кода, настройка отборов, ошибки.
Подсветка строк табличной части — одна из самых частых задач при доработке управляемых форм в 1С. Пользователю нужно сразу видеть отменённые строки заказа, позиции с недостаточным остатком или дубли номенклатуры, не вчитываясь в каждую колонку. В управляемых формах для этого существует штатный механизм — условное оформление, и в большинстве случаев его достаточно: никаких обработчиков при выводе строк писать не нужно.
Ключевое отличие от обычных форм: в управляемой форме нельзя «добежать» до строки таблицы и напрямую назначить ей цвет. Вместо этого вы описываете правило: «если колонка Отменено равна Истина — фон строки красный», а платформа сама применяет его при каждой перерисовке. Такой подход надёжнее: оформление автоматически обновляется при редактировании данных пользователем.
Ниже разобраны оба рабочих способа — настройка условного оформления прямо в конфигураторе без единой строки кода и программное добавление правил из модуля формы. Отдельно рассмотрены динамические условия, типичные ошибки, из-за которых раскраска «не срабатывает», и ограничения механизма.
Как работает условное оформление управляемой формы
Условное оформление формы — это коллекция правил, хранящаяся вместе с формой. Каждое правило состоит из трёх частей: отбора (условие, при котором применяется оформление), оформления (цвет фона, цвет текста, шрифт и другие параметры) и списка оформляемых полей (к каким колонкам применить). Все три части обязательны: если забыть указать оформляемые поля, правило просто ничего не сделает.
Правила условного оформления формы применяются к элементам формы — таблицам, полям, кнопкам. Важно не путать их с условным оформлением динамического списка: если табличная часть построена на динамическом списке (например, журнал документов), оформление нужно настраивать у самого списка, а не у формы. Для обычных табличных частей документа (Объект.Товары и подобных) используется именно условное оформление формы.
Платформа пересчитывает оформление автоматически при изменении данных, поэтому правило «подсветить строку, где количество больше остатка» будет работать и в момент открытия документа, и при каждом редактировании строки пользователем. Писать обработчики ПриИзменении ради самой раскраски не требуется.
Способ 1: настройка в конфигураторе без кода
Если условие статично и известно на этапе разработки, проще всего настроить раскраску в конфигураторе. Откройте форму документа, выделите в дереве элементов таблицу табличной части (например, «Товары») и в палитре свойств найдите пункт «УсловноеОформление» — он открывает редактор правил. Альтернативный путь: главное меню формы «Условное оформление» в командной панели редактора форм.
В редакторе добавьте новый элемент и заполните три вкладки. На вкладке «Оформление» установите, например, «Цвет фона» — красный или светло-жёлтый. На вкладке «Условие» добавьте элемент отбора: левое значение — поле «Объект.Товары.Отменено», вид сравнения — «Равно», правое значение — «Истина». На вкладке «Оформляемые поля» перечислите все колонки таблицы, которые должны окраситься: Номенклатура, Количество, Цена, Сумма и так далее.
Чтобы окрасилась вся строка целиком, в список оформляемых полей нужно добавить каждую видимую колонку таблицы. Частая ошибка — указать только одну колонку и удивляться, почему раскрасилась «полстроки». Если колонок много, удобнее задать оформление программно в цикле — об этом ниже.
- 1Откройте форму в конфигураторе и выделите таблицу табличной части
- 2В палитре свойств откройте «УсловноеОформление» и добавьте элемент
- 3На вкладке «Оформление» задайте цвет фона или цвет текста
- 4На вкладке «Условие» добавьте отбор по полю данных табличной части
- 5На вкладке «Оформляемые поля» перечислите все колонки таблицы
- 6Сохраните форму и проверьте раскраску в режиме предприятия
Способ 2: программное добавление правил из модуля формы
Программный вариант нужен, когда условия зависят от настроек пользователя, функциональных опций или когда правил много и удобнее держать их в коде. Правила добавляются в коллекцию УсловноеОформление формы, чаще всего в обработчике ПриСозданииНаСервере.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Оформление — цвет фона
ЭлементОформления.Оформление.УстановитьЗначениеПараметра(
"ЦветФона", WebЦвета.СветлоРозовый);
// Условие — строка отменена
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение =
Новый ПолеКомпоновкиДанных("Объект.Товары.Отменено");
ЭлементОтбора.ВидСравнения =
ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
// Оформляемые поля — все колонки таблицы
Для Каждого Колонка Из Элементы.Товары.ПодчиненныеЭлементы Цикл
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле =
Новый ПолеКомпоновкиДанных(Колонка.Имя);
КонецЦикла;
КонецПроцедуры
Обратите внимание на три момента в коде. Во-первых, путь к данным в отборе указывается с точками — «Объект.Товары.Отменено», то есть от корня реквизита формы. Во-вторых, в оформляемых полях используются имена элементов формы (колонок таблицы), а не пути к данным. В-третьих, цикл по ПодчиненныеЭлементы таблицы избавляет от ручного перечисления колонок — при добавлении новой колонки в форму она раскрасится автоматически.
Если таблица содержит группы колонок, цикл по подчинённым элементам нужно сделать рекурсивным: у группы колонок есть свои подчинённые элементы, и её имя в оформляемые поля добавлять не следует.
Как задать сложные и динамические условия
Несколько условий внутри одного правила по умолчанию объединяются по «И». Если нужно «ИЛИ» — например, подсветить строку, где товар отменён или количество равно нулю, — добавьте в отбор группу элементов с типом группировки «ГруппаИли» и поместите оба условия в неё. В конфигураторе это делается кнопкой «Сгруппировать условия», программно — добавлением элемента типа ГруппаЭлементовОтбораКомпоновкиДанных.
Для сравнения двух колонок между собой (например, «Количество» больше «КоличествоЗаказано») правое значение отбора тоже задаётся как поле компоновки данных: Новый ПолеКомпоновкиДанных("Объект.Товары.КоличествоЗаказано"). Платформа поймёт, что сравниваются два поля, а не поле с константой.
Динамические условия — когда цвет или порог зависит от настройки — реализуются через реквизит формы. Заведите реквизит «ЦветПредупреждения», заполните его при создании формы из настроек пользователя и подставляйте в оформление. При изменении настройки достаточно обновить значения параметров в существующих правилах, не пересоздавая их.
Где настраивать оформление
Условие статично и одинаково для всех пользователей. Не требует кода, видно при открытии формы, но не меняется в runtime.
Условия зависят от настроек, прав много колонок. Гибче, но требует аккуратности с дублями правил.
Таблица построена на динамическом списке (журналы, подбор). Настраивается у реквизита списка, а не у формы.
Проверка результата и типичные ошибки
После настройки откройте документ в режиме предприятия и проверьте три сценария: раскраска существующих строк при открытии, изменение цвета при редактировании контрольного поля и снятие окраски при возврате значения в норму. Если цвет меняется во всех трёх случаях — правило настроено корректно.
Самая частая причина «не работает» — пустой список оформляемых полей. Вторая по частоте — ошибка в пути к данным: в отборе указано «Товары.Отменено» без префикса «Объект.», либо использовано имя колонки формы вместо пути к реквизиту. Третья — конфликт нескольких правил: если два правила задают разный цвет фона для одной строки, применится то, которое идёт позже в коллекции, и порядок элементов имеет значение.
Отдельный случай — правила типовой конфигурации. В типовых формах уже есть своё условное оформление, добавленное кодом в общих модулях. Ваше правило может проигрывать типовому по приоритету. Диагностируется это просмотром коллекции УсловноеОформление в отладчике: видно, какие правила существуют и в каком порядке.
Как проверить результат
Строки, удовлетворяющие условию, окрашены сразу
Окраска появляется только после редактирования строки — проверьте путь к данным в отборе
Цвет строки меняется сразу после ввода значения
Цвет не меняется — условие не срабатывает, проверьте вид сравнения и тип значения
Окрашены все видимые колонки строки
Окрашена часть колонок — дополните список оформляемых полей
Ограничения и альтернативные подходы
Условное оформление умеет менять цвет фона, цвет текста, шрифт, доступность, видимость, отметку незаполненного и формат отображения. Оно не умеет менять высоту строки, вставлять произвольные картинки в ячейки или рисовать градиенты. Если нужна пиктограмма статуса в строке, используйте колонку с картинкой строки — для таблиц значений есть свойство КартинкаСтрок, а признак можно вычислять в обработчике ПриПолученииДанныхНаСервере (для динамических списков) или при изменении данных.
Ещё одно ограничение: условие отбора работает только с полями данных формы. Если признак раскраски вычисляется сложным запросом (например, остаток на складе на текущую дату), его нужно материализовать — добавить в табличную часть служебную колонку «Остаток» или «ЕстьНехватка», заполнять её при открытии и при изменении строк, а правило оформления строить уже по этой колонке.
Для таблиц на основе динамического списка вычисляемые поля добавляются через поля компоновки самого списка, а условное оформление настраивается в его коллекции УсловноеОформление — синтаксис тот же, но пути к полям начинаются от полей запроса, а не от «Объект.».
Что важно запомнить
Раскраска строк табличной части в управляемой форме делается условным оформлением: отбор по полям данных, оформление (цвет), список оформляемых колонок. Статичные правила настраиваются в конфигураторе, динамические — программно в ПриСозданииНаСервере. Типовые формы дорабатывайте через расширение.
Частые вопросы
Как раскрасить всю строку, а не отдельные ячейки?
Добавьте в список оформляемых полей правила все видимые колонки таблицы. Программно это удобно сделать циклом по подчинённым элементам таблицы формы, включая вложенные группы колонок. Пропущенные колонки останутся с фоном по умолчанию.
Почему правило не срабатывает, хотя условие верное?
Чаще всего не заполнены оформляемые поля или в отборе указан неверный путь к данным. Проверьте, что левое значение отбора — это полный путь от реквизита формы, например «Объект.Товары.Отменено», а не имя колонки. Также проверьте отладчиком, не перекрывает ли ваше правило другое, стоящее позже в коллекции.
Можно ли раскрасить строки по условию, которого нет в данных табличной части?
Напрямую нет — отбор работает только по полям данных формы. Добавьте в табличную часть служебную колонку (например, булево «ЕстьНехватка»), вычисляйте её при открытии формы и при изменении строк, а правило оформления стройте по этой колонке.
Как задать условие «ИЛИ» между двумя проверками?
Сгруппируйте условия: в конфигураторе — кнопкой группировки с типом «Или», программно — добавлением элемента типа ГруппаЭлементовОтбораКомпоновкиДанных с ТипГруппы равным ГруппаИли, и разместите оба условия внутри этой группы.
Как раскрасить строки в форме типовой конфигурации, не снимая её с поддержки?
Создайте расширение конфигурации, заимствуйте нужную форму и в обработчике ПриСозданииНаСервере с аннотацией «После» добавьте свои элементы в коллекцию УсловноеОформление. Такой подход переживает обновления типовой конфигурации.
Работает ли этот подход для динамических списков и журналов документов?
Да, но правила нужно добавлять в коллекцию УсловноеОформление самого динамического списка (реквизита формы), а не формы. Пути к полям в отборе тогда указываются от полей запроса списка, без префикса «Объект.».