Проблема с кэшированием данных формы #697702


#0 by SashaNox
Добрый день! Столкнулся со следующей проблемой: Имеется документ, у которого есть реквизит "Склад" (СправочникСсылка.Склады), на форму документа выведены реквизиты склада. 1. Открываем форму одного и того же документа под разными сеансами. 2. Закрываем формы. 3. Изменяем в одном из сеансов элемент справочника Склады - значение реквизита нашего документа. 4. В этом же сеансе открываем документ и видим, что связанные реквизиты справочника перечитались верно. 5. Открываем документ в другом сеансе и видим, что реквизиты элемента справочника не обновляются, даже при перевыборе склада и обновлении формы. Аналогичная ситуация и с табличной частью. Предполагаю, что при первом открытии формы данные считываются из базы данных, а при последующем - из кэша. Учитывая, что кэш обновляется через некоторое время, как увидеть актуальные данные в форме? Пробовал в Управляемом приложении, режим запуска тонкий клиент, платформа 8.2.19.83 и на 8.3 последней тоже пробовал, результат одинаков
#1 by SashaNox
Ау, неужели столь серьезная проблема никого не интересует...
#2 by MrStomak
Значения объекта формы не кешируются. Описанная тобой ситуация очень странная.
#3 by SashaNox
Описанная ситуация элементарно воспроизводится на любой конфигурации. Помогла мне вот такая вещь: При открытии формы написал: ОповеститьОбИзменении(Тип("СправочникСсылка.Склады)) - при этом происходит очистка кэша, цитирую из СП: Поведение при очистке кэша (такое же, как при интерактивном изменении): кэш представлений ссылок - очищаются записи, соответствующие измененной ссылке, кэш данных через точку - удаляются те записи, которые имеют в пути ссылки того же типа, что и измененная, кэш данных быстрого выбора - данные хранятся по типам, очищаются данные, которые относятся к типу измененной ссылки, кэш ограничений по типу - данные хранятся по типам, очищаются данные, которые относятся к типу измененной ссылки. Применить ОповеститьОбИзменении при открытии формы достаточно поздно, т.к. форма уже считалась с кэша, а затем мы его удалили, поэтому после того как кэш будет удален форму надо перечитать Но это нужно в случае если играешься с реквизитами шапки, если это ТЧ, то считывание реквизитов реквизитов происходит позже открытия формы, наверное в момент вывода строки, и все нормально отрабатывает. Вообще мыслится вся эта работа формы следующим образом: 1. При первом открытии форма считывается целиком из ИБ, при этом с сервера на клиент передаются ДанныеФормы, в которых, ссылочные значения, представляет собой только ссылку и ничего более. Когда при построении формы программа сталкивается с элементом формы путь к данным которого является реквизит реквизита ДанныхФормы (к примеру Номенклатура.Артикул), то осуществляется невидимый запрос к серверу и оттуда передается значение этого реквизита. Затем ДанныеФормы и реквизиты реквизитов помещаются в кэш. Кэш в одном сеансе существует либо в пределах определенного времени (не менее 20 мин), либо пока не будут внесены изменения в любой из справочников или документов имеющий ссылку в ДанныхФормы в пределах одного сеанса. 2. При повторном открытии, если не было внесено изменений в текущем сеансе в типы справочников или документов участвующих в ДанныхФормы то форма берется целиком из кэша - такова оптимизация.
#4 by MrStomak
Из твоего описания в я не смог понять, что ты говоришь о данных через точку. По поводу форма берется целиком из кеша - это ложь. У тебя даже есть событие "ПриСозданииНаСервере", которое как бы намекает, что форма создается не из кеша. Если изменить в другом сеансе сам реквизит, а не реквизит реквизита, то в этом сеансе изменение будет видно сразу при открытии. По поводу реквизитов через точку - их значения, очевидно, кешируются. Хотя почему при создании формы сразу они не перечитываются - непонятно.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям