|
Вернуться на начало первого цикла из второго | ☑ | ||
---|---|---|---|---|
0
Nzzzz
30.07.20
✎
10:40
|
Добрый день!
Есть 2 цикла. Когда я зайду во второй, при определенных условиях мне нужно вернуться в начало первого цикла. то есть иерархия такая, цикл в цикле. ЦИКЛ 1: Для каждого Стр из Массив Цикл . . . ЦИКЛ 2: Для каждого Запись из мНаборЗаписейРегистра Цикл //вот здесь у меня условие и если оно ложь, я пишу "Продолжить;", но меня возвращает на начало второго цикла. А мне надо, чтобы на начало 1 цикла, чтобы тот код, который ниже, больше не выполнялся для Стр! Чтобы пошла следующая Стр в цикле1 КонецЦикла; КонецЦикла; |
|||
1
Галахад
гуру
30.07.20
✎
10:41
|
Прервать
|
|||
2
lodger
30.07.20
✎
10:42
|
замени Продолжить на Прервать
|
|||
3
Nzzzz
30.07.20
✎
10:51
|
не помогло. Идет дальше.
Сейчас структуру ниже приведу как у меня: ЦИКЛ 1: Для каждого Стр из Массив Цикл . . . Если ...Тогда ЦИКЛ 2: Для каждого Запись из мНаборЗаписейРегистра Цикл Если ....Тогда ...... Иначе Прервать; конецЕсли; КонецЦикла; КОнецЕсли; КонецЦикла; |
|||
4
Nzzzz
30.07.20
✎
10:51
|
Где прервать, выходит из второго цикла и идет ниже..Не возвращает наверх
|
|||
5
Nzzzz
30.07.20
✎
10:53
|
(4) то есть из второго цикла выходит, а первый продолжает, а мне не нужно его продолжать, надо чтобы заново шел
|
|||
6
Ц_У
30.07.20
✎
10:54
|
Перейти (Goto)
Синтаксис: Перейти ~<Метка>; Описание: Безусловная передача управления на другой оператор программы. Передает управление от одного оператора к другому. Область действия оператора ограничивается программным модулем, процедурой или функцией; он не может передать управление за пределы программного модуля, процедуры или функции. Метка – это идентификатор, "помечающий" определенный оператор, на который надо передать управление в ходе выполнения программы. Метка отделяется от этого оператора двоеточием и предваряется символом "~". Пример: Пока Истина Цикл Для Каждого Элемент Из МассивЭлементов Цикл Если ВыполнениеУсловия(Элемент) Тогда Перейти ~ВыходИзДвойногоЦикла; КонецЕсли; ... КонецЦикла; КонецЦикла; ~ВыходИзДвойногоЦикла: // продолжение вычислений |
|||
7
Ц_У
30.07.20
✎
10:56
|
сейчас налетят адепты против использования операторов перехода, не нравится - не используйте :)
|
|||
8
JeHer
30.07.20
✎
10:57
|
(0) Какая задача, а то вон уже адепты "Goto" поналетели в (6) (7)?
|
|||
9
ГдеСобака Зарыта
30.07.20
✎
10:57
|
Так это же бесконечный цикл получится.
|
|||
10
JeHer
30.07.20
✎
10:58
|
(9) может ТС по условию что-то меняет и в следующий раз уже не попадает на это условие?
|
|||
11
ГдеСобака Зарыта
30.07.20
✎
11:00
|
(10) Все равно рано или поздно попадутся зацикливающие условия. Закон Мерфи
|
|||
12
Nzzzz
30.07.20
✎
11:02
|
Эта обработка в которую я загружаю файл Эксель - из него всё помещается в массив - этот массив каждую строчку обхожу циклом (Цикл 1) - далее я иду в РС, мне нужно проверить конкретное поле с датой - создаю цикл по обходу Набора записей регистра сведений (Цикл 2) - и проверяю реквизит - если он совпадает с тем реквизитом из массива, тогда прерываюсь и выхожу - если не совпадает, то изменяю реквизит и записываю.
|
|||
13
vova1122
30.07.20
✎
11:03
|
(зациклывания небудет, если метку (куда перейти) постакить перед КонецЦикла (внешнего цикла)
|
|||
14
Bigbro
30.07.20
✎
11:03
|
иначе
прервано=1; Прервать; Если прервано=1 тогда Продолжить конецЕсли; выкидывает из продолжения после второго цикла в след итерацию первого. извините за 7рочный стиль. примерно так. |
|||
15
Злопчинский
30.07.20
✎
11:05
|
Пока Истина Цикл
ПиздецВсему = ФункцияСдвумяЦиклами(); Если ПиздецВсему Тогда Прервать; КонецЕсли; КонецЦикла. Функция ФункцияСдвумяЦиклами() Цикл 1 Цикл 2 Если Чтото тогда Возврат Ложь; КонецЕсли; КонецЦикла1 КонецЦикла1 Возврат Истина; КонецФункции |
|||
16
uno-group
30.07.20
✎
11:09
|
Цикл 1
нашли=0; Цикл 2 Если .... Тогда Нашил=1 Прервать КонецЦикла Если нашли=1 тогда Продолжить; КонецЕсли; КонецЦикла; |
|||
17
ГдеСобака Зарыта
30.07.20
✎
11:09
|
(12) Засовывай excel в тз, тз в запрос, в запросе соединяй с РС, получай только необходимые к обработке записи.
|
|||
18
Злопчинский
30.07.20
✎
11:09
|
(16) ну ему не продолжить внешний цикл надо. а начать его заново
|
|||
19
Василий Алибабаевич
30.07.20
✎
11:11
|
(0) "при определенных условиях мне нужно вернуться в начало первого цикла"
Птля... Классика Пока УсловиеЦикла1 Цикл Флаг = Истина; Пока УсловиеЦикла2 Цикл Если Чтото Тогда Флаг = Ложь; Прервать; КонецЕсли; КонецЦикла; // !!! Если НЕ Флаг Тогда Продолжить; КонецЕсли; ... КонецЦикла; |
|||
20
Злопчинский
30.07.20
✎
11:12
|
в клюшках можно было бы счетчик цикла тупо в предначальное значение установить и все
. Для Ы=1 По Конец1 Цикл Для Ж=1 По Конец2 Цикл Если ЧтоТо Тогда Ы=0; Прервать; КонецЕсли; КонецЦикла; //Ж КонецЦикла; //Ы |
|||
21
uno-group
30.07.20
✎
11:12
|
Тогда первый цикл по переменной и менять значение переменной в 1
|
|||
22
Злопчинский
30.07.20
✎
11:14
|
(21) не, скорее в 0.
хотя может и в 1, хз в какой момент внутри системы счетчик цикла инкрементируется... |
|||
23
Фрэнки
30.07.20
✎
11:14
|
Только тс не уточнил, что именно он считает началом. Начало цикла - это которое начинается с первой позиции в коллекции или переход на обработку следующего? Или повторная обработка той же самой позиции в коллекции не сдвигаясь выше или ниже
|
|||
24
JeHer
30.07.20
✎
11:15
|
(12) >>> если он совпадает с тем реквизитом из массива, тогда прерываюсь и выхожу - если не совпадает, то изменяю реквизит и записываю
Непонятно же. Получится, что в РС будут записана последняя запись из 1-го цикла? |
|||
25
vova1122
30.07.20
✎
11:15
|
ЦИКЛ 1: Для каждого Стр из Массив Цикл
. . . Если ...Тогда Нашли=Ложь; ЦИКЛ 2: Для каждого Запись из мНаборЗаписейРегистра Цикл Если ....Тогда ...... Иначе Нашли=Истина; Прервать; конецЕсли; КонецЦикла; Если Нашли тогда Продолжить; КонецЕсли; КОнецЕсли; КонецЦикла; |
|||
26
uno-group
30.07.20
✎
11:16
|
(22) Скорее всего да хотя не знаю как на 0 отреагирует. лучше в 1 в начале 1 цикла переменную сбрасывать.
А так зафигачить циклы в отдельные функции и хоть рекурсией по кругу их крутить. |
|||
27
Nzzzz
30.07.20
✎
11:17
|
Спасибо добрые люди, сказали как выкрутиться из этой ситуации! Сделала с переменной. После ИНАЧЕ во втором цикле объявила переменную, присвоила ей значение и потом проверила это значение:
Иначе Прервано=1; Прервать; КонецЕсли; КонецЦикла; Если Прервано=1 тогда Продолжить конецЕсли; КонецЕсли; Вернулся на первый цикл! Ещё раз, спасибо КАЖДОМУ! |
|||
28
Фрэнки
30.07.20
✎
11:17
|
- А чего читать начинать и заканчивать?
- Все очень просто. Начинай с начала, а когда дойдешь до конца - заканчивай |
|||
29
Злопчинский
30.07.20
✎
11:18
|
(27) ну так тыж сама сказала что тебе нужно НЕ ПРОДОЛЖИТЬ первый цикл, а начать его ЗАНОВО...?
а у тебя продолжение первого цикла... |
|||
30
ГдеСобака Зарыта
30.07.20
✎
11:19
|
Остановитесь! Сделаете сейчас из ТС еще одного гуру алгоритмистики, который вместо человечьей архитектуры, будет массивы в циклах крутить.
Сейчас перевожу базу с 2 на 3 и это просто .... разбираться в подобных зацикленных конструкциях предыдущих прогов. |
|||
31
Злопчинский
30.07.20
✎
11:19
|
(27) а. сорри, посмотрел исх.
"Чтобы пошла следующая Стр в цикле1" |
|||
32
Fish
30.07.20
✎
11:21
|
(27) Главное, это не забыть переменную "Прервано" обнулить :))
|
|||
33
Nzzzz
30.07.20
✎
11:23
|
(29) ой, не так выразилась. Он начинается сначала, а не продолжается
|
|||
34
Nzzzz
30.07.20
✎
11:24
|
(32) Забыла)
|
|||
35
Фрэнки
30.07.20
✎
11:24
|
Вообще, если возникают такого рода заморочки, то вложенный цикл с обработкой условий и возвратом некоего флага нужно оформлять в качестве функции.
Хотя по производительности уже готового кода могут возникнуть претензии. |
|||
36
vova1122
30.07.20
✎
11:25
|
(32)934) см (25)
|
|||
37
Конструктор1С
30.07.20
✎
11:28
|
(3) фууу... Ужаснейшая структура кода. Разбей эту портянку на методы
|
|||
38
Конструктор1С
30.07.20
✎
11:29
|
(7) просто не надо писать кривокод, сквозь дебри которого может только GOTO пролезть
|
|||
39
Злопчинский
30.07.20
✎
11:31
|
(33) Тогда твой код который ты выбрала для реализации - кривой. он не делает то что тебе надо. он - ПРОДОЛЖАЕТ.
а тебе надо - НАЧАТЬ ЗАНОВО. |
|||
40
Ёпрст
30.07.20
✎
11:34
|
(39) че ты докапался до девушки, ей не надо заново, ей надо что всё что ниже не выполнялось и всё..чтоб вернулось на след итерацию первого цикла, об этом в (0) написано
|
|||
41
Злопчинский
30.07.20
✎
11:35
|
(33) ну и "начинается сначала" и "продолжается" - ты уже как-то определись к чему применяются эти термины. каша в голове - каша на языке.
. если термины применяются к ЦИКЛУ КАК К УПРАВЛЯЮЩЕЙ КОНСТРУКЦИИ - то при выходе из внутреннего цикла "начинается сначала" - эквивалетно началу первого цикла с 1. старт первого цикла заново. если термины применяются к КОДУ ВНУТРИ ЦИКЛА - то при выходе из внутреннего цикла "начинается сначала" - экваивалетно перехода к началу кода внутри внешнего цикла, т.е. по сути ПРОДОЛЖЕНИЕ внешнего цикла. |
|||
42
Ёпрст
30.07.20
✎
11:35
|
у ней так
цикл1 .... цикл 2 конец цикла2 <туту кучка мусора, который выполнять не надо, если во втором цикле было прервать> КонецЦикла1 |
|||
43
Злопчинский
30.07.20
✎
11:36
|
(42) угу.
но девушка - нестойкая. колеблется. ;-) |
|||
44
Конструктор1С
30.07.20
✎
11:38
|
(12) ты пытаешься делать несколько дел одновременно, в этом вся проблема. Как-минимум: чтение файла одно действие, проверка данных второе, запись в регистр третье. Но на деле декомпозиция будет ещё глубже. Вот что гласит золотое правило:
ФУНКЦИЯ ДОЛЖНА ВЫПОЛНЯТЬ ТОЛЬКО ОДНУ ОПЕРАЦИЮ. ОНА ДОЛЖНА ВЫПОЛНЯТЬ ЕЕ ХОРОШО. И НИЧЕГО ДРУГОГО ОНА ДЕЛАТЬ НЕ ДОЛЖНА Под функцией тут понимается вообще любой метод (в терминах 1с и процедура, и функция). У тебя внутри одного метода стописят действий. Такой код потом тяжело читать, долго и нудно править, а каждое изменение будет пораждать пучок ошибок |
|||
45
Злопчинский
30.07.20
✎
11:51
|
(44) а перечисленные действия должны выполняться последовательно над всем массивом данных, или последовательно для каждой строки массива данных?
|
|||
46
Вафель
30.07.20
✎
12:14
|
нужно не через для каждого а через
для счётчик=1 по со сбросом счётчика |
|||
47
Конструктор1С
30.07.20
✎
12:15
|
(45) правильнее будет отделить чтение данных из файла, проверку данных и запись в БД. Про инкапсуляцию слышал что-нибудь? Хороший метод знает минимум о "внешнем мире" и никогда не интересуется внутренними подробностями вызываемых им методов. Завтра чтение из файла поменяется на чтение из внешней БД (файла другой структуры, таблицы 1с, нужное подчеркнуть), и будешь ты перелопачивать весь код. А если чтение из файла будет инкапсулировано в отдельный метод(ы), то изменять придется только этот метод(ы). Помимо этого, при грамотной декомпозиции ты сможешь применять методы в других участках конфигурации. Портянко-метод ты больше нигде ппименить не сможешь. То же самое относится и к другим "блокам"
|
|||
48
Bigbro
30.07.20
✎
12:17
|
вот же докопались.
ну понадобится причесать и навести красоту перепишет отдельными функциями. работает - не трожь. |
|||
49
Конструктор1С
30.07.20
✎
12:22
|
(48) надо сразу писать по-человечачи. "Потом" равносильно "никогда". В 9 из 10 случаев никто не будет причесывать плохой код, даже свой собственный. Просто допишет к существующему говнокоду новый говнокод, сделав модуль ещё кривее-запутаннее-глючнее
|
|||
50
JeHer
30.07.20
✎
12:23
|
(48) сколько раз ты причёсывал свои разработки? Если сразу делать всё, как говорит Конструктор, то в дальнейшем это очень сильно помогает.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |