|
Чем можно заменить условие: СправочникСсылка.ПолучитьОбъект()<>Неопределено ? | ☑ | ||
---|---|---|---|---|
0
Shaman
12.11.11
✎
09:32
|
Проходит обработка большого количества объектов, данное условие занимает значительную часть обработки. Логика условия такова - в качестве параметра передается ссылка на справочник, возможен вариант когда передается ссылка на еще не записанный элемент справочника, но с установленым гуидом.
Можно ли "облегчить" это условие? |
|||
1
Amiralnar
12.11.11
✎
09:39
|
С гуидом, без гуида... не записанный = > ЭтоНовый() = Истина
|
|||
2
anddro
12.11.11
✎
09:39
|
Запросом почему не хочешь? И желательно не в цикле
|
|||
3
anddro
12.11.11
✎
09:40
|
ЭтоНовый - у объекта, а ТС спрашивает про ссылку
|
|||
4
Amiralnar
12.11.11
✎
09:47
|
Передавай параметром признак того, что объект записан. Или храни список не записанных объектов в глобальной таблице.
|
|||
5
Aleksey
12.11.11
✎
09:51
|
А если запросом
Функция ОбъектБДСуществует(ТестоваяСсылка) ИмяОбъекта = ТестоваяСсылка.Метаданные().Имя; ПолноеИмяОбъекта = ТестоваяСсылка.Метаданные().ПолноеИмя(); Запрос = новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | ИСТИНА КАК СсылкаБДСуществует |ИЗ | " + ПолноеИмяОбъекта + " КАК " + ИмяОбъекта + " |ГДЕ | " + ИмяОбъекта + ".Ссылка = &Cсылка"; Запрос.УстановитьПараметр("Cсылка", ТестоваяСсылка); РезультатЗапроса = Запрос.Выполнить(); Возврат Не РезультатЗапроса.Пустой(); КонецФункции Если не ОбъектБДСуществует(Результат.ВалютаДокумента) тогда //не записано, или битая ссылка КонецЕсли |
|||
6
Фрэнки
12.11.11
✎
10:04
|
(5) тогда по условиям написанного запроса будет получаться, что у тестовой ссылки просто не заполнено значение реквизита Ссылка
т.е. если такой запрос работает, должна работать и проверка ЗначениеЗаполнено(СправочникСсылка.Ссылка) |
|||
7
Фрэнки
12.11.11
✎
10:10
|
+5 но при этом я уже вижу свою ошибку : мой вариант надо применять в том случае, если конкретная ссылка получена чтением данных _объекта_, т.е. СправочникСсылка нужно перечитать из базы, что можно сделать тем же самым методом ПолучитьОбъект().
А в запросе вызывается неявным образом чтение данных объекта из БД - это практически такая же функция ПолучитьОбъект() Я к тому что выигрыша по скорости для каждой конкретной проверяемой ссылкой в цикле не даст никакого. Надо придумывать какой-то более эффективный способ. |
|||
8
sda553
12.11.11
✎
10:13
|
(7) Понимаешь в чем дело. Тут уже была дискуссия которая установила, что если какой то горе программист напишет в модуле объекта функцию Предупреждение() или Вопрос() или еще какую то такую гадость, то твой код ПолучитьОбъект() ни фига не будет работать из под сервера.
|
|||
9
sda553
12.11.11
✎
10:14
|
(8) Поэтому тогда установили что безопаснее и быстрее использовать запросы
|
|||
10
Фрэнки
12.11.11
✎
10:21
|
(9) с этой позицией (запрос вместо метода) я согласен на все 100% - есть безопасность кода и ее нужно обеспечить.
Но в контексте заданного вопроса в теме просят предложить версию выигрыша по скорости обработки. Я не думаю, что по скорости именно такая версия запроса даст выигрыш, либо он будет совсем небольшой. |
|||
11
acsent
12.11.11
✎
10:30
|
(7) ПолучитьОбъект()не работает на сервере??????
|
|||
12
Фрэнки
12.11.11
✎
10:36
|
(11) Ну... по идее, согласно задумке разработчиков платформы, при корректном описании контекста модуля, на сервере ПолучитьОбъект() работать будет. Поэтому я и не особо привязываюсь к методу, а говорю об отсутствии выигрыша в скорости, если просто заменить вызов одного метода для одной ссылки на объект таким вот запросом, точно также получающим один объект по ссылке на него.
|
|||
13
Фрэнки
12.11.11
✎
10:37
|
зы. убежал. вечером вернусь.
|
|||
14
acsent
12.11.11
✎
10:45
|
(12) А отличие от (5) в том что ПолучитьОбъект() получает ВСЕ реквизиты и что самое страшное табличные части
|
|||
15
anddro
12.11.11
✎
10:49
|
(14) +1
|
|||
16
sda553
15.11.11
✎
08:04
|
(10) У ПолучитьОбъект() выполняется модуль инициализации - он может хоть час выполнятся, смотря что туда понаписать
|
|||
17
Фрэнки
15.11.11
✎
08:53
|
(16) просто я не видел никогда этого модуля. Если в модуле предусмотрено выделение памяти под типы значений реквизитов и реквизитов тч и в самом деле происходит единовременное получение всех этих значений... Это же прописывается в коде платформы? "смотря что туда" - это имеется ввиду в состав реквизитов шапки и реквизитов тч ?
|
|||
18
Фрэнки
15.11.11
✎
08:55
|
(14) о как! не удосуживался проверить.
|
|||
19
alkov
15.11.11
✎
09:10
|
А Пустая() не прокатит?
|
|||
20
sda553
15.11.11
✎
11:48
|
(17) Это обычный модуль объекта. Код инициализации это то что в этом модуле за границами всех процедур и функций
(19) Конечно нет, Пустая() для битой ссылки возвращает Ложь |
|||
21
Фрэнки
15.11.11
✎
14:41
|
(20) хитро, спасибо за подсказку.
|
|||
22
alkov
15.11.11
✎
14:43
|
(20) А ему нужно Истина, если GUID уже установлен?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |