Как выйти из 1с. Прерывания цикла. объединение условий. "Горячие" клавиши: работа со списком и деревом

Внимание! В конце статьи ссылка на видеоурок.
Если Вы раньше не сталкивались с программированием, то вероятно не совсем понятна необходимость использования цикла в программе 1С. В этой статье я расскажу об операторах цикла, а также об их основном назначении.

Но сначала, для ясности, несколько пояснений об употребляемых в статье выражениях:
Итерация – это повторение.
Операторные скобки – зарезервированные слова, которые всегда записываются парами, открывающим оператором и закрывающим оператором. Например: Функция – КонецФункции, Если – КонецЕсли, Для – КонецЦикла и т.д.
Тело цикла – программный код находящийся внутри операторных скобок цикла.
Цикл – это конструкция, которая повторяет выполнение строк находящихся в теле цикла, количество повторений зависит от результата выполнения условий в начале цикла.

Если бы не было этого оператора, то код находящийся внутри цикла пришлось бы написать столько раз сколько итераций нам нужно. Представляете, если в документе 100 строк и их надо перебрать и, допустим, изменить значение, а если при этом их количество периодически меняется, т.е. они добавляются и удаляются. Это было бы не просто.
Цикл позволяет упростить задачу с выполнением повторяющихся строк кода.
В программе 1С 8.1 существует три конструкции цикла:
«Для.. По.. Цикл» - повторяет количество циклов с начального значения счетчика до конечного указанного значения, прибавляя 1 к переменной счетчика при каждой итерации. Используется когда известно количество итераций.

Цикл 1С Для

Для Счетчик = 1 По 3 Цикл //Тело цикла КонецЦикла;

Цикл 1С Пока

«Пока … Цикл» - выполняется пока вычисляемое значение равно Истина. Может использоваться в случаях, когда переменные для вычисления выражения меняются в теле цикла либо, если перебирается коллекция и у нее есть соответствующий метод возвращающий булево, который вызывается в начале цикла.

Пока Выборка.Следующий() Цикл //Тело цикла КонецЦикла;

Цикл 1С Для каждого

«Для Каждого … Из … Цикл» перебирает коллекцию с первого по последний элемент. Записывая в переменную(в примере: ТекЭлемент ) значение элемента.

Для Каждого ТекЭлемент Из МассивЭлементов Цикл //Тело цикла КонецЦикла;

Обратный цикл 1С

Также существует обратный цикл, который можно использовать для обхода коллекций в обратном порядке т.е. снизу вверх(с конца). Такой способ может понадобиться если нужно удалять элементы коллекции

КоличествоЭлементов = МассивЭлементов.Количество(); Для ОбратныйИндекс = 1 По КоличествоЭлементов Цикл ТекЭлемент = МассивЭлементов[КоличествоЭлементов - ОбратныйИндекс]; КонецЦикла;

Операторы продолжить и прервать рассматриваются в видео, ссылка ниже.

Алгоритмы многих программ зачастую предполагают циклическое повторение определённых действий. 1С в этом случае не является исключением. Циклы в 1С позволяют:

  • Перебрать элементы справочника;
  • Заполнить области макета;
  • Выполнить определенные действия с выборкой документов;
  • И многое многое другое.

Типы циклов

В 1С принято различать три типа циклов в зависимости от набора слов, входящих в конструкцию:

  1. Для каждого «Переменная» из «Коллекция значений»;
  2. Для «Переменная» = «Нач. значение» По «Кон. Значение»;
  3. Пока «Выражение».

Рассмотрим их подробнее.

Для каждого из

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

  • Переменная, определяющая текущий элемент коллекции;
  • Определение коллекции значений.

Наиболее часто возникающая ошибка в этом случае показана на рис.1

Чаще всего она возникает, когда программист не до конца понимает разницу между объектом (документом, справочником) и коллекцией (выборкой) значений, получаемой с помощью оператора Выбрать().

Для по

В качестве параметров, передаваемых в строку, в этом случае выступают:

  1. Имя переменной – итератора;
  2. Начальное значение переменной;
  3. Конечное значение переменной.

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

Такая конструкция очень часто используется при обходе табличных частей.

При использовании данного обходчика важно различать количество строк табличной части и индекс отдельной взятой строки. В первом случае начальное значение будет равно 1, конечное можно получить с помощью оператора Количество(). Индексы начинаются с 0 и заканчиваются Количество()-1. В противном случае можно получить ошибку (Рис.2).

Пока

Здесь всего один параметр – логическое выражение, которое перед каждым следующим шагом цикла проверяется на истинность. Как только логическое выражение не будет выполнено, обработчик завершит обход.

Очень важно понимать, что в некоторых случаях проверяемое выражение может постоянно находиться в значении Истина, тем самым обход будет совершаться бесконечное количество раз, подвешивая систему.

В таких случаях необходимо внутри тела цикла прописать один из двух вариантов прерывания выполнения.

