|
Проверить ссылку что не новая (существует в БД).Кроме Если ПолучитьОбъект() = Неопределено | ☑ | ||
---|---|---|---|---|
0
Sam1C
29.09.17
✎
12:09
|
Суть во внешней БД (Приемник) создается элемент(или документ) по ГУИД базы Источника. И соответственно нужно проверить это новая ссылка или уже есть такой объект. Проверяю так:
СсылкаПриемник = ПолучитьВнешниюСсылкуПоГУИД(пВидВПриемнике,пГУИД_Источника); Если СсылкаПриемник.ПолучитьОбъект() = Неопределено Тогда ... Может есть какой другой способ проверить, не нравится использования тяжелого метода ПолучитьОбъект(), тем более объект и не нужен, нужна проверка. |
|||
1
Ненавижу 1С
гуру
29.09.17
✎
12:23
|
ТекстЗапроса =
"ВЫБРАТЬ | 1 КАК Флаг |ИЗ | "+ИмяВидаОбъекта+"."+ИмяТипаУдаленный+" КАК Т |ГДЕ | Т.Ссылка = &Ссылка"; Запрос = Соединение.NewObject("Запрос",ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка",УдСсылка); ЭтоНовый = Запрос.Выполнить().Пустой(); |
|||
2
Sam1C
29.09.17
✎
12:34
|
(1) а точно это будет быстрее работать в цикле, чем ПолучитьОбъект() ?
|
|||
3
Альбатрос
29.09.17
✎
12:36
|
(2) Сделай запрос сразу на все ссылки
|
|||
4
Fragster
гуру
29.09.17
✎
12:36
|
(2) инфа сотка
|
|||
5
Лефмихалыч
29.09.17
✎
12:38
|
(2) если объект не новый, то гарантированно быстрее. ПолучитьОбъект() тянет на клиента все реквизиты и табличные части объекта.
Но вообще, такие вещи в цикле делать не надо. |
|||
6
Sam1C
29.09.17
✎
12:42
|
(3) Заранее не известно какие ссылки
|
|||
7
Sam1C
29.09.17
✎
12:46
|
(5) На какого клиента тянет? вся обработка выполняется в модуле объекта на сервере. И как без цикла ? Запросом выбираются нужные данные, и в цикле обходит выборку проверят создан объект в Приемнике или нет. Не создан, создает, все ссылочные реквизиты создаются рекурсивно, поэтому выбрать сразу ссылки для проверки нет возможности
|
|||
8
Sam1C
29.09.17
✎
12:52
|
(1) Протестирую этот способ посмотрю замеры, отпишусь! Может еще какие интересные варианты?
|
|||
9
Рэйв
29.09.17
✎
13:43
|
(0)А что .Пустая(уже запрещено религией?:)
|
|||
10
Рэйв
29.09.17
✎
13:43
|
.Пустая()
|
|||
11
H A D G E H O G s
29.09.17
✎
13:46
|
(9) Запрещено, Рэйв, запрещено.
|
|||
12
H A D G E H O G s
29.09.17
✎
13:49
|
(0) Надеюсь, кэш уже пройденных GUID и найденных/созданных объектов есть?
|
|||
13
H A D G E H O G s
29.09.17
✎
13:52
|
(0) Пройдись первый раз без записи, просто накопи ГУИДы в разрезе видов объектов, запроси их в базе, результат сохрани в Соответствии, но даже я бы забил и остановился на (1)
90% времени у тебя будет тратится на повторную обработку уже обработанного, если нет кэша (12) |
|||
14
Рэйв
29.09.17
✎
14:07
|
(9)А, понял. По УИД получает бытую если нет в базе.
|
|||
15
Ненавижу 1С
гуру
29.09.17
✎
14:17
|
(13) вот кстати, после того как скопипастил это - подумал о кэше
|
|||
16
Sam1C
29.09.17
✎
14:18
|
(9) Пустая() всегда будет возвращать ЛОЖЬ, не зависимо есть объект в БД или нет! Проверено
|
|||
17
Sam1C
29.09.17
✎
14:20
|
(12) Конечно же есть
|
|||
18
HEKPOH
29.09.17
✎
15:43
|
(0) из БСП:
&НаСервере // Проверяет физическое наличие записи в информационной базе данных о переданном значении ссылки. // // Параметры: // ЛюбаяСсылка - значение любой ссылки информационной базы данных. // // Возвращаемое значение: // Булево. // Функция СсылкаСуществует(ЛюбаяСсылка) //Экспорт ТекстЗапроса = " |ВЫБРАТЬ | Ссылка КАК Ссылка |ИЗ | [ИмяТаблицы] |ГДЕ | Ссылка = &Ссылка |"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ЛюбаяСсылка)); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка); Возврат НЕ Запрос.Выполнить().Пустой(); КонецФункции &НаСервере // Возвращает полное имя объекта метаданных по переданному значению ссылки. // Примеры: // "Справочник.Номенклатура"; // "Документ.ПриходнаяНакладная". // // Параметры: // Ссылка - ЛюбаяСсылка - объект, для которого необходимо получить имя таблицы ИБ. // // Возвращаемое значение: // Строка - полное имя объекта метаданных для указанного объекта. // Функция ИмяТаблицыПоСсылке(Ссылка) //Экспорт Возврат Ссылка.Метаданные().ПолноеИмя(); КонецФункции |
|||
19
Tateossian
29.09.17
✎
15:48
|
(10) Не вариант:
ДокКЗР = Документы.КорректировкаЗаписейРегистров.ПолучитьСсылку(Новый УникальныйИдентификатор); Ы = ДокКЗР.Пустая(); Ы = Ложь |
|||
20
Sam1C
29.09.17
✎
16:11
|
(18) И как это относится к (0)? вернет одинаковое значение есть ли эта ссылка в базе или нет ее
|
|||
21
OneLove1C
30.09.17
✎
09:13
|
Проверяй по номеру документа. Если такого документа нет, то и реквизиты полученной ссылки будут не заполнены:
Если НЕ ЗначениеЗаполнено(СсылкаПриемник.Номер) Тогда ... |
|||
22
H A D G E H O G s
30.09.17
✎
11:41
|
(21) Дичь какая.
|
|||
23
Филиал-msk
30.09.17
✎
11:58
|
(22) Я уже удивлен, что ещё никто не предложил проверенный временем способ:
Если Найти(Ссылка, "Объект не найден") Тогда |
|||
24
GANR
02.10.17
✎
10:46
|
(23) Ты знаешь, что скажут сотрудники фирмы 1С, если ты им такое предложишь? (0) Рекомендую (18).
|
|||
25
Филиал-msk
02.10.17
✎
11:22
|
(24) Ну хорошо, убедил:
Если Найти(Ссылка, "Объект не найден") > 0 Или Найти(Ссылка, "Object not found") > 0 Тогда Пойдет? Я теперь всегда так писать буду! |
|||
26
Ненавижу 1С
гуру
02.10.17
✎
11:38
|
(25) это бред
1. Языков чуть больше чем два 2. Никто не гарантирует, что завтра представление битой ссылки не изменится |
|||
27
Филиал-msk
02.10.17
✎
11:40
|
(26) Хорошо! Я вынесу код проверки в отдельную функцию и буду ее постоянно рефакторить!
|
|||
28
Филиал-msk
02.10.17
✎
11:41
|
Кстати, можно использовать ПовтИсп!
|
|||
29
Ненавижу 1С
гуру
02.10.17
✎
11:47
|
(27) это не рефакторинг
|
|||
30
Филиал-msk
02.10.17
✎
11:49
|
(29) А как это называется? Есть же умное слово, я в тетрадку записывал!
|
|||
31
dezss
02.10.17
✎
12:27
|
(30) Костыль
|
|||
32
HEKPOH
02.10.17
✎
15:58
|
(20) В фирме 1С так не считают :)
|
|||
33
H A D G E H O G s
02.10.17
✎
16:10
|
(30) Оленизм.
|
|||
34
Ненавижу 1С
гуру
02.10.17
✎
16:12
|
(30) хз как это называется, но
Рефакторинг - процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы |
|||
35
Sam1C
03.10.17
✎
20:57
|
(32) Извиняюсь сразу не весь код развернул, поэтому в (20) комментировал "Ссылка.Метаданные().ПолноеИмя()". Но а так тоже самое что и в (1), но все равно спасибо.
|
|||
36
Tateossian
03.10.17
✎
21:18
|
(25) Кстати, вы в курсе, что неявное приведение к булево быстрее сравнения на количество в среднем на 5-7%:
замерьте так Таб = Новый ТаблицаЗначений(); Для Инд = 0 По 9999999 Цикл Если Таб.Количество() Тогда КонецЕсли; КонецЦикла; И так Таб = Новый ТаблицаЗначений(); Для Инд = 0 По 9999999 Цикл Если Таб.Количество() > 0 Тогда КонецЕсли; КонецЦикла; Это касается и всяких "найти" (кроме там, где возрвщается неопределено или массив), да и писать короче. Хоть 5% и не много, но все же лучше чем ничего:) |
|||
37
Лефмихалыч
03.10.17
✎
21:28
|
(7) ну, значит, - на сервер приложений, а не на клиента.
Без цикла - собрать все ссылки в таблицу значений, эту таблицу значение один раз в запросе соединить левым соединением с основной таблицей документа и получить за один запрос по всем статус новый/старый. Если перечень ссылок для проверки известен до цикла, то проверять их запросов в цикле - грубейшая ошибка |
|||
38
H A D G E H O G s
03.10.17
✎
21:40
|
(36) Нет слов. Воспользуюсь словами другого человека:
Боль в меня вгрызалась змеей голодной, Я топил печали в дурной крови – И хочу, чтоб ангел с душой холодной Отравился ядом моей любви. |
|||
39
Sam1C
03.10.17
✎
21:54
|
(37) Идет цикл по созданию документов ПриходТМЦ, в нем заполняется в тч Номенклатура, ищет в кэше есть ли такая Номенкл. нету пытается получить по ГУИД источника, нету создает новую Номенклатуру, у которой может быть 100500 ссылочных реквизитов по такому же принципу рекурсивно находит или создает ссылки...
можно конечно этот цикл прогнать один раз для сбора ТЗ для проверки на сущ. объекты, а второй уже создавать объекты. Но не думаю, что это будет для производительности лучше. Через точку гонять два цикла в COM-базе, точно не лучше |
|||
40
Лефмихалыч
03.10.17
✎
21:55
|
(23) это тупо. номенклатура с наименованием, содержащим слова "объект не найден" нагибнёт всю механизьму. Опять же - это такой же ухлебансткий запрос в цикле.
|
|||
41
Лефмихалыч
03.10.17
✎
21:56
|
(39) ну, ты перед этим циклом сделай запрос по номенклатуре, создай недостающие, а внутри цикла уже ни чего не проверяй и не создавай. Быстрее будет в 100500 и ни какие кэши в крен не сдались.
|
|||
42
Лефмихалыч
03.10.17
✎
21:58
|
(38) а чо не так?
А всегда так проверяю Если Коллекция.Количество() Тогда привычка еще с и вертел я производительность конкретно в этом месте до тех пор, пока мне конкретно эти сцаные милисекунды объективно не понадобятся |
|||
43
Ненавижу 1С
гуру
03.10.17
✎
22:08
|
(42) даже в плюсплюсах теперь компилятор генерит предупреждение. И это хорошо
|
|||
44
Лефмихалыч
03.10.17
✎
22:12
|
(43) когда я в йих кодил, - не генерило.
|
|||
45
Sam1C
03.10.17
✎
22:15
|
(41) В Номенклатуре есть много реквизитов ссылочного типа и на все делать запросы? и по каждому виду потом отдельный цикл, потомучто ГУИД запросом не получить (если специально не хранить отдельно).Тем более код по скорости полностью меня устраивает, интересно было узнать альтернативу ПолучитьОбъект. Пару тысяч документов со справочниками за 1 минуту в полне для фон. задания на один раз в день
|
|||
46
Лефмихалыч
03.10.17
✎
22:18
|
(45) блин, да делай, как умеешь
|
|||
47
Лефмихалыч
03.10.17
✎
22:18
|
просто нахрена было приходить сюда и спрашивать совета, чтобы потом всех убеждать, что ты в советах не нуждаешься и тебя и так всё устраивает?
|
|||
48
Sam1C
03.10.17
✎
22:48
|
(47) на вопрос (0) получил ответ, всем за это спасибо. Но потом ушло в другую степь и мне не понятно как без цикла можно обойтись в этой конкретной задачи. Сделал запрос в Источнике по Номенклатуре и теперь как связать с Приемником чтобы определить что есть, а чего нет в Приемнике? Только цикл с получением ГУИД источника и проверкой его в Приемнике через ПолучитьСсылку. Делать этот цикл только для создания ТЗ для проверки по всем ссылкам, загонять это ТЗ во временную таблицу. выгружать запрос опять в ТЗ для поиска во втором цикле. Мне просто не кажется что это рациональней, тем более запросов может быть много в зависимости от кол-ва видов справочников зависимых.
|
|||
49
Sam1C
03.10.17
✎
22:53
|
(48) с кэшем по уже проверенным объектам конечно же.
|
|||
50
Мимохожий Однако
03.10.17
✎
23:09
|
(48) Не пробовал сразу получить ГУИДЫ вместе с прочими параметрами Номенклатуры?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |