Имя: Пароль:
1C
1С v8
Точка 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)+
или хз... может я ошибаюсь.