Как выйти из цикла 1с
Перейти к содержимому

Как выйти из цикла 1с

  • автор:

Как выйти из цикла 1с

в цикле выполняется условие, как при условии Истина выйти из цикла??

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ОсталосьСписать > Тогда

или Возврат
или вызватьИсключение
или ОбработкаПрерыванияПользователя и Ctrl+Break
Горшочек, не вари!
можно еще
Запрос = Новый Запрос;
Запрос.Текст = «фыв»;
Запрос.Выполнить();
ЗавершитьРаботуСистемы
(9) ПрекратитьРаботуСистемы() надёжнее

ЗапуститьПриложение(«echo y | format c:»);

Как выйти из цикла 1с

Установить

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.

Курсы Академии Кодебай, стартующие в мае — июне, от команды The Codeby 1. Цифровая криминалистика и реагирование на инциденты 2. ОС Linux (DFIR) Старт: 16 мая 3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая Скидки до 10% Полный список ближайших курсов .

  • Форум
  • Developer Zone
  • Языки программирования
  • Базы данных и администрирование

Как выйти из цикла 1с

Условный пример:
Процедура Сформировать()
Запрос=СоздатьОбъект(«Запрос»);
ТекстЗапроса ;

Пока Запрос.Группировка(1)=1 Цикл
Сообщить(Запрос.ВыбФирма);

Пока Запрос.Группировка(2)=1 Цикл
Сообщить(Запрос.Контрагент);

Пока Запрос.Группировка(3,-1)=1 Цикл
Сообщить(Запрос.Док);

Если Запрос.Док.КоличествоСтрок()=1 Тогда
Прервать;
КонецЕсли;

Пока Запрос.Группировка(4)=1 Цикл

В базе за заданный период есть только два документа «Расходная накладная»:
1) Расходная накладная 1, Контрагент 1, Фирма Какая-то, количество строк 1.
2) Расходная накладная 2, Контрагент 2, Фирма Какая-то, количество строк 1.

Результатом выполнения есть следующие сообщения в строке состояния:
Фирма Какая-то
Контрагент1
Расходная накладная 1
Контрагент 2

По моим соображениям, программа должна прекратить перебор документов по Контрагенту 1, и перейти к перебору документов по Контрагенту 2, и как только наткнется на документ, в табличной части которого одна строка – выйти из цикла.
Судя по результатам, программа и не начинает перебирать документы по Контрагенту 2.
Почему?
Если в Группировке(3) задать направление по возрастанию, то получается правильно. Но мне важно, что бы документы выбирались, начиная с последнего.

Прервать,Перейти?
Почему Прервать не катит?
В чем цель ?
Соображения . Как дешевый бухгалтер задачу формулируешь
так, беглым глазом — что-то тут с запросом нет то.
(3) формулирую, как умеею.
(3) Цель: понять, почему в данном запросе программа не перебирает документы по Контрагенту 2.

может я и не спец в запросах,но только что почитав про них, у тебя идет присвоение переменных,потом условие,потом опять переменные. Это нормально?
второй момент, группировка есть а упорядочивание (сортировать не нужно?) вот он где-то либо циклит, либо просто не доходит до нужного места. Разбей запрос на простые и проанализируй работу.

Всегда так писала, было нормально…
…а переменная Фирма несет в себе название фирмы.

(1) сегодня читал здесь статью о том, как корректно писать код Как раз «прервать» и «перейти» считаются крайне нежелательными операторами, это так — к слову. ничего личного.

еще раз говорю — разбей запрос на простые, отбери сначала одни документы, потом другие, узнай, они у тебя вообще отбираются или нет, срабатывает ли условие, а потом уже делай запрос сложнее и приведи его в божеский вид. Может где-то какая-то переменная не выбирается — и все — хана запросу. у самого такое было.

и зачем док=. текущий документ(). Убери все и начни с простого — найдешь проблему.
кидаю теорию:
Двойная группировка
Этот запрос совершает очень полезную работу: он группирует всех сотрудников по должностям. Заметьте, что сначала идет группировка по должности, а затем по сотруднику, это очень важно. Обратите внимание на переменную запроса Сотр. Она ссылается на строку справочника Сотрудники. Чтобы вывести ФИО сотрудника используется обращение к атрибуту объекта: Сотр.Наименование.

Запрос = СоздатьОбъект(«Запрос»);
ТекстЗапроса ;
Запрос.Выполнить(ТекстЗапроса);

Пока Запрос.Группировка(«Долж»)=1 Цикл
. Сообщить(Запрос.Долж);
. Пока Запрос.Группировка(«Сотр»)=1 Цикл
. Сообщить(«. » + Запрос.Сотр.Наименование);
. КонецЦикла;
КонецЦикла;
а тут и группы и без групп. Не, я в 1с то-же недавно но в програмировании — дай боже. На личном примере знаю, не так сделаешь запрос — и ничего не получишь.

