При разработке интерфейсов в управляемом приложении 1С часто возникает задача визуального выделения строк в списке документов или справочников. Например, необходимо подсветить красным цветом договоры, срок действия которых подходит к концу или уже истек. Начинающие разработчики нередко пытаются решить эту задачу простым перебором элементов в цикле и обращением к свойствам элементов формы, однако такой подход приводит к ошибкам.
Разберем типичную ошибку, выясним причину такого поведения платформы и подробно рассмотрим правильные способы настройки подсветки строк.
Рассмотрим пример кода, в котором выполняется попытка раскрасить строки списка договоров:
&НаСервере
Процедура ПроверитьСрокиОкончанияНаСервере()
ТекДата = ТекущаяДата();
Выборка = Справочники.Договоры.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ДатаОкончания - ТекДата <= 5184000 И Выборка.ДатаОкончания >= ТекДата Тогда
Элементы.СписокДоговоров.ТекущийЭлемент.ЦветФона = WebЦвета.Красный;
Сообщить("Договор № " + Выборка.Наименование + " заканчивается " + Формат(Выборка.ДатаОкончания, "ДЛФ=ДД"));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем, почему этот алгоритм работает некорректно:
Справочники.Договоры.Выбрать() считывает записи из базы данных на сервере. Она никак не связана с отображением строк на клиенте.Элементы.СписокДоговоров.ТекущийЭлемент.ЦветФона обращается к визуальному элементу управления (самой таблице или текущей колонке), а не к конкретной записи в базе. В результате меняется фон всей таблицы или активной колонки для всех отображаемых строк сразу.Для решения задач динамического оформления строк в управляемом приложении используется штатный механизм платформы — Условное оформление.
Рассмотрим, как настроить условное оформление формы программно в процедуре-обработчике ПриСозданииНаСервере. Мы создадим правило, которое будет сравнивать дату окончания договора с текущей датой сеанса.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем новый элемент условного оформления формы
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Задаем цвет фона
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
// Настраиваем условие отбора
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.ДатаОкончания");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
ЭлементОтбора.ПравоеЗначение = ТекущаяДатаСеанса();
ЭлементОтбора.Использование = Истина;
// Если список оформляемых полей пуст, выделяется вся строка целиком.
// Если нужно выделить только поле "ДатаОкончания", раскомментируйте код ниже:
// ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
// ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДатаОкончания");
КонецПроцедуры
Обратите внимание на важный нюанс: если в коллекцию Поля элемента оформления не добавлять конкретные поля, то платформа применит цвет ко всей строке целиком.
Если условие раскраски содержит сложную логику (например, попадание даты в интервал «договор истекает в течение ближайших 60 дней»), удобнее всего рассчитать признак непосредственно в тексте запроса динамического списка.
Разберем по шагам, как это реализовать:
Список (тип ДинамическийСписок).ВЫБОР:
ВЫБРАТЬ
СправочникДоговоры.Ссылка КАК Ссылка,
СправочникДоговоры.Наименование КАК Наименование,
СправочникДоговоры.ДатаОкончания КАК ДатаОкончания,
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(СправочникДоговоры.ДатаОкончания, ДЕНЬ, -60) <= &ТекДата
И СправочникДоговоры.ДатаОкончания >= &ТекДата
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ДоговорЗаканчивается
ИЗ
Справочник.Договоры КАК СправочникДоговоры
ПриСозданииНаСервере установим значение параметра &ТекДата:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Список.Параметры.УстановитьЗначениеПараметра("ТекДата", НачалоДня(ТекущаяДатаСеанса()));
КонецПроцедуры
ДоговорЗаканчивается. Сделать это можно как в конфигураторе в свойствах формы (раздел «Условное оформление»), так и программно через компоновщик настроек:
&НаСервере
Процедура НастроитьОформлениеСписка()
ЭлементОформления = Список.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоРозовый);
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДоговорЗаканчивается");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
Если нет необходимости вносить изменения в конфигурацию, любой пользователь может настроить выделение строк самостоятельно прямо в режиме «1С:Предприятие»:
Дата окончания Меньше или равно [Текущая дата]).Таким образом, использование механизма условного оформления полностью избавляет от необходимости писать тяжелые циклы перебора данных и позволяет быстро и корректно раскрашивать строки формы списка под любые требования.