|   |   | 
| 
 | Точка 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)+
 или хз... может я ошибаюсь. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |