Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вернуться на начало первого цикла из второго

Вернуться на начало первого цикла из второго
Я
   Nzzzz
 
30.07.20 - 10:40
Добрый день!
Есть 2 цикла. Когда я зайду во второй, при определенных условиях мне нужно вернуться в начало первого цикла. то есть иерархия такая, цикл в цикле.

ЦИКЛ 1: Для каждого Стр из Массив Цикл
             . . .
ЦИКЛ 2:     Для каждого Запись из мНаборЗаписейРегистра Цикл
             //вот здесь у меня условие и если оно ложь, я пишу "Продолжить;", но меня возвращает на начало второго цикла. А мне надо, чтобы на начало 1 цикла, чтобы тот код, который ниже, больше не выполнялся для Стр! Чтобы пошла следующая Стр в цикле1
             КонецЦикла;

         КонецЦикла;
   Галахад
 
1 - 30.07.20 - 10:41
Прервать
   lodger
 
2 - 30.07.20 - 10:42
замени Продолжить на Прервать
   Nzzzz
 
3 - 30.07.20 - 10:51
не помогло. Идет дальше.
Сейчас структуру ниже приведу как у меня:

ЦИКЛ 1: Для каждого Стр из Массив Цикл
             . . .
          Если ...Тогда
ЦИКЛ 2:     Для каждого Запись из мНаборЗаписейРегистра Цикл
               Если ....Тогда
                 ......
               Иначе
                  Прервать;
               конецЕсли;
            КонецЦикла;
          КОнецЕсли;
        КонецЦикла;
   Nzzzz
 
4 - 30.07.20 - 10:51
Где прервать, выходит из второго цикла и идет ниже..Не возвращает наверх
   Nzzzz
 
5 - 30.07.20 - 10:53
(4) то есть из второго цикла выходит, а первый продолжает, а мне не нужно его продолжать, надо чтобы заново шел
   Ц_У
 
6 - 30.07.20 - 10:54
Перейти (Goto)
Синтаксис:
Перейти ~<Метка>;
Описание:
Безусловная передача управления на другой оператор программы. Передает управление от одного оператора к другому. Область действия оператора ограничивается программным модулем, процедурой или функцией; он не может передать управление за пределы программного модуля, процедуры или функции.
Метка – это идентификатор, "помечающий" определенный оператор, на который надо передать управление в ходе выполнения программы. Метка отделяется от этого оператора двоеточием и предваряется символом "~".
Пример:
Пока Истина Цикл
 Для Каждого Элемент Из МассивЭлементов Цикл
  Если ВыполнениеУсловия(Элемент) Тогда
   Перейти ~ВыходИзДвойногоЦикла;
  КонецЕсли;
  ...
 КонецЦикла;
КонецЦикла;
~ВыходИзДвойногоЦикла:
// продолжение вычислений
   Ц_У
 
7 - 30.07.20 - 10:56
сейчас налетят адепты против использования операторов перехода, не нравится - не используйте :)
   JeHer
 
8 - 30.07.20 - 10:57
(0) Какая задача, а то вон уже адепты "Goto" поналетели в (6) (7)?
   ГдеСобакаЗарыта
 
9 - 30.07.20 - 10:57
Так это же бесконечный цикл получится.
   JeHer
 
10 - 30.07.20 - 10:58
(9) может ТС по условию что-то меняет и в следующий раз уже не попадает на это условие?
   ГдеСобакаЗарыта
 
11 - 30.07.20 - 11:00
(10) Все равно рано или поздно попадутся зацикливающие условия. Закон Мерфи
   Nzzzz
 
12 - 30.07.20 - 11:02
Эта обработка в которую я загружаю файл Эксель - из него всё помещается в массив - этот массив каждую строчку обхожу циклом (Цикл 1) - далее я иду в РС, мне нужно проверить конкретное поле с датой - создаю цикл по обходу Набора записей регистра сведений (Цикл 2) - и проверяю реквизит - если он совпадает с тем реквизитом из массива, тогда прерываюсь и выхожу - если не совпадает, то изменяю реквизит и записываю.
   vova1122
 
