Здравствуйте!
Столкнулся с неожиданным поведением - запись любых данных выполняется с падением производительности и нагрузкой на СУБД.
В замере производительности и в технологическом журнале вроде локализовал проблемное место.
Имеется типичный код регистрации изменений записываемых объектов:
НаборУзлов = ЭлементДанных.ОбменДанными.Получатели;
Для каждого Узел из ВыбранныеУзлы Цикл
НаборУзлов.Добавить(Узел);
КонецЦикла;
Узел - содержит ссылку на элемент плана обмена, который содержит несколько табличных частей.
Замечено, что эта операция выполняется недостаточно быстро (при этом вызывается очень часто).
В технологическом журнале по этому фрагменту кода отразились запросы ко всем полям ссылки и запросы ко всем табличным частям, будто запрашивается объект, а не ссылка. (Даже имеется отдельный запрос на соответствие _Version).
Почему так? Ладно версию объекта проверить, но зачем весь объект вытягивать?
Влияет ли то, что НаборУзлов.Автозаполнение = истина ?
(1)Это такое поведение платформы. Всегда было и хз переделают ли. Типизация такая. Ссылка содержит всю свою же структуру метаданных. Двоякая ситуация надо ли это или нет. Как по мне так надо. Не будь этого, я даже боюсь представить сколько надо переписывать)))
(6)да, видимо поэтому где-то встречал совет в планы обмена кроме минимального примитива не добавлять. Может кто-нибудь вспомнит где была эта рекомендация?
Сейчас в конфе и реквизиты неограниченной длины и хранилищезначения и множество ТЧ с несколькими тысячами записей. кошмар )
По всей видимости при изменении свойств Отправитель и Получатели (объекта ОбменДанными) проверяется вхождение метаданных объекта в состав плана обмена указываемого узла.
"... обращение к любому полю через ссылку приведет к полному считыванию объекта (включая все поля и все табличные части)."
Спасибо за ответ! НО:
1 - в коде нет явного обращения к свойствам ссылки.
2 - оттуда же, про обращение к свойствам ссылки: "используется кэширование объектов и в определенном интервале времени при повторном обращении к данным объекта не будет выполняться повторное считывание". Кэширования данных "Узел" не наблюдается.
Походу, так как в НаборУзлов элементом коллекции является ссылка любого плана обмена, то при помещении в коллекцию считывается его тип, и это влечёт считывание всего объекта.
Также в СП написано:
Значения данного типа в системе поддерживаются централизовано.
При обращении к информации по ссылке происходит считывание узла,
а в дальнейших обращениях данный узел уже не считывается,
а используются ранее полученные значения.
-то есть при любом обращении? или я не догоняю...
В любом случае, получается кэш не срабатывает, так как сперва определяется принадлежность по типу