Вход | Регистрация
    1  2  3   
1С:Предприятие :: 1С:Предприятие 8 общая

ОФ. Происходит ли обращение к БД при работе с реквизитами объекта?

ОФ. Происходит ли обращение к БД при работе с реквизитами объекта?
Я
   Тенепопятам
 
10.06.21 - 16:58
Вопрос следующий. В коде программы нужно периодически обращаться к реквизитам документа. Это можно делать через объект, а можно через ссылку. Правильно я понимаю, что если обращаться через ссылку, то при каждом обращении к реквизиту выполняется запрос к БД, а если через объект, то реквизиты считываются из оперативной памяти, куда они были записаны при считывании объекта? Как в этом контексте грамотнее организовать работу с объектами 1С, через ссылку или через объект?
 
 Партнерская программа EFSOL Oblako
   mistеr
 
101 - 11.06.21 - 16:18
(78) В (68) правильно, но не совсем четко написано. "Если каждый раз обращаться именно к базе данных" - ключевая фраза. То есть если сделать запрос, то получишь гарантированно актуальное значение. Если обратиться к реквизиту ссылки через точку, то получишь значение из кэша, которое может оказаться не актуальным.
   Злопчинский
 
102 - 11.06.21 - 16:19
Возвращаемся к истокам ибо непонятно (убежали в обсуждение разных кешей и прочего).
.
написанное в (68) - что при обращении ссылка.Реквизит - всегда будет актуальное занчение
- верно или неверно?
   Никулин Леонид
 
103 - 11.06.21 - 16:19
(95) Конечно могут дать разные значения. (кстати и в 7-ке и в 8-ке). СпрН.Производитель - это ты из базы читаешь. СпрН.ТекущийЭлемент().Производитель - а это с формы :)
   Garykom
 
104 - 11.06.21 - 16:20
(99) >То есть по ссылке в (9) чушь собачья?

по ссылке (9) у меня нет никакого текста про 20 секунд
   mistеr
 
105 - 11.06.21 - 16:20
Да, и непонятно твое "фу какая гадость". Так работает любой кэш в принципе.
   Злопчинский
 
106 - 11.06.21 - 16:21
(101) в 68 про запрос как термин языка программрования речи не идет.
речь только о получении значения через
Ссылка.Реквизит
   mistеr
 
107 - 11.06.21 - 16:21
(102) Неверно
   fisher
 
108 - 11.06.21 - 16:22
(104) Там чуть ниже, в разделе про устройство обычного кэша. Уточняющая ссылка в (27)
   Злопчинский
 
109 - 11.06.21 - 16:22
(103) нет. это не с формы. это тоже из базы.
форма. на форме - поле выбора ВыбНоменклатура и три кнопки\
Сформировать. Сформироват1 и Сформировать2
.
Перем СпрН;

//*******************************************

Процедура Сформировать()
    
    СпрН = СоздатьОбъект("Справочник.Номенклатура");
    СпрН.НайтиЭлемент(ВыбНоменклатура);
    
КонецПроцедуры

//*******************************************

Процедура Сформировать1()
    
    Сообщить("СпрН.дПроизводитель = "+СпрН.дПроизводитель);
    
КонецПроцедуры

//*******************************************

Процедура Сформировать2()
    
    Сообщить("СпрН.ТекущийЭлемент().дПроизводитель = "+СпрН.ТекущийЭлемент().дПроизводитель);
    
КонецПроцедуры
   Garykom
 
110 - 11.06.21 - 16:22
   Злопчинский
 
111 - 11.06.21 - 16:23
Никулин Леонид, вам говорят что вы в (68) - лажаете, то бишь не знаете основ...
что ответите?
   mistеr
 
112 - 11.06.21 - 16:24
(106) Выражение Ссылка.Реквизит может быть и в коде, и в запросе.
   Никулин Леонид
 
113 - 11.06.21 - 16:24
(95) Конечно могут дать разные значения при таком синтаксисе. Кстати как в семерке, так и в восьмерке. прН.Производитель - это ты из базы данных читаешь. А СпрН.ТекущийЭлемент().Производитель - это с формы :)
   fisher
 
