При разработке интерфейсов в конфигурациях на обычных формах (например, «1С:Бухгалтерия предприятия 2.0») часто возникает задача визуального разделения строк. Пользователям удобно сразу видеть состояние документа прямо в журнале или списке: например, подсвечивать зеленым цветом полностью оплаченные счета, а красным — неоплаченные. В управляемых формах («1С:Бухгалтерия 3.0») для этого предусмотрен визуальный механизм Условное оформление, однако в обычных формах логика оформления реализуется программно в модуле формы списка.
Разберем по шагам, как правильно реализовать раскраску строк и отдельных колонок, а также выясним, какие подводные камни могут повлиять на быстродействие программы.
Прежде чем переходить к визуальной части, проанализируем логику вычисления статуса. Типичная ошибка — вычислять оплату запросом только при записи документа «Счет на оплату». В реальной работе документ оплаты («Поступление на расчетный счет») проводится позже выставления счета. Если статус хранится как реквизит счета и рассчитывается при его записи, то после проведения оплаты статус счета останется неактуальным до тех пор, пока пользователь вручную не откроет и не перезапишет счет.
Для корректной работы статуса рекомендуется выбрать один из двух подходов:
ОбработкаПроведения и ОбработкаУдаленияПроведения для документов оплаты. В обработчике следует находить связанные счета из табличной части и обновлять их реквизит статуса.Рассмотрим базовый способ раскраски списка. Для табличного поля, отображающего список документов, платформа предоставляет событие ПриВыводеСтроки. Это событие вызывается платформой автоматически при отрисовке каждой видимой строки на экране.
Чтобы назначить обработчик, откроем форму списка документов в конфигураторе, перейдем в свойства табличного поля (элемента управления со списком документов) и нажмем кнопку с лупой напротив события ПриВыводеСтроки.
Посмотрим на пример кода, который меняет цвет фона и текста для всей строки:
Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Проверяем значение реквизита в отображаемой строке
Если ДанныеСтроки.Оплата = Перечисления.ОплатаСчета.Оплачен Тогда
ОформлениеСтроки.ЦветТекста = WebЦвета.ТемноЗеленый;
ОформлениеСтроки.ЦветФона = WebЦвета.СветлоЗеленый;
ИначеЕсли ДанныеСтроки.Оплата = Перечисления.ОплатаСчета.ОплаченЧастично Тогда
ОформлениеСтроки.ЦветТекста = WebЦвета.Оранжевый;
ИначеЕсли ДанныеСтроки.Оплата = Перечисления.ОплатаСчета.НеОплачен Тогда
ОформлениеСтроки.ЦветТекста = WebЦвета.Красный;
КонецЕсли;
КонецПроцедуры
Если требуется раскрасить не всю строку целиком, а только конкретную ячейку (например, колонку с названием «Оплата» или «СуммаДокумента»), мы обращаемся к коллекции Ячейки объекта ОформлениеСтроки:
Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки.Оплата = Перечисления.ОплатаСчета.Оплачен Тогда
ОформлениеСтроки.Ячейки.Оплата.ЦветТекста = WebЦвета.Зеленый;
ИначеЕсли ДанныеСтроки.Оплата = Перечисления.ОплатаСчета.НеОплачен Тогда
ОформлениеСтроки.Ячейки.Оплата.ЦветТекста = WebЦвета.Красный;
КонецЕсли;
КонецПроцедуры
Важное предупреждение о производительности: в процедуре ПриВыводеСтроки категорически запрещено выполнять запросы к базе данных или обращаться через точку к сложным реквизитам ссылочных типов (например, ДанныеСтроки.Контрагент.ИНН). Событие срабатывает многократно при каждой перерисовке и прокрутке списка. Любое обращение к базе данных в этом месте приведет к сильному зависанию интерфейса.
Кроме того, платформа в обычном приложении повторно использует визуальные элементы строк при прокрутке. Если условие не выполнено, оформление нужно явно сбрасывать в исходное состояние (например, присваивать цвет по умолчанию), чтобы избежать «залипания» цветов на соседних строках.
Проанализируем второй, более производительный метод оформления — событие ПриПолученииДанных. В отличие от ПриВыводеСтроки, этот обработчик вызывается платформой не по одной строке, а сразу для пачки отображаемых на экране записей.
В параметрах обработчика передается коллекция ОформленияСтрок. Это позволяет при необходимости собрать массив ссылок всех отображаемых документов, выполнить ровно один запрос к базе данных для получения дополнительных сведений и раскрасить строки пакетом.
Рассмотрим пример реализации:
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
Если ДанныеСтроки = Неопределено Тогда
Продолжить;
КонецЕсли;
// Раскрашиваем ячейку определенной колонки
Если ДанныеСтроки.Оплата = Перечисления.ОплатаСчета.Оплачен Тогда
ОформлениеСтроки.Ячейки.Оплата.ЦветТекста = WebЦвета.ТемноЗеленый;
ИначеЕсли ДанныеСтроки.Оплата = Перечисления.ОплатаСчета.ОплаченЧастично Тогда
ОформлениеСтроки.Ячейки.Оплата.ЦветТекста = WebЦвета.Оранжевый;
ИначеЕсли ДанныеСтроки.Оплата = Перечисления.ОплатаСчета.НеОплачен Тогда
ОформлениеСтроки.Ячейки.Оплата.ЦветТекста = WebЦвета.Красный;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Помимо цвета текста и фона, объект оформления ячейки предоставляет дополнительные визуальные возможности:
ОформлениеСтроки.Ячейки.ИмяКолонки.УстановитьКартинку(Картинка), чтобы отображать кружки-индикаторы или иконки статуса.Шрифт позволяет выделить важные строки или ячейки полужирным начертанием, что делает форму более информативной без перегрузки цветами.