Цвет строки в списках, таблицах и отчётах 1С 8.3: пользователю и программисту
Содержание
Строку в 1С выделяют цветом через условное оформление: задаёте условие (например, «документ не проведён» или «сумма больше 100 000») и параметр оформления — ЦветФона, ЦветТекста или Шрифт. Пользователь делает это без программиста: в списке откройте меню Ещё, команду настройки списка и вкладку «Условное оформление». Программист добавляет то же самое кодом в ПриСозданииНаСервере формы или в настройки схемы компоновки отчёта.
Когда список на 3 000 документов выглядит одинаково серым, ошибку легко пропустить. Ниже готовые варианты для каждого случая: управляемая форма, обычная форма, табличный документ и отчёт на СКД. Механизм общий для платформы 8.3, а не для одной конфигурации, поэтому всё работает и в Бухгалтерии, и в ЗУП, и в УТ.
Как работает условное оформление в управляемой форме
Условное оформление — это набор правил. Каждое правило состоит из трёх частей:
- 🎯 Оформляемые поля — к каким колонкам применить цвет. Если указать саму таблицу формы (например,
Список), окрасится вся строка. - 🔍 Отбор — условие, при котором правило срабатывает:
Проведен = Ложь,Сумма > 100000,Контрагент заполнен. - 🎨 Оформление — что меняется: цвет фона, цвет текста, шрифт, видимость, доступность, текст ячейки.
Правила хранятся в трёх местах, и это важно для выбора способа:
| Где задано | Кто настраивает | На кого действует |
|---|---|---|
| Пользовательские настройки списка | Сам пользователь | Только на этого пользователя |
| Условное оформление формы в Конфигураторе | Программист | На всех пользователей |
| Условное оформление динамического списка | Программист | На всех, поля пишутся без префикса таблицы |
Пользовательский способ: без Конфигуратора
Подходит бухгалтеру, которому нужно подсветить свои строки в журнале документов или справочнике.
- Откройте нужный список, например журнал «Реализация (акты, накладные)».
- Нажмите
Ещёи выберите команду настройки списка. - Перейдите на вкладку «Условное оформление» и нажмите «Добавить».
- В поле «Оформление» укажите цвет фона или текста.
- В поле «Условие» добавьте отбор: например, «Проведен» — «Равно» — «Нет».
- В поле «Оформляемые поля» ничего не выбирайте, если нужна вся строка. Укажите колонку, если нужна только одна ячейка.
- Нажмите «Завершить редактирование».
Настройка сохраняется в пользовательских настройках. Коллеги её не увидят, а при очистке настроек она пропадёт.
Если нужного поля нет в списке условий, сначала выведите его колонкой в список через ту же настройку. Условие строится только по полям, которые есть в данных списка.
Способ программиста: правило в Конфигураторе
В Конфигураторе откройте форму, выделите корневой элемент «Форма» и найдите в палитре свойств «Условное оформление». Откроется тот же редактор правил, что и у пользователя, но правило попадёт в конфигурацию и будет у всех.
Для типовой конфигурации на поддержке правку формы лучше делать в расширении конфигурации. Так обновления не затрут ваше правило, а форму не придётся снимать с поддержки.
Выделение строки кодом: управляемые формы и отчёты СКД
Кодом удобно, когда условие зависит от настроек, ролей или констант. Правило добавляют один раз при создании формы.
Строка динамического списка
Пример: непроведённые документы закрашиваются светло-розовым, вся строка целиком.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Оформляемое поле — вся таблица формы, значит красится вся строка
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список.Имя);
// Условие: документ не проведён
Отбор = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Проведен");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор.ПравоеЗначение = Ложь;
// Оформление
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 228, 225));
КонецПроцедуры
Для табличной части документа путь к полю в отборе будет другим: Объект.Товары.Количество, а оформляемым полем — элемент таблицы Товары. Для реквизита формы типа «ТаблицаЗначений» — ИмяРеквизита.ИмяКолонки.
Строка отчёта на СКД
В схеме компоновки откройте вкладку «Настройки», затем «Условное оформление». Если список оформляемых полей оставить пустым, правило применится ко всем полям, то есть ко всей строке отчёта.
Когда условие нужно собрать кодом, используйте событие модуля отчёта ПриКомпоновкеРезультата. Стандартную обработку отключают и выводят результат сами:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Строки с отрицательным остатком — красным текстом
ЭлементОформления = Настройки.УсловноеОформление.Элементы.Добавить();
Отбор = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоКонечныйОстаток");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
Отбор.ПравоеЗначение = 0;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет, , ДанныеРасшифровки, Истина);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(Процессор);
КонецПроцедуры
Имя макета ОсновнаяСхемаКомпоновкиДанных замените на имя схемы вашего отчёта. Поле в отборе должно совпадать с путём поля в схеме, а не с его заголовком.
В отчётах на БСП (большинство отчётов типовых конфигураций) вывод уже переопределён библиотекой. Правьте такие отчёты через расширение и проверяйте, что ваш обработчик не ломает варианты и расшифровку.
Пользователь отчёта на БСП может добавить правило сам: откройте настройки отчёта, переключитесь на расширенный вид и найдите вкладку с оформлением.
Обычные формы и табличный документ: другой подход
В обычных формах (толстый клиент, старые самописные конфигурации) условное оформление тоже есть, но цвет строки чаще задают в событии таблицы.
Событие ПриВыводеСтроки табличного поля
Обработчик вызывается для каждой видимой строки. Он получает объект ОформлениеСтроки, где можно поменять цвет
всей строки или отдельной ячейки:
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки.Количество = 0 Тогда
ОформлениеСтроки.ЦветФона = Новый Цвет(255, 245, 200);
КонецЕсли;
// Только одна ячейка
Если ДанныеСтроки.Сумма > 100000 Тогда
ОформлениеСтроки.Ячейки.Сумма.ЦветТекста = WebЦвета.Красный;
КонецЕсли;
КонецПроцедуры
В управляемых формах такого события у таблицы нет. Тот же результат там получают условным оформлением из предыдущего раздела.
Строка табличного документа
Табличный документ (печатная форма, результат отчёта) красят напрямую, через область. Это работает и в обычных, и в управляемых формах:
// Номер строки — пятая строка документа
Область = ТабДок.Область("R5");
Область.ЦветФона = Новый Цвет(220, 240, 220);
Область.Шрифт = Новый Шрифт(, , Истина); // жирный
Для диапазона строк укажите "R5:R10". Если выводите табличный документ из макета, удобнее раскрасить строку прямо в макете или задать цвет области макета перед выводом: так не придётся считать номера строк.
Цвета: стиль, WebЦвета и RGB
Цвет в 1С задают тремя способами. Выбор влияет на то, как строка будет смотреться у разных пользователей.
| Способ | Пример | Когда использовать |
|---|---|---|
| RGB | Новый Цвет(255, 228, 225) | Нужен точный оттенок, разовая задача |
| Веб-цвет | WebЦвета.Красный | Быстро, без подбора чисел |
| Цвет стиля | ЦветаСтиля.ИмяЭлемента | Типовые конфигурации и всё, что должно быть единым по базе |
Элементы стиля создают в дереве конфигурации: Общие → Элементы стиля. Задаёте элемент типа «Цвет», например «ЦветПросроченногоДокумента», и в коде пишете ЦветаСтиля.ЦветПросроченногоДокумента. Через год вы захотите сменить оттенок — поменяете его в одном месте, а не в двадцати формах.
Несколько правил подбора:
- 🌈 Для фона берите светлые оттенки: компоненты RGB от 200 до 255. Тёмный фон съедает чёрный текст.
- 🔴 Красный текст оставьте для действительно плохого: минус, просрочка, ошибка.
- ⚪ Серый текст хорошо показывает «неактивные» строки: непроведённые, архивные, закрытые.
- 👁 Не кодируйте смысл только цветом. Добавьте жирный шрифт или значок: часть пользователей плохо различает красный и зелёный.
Шрифт задаётся конструктором Новый Шрифт(Имя, Размер, Жирный, Наклонный, Подчеркнутый, Зачеркнутый). Пустые параметры наследуются от текущего шрифта, поэтому Новый Шрифт(, , Истина) даёт жирный текст того же размера.
Подсветка строки по статусу документа
На практике одним цветом не обходятся. Документ может быть черновиком, проведённым, просроченным или помеченным на удаление. Для каждого статуса заводят своё правило.
Схема для журнала заказов покупателей:
| Статус | Условие | Оформление |
|---|---|---|
| Черновик | Проведен = Ложь | Серый текст |
| Просрочен | ДатаОплаты < ТекущаяДата и не оплачен | Светло-розовый фон |
| Крупный | СуммаДокумента > 500000 | Жирный шрифт |
| Помечен на удаление | ПометкаУдаления = Истина | Зачёркнутый шрифт |
Следите за конфликтами. Если два правила меняют один параметр (например, оба красят фон), строка получит цвет только одного из них, и результат зависит от порядка правил. Проверьте, переставив правило стрелками в списке. Правила с разными параметрами (фон и шрифт) складываются: просроченный крупный заказ будет и розовым, и жирным.
Сравнение с текущей датой
Отбор условного оформления сравнивает поле с константой, а не с выражением. Поэтому «просрочен» делают одним из двух способов:
- Добавляют в запрос динамического списка вычисляемое поле, например
ВЫБОР КОГДА ДатаОплаты < &ТекущаяДата ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК Просрочен, задают параметр списка вПриСозданииНаСервереи строят отбор по полюПросрочен. - Задают в правиле в качестве правого значения стандартную дату начала дня: при создании формы подставляют
НачалоДня(ТекущаяДатаСеанса()).
Первый способ надёжнее. Признак считается на стороне СУБД, и логика видна в одном месте.
Несколько условий в одном правиле
Если строка должна краситься только при выполнении двух условий сразу, добавьте в отбор группу:
Группа = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
Условие1 = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Условие1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Проведен");
Условие1.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Условие1.ПравоеЗначение = Истина;
Условие2 = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Условие2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.СуммаДокумента");
Условие2.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Условие2.ПравоеЗначение = 500000;
Для «или» используйте ГруппаИли. Элементы, добавленные прямо в Отбор.Элементы без группы, по умолчанию объединяются через «И».
Почему цвет не появляется и как не замедлить форму
Ниже частые причины, по которым правило есть, а строка остаётся белой.
Скорость: что тормозит, а что нет
Условное оформление считает платформа, а не ваш код, поэтому само по себе оно почти бесплатно. Тормозят решения вокруг него:
- 🐢 Поле условия через несколько точек — например,
Список.Контрагент.ОсновнойДоговор.Срок. Каждое разыменование превращается в соединение в запросе. Вынесите нужное значение в запрос динамического списка. - 🐢 Тяжёлый код в ПриВыводеСтроки в обычных формах. Обработчик вызывается при каждой прокрутке. Никаких запросов к базе внутри, только данные строки.
- 🐢 Десятки правил на одну форму. Каждое правило — отдельная проверка для каждой видимой строки. Объединяйте условия группами.
- ✅ Вычисляемые поля в запросе — самый быстрый путь: признак готов к моменту вывода.
Для сложной логики, которую нельзя выразить запросом, у динамического списка есть серверное событие ПриПолученииДанныхНаСервере. Оно получает порцию строк и позволяет задать оформление каждой строке отдельно. Пользуйтесь им, только если условного оформления и вычисляемых полей не хватает: код там выполняется на каждую порцию данных.
Правку формы в рабочей базе делайте после резервной копии и вне рабочего времени: обновление конфигурации базы данных при подключённых пользователях может не пройти.
Частые вопросы
Можно ли выделить строку цветом вручную, без условия?
Сохранится ли цвет при выгрузке списка в Excel?
Будет ли подсветка работать в веб-клиенте и на мобильном?
Как подсветить строку в печатной форме документа?
Область.ЦветФона.