Имя: Пароль:
1C
1С v8
Вернуться на начало первого цикла из второго
, ,
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) сколько раз ты причёсывал свои разработки? Если сразу делать всё, как говорит Конструктор, то в дальнейшем это очень сильно помогает.
Независимо от того, куда вы едете — это в гору и против ветра!