114 - 11.06.21 - 16:24
(110) Похоже на правду, потому что для файловой и ОФ - задолбаешься сессионные кэши обновлять. Они ж на клиенте должны быть. А для УФ сессии могут на разных серверах находиться и тоже встанет в копеечку.
   Злопчинский
 
115 - 11.06.21 - 16:25
(112) запрос не рассматриваем.
речь про использование Ссылка.реквизит в коде
   mistеr
 
116 - 11.06.21 - 16:25
(111) Только ты это говоришь.
   Злопчинский
 
117 - 11.06.21 - 16:26
(113) еще раз: СпрН.ТекущийЭлемент().Производитель - это не с формы.
   Злопчинский
 
118 - 11.06.21 - 16:27
(116) хорошо.
уточняем.
.
если читать (68) и считать что Ссылка.Реквизит используется в коде, а не в запросе - написанное в (68) - верно?
   Garykom
 
119 - 11.06.21 - 16:27
(114) 1С при записи объекта сначала его всегда читает (будет попытка из кэша)
Так что расхождение получить очень сложно
20 секунд это вероятно правила на случай сбоев чтения/записи

Но в случае двух и более серверов 1С на одну sql базу это мдя
   mistеr
 
120 - 11.06.21 - 16:29
(118) Уже разъяснили не раз. В коде Ссылка.Реквизит получишь значение из кэша. Может оказаться неактуальным.
   fisher
 
121 - 11.06.21 - 16:31
(119) Да нет. 20 секунд - это ключевое правило протухания кэша. Иначе кэш вообще теряет смысл. Проверить версию - дорого. Обновлять все кэши при записи - тоже дорого.
   Garykom
 
122 - 11.06.21 - 16:31
(120) механизм блокировок тут еще работает
   Garykom
 
123 - 11.06.21 - 16:33
(121) тогда какой смысл держать данные в кэше 20 минут или до вытеснения?
   fisher
 
124 - 11.06.21 - 16:36
(121) + Вероятно, для УФ и клиент-сервера можно было бы заморочиться с оптимизацией актуализации кэша. Но большого смысла это не имеет.
(123) Неточно выразился. 20 секунд - это период не протухания, а проверки актуальности. А протухание - 20 минут.
   Garykom
 
125 - 11.06.21 - 16:38
(124) с учетом "Проверить версию - дорого. Обновлять все кэши при записи - тоже дорого"
откуда взялись эти 20 секунд? почему не 10 или не 30?
   Злопчинский
 
126 - 11.06.21 - 16:39
(113) на, играйся https://dropmefiles.com/MTAk2 - на форме вообще нет никаких пеквизитов оносящихся к данным базы.
1. скачать обработку.
2. типовая тис
3. открыть обработку
4. нажать Сформировать, выбрать элемент справочника (запомнить какой)
5. нажать Сформировать1 и Сформировать2 - названия одинаковые
6. открыть форму элемента справочника выбранного в п.4. изменить название. записать, закрыть форму элемента.
7. нажать Сформировать1 и Сформировать2 - названия разные.
.
наименование, полученное через точку в разные моменты времени - не актуальное!
для получения актуального значения реквизита через точку это надо указывать явным образом.
.
Никулин Леонид вычеркивается из списка клюшечников.
   Злопчинский
 
127 - 11.06.21 - 16:40
(120) ответ получен.
значит Никулин Леонид в (68) написал лажу.
   fisher
 
128 - 11.06.21 - 16:43
(127) Если бы мне это было интересно настолько же, насколько тебе - я бы проверил на практике. Потому как мало ли. Это внутренние механизмы, а они могли или поменяться или в ЖКК могли лажануть.
   Злопчинский
 
129 - 11.06.21 - 16:43
(124) протухание - это значит значение из кэша "убивается", его там нет?
   Злопчинский
 
130 - 11.06.21 - 16:44
(128) так.. еще один спец, который не знает... так и рождаются типа как у фузины 2+2=5. бо одно слагаемой неактуальное стало...
 
 
   Garykom
 
131 - 11.06.21 - 16:44
(127) лень ставить 77 но думаю у тебя разные объекты в (126)
   Злопчинский
 
132 - 11.06.21 - 16:45
(131) здесь объект - элемент справочника.
один и тот же.
   Злопчинский
 
133 - 11.06.21 - 16:46
(131) кода там - гулькин лилипут...
Перем СпрН;

//*******************************************

Процедура Сформировать()
    
    СпрН = СоздатьОбъект("Справочник.Номенклатура");
    Пока СпрН.Выбрать("Выбери любой элемент справочника номенклатуры",) = 0 Цикл КонецЦикла;
    
КонецПроцедуры

//*******************************************

Процедура Сформировать1()
    
    Сообщить("(из <кэша>) СпрН.Наименование = "+СпрН.Наименование);
    
КонецПроцедуры

//*******************************************

Процедура Сформировать2()
    
    Сообщить("(из базы) СпрН.ТекущийЭлемент().Наименование  = "+СпрН.ТекущийЭлемент().Наименование );
    
КонецПроцедуры
   Garykom
 
134 - 11.06.21 - 16:46
(132) хехе
не один
ты в переменную взял а затем напрямую в базе поменял

ты не путай переменная и кэш это две большие разницы
   Garykom
 
135 - 11.06.21 - 16:49
Интересно в 77 насколько аналогична 8-ке
В плане ТекущийЭлемент() и Ссылка
   Serg_1960
 
136 - 11.06.21 - 16:50
Ещё больше запутаю народ :)) у общих модулей есть свойство "Повторное использование возвращаемых значений" - возвращаемые значения функций кэшируются и удаляются из кэша "через 20 минут после вычисления или через 6 минут после последнего использования"
Источник: "Использование модулей с повторным использованием возвращаемых значений" - https://its.1c.ru/db/v8std/content/724/hdoc
   Злопчинский
 
137 - 11.06.21 - 16:50
(134) ну да. Именно так.
Никулин говорит, что и в 77
использование Ссылка.Реквизит - дает актуальное значение.
я показываю - что это не так.
   Злопчинский
 
138 - 11.06.21 - 16:51
(135) это не совсем одно и то же.
это лучше может hogik объяснить.
   Garykom
 
139 - 11.06.21 - 16:51
(136) А это повторное в случае разных сеансов разное?
   Злопчинский
 
140 - 11.06.21 - 16:52
если Никулин продемонстрирует в 77 то что подтверждает его слова - буду исследовать.
   Garykom
 
141 - 11.06.21 - 16:52
(137) Ха
В 8-ке есть
Ссылка.Ссылка.Реквизит!
   Garykom
 
142 - 11.06.21 - 16:53
(141)+ Смотри у тебя в 77
СпрН.Наименование
и
СпрН.ТекущийЭлемент().Наименование
В 8-ке
СпрН.Наименование
и
СпрН.Ссылка.Наименование
   fisher
 
143 - 11.06.21 - 16:54
(139) Слушай. А откуда ты вообще взял инфу про сессионные кэши? Или это твои догадки? Я нигде ничего подобного не видел. Везде речь как про общий серверный кэш.
   Garykom
 
144 - 11.06.21 - 16:55
(143) Догадки
Подозреваю что кэш один но разделен на общий и сессионные
Причем объекты могут мигрировать
   fisher
 
145 - 11.06.21 - 16:56
(144) Тогда вряд ли. Овчинка выделки не стоит. Заглянул кстати в проф-разработку - там тоже про двадцатисекундный интервал валидности. Скорее всего Радченко оттуда и утянул.
   fisher
 
146 - 11.06.21 - 16:57
Но писалось это еще для 8.0
Поэтому мало ли...
   Garykom
 
147 - 11.06.21 - 16:58
(145) «Серверный» кэш или » или как его еще называют – «сеансовые данные на сервере»
   Garykom
 
148 - 11.06.21 - 16:59
   Злопчинский
 