13 - 30.07.20 - 11:03
(зациклывания небудет, если метку (куда перейти) постакить перед КонецЦикла (внешнего цикла)
   Bigbro
 
14 - 30.07.20 - 11:03
иначе
прервано=1;
Прервать;
Если прервано=1 тогда Продолжить конецЕсли;
выкидывает из продолжения после второго цикла в след итерацию первого.
извините за 7рочный стиль.
примерно так.
   Злопчинский
 
15 - 30.07.20 - 11:05
Пока Истина Цикл
  ПиздецВсему = ФункцияСдвумяЦиклами();
  Если ПиздецВсему Тогда 
    Прервать;
  КонецЕсли;
КонецЦикла.

Функция ФункцияСдвумяЦиклами()
   Цикл 1
     Цикл 2
         Если Чтото тогда 
           Возврат Ложь;
         КонецЕсли;
     КонецЦикла1
   КонецЦикла1
   Возврат Истина;

КонецФункции
   uno-group
 
16 - 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;
       Прервать;
     КонецЕсли;
  КонецЦикла;//Ж

КонецЦикла;//Ы
   uno-group
 
21 - 30.07.20 - 11:12
Тогда первый цикл по переменной и менять значение переменной в 1
   Злопчинский
 
22 - 30.07.20 - 11:14
(21) не, скорее в 0.
хотя может и в 1, хз в какой момент внутри системы счетчик цикла инкрементируется...
   Фрэнки
 
23 - 30.07.20 - 11:14
Только тс не уточнил, что именно он считает началом. Начало цикла - это которое начинается с первой позиции в коллекции или переход на обработку следующего? Или повторная обработка той же самой позиции в коллекции не сдвигаясь выше или ниже
   JeHer
 
24 - 30.07.20 - 11:15
(12) >>> если он совпадает с тем реквизитом из массива, тогда прерываюсь и выхожу - если не совпадает, то изменяю реквизит и записываю

Непонятно же. Получится, что в РС будут записана последняя запись из 1-го цикла?
   vova1122
 
25 - 30.07.20 - 11:15
ЦИКЛ 1: Для каждого Стр из Массив Цикл
             . . .
          Если ...Тогда
Нашли=Ложь;
ЦИКЛ 2:     Для каждого Запись из мНаборЗаписейРегистра Цикл
               Если ....Тогда
                 ......
               Иначе
                   Нашли=Истина; 
                  Прервать;
               конецЕсли;
            КонецЦикла;
Если Нашли тогда
Продолжить;
КонецЕсли;
          КОнецЕсли;
        КонецЦикла;
   uno-group
 
26 - 30.07.20 - 11:16
(22) Скорее всего да хотя не знаю как на 0 отреагирует. лучше в 1 в начале 1 цикла переменную сбрасывать.
А так зафигачить циклы в отдельные функции и хоть рекурсией по кругу их крутить.
   Nzzzz
 
27 - 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"
   Fish
 
32 - 30.07.20 - 11:21
(27) Главное, это не забыть переменную "Прервано" обнулить :))
   Nzzzz
 
33 - 30.07.20 - 11:23
(29) ой, не так выразилась. Он начинается сначала, а не продолжается
   Nzzzz
 
34 - 30.07.20 - 11:24
(32) Забыла)
   Фрэнки
 
35 - 30.07.20 - 11:24
Вообще, если возникают такого рода заморочки, то вложенный цикл с обработкой условий и возвратом некоего флага нужно оформлять в качестве функции.

Хотя по производительности уже готового кода могут возникнуть претензии.
   vova1122
 
36 - 30.07.20 - 11:25
(32)934) см (25)
   Конструктор1С
 
37 - 30.07.20 - 11:28
(3) фууу... Ужаснейшая структура кода. Разбей эту портянку на методы
   Конструктор1С
 
38 - 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) угу.
но девушка - нестойкая. колеблется. ;-)
   Конструктор1С
 
44 - 30.07.20 - 11:38
(12) ты пытаешься делать несколько дел одновременно, в этом вся проблема. Как-минимум: чтение файла одно действие, проверка данных второе, запись в регистр третье. Но на деле декомпозиция будет ещё глубже. Вот что гласит золотое правило:

ФУНКЦИЯ ДОЛЖНА ВЫПОЛНЯТЬ ТОЛЬКО ОДНУ ОПЕРАЦИЮ. ОНА ДОЛЖНА ВЫПОЛНЯТЬ ЕЕ ХОРОШО. И НИЧЕГО ДРУГОГО ОНА ДЕЛАТЬ НЕ ДОЛЖНА

Под функцией тут понимается вообще любой метод (в терминах 1с и процедура, и функция). У тебя внутри одного метода стописят действий. Такой код потом тяжело читать, долго и нудно править, а каждое изменение будет пораждать пучок ошибок
   Злопчинский
 
45 - 30.07.20 - 11:51
(44) а перечисленные действия должны выполняться последовательно над всем массивом данных, или последовательно для каждой строки массива данных?
   Вафель
 
46 - 30.07.20 - 12:14
нужно не через для каждого а через
для счётчик=1 по
со сбросом счётчика
   Конструктор1С
 
47 - 30.07.20 - 12:15
(45) правильнее будет отделить чтение данных из файла, проверку данных и запись в БД. Про инкапсуляцию слышал что-нибудь? Хороший метод знает минимум о "внешнем мире" и никогда не интересуется внутренними подробностями вызываемых им методов. Завтра чтение из файла поменяется на чтение из внешней БД (файла другой структуры, таблицы 1с, нужное подчеркнуть), и будешь ты перелопачивать весь код. А если чтение из файла будет инкапсулировано в отдельный метод(ы), то изменять придется только этот метод(ы). Помимо этого, при грамотной декомпозиции ты сможешь применять методы в других участках конфигурации. Портянко-метод ты больше нигде ппименить не сможешь. То же самое относится и к другим "блокам"
   Bigbro
 
48 - 30.07.20 - 12:17
вот же докопались.
ну понадобится причесать и навести красоту перепишет отдельными функциями.
работает - не трожь.
   Конструктор1С
 
49 - 30.07.20 - 12:22
(48) надо сразу писать по-человечачи. "Потом" равносильно "никогда". В 9 из 10 случаев никто не будет причесывать плохой код, даже свой собственный. Просто допишет к существующему говнокоду новый говнокод, сделав модуль ещё кривее-запутаннее-глючнее
   JeHer
 
50 - 30.07.20 - 12:23
(48) сколько раз ты причёсывал свои разработки? Если сразу делать всё, как говорит Конструктор, то в дальнейшем это очень сильно помогает.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.