Как настроить динамическое условное оформление в 1С для дат старше 3 лет?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в среде 1С часто возникает задача визуального выделения строк в списках по динамическим условиям. Например, нам необходимо выделить в регистре сведений или динамическом списке документы или записи, у которых определенная дата (в нашем примере — ДатаКонца обучения слушателя) отстает от текущей даты более чем на 3 года. Сложность заключается в том, что текущая дата постоянно меняется. Если настраивать условное оформление интерактивно через конфигуратор, платформа предложит выбрать лишь фиксированное значение даты, что нам категорически не подходит.

В этой статье мы подробно разберем, как решить эту задачу изящно и в соответствии со стандартами разработки фирмы «1С». Мы рассмотрим два основных и наиболее эффективных подхода: программное добавление условного оформления и использование произвольного запроса в динамическом списке.

Метод 1. Программная настройка условного оформления (Рекомендуемый)

Программная установка параметров условного оформления — это наиболее надежный и гибкий способ решения подобных задач. Мы выполним настройку динамического списка непосредственно в модуле формы при ее инициализации на сервере. Это гарантирует, что оформление применится у всех пользователей, независимо от их локальных настроек и кэша.

Рассмотрим по шагам, как реализовать этот алгоритм в обработчике события ПриСозданииНаСервере:

  1. Вычислим пограничную дату. Так как нам нужно выделить записи старше 3 лет, мы вычтем 36 месяцев из текущей даты с помощью функции встроенного языка ДобавитьМесяц.
  2. Добавим новый элемент условного оформления в коллекцию динамического списка.
  3. Зададим визуальные свойства оформления (например, изменим цвет текста или фон строки).
  4. Сформируем условие отбора (компоновку данных), сравнивая поле ДатаКонца со значением пограничной даты по принципу «Меньше или равно».
  5. Определим список оформляемых полей. Если поле не указать, оформится вся строка целиком.

Проанализируем пример готового программного кода:


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

Такой подход полностью решает проблему динамического изменения даты и избавляет разработчика от необходимости вручную обновлять настройки в конфигураторе при изменении бизнес-логики.

Метод 2. Использование произвольного запроса в динамическом списке

Если мы хотим избежать написания объемного программного кода по созданию элементов компоновки данных, мы можем перенести логику расчета условий в сам запрос динамического списка. Это позволит нам настраивать условное оформление стандартным интерактивным способом (через свойства списка в конфигураторе или прямо в режиме «1С:Предприятие»).

Выясним, как это сделать по шагам:

  1. Откроем свойства динамического списка Список на форме и установим флаг Произвольный запрос.
  2. Перейдем в редактирование текста запроса и добавим в выборку новое вычисляемое поле. Для этого применим конструкцию ВЫБОР и стандартную функцию языка запросов ДОБАВИТЬКДАТЕ:

ВЫБРАТЬ
    РегСлушатели.Ссылка КАК Ссылка,
    РегСлушатели.ДатаКонца КАК ДатаКонца,
    ВЫБОР
        КОГДА РегСлушатели.ДатаКонца < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ГОД, -3)
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ПросроченоНа3Года
ИЗ
    РегистрСведений.Слушатели КАК РегСлушатели
  1. Затем нам необходимо передать значение параметра &ТекущаяДата в модуль формы при ее открытии. В обработчике ПриСозданииНаСервере пишем простую строку:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Список.Параметры.УстановитьЗначениеПараметра("ТекущаяДата", ТекущаяДата());
КонецПроцедуры
  1. Теперь нам доступно новое булево поле ПросроченоНа3Года. Мы можем зайти в свойства условного оформления динамического списка прямо в конфигураторе и настроить простое условие: ПросроченоНа3Года Равно Истина. Визуальное оформление (например, серый цвет фона) привязываем к этому условию. Это очень удобно и наглядно.

Важные тонкости и стандарты разработки «1С»

При реализации условного оформления важно учитывать несколько ключевых особенностей платформы 1С:Предприятие, которые могут повлиять на стабильность работы формы и производительность системы.

1. Проблема пользовательских настроек (кэш форм)

Если вы настраиваете условное оформление интерактивно в свойствах списка внутри конфигуратора, платформа сохраняет эти настройки в кэш для каждого пользователя персонально. Если завтра вы решите изменить цвет оформления с красного на оранжевый, пользователи, которые уже открывали эту форму ранее, изменений не увидят (у них подгрузятся старые настройки из кэша). Именно поэтому программная настройка в коде (Метод 1) является приоритетной и рекомендуется стандартами разработки «1С» — она гарантирует применение актуального оформления у всех пользователей без очистки кэша.

2. Использование свойства «Использовать всегда»

Если вы выполняете отбор по какому-то полю (например, ДатаКонца), но сама колонка не выведена на форму (пользователь скрыл ее через «Изменить форму»), платформа в целях оптимизации трафика может не получать данные этого поля из СУБД. В таком случае условное оформление перестанет работать. Чтобы избежать этой проблемы, обязательно включите флаг Использовать всегда для поля ДатаКонца в настройках динамического списка (на вкладке «Данные») конфигуратора или сделайте это программно в коде:

Список.УстановитьОбязательноеИспользование("ДатаКонца", Истина);

3. Производительность интерфейса

Всегда настраивайте условное оформление применительно к конкретному динамическому списку (Список.УсловноеОформление), а не ко всей форме целиком (ЭтаФорма.УсловноеОформление). Оформление на уровне списка обрабатывается платформой оптимизировано и снижает нагрузку на рендеринг интерфейса в тонком и веб-клиенте.

4. Обновление даты в реальном времени

Если пользователи работают в программе непрерывно в течение всего дня, а пограничная дата критична до минут, то однократного расчета в ПриСозданииНаСервере может не хватить. Для динамического обновления пороговой даты «на лету» без перезапуска формы можно подключить обработчик ожидания на клиенте, который будет раз в час обновлять параметр &ТекущаяДата в динамическом списке.

Мы подробно разобрали, как реализовать динамическое условное оформление. Выбирайте наиболее подходящий для вашего проекта метод и делайте интерфейсы ваших решений удобными и понятными для пользователей!

← На главную