Имя: Пароль:
1C
1С v8
Как расово верно проверить реквизит ссылочного типа на заполненность?
🠗 (Волшебник 27.06.2017 14:40)
,
0 1dvd
 
27.06.17
12:52
1. Вариант 2 40% (2)
2. Свой ответ 40% (2)
3. КГ/АМ 20% (1)
4. Вариант 1 0% (0)
5. Оба верны 0% (0)
6. Оба не верны 0% (0)
Всего мнений: 5

Вариант 1
Если НЕ пАктСверкиВзаиморасчетов.Ссылка.Пустая() Тогда

Вариант 2
Если ЗначениеЗаполнено(пАктСверкиВзаиморасчетов.Ссылка) Тогда
1 Волшебник
 
модератор
27.06.17
12:53
1-й вариант не сработает для реквизитов составного типа

Вариант 2
2 Волшебник
 
модератор
27.06.17
12:53
Если ЗначениеЗаполнено(пАктСверкиВзаиморасчетов) Тогда

Свой ответ
3 Господин ПЖ
 
27.06.17
12:54
.

КГ/АМ
4 Ц_У
 
27.06.17
12:54
ЗначениеЗаполнено служит для проверки заполнения объектов составного типа, для простых типов быстрее будет сравнить с пустым значением того же типа.
5 Вафель
 
27.06.17
12:55
(4) насколько быстрее?
6 Ц_У
 
27.06.17
12:56
(5) не знаю насколько, наверное зависит от железяки пока она все типы перелопатит и сравнит
7 1dvd
 
27.06.17
12:58
(6) т.е. в некоторых случаях значительно?
8 Ц_У
 
27.06.17
12:59
(7) думаю это может быть узким местом в производительности
9 k_aleks80
 
27.06.17
13:08
Пользуйся.

Если обЗначениеНеЗаполнено(пАктСверкиВзаиморасчетов.Ссылка) Тогда

Функция обЗначениеНеЗаполнено(Значение)

    Результат = Ложь;
    
    Попытка
        Результат = Не ЗначениеЗаполнено(Значение)    
    Исключение // Мутабельные типы (Объекты)
        Результат = Ложь
    КонецПопытки;
    
    Возврат Результат;
    
КонецФункции

Свой ответ
10 Мыш
 
27.06.17
13:17
(8) Я проверял. Для несоставных типов ".Пустая()" выполняется на треть дольше, чем "ЗначениеЗаполнено()"

Вариант 2
11 Buster007
 
27.06.17
13:19
неужели в алгоритме узкое место - это проверка на заполненность?
12 Мыш
 
27.06.17
13:21
(11) Красивый бантик сверху. Ну а что внутри - оставим археологам )
13 Ц_У
 
27.06.17
13:23
(10) приду проверю
14 Мыш
 
27.06.17
13:33
(13) На слово тут не верят ) На производительность не повлияет ни тот ни другой вариант, кстати. По времени выполнения оба варианта сравнимы с каким-нибудь "КонецЕсли"
15 Ц_У
 
27.06.17
14:05
(14) уболтал, чертяка языкатый, не буду проверять :)
16 Мыш
 
27.06.17
14:10
(15) Ща мне карта попрёт! )
17 arsik
 
гуру
27.06.17
14:17
(10) А вот так?

МояПустаяССылка = Документы.АктыВзаимозачетов.ПустаяСсылка();

Если НЕ пАктСверкиВзаиморасчетов.Ссылка = МояПустаяССылка Тогда
18 Мыш
 
27.06.17
14:23
(17) А ты хитрый!
Быстрее, ага. На ту же треть )
19 Ц_У
 
27.06.17
14:26
(18) надо было проверить, да?
20 Ц_У
 
27.06.17
14:27
(18) из (4) "быстрее будет сравнить с пустым значением того же типа"
надо проверять как в (17) а не просто Пустая() = Истина
21 Мыш
 
27.06.17
14:39
(20) ".Пустая() = Истина" дольше чем ".Пустая()"

Но это пустые споры. На производительность влияние пренебрежительно мало. Говорю же, обычные операторы выполняются со сравнимой скоростью.
22 vde69
 
модератор
27.06.17
14:42
(17) а если тип составной и в пАктСверкиВзаиморасчетов лежит значение "Неопределено" ?
23 arsik
 
гуру
27.06.17
14:54
(22) Конечно работать не будет, но в теме это не раскрывается. Я лишь предлагаю варианты.
24 1dvd
 
28.06.17
09:50
написано же "Реквизит ссылочного типа", не может быть там неопределено