Как программно изменить условное оформление динамического списка для выделения просроченных дат

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

В процессе разработки интерфейсов на платформе 1С:Предприятие 8 часто возникает задача визуального выделения данных, требующих внимания пользователя. Одной из самых популярных задач является подсветка «просроченных» строк — например, когда дата в документе или справочнике меньше текущей. Несмотря на то что пользователь может настроить такое оформление самостоятельно через меню «Еще — Настроить список», разработчику важно уметь реализовывать это программно, чтобы настройки применялись автоматически и были стандартизированы для всех пользователей.

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

Основные механизмы программного управления оформлением

Программная настройка оформления выполняется через обращение к свойству динамического списка УсловноеОформление. Это коллекция элементов типа ЭлементУсловногоОформленияКомпоновкиДанных. Процесс добавления нового правила оформления можно разделить на четыре ключевых этапа:

  1. Создание нового элемента оформления в коллекции.
  2. Настройка визуальных свойств (цвет текста, шрифт, цвет фона).
  3. Формирование условия, при котором оформление должно сработать.
  4. Определение списка полей (колонок), к которым будет применено данное оформление.

Рассмотрим по шагам, как реализовать это в коде. Чаще всего инициализацию оформления выполняют в процедуре ПриСозданииНаСервере формы.

Реализация условия «Меньше текущей даты»

Разберем конкретный пример: нам нужно выделить красным цветом текст в колонке Дата, если она меньше сегодняшнего дня. Проанализируем код, который решает эту задачу:


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

КонецПроцедуры

Выясним причину использования функции НачалоДня(). Если в поле динамического списка хранится дата со временем (например, 01.10.2023 14:00), а мы просто сравним её с ТекущаяДата(), то записи, созданные сегодня утром, уже будут считаться «меньшими» и покрасятся в красный. Использование начала текущего дня гарантирует, что выделятся только записи за вчерашний день и старше.

Работа с динамической датой и обновление списка

Рассмотрим ситуацию: пользователь открыл форму в 23:50 и работает в ней до 00:10 следующего дня. В 00:00 понятие «сегодня» изменилось, но программно установленное условие в динамическом списке все еще содержит «старую» дату, которая была актуальна на момент открытия формы. В этом случае условное оформление станет некорректным.

Для решения этой проблемы проанализируем возможности обновления данных. Мы можем вынести установку даты в отдельный обработчик. Хорошим вариантом является использование серверного события ПриОбновленииСоставаОтображаемыхДанныхНаСервере. Однако, стоит помнить о нагрузке: это событие вызывается часто. Более рационально использовать обработчик ожидания на клиенте, который раз в час или раз в сутки будет инициировать обновление оформления на сервере.

Хитрость с отладчиком для сложных условий

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

  1. Зайти в пользовательский режим «1С:Предприятие».
  2. Настроить нужное оформление интерактивно через «Настроить список».
  3. В конфигураторе поставить точку останова в процедуре, где доступен объект Список.
  4. В отладчике найти Список.УсловноеОформление и изучить структуру созданных элементов.

Посмотрим на структуру в отладчике и просто скопируем нужные параметры в программный код. Это значительно экономит время на поиске имен параметров оформления (таких как Шрифт, ЦветФона, ОтметкаНезаполненного).

Приоритетность и производительность

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

Проанализируем влияние на производительность. Условное оформление рассчитывается на клиенте при отрисовке каждой строки списка. Если список содержит десятки тысяч записей, а условие оформления включает в себя сложные функции или проверяет множество полей, пользователь может заметить «подтормаживание» при прокрутке. Рекомендация: всегда указывайте конкретные ОформляемыеПоля. Подсветка одной ячейки (например, только даты) работает быстрее, чем перекрашивание всей строки целиком.

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

← На главную