Как закрасить дни в календаре 1С при наличии записей в регистре?

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

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

Использование события ПриВыводеПериода

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

В процедуру передается параметр ОформлениеПериода, который содержит коллекцию Даты. Каждая дата в этой коллекции имеет свойства оформления: ЦветФона, ЦветТекста, Шрифт и другие. Рассмотрим пример кода, который закрашивает даты, предшествующие текущему дню:


Процедура КалендарьПриВыводеПериода(Элемент, ОформлениеПериода)
    Для Каждого ТекДата Из ОформлениеПериода.Даты Цикл
        Если ТекДата.Дата < ТекущаяДата() Тогда
            ТекДата.ЦветФона = Новый Цвет(83, 106, 194); // Синий оттенок
            ТекДата.ЦветТекста = Новый Цвет(255, 255, 255); // Белый текст
        КонецЕсли; 
    КонецЦикла;
КонецПроцедуры

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

Оптимизация производительности: работа с кэшем

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

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

Рассмотрим пример реализации с использованием кэширования:


// В модуле формы создадим переменную для хранения дат
Перем КэшРаскрашенныхДат;

Процедура ПриОткрытии()
    КэшРаскрашенныхДат = Новый Соответствие;
    // Здесь должен быть запрос к регистру сведений
    Выборка = РегистрыСведений.ЗанятостьПериодов.Выбрать();
    Пока Выборка.Следующий() Цикл
        ТекДата = НачалоДня(Выборка.ДатаНачала);
        Пока ТекДата <= НачалоДня(Выборка.ДатаОкончания) Цикл
            КэшРаскрашенныхДат.Вставить(ТекДата, Истина);
            ТекДата = ТекДата + 86400; // Переход к следующему дню
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Процедура КалендарьПриВыводеПериода(Элемент, ОформлениеПериода)
    Для Каждого ОформлениеДаты Из ОформлениеПериода.Даты Цикл
        Если КэшРаскрашенныхДат.Получить(НачалоДня(ОформлениеДаты.Дата)) <> Неопределено Тогда
            ОформлениеДаты.ЦветФона = WebЦвета.СветлоЗеленый;
            ОформлениеДаты.Шрифт = Новый Шрифт(,,Истина); // Выделение жирным
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Расширенные возможности оформления

Свойство ОформлениеДаты позволяет не только менять цвета. Выясним, какие еще возможности доступны программисту 1С для улучшения визуализации:

1. Использование отметок. Свойство Отметка позволяет вывести в ячейке даты специальный маркер (например, маленькую галочку или точку). Это полезно, если вы не хотите полностью менять цвет фона, а лишь хотите сигнализировать о наличии события в этот день.

2. Изменение текста. Свойство Текст позволяет заменить стандартное число месяца на произвольную строку. Однако использовать это нужно осторожно, чтобы не нарушить читаемость календарной сетки.

3. Границы периодов. При раскрашивании интервалов (от Даты Начала до Даты Окончания) всегда приводите время к началу дня с помощью функции НачалоДня(). Это гарантирует, что сравнение дат будет корректным, даже если в регистре время указано с точностью до секунд.

Альтернативные подходы в управляемых формах

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

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

← На главную