Как в отчете СКД выделить цветом выходные и праздничные дни?

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

В процессе разработки отчетов на системе компоновки данных (СКД) часто возникает задача визуального выделения определенных дат. Окрашивание выходных дней в красный цвет — это классический пример, который значительно повышает читаемость отчета. Однако реализация этой задачи может варьироваться от простой настройки в несколько кликов до сложной архитектурной доработки, если требуется учитывать государственные праздники и переносы. Рассмотрим подробно все доступные методы решения этой задачи.

Метод 1: Простое условное оформление для субботы и воскресенья

Начнем с самого простого сценария: нам нужно выделить только стандартные выходные дни (субботу и воскресенье). В этом случае нам не требуется изменять запрос или создавать дополнительные объекты в базе данных. Вся настройка выполняется непосредственно в схеме компоновки данных.

Разберем алгоритм действий по шагам:

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

Проанализируем выражение для условия. В СКД можно использовать логику, проверяющую порядковый номер дня недели. Рассмотрим пример выражения, которое можно прописать в условии:

ДЕНЬНЕДЕЛИ(ДатаОтправки) В СПИСКЕ (6, 7)

Где 6 — это суббота, а 7 — воскресенье. После этого в колонке Оформляемые поля выберем только поле ДатаОтправки, чтобы не окрашивать всю строку целиком, если это не требуется по задаче. Этот метод максимально эффективен, когда не нужно учитывать праздничные дни, которые могут выпадать на будни.

Метод 2: Использование регистра сведений для учета праздников

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

Рассмотрим архитектуру решения. Создадим справочник ГрафикиРаботы и регистр сведений ДанныеГрафикаРаботы со следующей структурой:

После заполнения этого регистра мы можем изменить запрос нашего отчета в СКД. Проанализируем пример запроса с использованием левого соединения:


ВЫБРАТЬ
    Продажи.ДатаОтправки КАК ДатаОтправки,
    Продажи.Груз КАК Груз,
    ЕСТЬNULL(Календарь.ВидДня, ЗНАЧЕНИЕ(Перечисление.ВидыДней.Рабочий)) КАК ВидДня
ИЗ
    Документ.Отгрузка КАК Продажи
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственныхКалендарей КАК Календарь
    ПО НАЧАЛОПЕРИОДА(Продажи.ДатаОтправки, ДЕНЬ) = Календарь.Дата

В данном случае мы получаем признак ВидДня прямо в наборе данных. Теперь в условном оформлении мы можем задать условие: ВидДня Равно Значение(Перечисление.ВидыДней.Выходной) или ВидДня Равно Значение(Перечисление.ВидыДней.Праздник). Это универсальный способ, который позволяет гибко управлять раскраской в зависимости от реального производственного календаря предприятия.

Метод 3: Использование вычисляемых полей и общих модулей

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

Выясним причину, почему это удобно: вы централизуете логику. Если правила изменятся, вам не придется править каждый отчет. В схеме на закладке Вычисляемые поля добавим поле ЭтоВыходной и в выражении укажем:

ИмяВашегоОбщегоМодуля.ЭтоВыходнойДень(ДатаОтправки)

Сам код в общем модуле (с флагом «Вызов сервера») может выглядеть следующим образом:


Функция ЭтоВыходнойДень(ПроверяемаяДата) Экспорт
    Если ДеньНедели(ПроверяемаяДата) > 5 Тогда
        Возврат Истина;
    КонецЕсли;
    // Здесь можно добавить запрос к регистру праздников
    Возврат Ложь;
КонецФункции

Важный нюанс: при использовании функций общих модулей в СКД убедитесь, что функция помечена как Экспорт, иначе система компоновки не сможет её вызвать в процессе формирования отчета.

Метод 4: Решение проблемы с «Дополнением периодов»

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

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

В выражении вычисляемого поля нужно использовать проверку isnull или обращаться к функции модуля, так как вычисляемые поля рассчитываются для каждой строки результата, включая те, что были созданы механизмом дополнения. Также обратите внимание на агрегатные функции. Если дата используется в группировке, для ресурса РабочийДень лучше использовать функцию Максимум(РабочийДень), чтобы корректно передать признак на уровень группировки.

Также полезно использовать конструкцию isnull в параметрах виртуальных таблиц или в условиях фильтрации запроса, как это было предложено в одном из решений форума:

ГДЕ ЕСТЬNULL(Период, ПроизвКалендарь.Дата) МЕЖДУ &ДатаНач И &ДатаКон

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

Метод 5: Тонкая настройка области оформления

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

Если ваш отчет имеет иерархическую структуру (например, Месяц -> Неделя -> День), проверьте настройки оформления для иерархии. Иногда требуется, чтобы итоги по выходным дням не выделялись цветом, для этого в настройках элемента оформления на вкладке Дополнительно можно снять флаг В иерархии.

Подводя итог, отметим: для простых задач достаточно ДЕНЬНЕДЕЛИ в условном оформлении. Для серьезных корпоративных систем оптимальным решением будет связка регистра сведений «Производственный календарь» и вычисляемых полей СКД, что обеспечит максимальную точность и гибкость настроек.

← На главную