Что выведет данный кусок кода?

```1c
    Массив = Новый Массив;
    Массив.Добавить(1);
    Массив.Добавить(2);
    Массив.Добавить(3);
    Массив.Добавить(4);
    Для Каждого Эл из Массив Цикл
    Сообщить(Эл);
    Массив = Новый Массив;
    Массив.Добавить(6);
    КонецЦикла;
```

Лично я удивился результату
---
Конструкция "Новый" создает новый объект в памяти, с другим адресом и связывает его с именем переменной (в данном случае "Массив").
Интерпретатор при выполнении конструкции

```1c
    Для Каждого Эл из Массив Цикл
```
запоминает не имя переменной, а адрес в памяти, связанный с этим именем, и от этого адреса уже "пляшет" дальше, перебирая элементы.
---
зацикливание и вылет в дамп?)
---
Интересный эффект. Пока идет обход цикла получение переменной "Эл" происходит не из текущей переменной Массив, а из изначальной, которая была до входа в цикл. Что-то связанное с передачей по ссылке/по значению? Интересно как этот момент в документации описывается.
---
думал, что у вас первый массив как-то хитро объявлен, например на английском часть букв. есть объяснения?)
---
Для Каждого Эл из Массив Цикл

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

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

И всё, если в это время в справочник, из которого выбирает данные запрос, добавить новые элементы, в выборке их не будет.
---
В таком случае, получается существует какая-то неявная выборка, которой ты оперировать никак не можешь.
---
Видимо да, особенность цикла типа "Для Каждого".
Кстати, со списками и таблицами значений работает так же.

Если это проблема, тогда вот так:

```1c
    Для Сч = 0 По Массив.Количество() - 1 Цикл
    Сообщить(Массив[Сч]);
    КонецЦикла;
```
---
```1c
    ВГраница()
```
---
1, 2, 3, 4 ?
---
А почему можете сказать? Я предугадать не смог.
---
Если это тест, то правильный ответ - "без малейшего понятия, потому что я избегаю использования недокументированных особенностей языка" :)
В других языках итераторы могут быть с разными возможностями и поведением, которое документируется.
В 1С я такого описания не встречал. Но самые простые итераторы обычно предназначены только для обхода.
Поэтому я бы не рискнул реализовывать алгоритмы, полагающиеся на текущие особенности недокументированного поведения. Нет никаких гарантий что они не изменятся в каком-нибудь очередном релизе.
ЗЫ. Именно поэтому, если мне нужно добавлять строки в процессе обхода коллекции я всегда работаю через индексы, а не через итератор. А если удалять - то либо тоже через индексы, либо сохраняя ссылки на строки в отдельном массиве и удаляя их потом в отдельном цикле.
---
Конструкция "Новый" создает новый объект в памяти, с другим адресом и связывает его с именем переменной (в данном случае "Массив").
Интерпретатор при выполнении конструкции

```1c
    Для Каждого Эл из Массив Цикл
```
запоминает не имя переменной, а адрес в памяти, связанный с этим именем, и от этого адреса уже "пляшет" дальше, перебирая элементы.
---
1
2
3
4

Границы цикла определяются заранее. Массив - это указатель. Если запросить вграница и количество() то они после первого массив = новый массив; будут сообщать 0 и 1 соответственно, при этом ошибки, при обращении к следующему элементу не возникает, что странно. Но, возможно, это результат оптимизации, где эл кэшируется 1с на некоторую глубину массива.

Кстати, из-за этого нельзя использовать данную конструкцию (для каждого) не только при создании элементов внутри цикла но и при удалении элементов внутри цикла (там будут более интересные эффекты).
---
Интересно, хотя практический смысл неясен, разве что поэкспериментировать ради интереса, посмотреть что получится.