|
Перезаписывается значение ранее добавленного элемента массива. В чем может быть дело? | ☑ | ||
---|---|---|---|---|
0
НачинающийВ1С
08.06.20
✎
17:15
|
Добрый день, коллеги.
В общем, обнаружил проблему в своей обработке. По какой-то причине в момент выполнения вложенного цикла изменяются уже добавленные в массив элементы. Имеется кусок кода: [CODE] МассивДанныхДляДокументов = новый Массив; Счетчик = 0; Пока Счетчик < 100 Цикл СтруктураДанных = Новый Структура; Для Каждого Строка из МассивНастроек Цикл СтруктураНастроек = Новый Структура; ЗаполнитьСтруктуруНастроекРекурсивно(СтруктураНастроек, Строка); //вот на этой строчке происходит редактирование //предыдущего элемента СтруктураДанных.Вставить(Строка.Имя, СтруктураНастроек); КонецЦикла; МассивДанныхДляДокументов.Добавить(СтруктураДанных); Счетчик = Счетчик + 1; КонецЦикла; [CODE] В коде отметил строчку, на которой происходит редактирование элемента. В чем может быть дело? Надо как-то явно после добавления в массив структуру уничтожать, недостаточно написать потом что эта переменная равна новой структуре? |
|||
1
Вафель
08.06.20
✎
17:20
|
а если ЗаполнитьСтруктуруНастроекРекурсивно заменить на СтруктураНастроек.Вставить(Что-то уникальное)
будет затираться? |
|||
2
dka80
08.06.20
✎
17:22
|
Передается по ссылке. Поэтому и переписывает. Нужно явно уничтожать
|
|||
3
dezss
08.06.20
✎
17:32
|
Надо смотреть, что делает ЗаполнитьСтруктуруНастроекРекурсивно.
|
|||
4
НачинающийВ1С
08.06.20
✎
17:47
|
(1) Нет, так ничего не затирается.
Но выходит вообще какая-то дичь, я же не передаю в эту процедуру массив или элементы массива, каким образом там может быть доступ на предыдущий элемент массива? (2) Как уничтожать? Разве присвоение конструкция "Переменная = новый Структура" не уничтожает связь с прежним значением и не присваивает новую структуру переменной? (3) Я там дерево обхожу и по нему заполняю настройки. Но мой же ответ на (1) наводит на мысли, что какая-то пробелма именно тут. |
|||
5
Ёпрст
08.06.20
✎
18:00
|
(4) код то покажи своей процы, нам отсюда не видно, что ты с ним там делаешь
|
|||
6
НачинающийВ1С
08.06.20
✎
18:09
|
(5) рекурсивной функции? Я изначальный код немного очистил, чтобы суть была ясна (поэтому не удивляйтесь что параметров тут больше)
Вот целиком рекурсивная функция. &НаКлиенте Процедура ЗаполнитьСтруктуруРеквизитаРекурсивно(СтруктураРеквизита, Строка, Лист, ИндексСтроки) Если Строка.ТипЗаполнения = "Заполнять указанным значением" тогда СтруктураРеквизита.Значение = Строка.ЗначениеЗаполнения; ИначеЕсли Строка.ТипЗаполнения = "Заполнять из Excel" тогда СтруктураРеквизита.Значение = Лист.Cells(ИндексСтроки, Строка.НомерКолонки).Value; ИначеЕсли Строка.ТипЗаполнения = "Искать по нескольким значениям" тогда Массив = Новый Массив; Для Каждого СтруктураДочернегоЭлемента из Строка.ЗначениеЗаполнения Цикл ЗаполнитьСтруктуруРеквизитаРекурсивно(СтруктураДочернегоЭлемента, СтруктураДочернегоЭлемента, Лист, ИндексСтроки); Массив.Добавить(СтруктураДочернегоЭлемента); КонецЦикла; СтруктураРеквизита.Значение = Массив; КонецЕсли; КонецПроцедуры |
|||
7
Ёпрст
08.06.20
✎
18:20
|
(6) тут ничего нет, покажи, как ты в Строка.ЗначениеЗаполнения пихаешь структуры
|
|||
8
Cthulhu
08.06.20
✎
19:23
|
(0):
|
|||
9
НачинающийВ1С
08.06.20
✎
20:27
|
Спасибо всем за помощь.
Нашел проблему, действительно была в рекурсивной процедуре. Я когда из нее вызывал ее же, писал вот так: ЗаполнитьСтруктуруРеквизитаРекурсивно(СтруктураДочернегоЭлемента, СтруктураДочернегоЭлемента, Лист, ИндексСтроки); И значения я заполнял в самой ветке дерева, и в итоговый массив, как я понимаю, попадала не просто структура, а структура-ссылка на ветку дерева. В общем, внутри самой рекурсии создаю новую структуру и передаю ее в качестве второго параметра внутрь процедуры. И все отрабатывает как нужно. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |