Имя: Пароль:
1C
1С v8
Как правильней сч=сч+1 или тз.Индекс(текСтрока)?
0 Crush
 
28.12.12
12:42
Как методологически правильнее получать номер строки при переборе Для Каждого?

варианты:

1) сч=сч+1

2) тз.Индекс(текСтрока)



При подсчете процента выполнения. От куда лучше брать общее количество строк?

1) из переменной КолСтрок = тз.Количество(), определенной перед циклом

2) из тз.Количество()



Переменные сч и КолСтрок более нигде не используются
1 Reset
 
28.12.12
12:44
Я бы делал так
--
сч=сч+1
--
из переменной КолСтрок = тз.Количество()
--
2 Kreont
 
28.12.12
12:44
сч=сч+1
универсальнее, и для массивов подойдет
3 palpetrovich
 
28.12.12
12:44
1 - 1
2 - пофиг
4 vicof
 
28.12.12
12:44
Не проще
Для к = 1 По КолчиествоСтрок Цикл?
5 acsent
 
28.12.12
12:45
выгода несущественная
6 Reset
 
28.12.12
12:46
(4) +1
7 zak555
 
28.12.12
12:46
(4) +1
чем сч++
8 fisher
 
28.12.12
12:47
(4) +1
Если нужны номера, то по ним и обхожу.
9 hhhh
 
28.12.12
12:48
(6) да это два разных варианта:

для (4) правильнее через "к", а если Для Каждого ТекСтрока Из ТЗ, то вариант тз.Индекс(текСтрока) рулит.
10 Reset
 
28.12.12
12:49
(9) Почему рулит? Имхо он чуть медленней чем специальный счетчик, хотя (5).
11 hhhh
 
28.12.12
12:52
(10) товарищ из (0) спрашивает "Как методологически правильнее". Понятно, что чуть помедленнее. Да там со счетчиками вероятность ошибиться больше. А тут есть строка, тупо берем ее индекс.
12 Mnemonic1C
 
28.12.12
12:57
(0) Смотря что делать с этой таблицей. Если например удалять строки по условию(ям), то не подойдет ни один из описаных алгоритмов.
13 Kreont
 
28.12.12
12:58
Для масивов обращение через "Индекс" не пойдет, вариант с "сч" будет универсальней
14 Crush
 
28.12.12
13:12
На консультации к экзамену на спеца говорилось, что не нужно лишний раз инициализировать переменные.
Сам склоняюсь к тз.Индекс(текСтрока), но сколько операций выполняется процессором для получения индекса? Когда достаточно обратиться к области памяти, прочитать, добавить, записать - в случае с сч++.
Так же и с количеством строк. Если через метод таблицы, то явно больше(имхо) операций, чем через переменную.

Собственно вопрос касается случая, когда в процессе перебора строк нужно ориентироваться в каком месте находишься: будь то процент выполнения или решаешь ставить запятую после последнего значения или нет.
15 Reset
 
28.12.12
13:17
"что не нужно лишний раз инициализировать переменные"
Это правильно. Вопрос в том, какой случай считать лишним.
Имхо, когда заведение переменной приводит к увеличению быстродействия, переменная не лишняя.
16 Reset
 
28.12.12
13:18
(15)<--- еще укажу мем "Имхо". Мнение может несовпадать с мнением экзаменаторов на спеца:) Да даже тут в ветке есть другое (11)
17 Reset
 
28.12.12
13:21
(14) в частном случае с запятой имхо проще ставить всегда(избавившись от проверок в цикле), а потом лишнюю один раз отрезать :)
18 Crush
 
28.12.12
13:29
(17) Хе, согласен! А если перед предпоследним значением союз "и" надо влепить?:)
Собственно это и подтолкнуло к вопросу.
19 Reset
 
28.12.12
13:32
(18)
К примеру :)
Для i=1 по Количество-1 цикл // для всех кроме последней
// Лепим основную часть
КонецЦикла;
//Лепим "И "+ПоследняяЧасть
20 Classic
 
28.12.12
13:32
(18)
То же самое.
ТекстУсловия = "";
Для Каждого .... Цикл
  ТекстУсловия = ТекстУсловия + "И " + НовоеУсловие + " ";
КонецЦикла;
ТекстУсловия = Сред(ТекстУсловия,3);
21 Classic
 
28.12.12
13:33
+(20)
Обычно надо "И" лепить везде, кроме первого.
22 Axel2009
 
28.12.12
13:34
(6)(7) вроде как получитьстроку отработывает медленнее чем для каждого
23 Reset
 
28.12.12
13:35
(21)  А может там не запрос, а "Уважаемый Петр, Марья, Сергей И Паша" :)
24 Classic
 
28.12.12
13:35
(23)
Возможно :)
25 Reset
 
28.12.12
13:37
(22) Вполне возможно, не задавался. Можно проверить.
Для каждого то же наверянка по индексу перебирает, но "внутри", соотв. может быстрее
26 NcSteel
 
28.12.12
13:38
Методически верно так:

Запрос = Новый Запрос;
Запрос.ТекстЗапроса = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();

КоличествоИтераций = Выборка.Количество();
Если КоличествоИтераций > 0 Тогда
   Индикатор = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
   Индикатор.НаименованиеОбработкиДанных = "Обработка справочника спецификации";
   Индикатор.КомментарийОбработкиДанных  = "";
   Индикатор.КомментарийЗначения         = "Обработано";
   Индикатор.МаксимальноеЗначение        = КоличествоИтераций;
   Индикатор.Значение = 0;
   Индикатор.Открыть();
КонецЕсли;
Пока Выборка.Следующий() Цикл
   ОбработкаПрерыванияПользователя();
       
   Индикатор.КомментарийОбработкиДанных = "Обработка элемента: " + Выборка.Ссылка;
   
//Обработка

   Индикатор.Значение = Индикатор.Значение + 1;    
КонецЦикла;
27 GANR
 
28.12.12
13:46
(0) тз.Индекс(текСтрока) - чтоб не думать!
28 GANR
 
28.12.12
13:47
+(27) Мало-ли какие строки добавятся/удалятся
29 Reset
 
28.12.12
13:50
(28) Если строки могут удалиться, "Для каждого" вообще противопоказан :) А в "Для" счетчик уже есть
30 hhhh
 
28.12.12
13:54
(29) так он собъется, если строки удалять. Проверено, ТЗ.Количество() вычисляется ровно один раз, в начале.
31 Reset
 
28.12.12
13:56
(30) По крайней мере иногда можно построить так, чтобы не сбился. "Для каждого" вообще "не управляемый".
32 NcSteel
 
28.12.12
13:57
(31) Не надо ля ля ля . 1С часто его используют для таких целей и нормально.
33 Axel2009
 
28.12.12
14:01
(30) если строки удалять то смысла в увеличении счетчика нет никакого. выйдет за рамки массива
34 Reset
 
28.12.12
14:04
(32) Поясни про "ля ля"
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn