Имя: Пароль:
1C
 
Зачем перед обходом коллекции для Каждого Из проверять Количество()>0 ?
0 RomaH
 
naïve
31.08.22
07:24
Если ИменаПредметовДляФункций.Количество() > 0 Тогда
            Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл
собственно
1 Конструктор1С
 
31.08.22
07:25
Совершенно незачем
2 Ненавижу 1С
 
гуру
31.08.22
07:27
(0) тоже не понимаю
экономят на времени создания итератора? глупо
кстати, метод Количество() каждый раз пересчитывает число элементов или там встроенный счетчик хранится?
3 Гипервизор
 
31.08.22
07:39
(2) В каком смысле каждый раз? В условии же однократная проверка.
4 Ненавижу 1С
 
гуру
31.08.22
07:43
(3) каждый раз когда вызывается метод, не применительно к данному примеру, а в общем случае
5 RomaH
 
naïve
31.08.22
07:45
... я просто дальше не дочитал - там ИначеЕсли дальше
6 Гипервизор
 
31.08.22
07:50
(4) А, ну смотря где. Вот в цикле Для тоже однократно.
7 TormozIT
 
гуру
31.08.22
07:53
Создание итератора иногда может быть весомым, если код выполняется часто.
Сделал замер.

ТаблицаЗначений = Метаданные.Справочники;
КоличествоПроходов = 100000;

ирОбщий.НачатьЗамерЛкс(КоличествоПроходов, "Замер1");
Для Счетчик = 1 По КоличествоПроходов Цикл
    Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
        Прервать;
    КонецЦикла;
КонецЦикла;
ирОбщий.КончитьЗамерЛкс();

ирОбщий.НачатьЗамерЛкс(КоличествоПроходов, "Замер1");
Для Счетчик = 1 По КоличествоПроходов Цикл
    Если ТаблицаЗначений.Количество() = 0 Тогда
    КонецЕсли;
КонецЦикла;
ирОбщий.КончитьЗамерЛкс();

Окончание замера "Замер1" - Длительность = 0.43с, Среднее = 0.00000426с.
Окончание замера "Замер1" - Длительность = 0.3с, Среднее = 0.000003с.
8 TormozIT
 
гуру
31.08.22
07:58
(7) Хотя для пустых выборочно проверенных мной коллекций разницы все равно практически нет. Так что действительно толку от этой проверки не видно.
Возможно для каких то особых коллекций она и будет, но наверное этим можно пренебречь.
9 Ненавижу 1С
 
гуру
31.08.22
08:10
(7)

ТаблицаЗначений = Новый ТаблицаЗначений;
КоличествоПроходов = 1000000;

Время = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Счетчик = 1 По КоличествоПроходов Цикл
    Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
    КонецЦикла;
КонецЦикла;
Дельта = ТекущаяУниверсальнаяДатаВМиллисекундах()-Время;
Сообщить(Дельта);

Время = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Счетчик = 1 По КоличествоПроходов Цикл
    Если ТаблицаЗначений.Количество() > 0 Тогда
    КонецЕсли;
КонецЦикла;
Дельта = ТекущаяУниверсальнаяДатаВМиллисекундах()-Время;
Сообщить(Дельта);

разница незначительна и даже хуже во втором случае (на несколько процентов)
10 Ненавижу 1С
 
гуру
31.08.22
08:11
+(9) не хуже, в пределах погрешности в ту или другую сторону скорее всего
11 NorthWind
 
31.08.22
08:11
(0) а дальше Иначе нет?
12 NorthWind
 
31.08.22
08:11
...конечно, есть. Сорри, не прочел все посты
13 СеменовСемен
 
31.08.22
08:11
Проверка нужна, если дополнительно нужно выполнить еще действия
14 Timon1405
 
31.08.22
09:32
(2) насколько я помню, какой-то внутренний счётчик там есть
ТЗ = Новый ТаблицаЗначений;
ТЗ.Добавить();
ТЗ.Добавить();
ТЗ.Добавить();
Для Сч=1 по ТЗ.Количество() Цикл
    ТЗ.Добавить();
КонецЦикла;
Сообщить(ТЗ.Количество());
15 Serg_1960
 
31.08.22
10:14
(0) Условие "Если" обязательно тогда, когда используется совместно с "Иначе" для обработки ситуации с "пустой" коллекцией.
16 Kassern
 
31.08.22
10:19
(0) Все от контекста и логики зависит. Например, нужно запустить несколько ресурсоемких процедур/функций, если выборка не пустая. Смысла их запускать для каждого элемента нет.
17 Serg_1960
 
31.08.22
10:21
PS: Тема напомнила вчерашнюю ветку - OFF. В выражении "Если" отсутствует ветка "Иначе". Нафига собственно? - если в "Если" и"ИначеЕсли" проверяются все возможные значения реквизита, то "Иначе" - для невозможного :)
18 Святофор
 
31.08.22
11:33
>Если" и"ИначеЕсли" проверяются все возможные значения реквизита, то "Иначе" - для невозможного :)

люди косплеят конструкцию

switch ()

case ...
break;

case ...
break;

default ...
break;
19 Ненавижу 1С
 
гуру
31.08.22
11:46
(14) этот пример ничего не показывает, просто граничные условия вычисляются всегда ДО цикла в этом операторе 1С