🛠 Битрикс: подводные камни архивирования событий

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

Казалось бы, достаточно сравнить дату мероприятия с текущей. Но в одном из рабочих проектов на 1С-Битрикс выяснилось, что нюансов здесь значительно больше.

📌 С чего всё началось

Есть инфоблок с мероприятиями. У каждого элемента предусмотрены дата проведения ("PROPERTY_DATETIME") и признак архива ("ARCHIVE").

Задача — корректно разделять мероприятия на две группы:

— актуальные, которые ещё не завершились;

— архивные, которые уже прошли или были явно отмечены как архивные.

При этом нужно учитывать не только дату, но и время мероприятия, ручной признак архива и особенности работы компонентов Битрикс.

⚙️ Где возникают сложности

Первый очевидный вариант — использовать фильтр в "CIBlockElement::GetList" или передать его в "news.list".

Например, для отбора предстоящих событий:

">=PROPERTY_DATETIME" — текущая дата и время.

Но здесь возникает первый нюанс: что именно хранится в свойстве — дата или дата со временем?

Если сравнивать только календарные даты, мероприятие, завершившееся утром, может оставаться актуальным до конца дня.

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

В Битрикс для этого есть свои инструменты, например "DateTime::createFromUserTime()" и "ConvertTimeStamp()".

🧩 Второй нюанс — ручной архив

Не все мероприятия должны переходить в архив исключительно по времени.

Иногда элемент необходимо скрыть из актуального списка раньше, поэтому используется отдельное свойство "ARCHIVE".

И здесь фильтрация становится составной:

— дата мероприятия ещё не прошла;

— элемент не отмечен как архивный.

Для архивного списка логика обратная: мероприятие уже прошло или явно помечено как архивное.

Причём нужно учитывать, что "ARCHIVE" может быть свойством типа «Список», а значит, при построении фильтра важно правильно работать со значениями перечисления.

🔄 Третий нюанс — кеширование

Даже корректный фильтр не гарантирует, что пользователь сразу увидит правильный результат.

Представим, что мероприятие должно перейти в архив в 15:00, но компонент закешировал список в 14:55.

Если кеш продолжает действовать, элемент может оставаться в актуальных мероприятиях уже после наступления времени перехода.

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

💡 Что в итоге

Такие задачи хорошо показывают особенности работы с существующими CMS.

Внешне изменение небольшое: разделить список мероприятий на две части.

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

И самое интересное здесь — не количество написанного PHP-кода, а необходимость заранее продумать граничные сценарии.

А вам приходилось сталкиваться с ситуацией, когда корректная логика фильтрации работала неправильно именно из-за кеширования или особенностей хранения дат? Как решали?

#Битрикс #PHP #ВебРазработка