IE 2018

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. Неопределено 39 09.08.18 09:21 Сейчас в теме
3. epresnyakova 09.08.18 06:37 Сейчас в теме
6. FirePyres 42 09.08.18 08:32 Сейчас в теме
(3) А почему можете сказать? Я предугадать не смог.
11. herfis 261 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С
Нижний Новгород
зарплата от 120 000 руб.
Полный день

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

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

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

Программист 1С
Казань
Полный день