Имя: Пароль:
1C
 
Как обновить все кэши нужного объекта?
,
0 TormozIT
 
гуру
19.07.15
17:23
Объект изменили в другом сеансе. Я получил об этом сигнал (неважно как). Мне нужно, чтобы новые данные сразу стали показываться по нему в управляемых и обычных формах, во всех динамических списках, списках быстрого выбора, методом ПолучитьОбъект(), в полях ввода и т.д. Я пробовал ОповеститьОбИзменении(Ссылка) - по крайней мере для обычных форм не дает нужного эффекта, т.е. в полях ввода представление ссылки не обновляется. Если получаю объект от ссылки методом ПолучитьОбъект(), то получаю естественно старые данные, т.к. они из объектного кэша берутся, который не чаще раза в 20 сек при необходимости обновляется. Если же у объекта вызываю метод Прочитать(), то получаю новые данные, но последующий вызов ПолучитьОбъект() опять получает старые данные из объектного кэша. Представление в полях ввода обычных форм вообще непонятно как обновить (метод Обновить() у обычной формы тоже не помогает).

Итого нужно обновить
1. объектный кэш
2. кэш представлений ссылок

Научите
1 Лефмихалыч
 
19.07.15
17:26
Зачем тебе это?
2 TormozIT
 
гуру
19.07.15
17:27
(1) Это нужно пользователю, т.к. он точно знает, что объект изменился и не хочет работать с его старыми данными.
3 Lama12
 
19.07.15
17:36
(2) Пользователь открывает утром документ на 100500 строк. Ждет обеда. Много думает. В конце рабочего дня решсет исправит 800 строчку. А система ему говорит что объект не актуален?
Вопрос решается по другому. Либо то кто открыл блокирует сразу, либо переоткрывает когда додумается зачем он его открыл.
4 TormozIT
 
гуру
19.07.15
17:40
(3) У меня другая ситуация. В ней блокировки не подходят. Пользователь сам инициирует действие изменения, протекающее в другом сеансе.
5 RomanYS
 
19.07.15
17:43
(0) а зачем после Прочитать() снова вызывать ПолучитьОбъект()?
6 TormozIT
 
гуру
19.07.15
17:45
(5) Например, для понимания состояния объектного кэша. При открытии формы объекта также используется объектный кэш, т.е. я вижу там старые данные, т.к. форма не делает Прочитать().
7 TormozIT
 
гуру
19.07.15
17:46
(6) А вот если в форме нажать "Перечитать данные объекта", то она выполнит Прочитать() и покажет уже новые данные.
8 Рэйв
 
19.07.15
17:49
(6)Тs походу путаешь данные и отображения на форме..
9 TormozIT
 
гуру
19.07.15
17:51
(8) Скорее всего нет. Ссылка.ПолучитьОбъект() - показывает в свойстве Наименование старые данные. После сразу же Объект.Прочитать() в этом свойстве уже новые данные.
10 TormozIT
 
гуру
19.07.15
17:53
Для тех кто не въезжает. Рекомендую познакомиться еще с этой темой v8: Кэши разные нужны, кэши нужные важны.
11 Рэйв
 
19.07.15
17:54
(9)>>Ссылка.ПолучитьОбъект()
получает актуальный объект.Нет?:-)
12 TormozIT
 
гуру
19.07.15
17:54
(11) Я же уже как минимум 2 раза написал, что нет.
13 Рэйв
 
19.07.15
17:55
(12)Спорить не буду.Но думаю, что да.
14 TormozIT
 
гуру
19.07.15
17:57
(13) Я это много раз проверил перед созданием темы.
Весь вопрос в том, как обойти эту особенность -
"Если обращение происходит в пределах 20 секунд после поступления данных в кеш, данные считаются верными (валидными)."
15 RomanYS
 
19.07.15
18:03
(14) ты же сам пишешь, что прочитать() решает твою проблему
Когда это надо сделать, ты вроде знаешь : "получил сигнал"
Непонятно в чем проблема
16 TormozIT
 
гуру
19.07.15
18:04
(15) Проблема в том, что во всех местах конфигурации и во всех формах объектов я не могу вставить Прочитать() после ПолучитьОбъект().
17 TormozIT
 
гуру
19.07.15
18:07
Еще очень волнует, что метод Прочитать() идет мимо объектного кэша. Я ожидал что он обновит сначала кэш, а потом оттуда выдаст данные, но очень похоже что он идет в обход.
18 RomanYS
 
19.07.15
18:10
(17) а объекты разных типов? или одного - можно попробовать "сигнал" в модуле объекта отработать
19 TormozIT
 
гуру
19.07.15
18:32
В общем как минимум нашел кандидата на ошибку в платформе
https://partners.v8.1c.ru/forum/t/1383852/m/1383852

Конфигурация ПО

1С 8.3.5.1589-6.2014, файловый и клиент-серверный режимы

Проблема

Метод Прочитать ссылочного объекта не обновляет объектный кэш.

Воспроизведение

Восстановить базу из выгрузки. Запустить обычное приложение. При этом выполнится код
Соединение1 = Новый COMОбъект("V83.ComConnector");
    Соединение1 = Соединение1.Connect(СтрокаСоединенияИнформационнойБазы());
    Объект = Справочники.Справочник1.т1.ПолучитьОбъект();
    ЧужойОбъект = Соединение1.Справочники.Справочник1.т1.ПолучитьОбъект();
    ЧужойОбъект.Записать();
    Объект = Справочники.Справочник1.т1.ПолучитьОбъект();
    Сообщить(Объект.ВерсияДанных);
    Объект.Прочитать();
    Сообщить(Объект.ВерсияДанных);
    Объект = Справочники.Справочник1.т1.ПолучитьОбъект();
    Сообщить(Объект.ВерсияДанных);

и будут выведены сообщения

AAAABAAAAAA=
AAAABQAAAAA=
AAAABAAAAAA=

Не нашел ни одного логичного объяснения, почему объектный кэш не должен обновляться в этом случае. Похоже на ошибку платформы.

Стоит отметить, что такое можно наблюдать и в форме объекта, т. к. по наблюдениям она использует фактически те же методы: ПолучитьОбъект() при открытии и Прочитать() при перечитывании.

http://rghost.ru/76DLNqrjr
20 TormozIT
 
гуру
20.07.15
12:41
Так и не нашел способа. Может еще кто то попробует предложить решение?
21 ЧеловекДуши
 
20.07.15
13:03
(20) Объект.ВерсияДанных <> Ссылка.ВерсияДанных
...ОпанЪки, документ изменили... нет?

При этом Объект, желательно получить по новой :)
22 TormozIT
 
гуру
20.07.15
13:04
(19) Не читал что ли?
Программист всегда исправляет последнюю ошибку.