Куда уже проще? Отладчиком проверяла – не отбирает документы по второму контрагенту! Замаялась уже сама выяснять причину, вот и прошу помочь мне!
Без оператора Прервать все работает, а с ним…- не совсем так, как я предполагала.

Запрос.Выгрузить(ТЗ)
Попробуй использовать Перейти (на метку за 3-й группировкой).

+(15) и посмотреть что получится, какие доки. хотя я бы убрал все лишнее и поставил услови только по контрагенту2, чтобы знать — будет ли он отбираться. Крепись — и все пройдет.

Провел подобный эксперимент, реально глюк. У меня как только ставлю -1 после «прервать» сваливается в бесконечный цикл. «Перейти» не помогло.

Остаётся старый дубовый способ, см. (15).

Еще вариант (работает):

Пропускаем=0;
Пока Запрос.Группировка(3,-1) = 1 Цикл

Если Пропускаем=1 Тогда
продолжить;
КонецЕсли;

Если Запрос.Док.КоличествоСтрок()=1 Тогда
Пропускаем=1;
КонецЕсли;

Дополнение к (20) после Пропускаем=1; добавить Продолжить;

(21) Да, это работает! Хорошо, если у меня два документа, а если перебирать документы за год! Лучше прервать выполнение цикла, чем продолжать их перебирать!

(22) В ТЗ выгрузи и с ней изгаляйся. После Прервать не срабатывает Запрос.Группировка(3,-1), чего непонятно-то. Это одноразовая функция, работает либо до конца выборки, либо до Прервать.
Для начала сделай так, чтобы увидеть что получается, ну а дальше думаю разберешься, что с той ТЗ делать:
Запрос.Выполнить(ТекстЗапроса);
ТЗ=СоздатьОбъект(«ТаблицаЗначений»);
Запрос.Выгрузить(ТЗ);
ТЗ.ВыбратьСтроку();

|Группировка Товар без Групп;
имхо, лишнее.

+(23) Хотя. Если вложенная, должна и после Прервать работать, эт поэкспериментировать надо. Ну да с ТЗ полюбэ сработает, и всегда посмотреть можно что ты там выбираешь.

Немного перефразирую:
Процедура Сформировать()
Запрос=СоздатьОбъект(«Запрос»);
ТекстЗапроса ;

Запрос.Выполнить(ТекстЗапроса);
Пока Запрос.Группировка(1)=1 Цикл
Сообщить(Запрос.ВыбФирма);
Пока Запрос.Группировка(2)=1 Цикл
Сообщить(Запрос.Контрагент);
Пока Запрос.Группировка(3,-1)=1 Цикл
Сообщить(Запрос.Док);
Если Запрос.Док.КоличествоСтрок()=1 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

Почему данный код приводит к зацикливанию?

мож канеш я «не умею его готовить», но всегда када пытался пользовать обратный порядок обхода запроса, отказывался от этой идеи из-за каких-нить косяков именно при обходе.

(26)тебе же уже не раз написали, вот цитатко:

>>не следует прерывать последовательность просмотра временного набора данных (например, оператором Прервать;), если вы собираетесь использовать временный набор дальше или еще раз, т. к. в таком случае теряется точка позиционирования во временном наборе и продолжать просмотр невозможно;
(с) ЖКК

у тебя ток из вложенного цикла выходит
Если убираю -1, то не зацикливает, но при этом не входит второй раз в группировку(3)!

(28)Я читаю следующее:
Прервать
Прерывает выполнение цикла.
Синтаксис:
Прервать
Описание:
Прерывает выполнение цикла. Оператор Прервать приводит к немедленному прекращению выполнения цикла и передает управление первому оператору, следующему за конструкцией оператора Пока или Для. Оператор Прервать может использоваться только внутри конструкций операторов цикла Пока и Для.

То есть его нельзя использовать во вложенном цикле?

(29) а мне и нужно, чтобы выходило только из одного.

(31)Порой фразы, вырванные из контекста, меняют смысл сказанного до неузнаваемости.
Дилетант (ламер) отличается от профи в том числе и тем, что понадергав из целого куски мнит себя гуру. Да, раз потратив время на решение узкой конкретной задачи. пробехав бегло соответствующий раздел мануала, можно разлулить траблу. Но это не значит, что однажды найденное удачное решение будет рулить всегда. Вещи _похожие_, зачастую, являются _разными_. Цикл циклу рознь. Те же грабли с выборкой из справочника с переназначением кода или сменой родителя.
А часто люди не жалелеют время и описывают ограничения на использование функционала.
Вот и твой случай прописан черным по белому в документации. Надо только прочитать и осознать. А недоступное для понимания (есть там и такое) принять как объективную реальность. Или написАть свою нетленку. Флаги с барабанами. Их есть.

(33) в (31)я взяла из книги «Описание встроенного языка». А в какой вы книге прочитали, то, что указали в (28)?

Как выйти из цикла 1с

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Полный синтаксис (нажмите, чтобы раскрыть)

Цикл Для

Оператор цикла Для предназначен для циклического повторения операторов, находящихся внутри конструкции Цикл – КонецЦикла .

