calendar · calendar 26.0.100 Заметное

calendar 26.0.100: почему у людей пропадали встречи при синхронизации с Google и iCloud

3 мин чтения

Маленький релиз с большими последствиями — исправлена потеря данных при импорте календаря. Если внешний сервис отдавал неполную страницу событий, Битрикс считал недостающие экземпляры удалёнными и вычищал их у себя. Публичного API изменение не трогает, но поставить его стоит всем, у кого работает синхронизация.

В чём была проблема

Импорт устроен так: получили от Google или iCloud список экземпляров повторяющегося события, сравнили с локальным, чего нет в ответе — удалили. Логика верная ровно при одном условии: ответ полный.

А ответ полный не всегда. При начальной синхронизации данные приходят страницами, и одна страница — это не весь набор. Экземпляр, который лежит на следующей странице, для процедуры сравнения выглядит точно так же, как удалённый у вендора: его нет в ответе. Результат — встреча исчезает из календаря пользователя, хотя её никто не удалял.

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

Как исправили

В DTO EventListResponse (и у Google, и у iCloud) появилось поле public bool $isPartial = false. Процедуры импорта проставляют его по ответу вендора, а AbstractEventImportProcessor::removeDeprecatedInstances() при isPartialResponse просто выходит, ничего не удаляя.

Ключевое разграничение — явные удаления применяются всегда. Google, присылающий событию статус cancelled, и iCloud, отвечающий 404, — это утверждение «этого события нет», ему верят при любом флаге. Подавляется только вывод удаления из факта отсутствия в списке.

Условия выставления флага стоит знать точно, потому что они не «всегда на всякий случай»:

  • Google: isPartial = true на начальной синхронизации (syncToken отсутствует), если в запросе был pageToken или в ответе есть nextPageToken. Одностраничный полный снимок — без pageToken на входе и без nextPageToken на выходе — очистку не отключает. Инкрементальная синхронизация (когда syncToken есть) не затрагивается вообще.
  • iCloud: аналогичный флаг на DTO; ICloudEventSynchronizer перестал безусловно выставлять syncToken из nextSyncToken на каждом ответе.

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

Заодно поправлена логика удаления

Роль master/owner против guest теперь берётся из локального события в $this->map, а не из внешнего. Причина техническая и показательная: у внешнего события getParentId() всегда null, так что определить по нему, экземпляр это или мастер, невозможно. Экземпляр повторения ищется через мастера и getSameInstance().

Что делать

  • Ставить, если у вас включена синхронизация с Google Calendar или iCloud. Это исправление потери пользовательских данных, а не улучшение.
  • Если пользователи жаловались на «пропали встречи после подключения календаря» — вот объяснение, и после обновления повторяться не должно.
  • Пишете свою синхронизацию с внешним источником — здесь хороший общий урок: отсутствие записи в ответе не равно её удалению, пока вы не уверены, что ответ полный.

Читайте дальше

calendar 25.195.0 Заметное Свежее

calendar 25.195.0: активность БП считает минуты встреч и перестала терять последний день

Точечный релиз вокруг одной активности бизнес-процессов — «Получить информацию из календаря». Она научилась отдавать списки заголовков и суммарные минуты встреч, а заодно у неё поправили границу выборки. Публичного PHP API релиз не меняет.

3 мин
calendar 25.197.0 Заметное Свежее

calendar 25.197.0: тип события call_sync и чат, который создаётся сам

У события календаря появился собственный тип, и первый его пользователь — синхронизированные созвоны: при создании такого события автоматически поднимается чат с гостевой ссылкой. Ломающих изменений нет, все правки сигнатур совместимы.

3 мин
calendar 25.200.0 Ломающее Свежее

calendar 25.200.0: таймзона пользователя переехала в b_user.TIME_ZONE — и это ломающий релиз

Самый «ломающий» календарный релиз батча. Часовой пояс пользователя перестал быть настройкой календаря и стал полем пользователя, из-за чего у AJAX-экшена сохранения настроек изменилась сигнатура. Плюс вырезаны два метода `SynchronizationFeature`. Обновление стоит смотреть внимательно, если вы что-т...

4 мин
calendar 26.0.0 Заметное Свежее

calendar 26.0.0: потолок повторов RRULE, права на удалённые sharing-события и разбор ошибок REST

Релиз про повторяющиеся события и права. Появился жёсткий лимит на количество повторов, у удалённых событий по общей ссылке — отдельная проверка доступа, а REST перестал терять ошибки между вызовами. Публичные сигнатуры не удалялись, но пара изменений в поведении заметна.

4 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…
Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти