Имя: Пароль:
1C
 
Как обновить объектный кэш по ссылке
,
0 TormozIT
 
гуру
06.08.22
10:51
Кто знает, как обновить объектный кэш по ссылке? Сеанс 1 записал объект. Сеанс 2 получил сигнал, что объект Х записан в другом сеансе. Но объект Х в сеансе 2 может уже находиться в объектном кэше. Нужно гарантировать обновление этого кэша. Как?
Если открываю транзакцию, то всегда получаю актуальный объект. Но если фиксирую транзакцию, то после этого снова используется старый кэш. https://www.hostedredmine.com/issues/948225
1 TormozIT
 
гуру
06.08.22
10:52
Метод Прочитать() объекта всегда считывает актуальные данные. Но опять же не обновляет объектный кэш. https://partners.v8.1c.ru/forum/topic/1383852
2 АНДР
 
06.08.22
11:20
(0) Почему я раньше не узнал про этот трекер...
3 Asmody
 
06.08.22
11:25
Штатно - никак.
Думаешь для чего в типовых вдоль и поперек используется костыли типа ЗначенияРеквизитовОбъекта()
4 Asmody
 
06.08.22
11:26
И вообще, рекомендованный способ чтения данных - запрос
5 TormozIT
 
гуру
06.08.22
11:28
(3) В документации описан способ с транзакцией, но он в реальности не работает https://its.1c.ru/db/pubdevguide83#content:304:hdoc
6 TormozIT
 
гуру
06.08.22
11:30
(2) Наверное потому что ИР не юзаешь.
7 Asmody
 
06.08.22
11:47
(5) Я бы не стал полагаться на такой способ. Объектный кэш штука эфемерная. Тем более, на границе сеансов. А если у тебя сеансы на разных рпхостах? А если на разных серверах?
8 TormozIT
 
гуру
06.08.22
11:52
(7) Ну если эту ошибку исправят, то почему это я не должен на него полагаться? Там все про один сеанс написано. Зафиксировал транзакцию - все обновления из нее должны попасть в обычный кэш твоего сеанса.
Кстати у разных сеансов одного рабочего процесса (rphost), судя по моим экспериментам, нет общего объектного кэша. О чем я сообщаю по ссылке в (0).
9 Asmody
 
06.08.22
11:57
(8) Ну вот же ты пишешь: "при записи объекта обычный объектный кэш обновляется, но только для того сеанса, который выполнял запись".
Значит ИТС не врёт. Никто вроде не обещал, что объектный кэш будет общим у разных сеансов.
10 СеменовСемен
 
06.08.22
11:58
В другом сеансе обновится, если там новую транзакцию начать
11 СеменовСемен
 
06.08.22
12:00
А то что общего кэша нет - это всем известный факт (хоть и противоречиь здравому смыслу)
12 TormozIT
 
гуру
06.08.22
12:02
(11) В документации я не нашел освещения этой особенности. Может подскажем ссылку, откуда этот факт общеизвестен?
13 Фрэнки
 
06.08.22
12:02
а почему он вообще должен быть - этот самый кэш - интуитивно понятно, что в программе он существует, но чем обосновано его наличие, как он продуман, почему может то, что он может, откуда известно, что он вообще должен чего-то мочь
14 TormozIT
 
гуру
06.08.22
12:03
(10) Обновится кэш транзакции, но не обычный кэш. В (0) есть воспроизводимый пример.
15 TormozIT
 
гуру
06.08.22
12:05
(9)  Я не утверждал, что "объектный кэш будет общим у разных сеансов". Да и это мне не требуется, хотя было бы разумно с точки зрения использования памяти.
16 TormozIT
 
гуру
06.08.22
12:08
Вот таким способом гарантировано обновляется объектный кэш в моем сеансе.
    НачатьТранзакцию();
    Объект = Справочники.Справочник1.тет.ПолучитьОбъект();
    Объект.ОбменДанными.Загрузка = Истина;
    Объект.Записать();
    ЗафиксироватьТранзакцию();
Но выполнять запись каждого объекта, кэш которого надо обновить, конечно очень затратно. Поэтому такой способ можно применять от безысходности.
17 Asmody
 
06.08.22
12:11
Почему объектный кэш плох на границе сеансов - я написал в (7). Если вы говорите "у нас общий кэш" для сеансов, вам надо обеспечивать консистентность как минимум. Зачем?
Вендору проще написать "ребята, вот вам запросы, вот их и пользуйте, там актуальные данные почти всегда".
18 ДНН
 
06.08.22
12:19
(0) Когда второй сеанс обратится к объекту из кеша будет выполнена проверка версии данных в кеше и в БД. Если они отличаются (а если вы записали этот объект в другом сеансе, то они должны отличаться), то второй сеанс обновит объект в кеше.
19 TormozIT
 
гуру
06.08.22
12:23
(18) Ты забыл самое главное - в течение <20 секунд при обращении к обычному объектному кэшу проверка изменения версии данных не выполняется https://its.1c.ru/db/pubdevguide83#content:303:hdoc
20 Asmody
 
06.08.22
12:49
И вообще, объектный кэш - внутренний механизм платформы, элемент оптимизации.
Думаю, вендор специально его наружу не выставляет, чтобы иметь определенную свободу манёвра. В любой момент можно поменять реализацию, особенно не беспокоясь об API и обратной совместимости.
21 ДедМорроз
 
07.08.22
02:08
На самом деле,если каждый раз проверять - не изменился объект (то есть читать поле версии),то тогда уж проще сразу читать объект,т.к.для объектов без табличных частей будет запрос к одной и той же строке таблицы.
Отмлеживание же изменений между процессами сервера затруднено,так как,в общем случае,они могут быть на разных компьютерах.
22 TormozIT
 
гуру
07.08.22
11:41
(21) Кто здесь предлагал каждый раз проверять?
23 ДедМорроз
 
07.08.22
17:11
(22) Если проверять не каждый раз,то всегда будет ситуация,когда значение в кеше еще не протухнет,но будет уже неверным.
24 TormozIT
 
гуру
07.08.22
17:37
(23) Где я просил чтобы значение было всегда верным? Для этого существует транзакционная блокировка.
Я задачу довольно четко описал в (0) - гарантировать обновление кэша объекта по сигналу. Не надо выдумывать другие задачи.
25 RomanYS
 
07.08.22
18:46
(24) судя по документации есть пара способов это сделать одинаковой бессмысленности:
- подождать 20 минут
- вытеснить другими данными

Какой смысл в такой задаче?
26 timurhv
 
07.08.22
19:12
v8: Проблема с кэшированием данных формы

(25) Например, документ оплаты, на форму выведен договор (реквизит документа) и через точку реквизит договора "Сумма".
Пользователь 1 меняет сумму, пользователь 2 открывает - сумма старая. Так и будет 20 минут висеть. Можно создать отдельный реквизит на форме и через запрос его заполнять, либо принудительно через оповещение обновить при открытии документа, но там нельзя передать ссылку.