|
Точка vs ОбщегоНазначения.ЗначениеРеквизитаОбъекта | ☑ | ||
---|---|---|---|---|
0
catzilla codzilkin
04.04.24
✎
10:06
|
В пустой базе создал документ из склада и табличной части с товарами. Добавил в ТЧ реквизит с типом значения ХранилищеЗначений. Закачал туда картинку весом в 5 МБ и накопировал 200 строк. База и документ стала весить 1 ГБ.
Если в обработке создать ссылку на документ и прочитать через точку склад, то память жрет. Склад = РО.Склад; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка(Склад); Сообщение.Сообщить(); Если через функцию вендора ОбщегоНазначения.ЗначениеРеквизитаОбъекта, то всё быстро читается. Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РО, "Склад")); Сообщение.Сообщить(); Какие еще есть подобные секреты? Может где то в одном месте собрано... |
|||
1
lodger
04.04.24
✎
10:09
|
сборник баянов и приколов всегда лежал тут
https://its.1c.ru/db/metod8dev#browse:13:-1:3199:3224:3226 |
|||
2
mikecool
04.04.24
✎
10:18
|
(0) найди двухтомник и почитай до просветления
|
|||
3
mikecool
04.04.24
✎
10:18
|
какой то вялый вброс
|
|||
4
Garykom
гуру
04.04.24
✎
10:28
|
Ну почему сразу вброс.
Просто разрабы платформы сначала спороли косяк. А потом разрабы БСП и типовых придумали как его слегка того, но через одно место. |
|||
5
Garykom
гуру
04.04.24
✎
10:32
|
РО - вероятно ссылка
И да попытка получить/прочитать РО.Склад - вызывает получение объекта РО целиком в КЭШ (и вероятно со всеми ТЧ, что вызывает дергание связанных таблиц) А если тупо передать ссылку в запрос и там получить значение одного реквизита - просто выполняет запрос (и возвращает одно значение реквизита) не получая объект РО целиком в кэш. |
|||
6
MaximSh
04.04.24
✎
10:34
|
(0) Это магия. При чтении отдельных реквизитов объекта из базы данных следует иметь в виду, что вызов метода ПолучитьОбъект или обращение к реквизитам объекта через точку от ссылки приводит к загрузке объекта из базы целиком, вместе с его табличными частями.
Поэтому для чтения значений отдельных реквизитов из базы данных следует использовать запрос. |
|||
7
RomanYS
04.04.24
✎
10:43
|
(4) Почему сразу косяк. Так и было задумано. Это называется кэширование.
Если ТС повторит свои пример в цикле например 200 раз, то окажется что быстрее было прочитать объект целиком. |
|||
8
Garykom
гуру
04.04.24
✎
10:54
|
(7) Косяк потому что учат плохому, например запросам/обработкам в цикле
Вместо стараться сразу правильно делать не по одному а с много записей работать |
|||
9
Timon1405
04.04.24
✎
11:10
|
||||
10
scanduta
04.04.24
✎
11:22
|
(0) БСП тоже не всегда панацея
я думаю что обращение через точку станадртное, например для справочника валюты будет быстрее работать чем через функцию БСП. Если же есть реквизиты типа хранилища значения тяжелые, тогда имеет смысл |
|||
11
Fragster
гуру
04.04.24
✎
11:23
|
(5) забыл, что для этого еще и блокировка на объект накладывается
|
|||
12
Мультук
гуру
04.04.24
✎
11:32
|
//гуру пишет код 01.04.2024
код = ссылкаВалюта.Код; //Ничего страшного я точно знаю Затем в этот модуль приходит неофит и "учится у гуру" //Гуру чуть выше так писал. Мне ли с ним спорить ? Номер = ссылкаЗаказКлиентаНа900Позиций.Номер И начинает работать "теория разбитых окон" |
|||
13
RomanYS
04.04.24
✎
13:20
|
(8) Кто учит и где? В БСП есть методы и для получения реквизитов для массива элементов в том числе.
А про чтение и кэширование объекта целиком написано во всех методичках. |
|||
14
Garykom
гуру
04.04.24
✎
13:53
|
(13) Платформа с "простейшими методами" которые нифига не простейшие под капотом.
Это совершенно нелогично что чтение реквизита по ссылке вызывает дергание полностью объекта со всеми связанными ТЧ. Хотя есть функция ПолучитьОбъект() - только которая и должна это вызывать. А простое Ссылка.ИмяРеквизита - должно быть равнозначно ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) по тяжести. Да можно допом засунуть в кэш пустой объект с одним заполненным реквизитом, чтобы затем в фоне (и нет нагрузки) его "дозаполнить". И при получении других реквизитов сначала проверить кэш, и если там нет то еще взять реквизит из базы и добавить его в кэш аналогично. |
|||
15
mikecool
04.04.24
✎
13:52
|
(4) "Ну почему сразу вброс. "
потому как автор произвел опыты и якобы затупил |
|||
16
DrZombi
гуру
04.04.24
✎
14:06
|
(0) Иллюзия, Если вы будете просто вызывать "Наименование" или "Представление", то тут скорей всего ваша теория экономии памяти подтвердится :)
|
|||
17
DrZombi
гуру
04.04.24
✎
14:09
|
(12) Потом приходит, человек, и пишет
стрРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(РО, "Склад,Код,Номер,Ссылка,Представление,Проведен"); |
|||
18
H A D G E H O G s
04.04.24
✎
14:13
|
(17) И?
|
|||
19
НЕА123
05.04.24
✎
08:50
|
(14)
> А простое Ссылка.ИмяРеквизита - должно быть равнозначно ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) по тяжести. неа. проверил док.ссылка.дата - вешает. хотя правило двух точек раньше было, вроде. и непонятно, для чего ТЧ кэшировать? |
|||
20
RomanYS
05.04.24
✎
09:07
|
(19) для чего ТЧ кэшировать?
Чтобы не обращаться каждый раз к базе. Обращений может быть много именно для ТЧ |
|||
21
НЕА123
05.04.24
✎
10:53
|
(20)
через ссылку реквизит ТЧ не получишь. объект надо получать. |
|||
22
НЕА123
05.04.24
✎
10:54
|
(20)+
или хз... может я ошибаюсь. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |