Имя: Пароль:
1C
1С v8
Чем можно заменить условие: СправочникСсылка.ПолучитьОбъект()<>Неопределено ?
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 уже установлен?