149 - 11.06.21 - 16:59
(142) в 77 такого реквизита как "ссылка" впрямую недоступно.
.
СпрН.ТекущийЭлемент().Наименование - это актуальное значение, дергается из базы.
если так не нуказать, а прсото реквизит через ссылку - то в общем случае будет неактальное значение реквизита.
для актуальносьти - надо принудительно дергать базу , в 77 это СпрН.ТекущийЭлемент().Реквизит.
в (68) то же самое (для 8-ки, без текущийэлемент()) утверждается что Ссылка.Реквизит - каждый раз дергает базу, вроде как большинство сошлось на том, что это не так...
   fisher
 
150 - 11.06.21 - 17:00
(147) Ересь. В ЖКК сеансовые данные нигде не называют "серверным кэшем". Только на форумах, когда ищут чего бы где почистить.
   Злопчинский
 
151 - 11.06.21 - 17:00
Короче, склифасовские восьмерочники ;-)
я пошел жену к метро встречать, миозги проветрить, а вы как-то определите стопудово 100% в (68) лажа или нет. а то нехорошо как-то.. человек программирует веря в другое...
   Garykom
 
152 - 11.06.21 - 17:01
(150) находится где? на сервере!
суть кэша? кэша!
= "серверный кэш" :)
   fisher
 
153 - 11.06.21 - 17:01
И уж совершенно точно сеансовые данные не имеют никакого отношения к кэшу представлений и объектов.
   Garykom
 
154 - 11.06.21 - 17:02
(149) в 77 ТекущийЭлемент() в 8-ке Ссылка
   mistеr
 
155 - 11.06.21 - 17:03
(149) В 8-ке "принудительно дергать базу" это запрос. Или, для удобства, ОбщегоНазначения.ПолучитьРеквизитыОбъекта().
   Serg_1960
 
156 - 11.06.21 - 17:03
(147) Эээ... Сеансовый кэш хранится по умолчанию в файлах C:\Program Files\1cv8\srvinfo\reg_1541\snccntx + уникальный идентификатор- туда сбрасывается всё то, что получается при серверных вызовах. Т.е сеансовые данные вторичны по отношению к серверным кэшам. Вот как-то вот так.
   Garykom
 
157 - 11.06.21 - 17:04
(156) кэш второго уровня?
   Злопчинский
 
158 - 11.06.21 - 17:05
(154) нееее! в 77 ТекущийЭлемент() это не то что ссылка в 8-ке, в 77 зависит от контектса использования, например
Товар = СпрН.ТекущийЭлемент();
в "товар" будет не совсем ссылка...
это hogik лучшне объяснил бы. я не полностью копенгаген в этом.
   fisher
 
159 - 11.06.21 - 17:06
(151) О боже. Да всем насрать. Вопрос чисто академический.
   Garykom
 
160 - 11.06.21 - 17:08
(158)
СпрН.ВыбратьЭлементы();
Пока СпрН.ПолучитьЭлемент()=1 Цикл
   Сообщить(СпрН.ТекущийЭлемент().Наименование);
КонецЦикла;

Выборка = Справочники.Номенклатура.Выбрать(); 
Пока Выборка.Следующий() Цикл 
    Сообщить(Выборка.Ссылка.Наименование);
КонецЦикла;
 
 
   fisher
 
161 - 11.06.21 - 17:13
Я, кстати, вместо того чтобы лазить на сервере чистить сеансовые данные при тяжелых приходах у сервака, просто прибивал сеансы в консоли после рестарта и еще раз рестартовал.
   Serg_1960
 
162 - 11.06.21 - 17:28
(157) Не совсем так, в 1С всё гораздо запутаннее как всегда. За сеансовые данные "отвечает" менеджер кластера. В кластере могут быть несколько серверов. Если не заданы требования назначения функциональности, то сеансовые данные менеджер распределяет по всем рабочим серверам. Я даже затрудняюсь с определением какого уровня в таком случае эти кэши :(
   Garykom
 
163 - 11.06.21 - 17:39
(162) платформу в 1С тоже запутали как и конфы
логично что тормозит и глючит
   Злопчинский
 
164 - 11.06.21 - 18:49
(160) это что? типа инфо о схожих вариантах получения данных?
.
в контектсе приведенного кода - ненужное излишество, для 77 достаточно
.
СпрН.ВыбратьЭлементы();
Пока СпрН.ПолучитьЭлемент()=1 Цикл
   Сообщить(СпрН.Наименование);// ТекущийЭлемент() - убрано!

КонецЦикла;
.
результат выполнения совершенно одинаковый
.
а в 8-ке
Выборка.Наименование - не прокатит?
   Злопчинский
 
165 - 11.06.21 - 18:50
короче - восьмерочники типичные шаманы/жрецы карго... ;-)
   Garykom
 
166 - 11.06.21 - 19:02
(164) >Выборка.Наименование

прокатит
   Garykom
 
167 - 11.06.21 - 19:04
(164) >результат выполнения совершенно одинаковый

ты только что доказал в (126) и (133) что результат разный
в 8-ке аналогично же
   Cthulhu
 
168 - 11.06.21 - 19:24
(167): вообще-то одинаковый.
полученный из спозиционированного объекта - такой же как (прямщяс) полученный по ссылке на спозционированный объект.
   Garykom
 
169 - 11.06.21 - 19:49
(168) речь про 77
   Garykom
 
170 - 11.06.21 - 19:50
(169)+ и хрень с объектом, в котором изменили но еще не записали в базу
или наоборот объект получили, нечего не меняли а в базе уже поменяно
   Cthulhu
 
171 - 11.06.21 - 19:55
(169): именно.
(170): "не записали в базу" = "не изменили", и "хрень" - это полагать иначе.
   Garykom
 
172 - 11.06.21 - 19:57
(171) эээ если обращаться к объекту там же уже новые/другие значения отличные от в базе (по Ссылке)
   Cthulhu
 
173 - 11.06.21 - 19:57
ЗЫ: изменение в сеансе - не изменение в базе.
   Garykom
 
174 - 11.06.21 - 19:58
(173) я это понимаю

но можно получить объект а в другом сеансе поменяли в базе и что с полученным объектом?
   Cthulhu
 
175 - 11.06.21 - 20:00
(174): не понимаешь. т.к. говоришь "в другом сеансе поменяли" имея ввиду данные.
   Garykom
 
176 - 11.06.21 - 20:01
(175) хренакс
смотри ты получил объект из базы (неважно 77 или 8)
я снаружи 1С лезу и меняю напрямую в dbf, 1cd или sql

и?

это тупое обяснение
   Злопчинский
 
177 - 11.06.21 - 20:11
(167) "ты только что доказал в (126) и (133) что результат разный"
нет.
ранее показано что если получать в 77 реквизит из "ссылки, типа "ссылка.Реквизит" - то нельзя получить актуальное значение после изменения реквизита в базе.
.
в твоем примере - где я указал что ТекущийЭлемент() лишнее - 
Пока СпрН.ПолучитьЭлемент()=1 Цикл
   Сообщить(СпрН.Наименование)//

.
актуализация собственно происходит в момент СпрН.ПолучитьЭлемент()
.
!!! конечно, если считаем что в приведенном коде промежуток времени между исполнением оператора СпрН.ПолучитьЭлемент() и оператором Сообщить() для наших целей существенен - то да, за это время может произойти изменение и результат Сообщить будет неактуальный.
   Garykom
 
178 - 11.06.21 - 20:15
(177) Тут сразу получил из базы и используем, да малый промежуток
Но у тебя в твоем примере в переменную записано и использовано потом после нажатия кнопки

Про это речь и веду
Объект.Ссылка.Реквизит - всегда в 1С 8 актуально
Как и в 7-ке ТекущийЭлемент().Реквизит ибо дергается из базы
Но в 8-ке есть еще кэширование на сервере и теоретически может протухнуть
   Garykom
 
179 - 11.06.21 - 20:17
Короче это важно если без блокировок хреначим в многопотоке фоновыми
   Злопчинский
 
180 - 11.06.21 - 20:20
(178) в моем примере:
нажать Сформироват1 СпрН.Наименование;// ааа

нажать Сформироват2 СпрН.текущийэлемент().Наименование;//ааа

меняем в базе ааа->ббб
нажать Сформироват1 СпрН.Наименование;// ааа

нажать Сформироват2 СпрН.текущийэлемент().Наименование;// ббб

.
просто иллюстрация того, что в (85) в части 77 утверждение
"Поведение одинаковое будет при обращении через точку и в семерке.... Каждое обращение через точку это новый запрос к базе данных"
- неверное.
в 77 обращение к реквизиту через точку в общем случае не есть "новый запрос к базе". а тянет из "кэша".
   Злопчинский
 
181 - 11.06.21 - 20:23
(178) "Объект.Ссылка.Реквизит - всегда в 1С 8 актуально"
я не спец. так может и всегда актуально
.
а если у нас обьекта нет, а есть только ссылка
то Ссылка.Реквизит в Т1 - тут промежуток где меняем в базе в другом сеансе - Ссылка.Реквизит в Т2 в 8-ке не дает актуального значения.- ВРОДЕ НА ЭТОМ ОСТАНОВИЛИСЬ (в противоположность утвеждения в (85) что дает актуальное).
   Злопчинский
 
182 - 11.06.21 - 20:24
(179) думать надо очень сильно чтобы писать правильно... а то будет потом 2+2=5
   Garykom
 
183 - 11.06.21 - 20:30
(182) смотри если у нас фибоначчева система счисления ну помним же 0,1,1,2,3,5,8,... или в простых числах 0,1,2,3,5,7,... то
2+2=5 в простых
и 2+2=8 в фибоначчевых ))
   Cthulhu
 
184 - 11.06.21 - 20:35
// прошу прощения. отличается.

// на морде реквизит ВыбТмц тима Справочник.ТМЦ и формулой "СпрТмц.НайтиЭлемент(ВыбТмц)"
// и кнопка "ТЫЦ" в формулой "Выполнить()"

// модуль формы:
Перем СпрТмц;
Процедура Выполнить()
    Сообщить("СпрТмц.Наименование = """+СпрТмц.Наименование
    +""" / СпрТмц.ТекущийЭлемент().Наименование) = """+СпрТмц.ТекущийЭлемент().Наименование
    +""" >>> "+?(СпрТмц.Наименование<>СпрТмц.ТекущийЭлемент().Наименование,"НЕ ","")+"совпадает","");
КонецПроцедуры//Выполнить

СпрТмц = СоздатьОбъект("Справочник.ТМЦ");
// 1. выбираем в реквизит ТМЦ с наименованием "Тест" (в процессе выбора - открывая его на редактирование)

//    ТЫЦ :  "... >>> совпадает"
// 2. в открытой ранее форме этого элемента меняем его наименование и сохраняем...

//    ТЫЦ :  "... >>> НЕ совпадает"
// извините. был неправ.
   Cthulhu
 
185 - 11.06.21 - 20:36
ЗВ: в ТекущийЭлемент() - верное, в объекте - кэшированное.
   Garykom
 
186 - 11.06.21 - 20:49
(185) Угу в 8-ке тоже самое, в Ссылка верное, в объекте кэшированное
Но с учетом кэша на сервере 1С и хз как он точно работает может и в Ссылке быть кэшированное
   Злопчинский
 
187 - 11.06.21 - 21:02
(184) остаешься в списках вменяемых... ;-)
   Злопчинский
 
188 - 11.06.21 - 21:03
(186) то есть до сих пор непонятно - в (85) верно написано или неверно?
   Злопчинский
 
189 - 11.06.21 - 21:05
я не восьмерочник, мне проверить трудно в 8-ке сценарий как в 77 в (126)
   mistеr
 
190 - 11.06.21 - 21:43
(186) Что еще за "кэшированное" в объекте?
   Garykom
 
191 - 11.06.21 - 21:48
(190) это я термин из (185) использовал в первой строке (186)
понятно что это нифига не кэш а считанный объект из базы в оперативку
   Garykom
 
192 - 11.06.21 - 21:51
(188) А хрен его знает
Например обращаемся через точку или даже две
Т.е. у объекта есть реквизит ссылочного типа и
СпрН.ВидНоменклатуры.Наименование - может вызвать как запрос к базе так и чтение их кэша ВидНоменклатуры если оно там уже есть

Но обращение через точку от .Ссылка всегда должно давать актуальные данные из базы, неважно через кэш или напрямую
   mistеr
 
193 - 11.06.21 - 21:56
(192) Откуда такой вывод?
   Злопчинский
 
194 - 11.06.21 - 23:36
(193) что и странно.
как бы восьмерке не 2 года, а внятно спецы не могут сказать...
   Garykom
 
195 - 12.06.21 - 00:04
(194) Потому что это внутри платформенный, внутри серверный механизма
Хз дергает ли оно БД или из кэша, про кэш на ИТС есть значит обращения к БД может и не быть
Но рекомендуют использовать запросы, понятно дело результат запроса он слегка устаревший относительно БД, если не заблокировать на запись
   Злопчинский
 
196 - 12.06.21 - 00:23
(195) да пофиг внтриплатформенный или серверный.
не знать при написании кода будут использованы актуальные данные или устаревшие - вот что странно про тех кто пишет код.
   acanta
 
197 - 12.06.21 - 02:41
В параметрах запуска clearcache делает старт 1с немного медленнее. А так да, грустно-скучно.
   ДедМорроз
 
198 - 12.06.21 - 11:33
Когда обсуждается кеш,то неплохо бы сначала обсудить режим работы.
Например,есть тонкий клиент,где что-то через точку можно получить только на сервере,а там кеш будет общий.
Если толстый клиент как в обычном режиме так и в управляемом,то кеш будет и на клиенте,как собственно говоря,и в файловом варианте,тут ему протухнуть сам бог велел.
А в серверном варианте,внезапно,может быть и кластер,где несколько серверов и у каждого свой кеш,вот тут-то 20 секунд опять вступают в свою роль.
Но,внутри транзакции,кеш отключается,что и логично.
Если транзакция не открыта,то данные нужны только для отображения на экран,а тут их актуальность не очень важна,когда в другом месте объект поменяли,то отображение должно обновиться,но насколько быстро - это открытый вопрос.

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

Когда же мы выбираем данные запросом,то то мы дергаем базу каждый раз,но,и сервер базы данных умеет кешировать данные запросов, и выбираем мы только то,что нужно,поэтому,это единственно верный путь.
Кроме того,в нетолстом клиенте,мы все равно кходим с клиента на сервер,и время запроса базы нас не сильно напряжет.
Также,если очень хочется,то можно в рамках транзакции организовывать свой кеш для хранения уже считанных данных,чтобы за ними не ходить несколько раз,но это уже особенности программирования.
В любом случае,получение и вычисление одного и того же в коде несколько раз - это плохо.
   2mugik
 
199 - 13.06.21 - 20:39
(47)Транзакции не хватит.
(198)"Но,внутри транзакции,кеш отключается" - вот пример - не отключается:

&НаСервере
Процедура Команда1НаСервере()
    // Вставить содержимое обработчика. 

    начатьТранзАкцию();
    эл=справочники.п1.НайтиПоКоду("000000001").ПолучитьОбъект();
    сообщить(эл.Наименование);
      //в это время в другой сессии меняем

      Секунд=10;        
      КомандаWindows = "Timeout /T " + Строка(Секунд) + " /NoBreak";
      ЗапуститьПриложение(КомандаWindows,,Истина);
    сообщить(эл.Наименование);
    зафиксироватьТранзакцию();
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры

выводит 2 одинаковых наименования.Хотя между 1 и 2 сообщить дает изменить объект в другом сеансе.
   acht
 
200 - 13.06.21 - 20:44
(199) Ты вообще не то тестируешь. Ты получил объект и сам держишь его в своей памяти - ессно он менятся из другого сеанса не будет. Должно быть что-то вроде

Ссылка = Справочники.п1.НайтиПоКоду("000000001")
Сообщить(Ссылка.Наименование)
  1  2  3   

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.