Иногда может сложиться ситуация, когда истинность проверяемого выражения не наступит никогда. Это может привести к бесполезным поискам ошибки в коде и потере времени.

Прерывание выполнения нажатием комбинации клавиш

Если в теле цикла прописать процедуру ОбработкаПрерыванияПользователя(), то в любой момент его выполнения, нажав комбинацию клавиш Ctrl+PauseBreakможно остановить его работу. В этом случае в окне сообщений будет выведена строка (Рис.3).

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

Прерывание по условию

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

Правильно записанный в код программы этот оператор выделяется красным цветом.

Перескакивание некоторых операций цикла

Зачастую в цикле необходимо проверять выполнение какого-либо условия и в случае, если это условие не выполняется, проскакивать основной обработчик. Такие конструкции могут быть реализованы двумя способами:

  • В первом способе мы ставим условие и внутри конструкции Если Тогда КонецЕсли прописываем исполняемый код, если условие не выполнено, код соответственно выполняться не будет. Очевидным минусом такого подхода является то, что она достаточно громоздка и в случае большого количества условий легко ошибиться, где берется начало одного «Если» и где заканчивается другое;
  • Гораздо правильнее использовать конструкцию, где вместо утверждения условия берется его отрицание (вместо равно, берется неравно и т.д.) и помещение внутри конструкции оператора Продолжить;

Оператор «Продолжить» в теле кода выделяется красным цветом и переносит выполнение цикла в его начало.

Описание:

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

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

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

Синтаксис:

Параметры:

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

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

Описание:

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

Синтаксис:

Параметры:

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

Цикл Пока

Описание:

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

Синтаксис:

Параметры:

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

Какой цикл быстрее? Тестируем 1С

  • Высокая производительность ,
  • Ненормальное программирование ,
  • Программирование

Занимаюсь программированием 1С уже несколько лет, и тут посетила мысль - «А не пройти ли какой-нибудь обучающий курс, вдруг в знаниях есть какие-то пробелы, о которых раньше даже и не подозревал»? Сказано-сделано. Сижу, слушаю курс, дохожу до циклических операторов и тут вторая мысль (да, не часто они у меня появляются) - «А какой цикл быстрее»? Надо бы проверить.
Итак, я нашел пять способов , как можно организовать цикл средствами 1С.

Первый вид цикла, назовем его условно «ДляПо» выглядит так:

Для н = 0 по КоличествоИтераций Цикл КакиеТоДействия(); КонецЦикла;
Второй вид «ДляКаждого» :

Для Каждого ЭлементКоллекции из Коллекция Цикл КакиеТоДействия(); КонецЦикла;
Третий «Пока» :

Пока н <> КоличествоИтераций Цикл КакиеТоДействия(); н = н + 1; КонецЦикла;
Далее вспомнил ассемблерную молодость - цикл «Если» :

~НачалоЦикла: Если н <> КоличествоИтераций Тогда КакиеТоДействия(); н = н + 1; Перейти ~НачалоЦикла; КонецЕсли;
Ну и напоследок «Рекурсия»

Процедура РекурсивныйЦикл(н, КоличествоИтераций) КакиеТоДействия(); Если н <> КоличествоИтераций Тогда РекурсивныйЦикл(н+1, КоличествоИтераций); КонецЕсли; КонецПроцедуры
Естественно, что относить рекурсию к циклам не совсем корректно, но тем ни менее с её помощью можно добиться похожих результатов. Сразу оговорюсь, что в дальнейшем тестировании рекурсия не участвовала. Во первых все тесты проводились при 1 000 000 итераций, а рекурсия выпадает уже при 2 000. Во вторых скорость рекурсии в десятки раз меньше, чем скорость остальных циклов.

Последнее отступление. Одним из условий было выполнение в цикле каких-либо действий. Во первых пустой цикл используется очень редко. Во вторых цикл «ДляКаждого» используется для какой-либо коллекции, а значит и остальные циклы должны работать с коллекцией, чтобы тестирование проходило в одинаковых условиях.

Ну что ж, поехали. В качестве тела цикла использовалось чтение из заранее заполненного массива.


или, при использовании цикла «ДляКаждого»

ПриемникТестовогоЗначения = Элем;
Тестирование проводилось на платформе 8.3.5.1231 для трех видов интерфейса (Обычное приложение, Управляемое приложение и Такси).
Числа это время в миллисекундах полученное с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах() , которую я вызывал до цикла и после его завершения. Числа дробные, потому что я использовал среднее арифметическое пяти замеров. Почему я не использовал Замер производительности? У меня не было цели замерить скорость каждой строчки кода, только скорость циклов с одинаковым результатом работы.

Казалось бы и все, но - тестировать так тестировать!
Результат для платформы 8.2.19.106
В среднем платформа 8.2 на 25% быстрее, чем 8.3. Я немножко не ожидал такой разницы и решил провести тест на другой машине. Результаты приводить не буду, в можете сами нагенерировать их с помощью вот этой конфигурации. Скажу только, что там 8.2 была быстрее процентов на 20.

Почему? Не знаю, дезасемблировать ядро в мои планы не входило, но в замер производительности я все же заглянул. Оказалось, что сами циклические операции в 8.3 проходят несколько быстрее, чем в 8.2. Но на строке
ПриемникТестовогоЗначения = ТестовыйМассив.Получить(н);
то есть при считывании элемента коллекции в переменную происходит значительное снижение производительность.

В итоге:
К чему всё это? Для себя я сделал несколько выводов:

1. Если есть возможность использовать специализированный цикл - «ДляКаждого», то лучше использовать его. Кстати, сам по себе он отрабатывает дольше чем другие циклы, но скорость доступа к элементу коллекции у него на много выше.
2. Если заранее знаешь количество итераций - используй «ДляПо». «Пока» отработает медленнее.
3. Если использовать цикл «Если» - другие программисты тебя явно не поймут.

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

Пример. Сообщить значение первой непериодической константы числового типа.

// Процедура, выводящая значение первой непериодической константы числового типа

// Запускается из обработки Проба процедура Выполнить()

// флагВывода

всегоКонстант = Метаданные.Константа(); для ин = 1 по всегоКонстант цикл

если Метаданные.Константа(ин).Периодический = 1 тогда

продолжить; // Передаем управление оператору Для конецЕсли;

если Метаданные.Константа(ин).Тип = "Число" тогда

идеи = Метаданные.Константа(ин).Идентификатор;

Сообщить(иден +" " + Константа.ПолучитьАтрибут(иден)); // БалансДней 1 флагВывода = 1;

прервать; // Досрочный выход из цикла Для

конецЕсли; конецЦикла; // для

если флагВывода = 0 тогда

конецПроцедуры // Выполнить

Замечание. Иногда программисты в цикле Для вместо оператора Прервать прибегают к изменению значения переменной цикла ин. Так, в нашем случае оператор Прервать мог быть заменен оператором

ин = всегоКонстант;

Такие действия, однако, классифицируются как плохой стиль программирования.

Некоторые программисты считают, что операторы прерывания цикла (в 1С это Продолжить и Прервать) ухудшают структуру программы, и поэтому по возможности отказываются от их употребления. Взамен используется объединение условий.

Последуем и мы принципам структурного программирования, написав решающий вышеприведенную задачу код, использующий объединение условий. В этом коде нам придется отказаться от цикла Для, заменив его циклом Пока.

// Процедура, использующая объединение условий и выводящая значение первой

// непериодической константы числового типа. Запускается из обработки Проба процедура Выполнить()

перем всегоКонстант, флагВывода, ин, идеи; ОчиститьОкноСообщений();

// флагВывода примет значение 1, если будет обнаружена

// непериодическая константа числового типа флагВывода = 0;

всегоКонстант = Метаданные.Константа();

ин = 1; // Номер константы пока (ин<= всегоКонстант) и (флагВывода = 0) цикл

если (Метаданные.Константа(ин).Периодический = 0) и (Метаданные.Константа(ин).Тип = "Число") тогда

идеи = Метаданные.Константа(ин).Идентификатор; Сообщить(иден + " " + Константа.ПолучитьАтрибут(иден)); флагВывода = 1;

конецЕсли;

ин = ин + 1; // Не забываем перейти к следующей константе конецЦикла; // для

если флагВывода = 0 тогда

Сообщить("В конфигураторе нет непериодических констант числового типа."); конецЕсли;

конецПроцедуры // Выполнить

В приведенном коде объединение условий использовано при записи ЛВ дважды: (ин <= всегоКонстант) и (флагВывода = 0)

(Метаданные.Константа(ин).Периодический = 0) и (Метаданные.Константа(ин).Тип = "Число") Это позволило нам исключить из процедуры операторы Продолжить и Прервать.

 
Статьи по теме:
Как убрать защитный код на нокиа
Инструкция Блокировка сим-карты осуществляется при помощи пин-кода. Это цифр, которые необходимо ввести с при включении . Данная мера безопасности предназначена для сохранности личных данных владельца в случае потери либо кражи сим-карты. В случае, если в
Как поставить пароль на комп: советы пользователям
Но о том как установить пароль на компьютер еще не писал, поэтому буду исправляться. На самом деле, это очень важный момент, который поможет защитить ваш компьютер от лишних глаз. Но если говорить по правде, то любая защита при необходимости взламывается
Как написать в техподдержку
Программа Steam (Стим), с описанием которой вы познакомитесь дальше, используется в качестве помощника для инсталляции игр и других приложений, так или иначе связанных с игровым процессом. Стим - это полноценный игровой онлайн сервис, созданный компанией
Найди красивый и короткий E-mail!
Сегодня каждому пользователю интернета рано или поздно придется создать электронную почту . Без зарегистрированного e-mail адреса вы не сможете в полной мере пользоваться всей доступной информацией интернета. Что бы зарегистрироваться в социальной сети ил