Задать вопрос
@den730

Как обновить пользовательские поля в событии календаря?

Цель: создать событие в календаре и до наступления даты начала привязывать к нему элементы CRM, каждый раз добавляя в поле UF_CRM_CAL_EVENT новую сущность.

С помощью метода CCalendar::SaveEvent создаю событие в календаре компании.
Затем привязываю к нему элемент CRM методом CCalendarEvent::UpdateUserFields обновляя данные в поле UF_CRM_CAL_EVENT.

Событие создаётся:
6351525d69b2b794825586.png
Элемент CRM привязывается:
635151ccd6ae3235308894.png
После обновления поля UF_CRM_CAL_EVENT методом CCalendarEvent::GetList, либо CCalendarEvent::GetById, получаю данное событие календаря, но в поле UF_CRM_CAL_EVENT ничего нет: [UF_CRM_CAL_EVENT] =>.
Хотя на скриншотах видно, что к событию привязан элемент CRM. Данные появляются через некоторое время. Может пройти минута, может пять минут:
[UF_CRM_CAL_EVENT] => Array
                (
                    [0] => T88_110
                )

Из-за этого становится проблематично добавить ещё один элемент к событию. Обновляю так: беру данные из этого поля, добавляю к ним новые и перезаписываю существующие.

Скорее всего после обновления поля UF_CRM_CAL_EVENT нужно выполнить ещё какой-то метод, чтобы обновления были сразу видны, но я не знаю какой. Прошу помочь.
  • Вопрос задан
  • 1239 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
Метод `CCalendarEvent::GetById` является прослойкой в метод `CCalendarEvent::GetList`, а сам метод `CCalendarEvent::GetList` имеет встроенное кеширование (потому календарь это сложный механизм и там по факту не просто достает данные из БД, но и просчитывает регулярные события).

Перед запросом попробуйте выключить кеширование:
// Выключаем кеширование, запоминая предыдущее значение
$oldCacheTime = \CCalendar::CacheTime();
\CCalendar::CacheTime(0);

// ... Делаем необходимые действия

// Возвращаем все как было
\CCalendar::CacheTime($oldCacheTime);
unset($oldCacheTime);


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

1. Статическое значение `eventlist`
2. md5 от сериализованнх (serialize) параметров функции `GetList`
3. Если включена проверка прав (параметр checkPermissions = true), то добавить 'perm' + ID текущего пользователя + '|'
4. Если установлен модуль "Социальная сеть" и текущий пользователь администратор, то добавить: 'socnetAdmin|'

Ну и все эти кеши складываются в `calendar/` подпапку.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы