1. FirePyres 42 09.08.18 05:44 Сейчас в теме

Тест :)

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

Лично я удивился результату
Найденные решения
12. glog 10.08.18 09:35 Сейчас в теме
Конструкция "Новый" создает новый объект в памяти, с другим адресом и связывает его с именем переменной (в данном случае "Массив").
Интерпретатор при выполнении конструкции
Для Каждого Эл из Массив Цикл
запоминает не имя переменной, а адрес в памяти, связанный с этим именем, и от этого адреса уже "пляшет" дальше, перебирая элементы.
Остальные ответы
Избранное Подписка Сортировка: Древо
2. user603532_fan_club_chelsea 09.08.18 06:20 Сейчас в теме
(1) зацикливание и вылет в дамп?)
4. enschede 09.08.18 06:47 Сейчас в теме
(1) Интересный эффект. Пока идет обход цикла получение переменной "Эл" происходит не из текущей переменной Массив, а из изначальной, которая была до входа в цикл. Что-то связанное с передачей по ссылке/по значению? Интересно как этот момент в документации описывается.
5. namazi74 2 09.08.18 07:32 Сейчас в теме
(1) думал, что у вас первый массив как-то хитро объявлен, например на английском часть букв. есть объяснения?)
7. epresnyakova 09.08.18 08:33 Сейчас в теме
(5)

Для Каждого Эл из Массив Цикл

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

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

И всё, если в это время в справочник, из которого выбирает данные запрос, добавить новые элементы, в выборке их не будет.
8. enschede 09.08.18 08:51 Сейчас в теме
(7) В таком случае, получается существует какая-то неявная выборка, которой ты оперировать никак не можешь.
9. epresnyakova 09.08.18 09:17 Сейчас в теме
(8)

Видимо да, особенность цикла типа "Для Каждого".
Кстати, со списками и таблицами значений работает так же.

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

Для Сч = 0 По Массив.Количество() - 1 Цикл
      Сообщить(Массив[Сч]);
КонецЦикла;
10. Неопределено 40 09.08.18 09:21 Сейчас в теме
3. epresnyakova 09.08.18 06:37 Сейчас в теме
6. FirePyres 42 09.08.18 08:32 Сейчас в теме
(3) А почему можете сказать? Я предугадать не смог.
11. herfis 264 09.08.18 09:59 Сейчас в теме
Если это тест, то правильный ответ - "без малейшего понятия, потому что я избегаю использования недокументированных особенностей языка" :)
В других языках итераторы могут быть с разными возможностями и поведением, которое документируется.
В 1С я такого описания не встречал. Но самые простые итераторы обычно предназначены только для обхода.
Поэтому я бы не рискнул реализовывать алгоритмы, полагающиеся на текущие особенности недокументированного поведения. Нет никаких гарантий что они не изменятся в каком-нибудь очередном релизе.
ЗЫ. Именно поэтому, если мне нужно добавлять строки в процессе обхода коллекции я всегда работаю через индексы, а не через итератор. А если удалять - то либо тоже через индексы, либо сохраняя ссылки на строки в отдельном массиве и удаляя их потом в отдельном цикле.
12. glog 10.08.18 09:35 Сейчас в теме
Конструкция "Новый" создает новый объект в памяти, с другим адресом и связывает его с именем переменной (в данном случае "Массив").
Интерпретатор при выполнении конструкции
Для Каждого Эл из Массив Цикл
запоминает не имя переменной, а адрес в памяти, связанный с этим именем, и от этого адреса уже "пляшет" дальше, перебирая элементы.
13. registration123 1 10.08.18 14:11 Сейчас в теме
1
2
3
4

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

Кстати, из-за этого нельзя использовать данную конструкцию (для каждого) не только при создании элементов внутри цикла но и при удалении элементов внутри цикла (там будут более интересные эффекты).
14. Jestery 12.08.18 00:25 Сейчас в теме
Интересно, хотя практический смысл неясен, разве что поэкспериментировать ради интереса, посмотреть что получится.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Удаленный ИТ-журналист
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб. до 150 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Руководитель группы сервисов FRM на 1С
Москва
зарплата от 150 000 руб.
Полный день