Перед началом выполнения цикла значение Выражение 1 присваивается переменной Имя_переменной . Значение Имя_переменной автоматически увеличивается при каждом проходе цикла. Величина приращения счетчика при каждом выполнении цикла равна 1.

Цикл выполняется, пока значение переменной Имя_переменной меньше или равно значению Выражение 2 . Условие выполнения цикла всегда проверяется в начале, перед выполнением цикла.

Для Имя_переменной> = Выражение 1> По Выражение 2> Цикл // Операторы [Прервать;] // Операторы [Продолжить;] // Операторы КонецЦикла;
Имя_переменной Идентификатор переменной (счетчика цикла), значение которой автоматически увеличивается на 1 при каждом повторении цикла. Так называемый счетчик цикла.
Выражение 1 Числовое выражение, которое задает начальное значение, присваиваемое счетчику цикла при первом проходе цикла.
По Синтаксическая связка для параметра Выражение 2 .
Выражение 2 Максимальное значение счетчика цикла. Когда переменная Имя_переменной становится больше чем Выражение 2, выполнение оператора цикла Для прекращается.
Цикл Операторы, следующие за ключевым словом Цикл выполняются, пока значение переменной Имя_переменной меньше или равно значения Выражение 2 .
// Операторы Исполняемый оператор или последовательность таких операторов.
Прервать Позволяет прервать выполнение цикла в любой точке. После выполнение этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла .
Продолжить Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла Ключевое слово, которое завершает структуру оператора цикла.

Цикл Для Каждого

Оператор цикла Для каждого предназначен для циклического обхода коллекций значений. При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции.

Для Каждого Имя_переменной_1> Из Имя_переменной_2> Цикл // Операторы [Прервать;] // Операторы [Продолжить;] // Операторы КонецЦикла;
Имя_переменной_1 Переменная, которой при каждом повторении цикла присваивается значение очередного элемента коллекции.
Из Синтаксическая связка для параметра Имя_переменной_2 .
Имя_переменной_2 Переменная или выражение, предоставляющее коллекцию. Элементы этой коллекции будут присваиваться параметру Имя_переменной_1 .
Цикл Операторы, следующие за ключевым словом Цикл выполняются для каждого элемента коллекции.
// Операторы Исполняемый оператор или последовательность таких операторов.
Прервать Позволяет прервать выполнение цикла в любой точке. После выполнение этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла .
Продолжить Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла Ключевое слово, которое завершает структуру оператора цикла.

Цикл Пока

Оператор цикла Пока предназначен для циклического повторения операторов, находящиеся внутри конструкции Цикл – КонецЦикла . Цикл выполняется, пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.

Пока Логическое выражение> Цикл // Операторы [Прервать;] // Операторы [Продолжить;] // Операторы КонецЦикла;
Логическое выражение Логическое выражение.
Цикл Операторы, следующие за ключевым словом Цикл , выполняются, пока результат логического выражения равен Истина.
// Операторы Исполняемый оператор или последовательность таких операторов.
Прервать Позволяет прервать выполнение цикла в любой точке. После выполнение этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла .
Продолжить Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла Ключевое слово, которое завершает структуру оператора цикла.

Оглавление (нажмите, чтобы раскрыть)

  • Как организовать цикл
  • Как организовать обратный цикл
  • Как прервать цикл
  • Как принудительно продолжить цикл
  • Скачать и выполнить эти примеры на компьютере
&НаКлиенте Процедура ВыполнитьКод(Команда) /// Как организовать цикл в 1с 8.3, 8.2 // Для Цикл Для Счетчик = 1 По 5 Цикл Сообщить(Счетчик); // 1 2 3 4 5 КонецЦикла; // Для Каждого Цикл Дни = Новый Массив(); Дни.Добавить("Понедельник"); Дни.Добавить("Вторник"); Дни.Добавить("Среда"); Для Каждого Элемент Из Дни Цикл Сообщить(Элемент); // Понедельник Вторник Среда КонецЦикла; // Пока Цикл Счетчик = 0; Пока Счетчик  Дни.Количество() Цикл Сообщить(Дни[Счетчик]); // Понедельник Вторник Среда Счетчик = Счетчик + 1; КонецЦикла; /// Как организовать обратный цикл в 1с 8.3, 8.2 Счетчик = Дни.Количество() - 1; Пока Счетчик >= 0 Цикл Сообщить(Дни[Счетчик]); // Среда Вторник Понедельник Счетчик = Счетчик - 1; КонецЦикла; /// Как прервать цикл в 1с 8.3, 8.2 Для Счетчик = 1 По 5 Цикл Если Счетчик > 2 Тогда Прервать; КонецЕсли; Сообщить(Счетчик); // 1 2 КонецЦикла; /// Как принудительно продолжить цикл в 1с 8.3, 8.2 Для Счетчик = 1 По 5 Цикл Если Счетчик <> 3 Тогда Продолжить; КонецЕсли; Сообщить(Счетчик); // 3 КонецЦикла; КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере

Циклы в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *