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