Вход | Регистрация


1С:Предприятие ::

Метки: 

Проверить ссылку что не новая (существует в БД).Кроме Если ПолучитьОбъект() = Неопределено

Я
   Sam1C
 
29.09.17 - 12:09
Суть во внешней БД (Приемник) создается элемент(или документ) по ГУИД базы Источника. И соответственно нужно проверить это новая ссылка или уже есть такой объект. Проверяю так:

СсылкаПриемник = ПолучитьВнешниюСсылкуПоГУИД(пВидВПриемнике,пГУИД_Источника);
Если СсылкаПриемник.ПолучитьОбъект() = Неопределено Тогда
...

Может есть какой другой способ проверить, не нравится использования тяжелого метода ПолучитьОбъект(), тем более объект и не нужен, нужна проверка.
 
  Рекламное место пустует
   Ненавижу 1С
 
1 - 29.09.17 - 12:23
ТекстЗапроса = 
    "ВЫБРАТЬ
    |    1 КАК Флаг
    |ИЗ
    |    "+ИмяВидаОбъекта+"."+ИмяТипаУдаленный+" КАК Т
    |ГДЕ
    |    Т.Ссылка = &Ссылка";
    Запрос = Соединение.NewObject("Запрос",ТекстЗапроса);
    Запрос.УстановитьПараметр("Ссылка",УдСсылка);
    ЭтоНовый = Запрос.Выполнить().Пустой();
   Sam1C
 
2 - 29.09.17 - 12:34
(1) а точно это будет быстрее работать в цикле, чем ПолучитьОбъект() ?
   Альбатрос
 
3 - 29.09.17 - 12:36
(2) Сделай запрос сразу на все ссылки
   Fragster
 
4 - 29.09.17 - 12:36
(2) инфа сотка
   Лефмихалыч
 
5 - 29.09.17 - 12:38
(2) если объект не новый, то гарантированно быстрее. ПолучитьОбъект() тянет на клиента все реквизиты и табличные части объекта.

Но вообще, такие вещи в цикле делать не надо.
   Sam1C
 
6 - 29.09.17 - 12:42
(3) Заранее не известно какие ссылки
   Sam1C
 
7 - 29.09.17 - 12:46
(5) На какого клиента тянет? вся обработка выполняется в модуле объекта на сервере. И как без цикла ? Запросом выбираются нужные данные, и в цикле обходит выборку проверят создан объект в Приемнике или нет. Не создан, создает, все ссылочные реквизиты создаются рекурсивно, поэтому выбрать сразу ссылки для проверки нет возможности
   Sam1C
 
8 - 29.09.17 - 12:52
(1) Протестирую этот способ посмотрю замеры, отпишусь! Может еще какие интересные варианты?
   Рэйв
 
9 - 29.09.17 - 13:43
(0)А что .Пустая(уже запрещено религией?:)
   Рэйв
 
10 - 29.09.17 - 13:43
.Пустая()
 
 
   H A D G E H O G s
 
11 - 29.09.17 - 13:46
(9) Запрещено, Рэйв, запрещено.
   H A D G E H O G s
 
12 - 29.09.17 - 13:49
(0) Надеюсь, кэш уже пройденных GUID и найденных/созданных объектов есть?
   H A D G E H O G s
 
13 - 29.09.17 - 13:52
(0) Пройдись первый раз без записи, просто накопи ГУИДы в разрезе видов объектов, запроси их в базе, результат сохрани в Соответствии, но даже я бы забил и остановился на (1)
90% времени у тебя будет тратится на повторную обработку уже обработанного, если нет кэша (12)
   Рэйв
 
14 - 29.09.17 - 14:07
(9)А, понял. По УИД получает бытую если нет в базе.
   Ненавижу 1С
 
15 - 29.09.17 - 14:17
(13) вот кстати, после того как скопипастил это - подумал о кэше
   Sam1C
 
16 - 29.09.17 - 14:18
(9) Пустая() всегда будет возвращать ЛОЖЬ, не зависимо есть объект в БД или нет! Проверено
   Sam1C
 
17 - 29.09.17 - 14:20
(12) Конечно же есть
   HEKPOH
 
18 - 29.09.17 - 15:43
(0) из БСП:

&НаСервере
// Проверяет физическое наличие записи в информационной базе данных о переданном значении ссылки.

//
// Параметры:

//  ЛюбаяСсылка - значение любой ссылки информационной базы данных.
// 

// Возвращаемое значение:
//  Булево.

//
Функция СсылкаСуществует(ЛюбаяСсылка)//Экспорт

    
    ТекстЗапроса = "
    |ВЫБРАТЬ
    |    Ссылка КАК Ссылка
    |ИЗ
    |    [ИмяТаблицы]
    |ГДЕ
    |    Ссылка = &Ссылка
    |";
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ЛюбаяСсылка));
    
    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка);
    
    Возврат НЕ Запрос.Выполнить().Пустой();
    
КонецФункции

&НаСервере
// Возвращает полное имя объекта метаданных по переданному значению ссылки.

// Примеры:
//  "Справочник.Номенклатура";

//  "Документ.ПриходнаяНакладная".
//

// Параметры:
//  Ссылка - ЛюбаяСсылка - объект, для которого необходимо получить имя таблицы ИБ.

// 
// Возвращаемое значение:

//  Строка - полное имя объекта метаданных для указанного объекта.
//

Функция ИмяТаблицыПоСсылке(Ссылка)//Экспорт

    
    Возврат Ссылка.Метаданные().ПолноеИмя();
    
КонецФункции
   Tateossian
 
19 - 29.09.17 - 15:48
(10) Не вариант:

ДокКЗР = Документы.КорректировкаЗаписейРегистров.ПолучитьСсылку(Новый УникальныйИдентификатор);
Ы = ДокКЗР.Пустая();


Ы = Ложь
   Sam1C
 
20 - 29.09.17 - 16:11
(18) И как это относится к (0)? вернет одинаковое значение есть ли эта ссылка в базе или нет ее
   OneLove1C
 
21 - 30.09.17 - 09:13
Проверяй по номеру документа. Если такого документа нет, то и реквизиты полученной ссылки будут не заполнены:
Если НЕ ЗначениеЗаполнено(СсылкаПриемник.Номер) Тогда
...
   H A D G E H O G s
 
22 - 30.09.17 - 11:41
(21) Дичь какая.
   Филиал-msk
 
23 - 30.09.17 - 11:58
(22) Я уже удивлен, что ещё никто не предложил проверенный временем способ:

Если Найти(Ссылка, "Объект не найден") Тогда
   GANR
 
24 - 02.10.17 - 10:46
(23) Ты знаешь, что скажут сотрудники фирмы 1С, если ты им такое предложишь? (0) Рекомендую (18).
   Филиал-msk
 
25 - 02.10.17 - 11:22
(24) Ну хорошо, убедил:

Если Найти(Ссылка, "Объект не найден") > 0 Или Найти(Ссылка, "Object not found") > 0 Тогда

Пойдет? Я теперь всегда так писать буду!
   Ненавижу 1С
 
26 - 02.10.17 - 11:38
(25) это бред
1. Языков чуть больше чем два
2. Никто не гарантирует, что завтра представление битой ссылки не изменится
   Филиал-msk
 
27 - 02.10.17 - 11:40
(26) Хорошо! Я вынесу код проверки в отдельную функцию и буду ее постоянно рефакторить!
   Филиал-msk
 
28 - 02.10.17 - 11:41
Кстати, можно использовать ПовтИсп!
   Ненавижу 1С
 
29 - 02.10.17 - 11:47
(27) это не рефакторинг
   Филиал-msk
 
30 - 02.10.17 - 11:49
(29) А как это называется? Есть же умное слово, я в тетрадку записывал!
   dezss
 
31 - 02.10.17 - 12:27
(30) Костыль
   HEKPOH
 
32 - 02.10.17 - 15:58
(20) В фирме 1С так не считают :)
   H A D G E H O G s
 
33 - 02.10.17 - 16:10
(30) Оленизм.
 
 
   Ненавижу 1С
 
34 - 02.10.17 - 16:12
(30) хз как это называется, но

Рефакторинг - процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы
   Sam1C
 
35 - 03.10.17 - 20:57
(32) Извиняюсь сразу не весь код развернул, поэтому в (20) комментировал  "Ссылка.Метаданные().ПолноеИмя()". Но а так тоже самое что и в (1), но все равно спасибо.
   Tateossian
 
36 - 03.10.17 - 21:18
(25) Кстати, вы в курсе, что неявное приведение к булево быстрее сравнения на количество в среднем на 5-7%:

замерьте так
Таб = Новый ТаблицаЗначений();

Для Инд = 0 По 9999999 Цикл
    Если Таб.Количество() Тогда
                
    КонецЕсли;
КонецЦикла;

И так 
Таб = Новый ТаблицаЗначений();

Для Инд = 0 По 9999999 Цикл
    Если Таб.Количество() > 0 Тогда
                
    КонецЕсли;
КонецЦикла;

Это касается и всяких "найти" (кроме там, где возрвщается неопределено или массив), да и писать короче. Хоть 5% и не много, но все же лучше чем ничего:)
   Лефмихалыч
 
37 - 03.10.17 - 21:28
(7) ну, значит, - на сервер приложений, а не на клиента.
Без цикла - собрать все ссылки в таблицу значений, эту таблицу значение один раз в запросе соединить левым соединением с основной таблицей документа и получить за один запрос по всем статус новый/старый.

Если перечень ссылок для проверки известен до цикла, то проверять их запросов в цикле - грубейшая ошибка
   H A D G E H O G s
 
38 - 03.10.17 - 21:40
(36) Нет слов. Воспользуюсь словами другого человека:

Боль в меня вгрызалась змеей голодной,
Я топил печали в дурной крови –
И хочу, чтоб ангел с душой холодной
Отравился ядом моей любви.
   Sam1C
 
39 - 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) а чо не так?
А всегда так проверяю
Если Коллекция.Количество() Тогда

привычка еще с детства C++
и вертел я производительность конкретно в этом месте до тех пор, пока мне конкретно эти сцаные милисекунды объективно не понадобятся
   Ненавижу 1С
 
43 - 03.10.17 - 22:08
(42) даже в плюсплюсах теперь компилятор генерит предупреждение. И это хорошо
   Лефмихалыч
 
44 - 03.10.17 - 22:12
(43) когда я в йих кодил, - не генерило.
   Sam1C
 
45 - 03.10.17 - 22:15
(41) В Номенклатуре есть много реквизитов ссылочного типа и на все делать запросы? и по каждому виду потом отдельный цикл, потомучто ГУИД запросом не получить (если специально не хранить отдельно).Тем более код по скорости полностью меня устраивает, интересно было узнать альтернативу ПолучитьОбъект. Пару тысяч документов со справочниками  за 1 минуту в полне для фон. задания на один раз в день
   Лефмихалыч
 
46 - 03.10.17 - 22:18
(45) блин, да делай, как умеешь
   Лефмихалыч
 
47 - 03.10.17 - 22:18
просто нахрена было приходить сюда и спрашивать совета, чтобы потом всех убеждать, что ты в советах не нуждаешься и тебя и так всё устраивает?
   Sam1C
 
48 - 03.10.17 - 22:48
(47) на вопрос (0) получил ответ, всем за это спасибо. Но потом ушло в другую степь и мне не понятно как без цикла можно обойтись в этой конкретной задачи. Сделал запрос в Источнике по Номенклатуре и теперь как связать с Приемником чтобы определить что есть, а чего нет в Приемнике? Только цикл с получением ГУИД источника и проверкой его в Приемнике через ПолучитьСсылку. Делать этот цикл только для создания ТЗ для проверки по всем ссылкам, загонять это ТЗ во временную таблицу. выгружать запрос опять в ТЗ для поиска во втором цикле. Мне просто не кажется что это рациональней, тем более запросов может быть много в зависимости от кол-ва видов справочников зависимых.
   Sam1C
 
49 - 03.10.17 - 22:53
(48)  с кэшем по уже проверенным объектам конечно же.
 
  Рекламное место пустует
   МимохожийОднако
 
50 - 03.10.17 - 23:09
(48) Не пробовал сразу получить ГУИДЫ вместе с прочими параметрами Номенклатуры?



Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует