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