Имя: Пароль:
1C
1С v8
Проблема с кэшированием данных формы
0 SashaNox
 
06.02.14
16:16
Добрый день! Столкнулся со следующей проблемой:

Имеется документ, у которого есть реквизит "Склад" (СправочникСсылка.Склады), на форму документа выведены реквизиты склада.

1. Открываем форму одного и того же документа под разными сеансами.
2. Закрываем формы.
3. Изменяем в одном из сеансов элемент справочника Склады - значение реквизита нашего документа.
4. В этом же сеансе открываем документ и видим, что связанные реквизиты справочника перечитались верно.
5. Открываем документ в другом сеансе и видим, что реквизиты элемента справочника не обновляются, даже при перевыборе склада и обновлении формы.

Аналогичная ситуация и с табличной частью.

Предполагаю, что при первом открытии формы данные считываются из базы данных, а при последующем - из кэша. Учитывая, что кэш обновляется через некоторое время, как увидеть актуальные данные в форме?

Пробовал в Управляемом приложении, режим запуска тонкий клиент, платформа 8.2.19.83 и на 8.3 последней тоже пробовал, результат одинаков
1 SashaNox
 
06.02.14
22:39
Ау, неужели столь серьезная проблема никого не интересует...
2 MrStomak
 
06.02.14
22:51
Значения объекта формы не кешируются. Описанная тобой ситуация очень странная.
3 SashaNox
 
07.02.14
12:25
Описанная ситуация элементарно воспроизводится на любой конфигурации. Помогла мне вот такая вещь:
При открытии формы написал: ОповеститьОбИзменении(Тип("СправочникСсылка.Склады)) - при этом происходит очистка кэша, цитирую из СП:
Поведение при очистке кэша (такое же, как при интерактивном изменении):
кэш представлений ссылок - очищаются записи, соответствующие измененной ссылке,
кэш данных через точку - удаляются те записи, которые имеют в пути ссылки того же типа, что и измененная,
кэш данных быстрого выбора - данные хранятся по типам, очищаются данные, которые относятся к типу измененной ссылки,
кэш ограничений по типу - данные хранятся по типам, очищаются данные, которые относятся к типу измененной ссылки.

Применить ОповеститьОбИзменении() при открытии формы достаточно поздно, т.к. форма уже считалась с кэша, а затем мы его удалили, поэтому после того как кэш будет удален форму надо перечитать
Но это нужно в случае если играешься с реквизитами шапки, если это ТЧ, то считывание реквизитов реквизитов происходит позже открытия формы, наверное в момент вывода строки, и все нормально отрабатывает.

Вообще мыслится вся эта работа формы следующим образом:
1. При первом открытии форма считывается целиком из ИБ, при этом с сервера на клиент передаются ДанныеФормы, в которых, ссылочные значения, представляет собой только ссылку и ничего более. Когда при построении формы программа сталкивается с элементом формы путь к данным которого является реквизит реквизита ДанныхФормы (к примеру Номенклатура.Артикул), то осуществляется невидимый запрос к серверу и оттуда передается значение этого реквизита. Затем ДанныеФормы и реквизиты реквизитов помещаются в кэш. Кэш в одном сеансе существует либо в пределах определенного времени (не менее 20 мин), либо пока не будут внесены изменения в любой из справочников или документов имеющий ссылку в ДанныхФормы в пределах одного сеанса.
2. При повторном открытии, если не было внесено изменений в текущем сеансе в типы справочников или документов участвующих в ДанныхФормы то форма берется целиком из кэша - такова оптимизация.
4 MrStomak
 
07.02.14
12:36
Из твоего описания в (0) я не смог понять, что ты говоришь о данных через точку.

По поводу форма берется целиком из кеша - это ложь. У тебя даже есть событие "ПриСозданииНаСервере", которое как бы намекает, что форма создается не из кеша. Если изменить в другом сеансе сам реквизит, а не реквизит реквизита, то в этом сеансе изменение будет видно сразу при открытии.

По поводу реквизитов через точку - их значения, очевидно, кешируются. Хотя почему при создании формы сразу они не перечитываются - непонятно.
Независимо от того, куда вы едете — это в гору и против ветра!