Артур Стамболцян
Fullstack-разработчик. Делаю быстрые и качественные веб-приложения.
После обновления коробочного Битрикс24 сотрудники перестали видеть события коллег. Владельцы при этом видели свои встречи, а сервер возвращал остальным успешный ответ с пустым списком событий.
Записи находились в базе. Повторное назначение прав доступа не помогало.
Данные уже использовали новую структуру, а календарь продолжал искать события через старые связи.
В рассмотренной реализации модуль выбирает способ чтения по настройке sectionStructureConverted:
| Значение | Откуда берётся привязка события к календарю |
|---|---|
N или настройка отсутствует | Старая связь EVENT_SECT.SECT_ID |
Y | Новое поле SECTION_ID |
На рабочем портале новое поле было заполнено, старых связей уже не было, а флаг оставался выключенным. Поэтому выборка чужого календаря возвращала пустой список.
Владелец видел собственные встречи благодаря дополнительному условию в коде выборки.
Причину проверили на тестовой копии: при переключении флага в N события исчезали, после запуска штатного обработчика возвращались. Получили воспроизводимый результат: события есть → пустой календарь → события снова есть.
Этот способ подходит для подтверждённого несоответствия структуры данных и флага конвертации. Сначала проверьте решение на копии и подготовьте резервную копию базы. Внутренние классы могут отличаться между версиями модуля.
В файле bitrix/modules/calendar/lib/update/sectionstructureupdate.php найдите класс SectionStructureUpdate.
В рассмотренной версии при отсутствии событий с SECTION_ID IS NULL он завершает конвертацию: выставляет флаг Y и удаляет сохранённый статус переноса, не обновляя записи событий.
Откройте Настройки → Инструменты → Командная PHP-строка и выполните код без открывающего тега PHP:
if (!\Bitrix\Main\Loader::includeModule('calendar'))
{
throw new \RuntimeException('Модуль calendar не подключён.');
}
$remaining = \Bitrix\Calendar\Internals\EventTable::getCount([
'=SECTION_ID' => null,
]);
if ($remaining > 0)
{
echo 'Остановлено: неперенесённых записей — '.$remaining;
return;
}
$result = [];
(new \Bitrix\Calendar\Update\SectionStructureUpdate())
->execute($result);
if (\Bitrix\Calendar\Util::isSectionStructureConverted())
{
(new \CPHPCache())->CleanDir(
\CCalendar::CachePath().'event_list'
);
echo 'Конвертация завершена. Кеш списков событий очищен.';
}
else
{
echo 'Флаг конвертации не изменился.';
}Код проверяет незаполненные поля по всему порталу. Если такие записи есть, он останавливается до внесения изменений.
Обновите страницу календаря. Проверьте собственные события и просмотр календаря коллеги под обычным пользователем и администратором.
Настройка общая для портала, поэтому исправление распространяется на календари, пострадавшие от этой причины. Права доступа и ограничения частных событий продолжают действовать.
Если флаг уже равен Y, остались записи с SECTION_ID = NULL или запрос завершается ошибкой, этот сценарий не подтверждён. Не переключайте настройку принудительно: сначала разберите состояние переноса или ошибку запроса.