Имя: Пароль:
1C
1С v8
8.2-8.3 глюк с кешированием
0 EvgeniuXP
 
13.01.14
20:30
Делаем очень просто:


1. Создаем документ, создаем в нем реквизит 1.
2. В этом же документе создаем табличную часть. Для табличной части создаем реквизит, который ссылается на этот же документ.
3. Создаем форму документа, выкладываем номер, дату документа и табличную часть с добавленным реквизитом ссылающегося на этот же документ и выкладываем еще один реквизит, типа ТабличнаяЧасть.СсылкаНаДокумент.Реквизит1.

Заходим в пользовательский режим создаем несколько документов.

Далее открываем один документ и заполняем табличную часть, в качестве ссылок на документы указываем любые документы.

Теперь всё просто:
Открываем документ у которого табличная часть заполнена и оставляем.
Открываем другие документы, которые есть в этой же табличной части и меняем значение реквизита 1. Закрываем их.

Открываем первый документ и смотрим, значение реквизитов в табличной части остались старые! т.к. все данные берутся из кеша... ждем 20 минут минимум, открываем снова форму - значения новые :)
1 EvgeniuXP
 
13.01.14
20:32
другие документы, которые открываем и меняем значение реквизита 1 - меняем всё это под другим пользователем.

Под первым пользователем смотрим как меняется табличная часть - после открытия снова того же документа :)))
2 EvgeniuXP
 
13.01.14
20:37
Если на форму выложить динамический список, который отображает  табличную часть, а табличную часть ограничить параметром на документссылка этого документа, то в нем всё сразу меняется и можно наглядно посмотреть, что данные считываются при открытии формы, а у объекта табличная часть берется постоянно из кеша в течении мин. 20 минут.
3 H A D G E H O G s
 
13.01.14
21:09
Давай dt демки.
4 fmrlex
 
13.01.14
21:19
(2) В <s>Спортлото</s> 1C звонил?
5 ifso
 
13.01.14
22:15
+(3)
без dt не взлетает
6 Ranger_83
 
13.01.14
22:18
это ж что покурить надо было...?
7 EvgeniuXP
 
13.01.14
23:02
http://yadi.sk/d/E6wnIY6lFzC6j - вот, 1-ый документ, табличную часть отображает, в других менять можете под этим же пользователем, но в другом сеансе. Закрыв и открыв 1-ый документ - данные не меняются, пока не закроешь полностью 1С и вновь ее не запустишь.
8 ifso
 
13.01.14
23:20
Все верно, ибо при открытии формы реквизиту формы единовременно присваивается значение реквизита документа при создании формы на сервере.
9 EvgeniuXP
 
13.01.14
23:38
(8) в смысле всё верно? открываем форму и видим старые значения в табличной части, а через 20 минут видим новые - сделали бы тогда уж через 2 года, чего уж там :)
10 EvgeniuXP
 
13.01.14
23:41
(8) при открытии формы объект должен заново считываться с базы данных, а не с кеша - есть такая функция у формы "Перечитать данные" - тоже берем из кеша получается? - по крайне мере, этот пример показывает, что функция "Перечитать данные" читает из кеша, а не из БД.
11 ifso
 
14.01.14
00:05
Данные реквизита формы (не реквизита документа) хранятся только в форме и, т.к. форма не менялась, то не происходит обновление кэша.
Сделай "Вывести список" и увидишь данные с сервера (измененные).
Т.о. это скорее фича, чем баг.
Другой вопрос, зачем таким образом использовать реквизит формы.
Хочешь, чтобы обновлялось - создай реквизит документа и уже его отобрази на форме.
12 EvgeniuXP
 
14.01.14
00:16
(11) в том-то и дело, что данные хранятся в другом документе, а этот (первый) документ отображает сведения других документов - другие документы, другие пользователи корректируют.
13 EvgeniuXP
 
14.01.14
00:18
(11) проще ТЗ на форму вывести :), а из ТЗ в табличную часть грузить перед записью.
14 EvgeniuXP
 
14.01.14
00:21
(11) кстати, выведи динамический список табличных частей всех, ограничь одним документом через параметр и данные обновятся сразу при открытии формы.
15 EvgeniuXP
 
14.01.14
00:22
(11) по твоей логике, они тогда тоже не должны обновляться...
16 EvgeniuXP
 
14.01.14
00:23
т.к. данные взяли из другого документа, и данные на форме не были изменены - однако обновляются.
17 RomaH
 
naïve
14.01.14
06:55
к сожалению только так нашел:

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ЗаписанПациент" Тогда
        Если Параметр = Объект.Пациент Тогда
            ПрочитатьДанныеПациента();
            ОтобразитьИзменениеДанных(Объект.Пациент,ВидИзмененияДанных.Удаление);
            ОбновитьОтображениеДанных();
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
18 RomaH
 
naïve
14.01.14
06:55
т.е. вот эти две строчки нужны:

            ОтобразитьИзменениеДанных(Объект.Пациент,ВидИзмененияДанных.Удаление);
            ОбновитьОтображениеДанных();
19 ifso
 
14.01.14
07:53
(15) Логика не моя, но клиент-серверная.
20 EvgeniuXP
 
14.01.14
10:45
(19) почему тогда в другом дин. списке обновляет через ссылку? - оповещение об изменении я не писал.
21 hhhh
 
14.01.14
10:51
(20) ну а в настройке списка? там есть например обновлять через 20 секунд? или через 30 секунд? Как это было в 8.2? Или уже нет?
22 EvgeniuXP
 
14.01.14
11:26
(21) проверяю и 8.2 - аналогичная ситуация, по умолчанию там "Автоматическое обновление" списка через 60 секунд - но он не работает.
23 EvgeniuXP
 
14.01.14
11:28
еще галку ставить "автообновление" - ладно, вечером проверю дома.
24 SUA
 
14.01.14
11:31
все нормально ОповеститьОбИзменении() еще есть как пример
25 EvgeniuXP
 
14.01.14
19:57
(21) у элемента формы где путь к данным "Объект.ТабличнаяЧасть" этого уже нет. У списка есть.

Объект.Пациент - как понимаю это реквизит документа.... а здесь табличная часть, т.е. надо типа

Объект.ТабличнаяЧасть[НомерСтроки].Реквизит1.

Во всяком случае прописал в документе:

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    ОповеститьОбИзменении(Объект.Ссылка);
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    ОбновитьОтображениеДанных();
    
КонецПроцедуры

у другого пользователя не обновляются данные.
26 RomaH
 
naïve
15.01.14
08:01
ОтобразитьИзменениеДанных(Объект.Пациент,ВидИзмененияДанных.Удаление);  добавь
параметры сам читай в СП какие нужны
там первый параметр - ссылка должна быть, а как ты её получишь, имхо, пофиг
27 EvgeniuXP
 
15.01.14
19:34
(26) написал, тоже самое - не обновляется.

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    ОтобразитьИзменениеДанных(Объект.Ссылка, ВидИзмененияДанных.Удаление);
КонецПроцедуры

&НаСервере
Процедура ОбработкаОповещенияНаСервере()
    ОбновитьОтображениеДанных();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ОбновитьОтображениеДанных();
КонецПроцедуры
28 EvgeniuXP
 
15.01.14
19:40
а, всё, при открытии добавил - появилося.
спасибо!
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший