Имя: Пароль:
1C
1С v8
Перезаписывается значение ранее добавленного элемента массива. В чем может быть дело?
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):

МассивДанныхДляДокументов = новый Массив;
Счетчик = 0;
Пока Счетчик < 100  Цикл
    Счетчик = Счетчик + 1; МассивДанныхДляДокументов.Добавить(Новый Структура);
    Для Каждого Строка из МассивНастроек Цикл
        МассивДанныхДляДокументов[Счетчик].Вставить(Строка.Имя,Новый Структура);
        ЗаполнитьСтруктуруНастроекРекурсивно(МассивДанныхДляДокументов[Счетчик][Строка.Имя], Строка);
    КонецЦикла;
КонецЦикла;
9 НачинающийВ1С
 
08.06.20
20:27
Спасибо всем за помощь.

Нашел проблему, действительно была в рекурсивной процедуре.
Я когда из нее вызывал ее же, писал вот так:

ЗаполнитьСтруктуруРеквизитаРекурсивно(СтруктураДочернегоЭлемента, СтруктураДочернегоЭлемента, Лист, ИндексСтроки);

И значения я заполнял в самой ветке дерева, и в итоговый массив, как я понимаю, попадала не просто структура, а структура-ссылка на ветку дерева.  
В общем, внутри самой рекурсии создаю новую структуру и передаю ее в качестве второго параметра внутрь процедуры. И все отрабатывает как нужно.