Имя: Пароль:
1C
1С v8
Философский вопрос об оформлении кода - 3
,
0 quest
 
03.06.12
23:49
1. Вариант 1 76% (13)
2. Вариант 2 24% (4)
3. Вариант 3 0% (0)
Всего мнений: 17

Трава стала еще забористее.
уже 3 эквивалентных варианта кода (здесь ТЗ это таблица значений)

1.
для каждого СтрокаТЗ из ТЗ цикл
   что-то делаем со СтрокаТЗ;
КонецЦикла;

2.
всего = ТЗ.Количество()-1;
для ИндексСтроки = 0 по всего цикл
   СтрокаТЗ = ТЗ[ИндексСтроки];
   что-то делаем со СтрокаТЗ;
КонецЦикла;

3.
всего = ТЗ.Количество()-1;
ИндексСтроки = 0;
пока ИндексСтроки < всего цикл
   СтрокаТЗ = ТЗ[ИндексСтроки];
   что-то делаем со СтрокаТЗ;
   ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;


Какой из вариантов вам ближе? в каких случаях? почему?
1 0_Serg_0
 
03.06.12
23:51
2  вариант

но  вместо

всего = ТЗ.Количество()-1;
для ИндексСтроки = 0 по всего цикл

написал бы

всего = ТЗ.Количество();
для ИндексСтроки = 0 по всего-1 цикл

или


для ИндексСтроки = 0 по ТЗ.Количество()-1 цикл

Вариант 2
2 IamAlexy
 
03.06.12
23:53
(0) чисто риторический вопрос:
ИТС и их рекомендации по оформлению кода читал?
3 IamAlexy
 
03.06.12
23:54
по теме: первый вариант
4 quest
 
03.06.12
23:56
(2) не смотря на то что риторический - отвечу - да.
для себя ответ есть. А вот послушать что могут сказать умные люди - всегда приятно. Вдруг что новое для себя узнаю :)
5 DrShad
 
03.06.12
23:56
да уже добейте кто-нибудь ТС - сил больше нет
6 0_Serg_0
 
03.06.12
23:57
(1) + бывает что  без индексов не обойтись - например для удаления части записей
а когда обращаться  по индексу не надо - то  конеч  1 вариант
7 DrShad
 
04.06.12
00:10
удалять можно и строки
8 dklushin
 
04.06.12
00:10
(0) вопрос один: где ты это берёшь? конечно первый. Если вот тебе нужно перескакивать через элементы, знать индекс текущего элемента при выполнении, ещё что-то творить с индексами, то тут ещё можно подумать, а так....

Вариант 1
9 Нуф-Нуф
 
04.06.12
00:11
Не?

Вариант 1
10 0_Serg_0
 
04.06.12
00:12
(7)
ТЗ тогда собьётся
11 DrShad
 
04.06.12
00:13
(10) смотря как удалять
12 dklushin
 
04.06.12
00:14
(10) вопрос зачем удалять в этом цикле, во время проверок?? Пишешь массив удаляемых записей, потом в отдельном цикле удаляешь. И делов
13 Asmody
 
04.06.12
00:14
первый, остальное — говнокод.
и вообще, я предпочел бы "рубийный" вариант типа

ТЗ.ДляКаждойСтроки { |строка|
    // что-то делаем со строкой
}
14 0_Serg_0
 
04.06.12
00:16
(12)
а  зачем потом и отдельно?? - если можно сразу просто обратным проходом
15 Asmody
 
04.06.12
00:17
(14) затем, что так быстрее
16 0_Serg_0
 
04.06.12
00:18
(15)
для ЛЮБЫХ случаев?))
17 dklushin
 
04.06.12
00:18
(14) ну можно и так.. Можно и прямым проходом без индексов(кажись, не пробовал), можно прямым с индексами и смещением счетчика на (-1)
18 lepesha
 
04.06.12
00:19
Я бы еще и обратный порядок выборки строк организовал - а вдруг в процессе их количество изменится. Но вы на меня внимание не обращайте, я уже литруху виски выпел.
19 Asmody
 
04.06.12
00:20
(16) в большинстве случаев
20 quest
 
04.06.12
00:20
(13) я вообще бы предпочел как в Lisp'e
для преобразований
(map (lambda (x) (что-то там делаем со строкой)) ТЗ)
для удалений
(filter (lambda (x) (условие по которому удаляем)) ТЗ)
для вычислений
(reduce (lambda (x y) (какая-то функция обработки строки)) ТЗ)
- и просто и понятно
но кто прикрутит lisp к 1C?
21 dklushin
 
04.06.12
00:21
(20) тогда уж в sql проще удаление.
22 0_Serg_0
 
04.06.12
00:22
(17)
я про обратный имел в виду:

всего = ТЗ.Количество();
для ИндексСтроки = 1 по всего цикл
СтрокаТЗ = ТЗ[всего-ИндексСтроки];
23 Asmody
 
04.06.12
00:23
(20) не, в лиспе скобочки считать запаришся
24 Asmody
 
04.06.12
00:24
(21) мы же не только про удаление
25 dklushin
 
04.06.12
00:24
я понял. (22) кстати обратный цикл в 1с-ке изврат, как и цикл с шагом <>0. Я долго был в шоке, когда узнал, что там нет оператора "шаг"
26 dklushin
 
04.06.12
00:26
(24) тогда синтаксис UPDATE вполне подойдёт, мы же "что-то делаем со СтрокаТЗ;" только и всего.
27 dklushin
 
04.06.12
00:27
(25)шагом не равным 1, ошибся
28 quest
 
04.06.12
00:27
(21) каким боком тут sql?
(22) кстати, да. Забыл указать жтот вариант.
(23) не прав. после месяца чтения кода даже их не замечаешь.
(25) почему же изврат? просто непривычная для глаза конструкция
29 Asmody
 
04.06.12
00:28
(26) не факт, что мы изменяем строку, не факт, что мы изменяем только эту строку, не факт, что мы вообще что-то изменяем
30 quest
 
04.06.12
00:29
(26) update не прокатит если надо  получить результат вычисления функции над каким-то множество строк
31 dklushin
 
04.06.12
00:32
(28)
(.21) таким же, как лисп и руби.
(.25) перегруженная для глаз конструкция.

в цикле ты как получишь результат над множеством строк? вторым циклом?
32 dklushin
 
04.06.12
00:33
(29) UPDATE .... SET ...=... WHERE ...
33 Asmody
 
04.06.12
00:41
(32) не факт, что мы вообще что-то меняем! твоими словами, делаем SELECT
34 dklushin
 
04.06.12
00:48
в (0) написано же: "что-то делаем со СтрокаТЗ;"
А селект можем селектом делать, я за sql, он в некоторых случаях даже рулит.
35 Steel_Wheel
 
04.06.12
01:04
Незачем вручную считать индекс: ты его нигде не используешь, кроме обхода.

Вариант 1
36 quest
 
04.06.12
01:06
(34) что-то делаем со СтрокаТЗ - это  может быть просто читаем и используем данные из нее
например
для каждого х из ТЗ цикл
если х.Сумма < 0 тогда
 продолжить;
конецЕсли;
суммирование = ОбработатьСумму(х.сумма);
конеццикла

то есть фактически, фильтруем ТЗ и по отфильтрованым строкам что-то считаем
37 dklushin
 
04.06.12
01:56
опять же не ясно куда деваем значение переменной "суммирование" и что делает ОбработатьСумму(). Реляционным запросом можно решить 90% задач =)
38 quest
 
04.06.12
02:25
да просто реляционным запросом реши - собрать сумму так что каждая третья строка в ТЗ - умножена на 2 каждая вторая - на 3 и каждая 7 - 11.32
для ТЗ это сделать не вопрос - просто обойти. А для запроса?

если что - я понимаю что это вариант из оставшися 10% которые не решаются запросами. Так что напрягаться над решением не нужно.
39 quest
 
04.06.12
02:26
(37) там ошибка строку суммирование = ОбработатьСумму(х.сумма); читать как суммирование = суммирование+  ОбработатьСумму(х.сумма);

просто писал с мобилы, пропустил.
40 dklushin
 
04.06.12
02:47
я как раз про этот случай из 10 % и подумал. Да, ну как раз для такого случая реляционный запрос не подходит))) Приходится напрягаться, но благо в T-SQL есть циклы, это не слишком напряжно. Но кстати и такое решается запросами)) но это уже для извращенцев
41 Loki_DelMar
 
04.06.12
06:20
Определенно первый вариант, если не нужны индексы. Либо второй, если нужны.

Вариант 1
42 0xFFFFFF
 
04.06.12
06:23
(0) Предлагаю 4й вариант. ТЗ в запрос, выгружаем результат в тз, тз в массив, обходим массив, получаем строки.

Ну можно еще че нить посложнее придумать.
В этом цель опроса, так ведь?
43 dva1c
 
04.06.12
06:40
В типовых и в рекомендациях

Вариант 1
44 dva1c
 
04.06.12
06:40
Можно использовать и...

Вариант 2
45 dva1c
 
04.06.12
06:41
Все зависит от решения задачи.
46 ДенисЧ
 
04.06.12
07:56
Извращенцы...

В цикле для каждого при удалении строки из ТЗ выборка не сбивается...

Вариант 1
47 Vladal
 
04.06.12
08:19
(46) вот-вот

Вариант 1
48 shamannk
 
04.06.12
08:24
А если в первом варианте из этого же тз удалять строку то обходить тз цикл будет меньше раз на кол-во удаленных. Пример тз из 2строк 1ую удаляем и цикл завершается.

Вариант 2
49 Defender aka LINN
 
04.06.12
08:28
(6) Я обхожусь без индекса при удалении. ЧЯДНТ?

Вариант 1
50 GomerSimpson
 
04.06.12
08:53
В цикле для каждого обращение к строкам все равно происходит по индексу, который всегда увеличивается на 1.
Т.е. если мы в цикле удаляем строку, то следующая строка просто пропускается. Косяк.
51 Помогите
 
04.06.12
08:57
конечно

Вариант 1
52 Vladal
 
04.06.12
09:03
(48) Та ты шо?
При удалении строки в цикле, надо его обходить с конца, вроде УдалитьСТроку(КолвоСтрок-ТекущийНомерСтроки+1)
Но еще лучше, создать массив удаляемых строк и удалить их так.
v8: Выборочное удаление строк документа
53 Maxus43
 
04.06.12
09:07
только так.
З.ы. для удаления строк по другому, типа 2

Вариант 1
54 PuhUfa
 
04.06.12
09:12
1

Вариант 1
55 Steel_Wheel
 
04.06.12
09:55
(53) Для удаления не подходит ни один из способов. Если удалять с индексами, надо идти с конца (такой вариант не предусмотрен) или дополнительно обрабатывать строку с индексом удаляемой строки после удаления ненужной (а это уже неэффективный код)
56 mirosh
 
04.06.12
09:57
по методологии 1с конечно же

Вариант 1
57 Ахиллес
 
04.06.12
10:05
Удобнее, когда точка выхода из функции 1, поэтому

Вариант 2
58 Ахиллес
 
04.06.12
10:06
Но часто ленюсь и делаю, как короче.

Вариант 1
59 Ахиллес
 
04.06.12
10:06
А вообще наплевать, такой фигнёй голову не забиваю.
60 kotletka
 
04.06.12
10:11
Сторонники 1 удалите с его помощью в цикле некоторые строки
61 Ахиллес
 
04.06.12
10:11
Не в ту тему ответил :-)
62 Defender aka LINN
 
04.06.12
10:28
(60) Смотри и рыдай:
Вариант 1 - удалить строки с определенным значением колонки:

СтрокиДляУдаления = ТаблицаЗначений.НайтиСтроки(Новый Структура("Колонка", Значение));

Для Каждого ТекущаяСтрока Из СтрокиДляУдаления Цикл
   ТаблицаЗначений.Удалить(ТекущаяСтрока);
КонецЦикла;

Вариант 2 - удалить строки по более сложному условию

СтрокиДляУдаления = Новый Массив;

Для Каждого ТекущаяСтрока Из СтрокиДляУдаления Цикл
   Если <Условие> Тогда
       СтрокиДляУдаления.Добавить(ТекущаяСтрока);
   КонецЕсли;
КонецЦикла;

Для Каждого ТекущаяСтрока Из СтрокиДляУдаления Цикл
   ТаблицаЗначений.Удалить(ТекущаяСтрока);
КонецЦикла;
63 0_Serg_0
 
04.06.12
10:31
(62)
но ведь это не внутри варианта 1?!О_о
64 0_Serg_0
 
04.06.12
10:32
+ (63) не там где текст "что-то делаем со СтрокаТЗ;" ??
65 Defender aka LINN
 
04.06.12
10:49
(63) Варианты 2 и 3 отличает получение количества строк, вариант 1 - использование цикла Для Каждого. Все признаки в наличии, в чем проблема?
66 GomerSimpson
 
04.06.12
10:52
Удаление строки в цикле для каждого )))

УдалилиСтроку = Ложь;
Для Каждого Строка Из ТЗ Цикл
   Если УдалилиСтроку Тогда
       Строка = ТЗ[ТЗ.Индекс(Строка)-1];
   КонецЕсли;    
   Если КакоеТоУсловие Тогда
       ТЗ.Удалить(Строка);
       УдалилиСтроку = Истина;
   Иначе
       УдалилиСтроку = Ложь;
   КонецЕсли;
КонецЦикла;
67 Defender aka LINN
 
04.06.12
10:55
(66) Наверняка в медицине и для этого название найдется...
68 Infsams654
 
04.06.12
11:02
В зависимости от того, что делаем со СтрокаТЗ.
Если просто в ней что-то меняем, то 1,
если есть случай, что надо удалить, то (62) (т.к. в 1С есть эта фишка, double recept разработчикам) или (66)(что ближе к другим языкам программирования, медицину к (67)),
если надо прервать цикл
то последний пост
v8: Философский вопрос о коде
69 Steel_Wheel
 
04.06.12
11:04
(60) В том виде, в каком есть, без копрокода варианты №№2 и 3 тоже не годятся для удаления
Ошибка? Это не ошибка, это системная функция.