Как в универсальном отчете настроить выделение ячеек цветом, если дата окончания наступает в течение ближайшего месяца?

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

При работе с отчетами в системе «1С:Предприятие» часто возникает задача визуального контроля сроков. Например, бухгалтеру или менеджеру необходимо видеть, у каких контрагентов срок действия договора или подписки ИТС истекает в течение ближайших 30 дней. Реализация такой задачи в Универсальном отчете или через Систему компоновки данных (СКД) имеет свои технические нюансы, особенно когда речь идет о динамическом сравнении с текущей датой.

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

Решение проблемы в Системе компоновки данных (СКД)

Если ваш отчет построен на базе СКД, наиболее правильным и стабильным решением будет использование вычисляемых полей и системных функций работы с датами. Рассмотрим ситуацию: нам нужно выделить цветом ячейку ДатаОкончания, если до этой даты осталось меньше месяца.

Шаг 1. Использование функции ТекущаяДатаСеанса()

Проанализируем типичную ошибку: использование функции ТекущаяДата(). В клиент-серверном варианте работы эта функция может вернуть время сервера, которое отличается от времени пользователя. Поэтому мы рекомендуем всегда использовать ТекущаяДатаСеанса(). Это гарантирует корректность расчетов независимо от часовых поясов.

Шаг 2. Создание вычисляемого поля-флага

Вместо того чтобы загромождать вкладку «Условное оформление» сложными формулами, создадим в схеме компоновки Вычисляемое поле. Назовем его, например, СрокИстекает. В колонке «Выражение» пропишем следующую логику:


ВЫБОР 
    КОГДА ДатаОкончания <> ДАТАВРЕМЯ(1, 1, 1) 
        И ДатаОкончания <= ДОБАВИТЬКДАТЕ(ТекущаяДатаСеанса(), "МЕСЯЦ", 1) 
        И ДатаОкончания >= ТекущаяДатаСеанса()
    ТОГДА Истина 
    ИНАЧЕ Ложь 
КОНЕЦ

Разберем, что делает это выражение. Функция ДОБАВИТЬКДАТЕ прибавляет к текущему моменту времени ровно один календарный месяц. Мы проверяем три условия: дата не пустая, она меньше или равна «сегодня + 1 месяц» и она еще не прошла (больше или равна сегодня). Это позволит избежать окрашивания старых, уже просроченных дат, если это не предусмотрено вашей задачей.

Шаг 3. Настройка оформления

Теперь перейдем на вкладку «Настройки», далее выберем «Условное оформление». Добавим новый элемент:

  1. Оформление: установим нужный цвет фона (например, желтый или светло-красный).
  2. Условие: выберем наше вычисляемое поле СрокИстекает и установим вид сравнения «Равно», значение «Да» (Истина).
  3. Оформляемые поля: если мы хотим подсветить только дату, выбираем поле ДатаОкончания. Если нужно выделить всю строку, оставляем этот список пустым.

Решение для Универсального отчета на обычных формах (Построитель отчета)

В конфигурациях типа «Управление производственным предприятием» (УПП) или «Управление торговлей 10.3» часто используется старый Построитель отчета. В нем интерфейс настройки условного оформления ограничен и не позволяет вводить формулы типа «Текущая дата + 1 месяц» напрямую пользователем.

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

Рассмотрим пример кода, который нужно разместить в процедуре перед формированием отчета:


// Получаем доступ к условному оформлению построителя
Условие = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("СрочныеДоговоры", "СрочныеДоговоры");

// Определяем, какую область будем оформлять (ячейку с датой)
Условие.Область.Добавить("ДатаОкончания", "ДатаОкончания", ТипОбластиОформления.Поле);

// Настраиваем отбор: сравниваем дату из данных с вычисленным значением
Условие.Отбор.Добавить("ДатаОкончания");
Условие.Отбор["ДатаОкончания"].Использование = Истина;
Условие.Отбор["ДатаОкончания"].ВидСравнения = ВидСравнения.МеньшеИлиРавно;

// Вычисляем граничную дату: сегодня + 1 месяц
ГраничнаяДата = ДобавитьМесяц(ТекущаяДатаСеанса(), 1);
Условие.Отбор["ДатаОкончания"].Значение = ГраничнаяДата;

// Устанавливаем визуальные свойства
Условие.Оформление.ЦветФона.Значение = Новый Цвет(255, 255, 0); // Желтый
Условие.Оформление.ЦветФона.Использование = Истина;
Условие.Использование = Истина;

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

Важные технические моменты и «подводные камни»

Разберем несколько критических ситуаций, с которыми часто сталкиваются разработчики при реализации подобных задач.

Проблема «Пустых дат»

В системе 1С пустая дата (01.01.0001) технически меньше любой текущей даты. Если в вашем отчете есть записи, где дата окончания не заполнена, условие ДатаОкончания <= ГраничнаяДата сработает и для них. В итоге все пустые ячейки окрасятся в яркий цвет, что создаст визуальный шум. Чтобы этого избежать, всегда добавляйте в условие проверку: ДатаОкончания Заполнено (в СКД) или ДатаОкончания > ДатаВремя(1, 1, 1) (в коде).

Оформление всей строки против конкретного поля

Часто пользователи просят выделять цветом не одну ячейку, а всю строку документа.

Точность до секунды

При использовании ТекущаяДатаСеанса() помните, что она содержит время. Если в поле ДатаОкончания время не указано (00:00:00), а проверка идет в середине дня, сравнение может сработать не так, как ожидается. Для более точного контроля сроков в днях рекомендуется использовать функцию НачалоДня() для обеих сравниваемых величин:

НачалоДня(ДатаОкончания) <= НачалоДня(ДобавитьМесяц(ТекущаяДатаСеанса(), 1))

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

← На главную