|   |   | 
| 
 | Как обновить объектный кэш по ссылке | ☑ | ||
|---|---|---|---|---|
| 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 минут висеть. Можно создать отдельный реквизит на форме и через запрос его заполнять, либо принудительно через оповещение обновить при открытии документа, но там нельзя передать ссылку. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |