Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Перезаписывается значение ранее добавленного элемента массива. В чем может быть дело?

Перезаписывается значение ранее добавленного элемента массива. В чем может быть дело?
Я
   НачинающийВ1С
 
08.06.20 - 17:15
Добрый день, коллеги.

В общем, обнаружил проблему в своей обработке.

По какой-то причине в момент выполнения вложенного цикла изменяются уже добавленные в массив элементы.

Имеется кусок кода:

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

[CODE]

В коде отметил строчку, на которой происходит редактирование элемента.
В чем может быть дело?

Надо как-то явно после добавления в массив структуру уничтожать, недостаточно написать потом что эта переменная равна новой структуре?
   Вафель
 
1 - 08.06.20 - 17:20
а если ЗаполнитьСтруктуруНастроекРекурсивно заменить на СтруктураНастроек.Вставить(Что-то уникальное)
будет затираться?
   dka80
 
2 - 08.06.20 - 17:22
Передается по ссылке. Поэтому и переписывает. Нужно явно уничтожать
   dezss
 
3 - 08.06.20 - 17:32
Надо смотреть, что делает ЗаполнитьСтруктуруНастроекРекурсивно.
   НачинающийВ1С
 
4 - 08.06.20 - 17:47
(1)  Нет, так ничего не затирается.
Но выходит вообще какая-то дичь, я же не передаю в эту процедуру массив или элементы массива, каким образом там может быть доступ на предыдущий элемент массива?

(2)  Как уничтожать? Разве присвоение конструкция "Переменная = новый Структура" не уничтожает связь с прежним значением и не присваивает новую структуру переменной?

(3) Я там дерево обхожу и по нему заполняю настройки. Но мой же ответ на (1) наводит на мысли, что какая-то пробелма именно тут.
   Ёпрст
 
5 - 08.06.20 - 18:00
(4) код то покажи своей процы, нам отсюда не видно, что ты с ним там делаешь
   НачинающийВ1С
 
6 - 08.06.20 - 18:09
(5) рекурсивной функции? Я изначальный код немного очистил, чтобы суть была ясна (поэтому не удивляйтесь что параметров тут больше)
Вот целиком рекурсивная функция.

&НаКлиенте
Процедура ЗаполнитьСтруктуруРеквизитаРекурсивно(СтруктураРеквизита, Строка, Лист, ИндексСтроки)
        
    Если Строка.ТипЗаполнения = "Заполнять указанным значением" тогда 
        
        СтруктураРеквизита.Значение = Строка.ЗначениеЗаполнения;
        
    ИначеЕсли Строка.ТипЗаполнения = "Заполнять из Excel" тогда 
        
        СтруктураРеквизита.Значение =  Лист.Cells(ИндексСтроки, Строка.НомерКолонки).Value;
        
    ИначеЕсли Строка.ТипЗаполнения = "Искать по нескольким значениям" тогда 
        
        Массив = Новый Массив;
        Для Каждого СтруктураДочернегоЭлемента из Строка.ЗначениеЗаполнения Цикл 
            ЗаполнитьСтруктуруРеквизитаРекурсивно(СтруктураДочернегоЭлемента, СтруктураДочернегоЭлемента, Лист, ИндексСтроки);
            Массив.Добавить(СтруктураДочернегоЭлемента);
        КонецЦикла;
        
        СтруктураРеквизита.Значение = Массив;
        
    КонецЕсли;
        
КонецПроцедуры
   Ёпрст
 
7 - 08.06.20 - 18:20
(6) тут ничего нет, покажи, как ты в Строка.ЗначениеЗаполнения пихаешь структуры
   Cthulhu
 
8 - 08.06.20 - 19:23
(0):
[1с]
МассивДанныхДляДокументов = новый Массив;
Счетчик = 0;
Пока Счетчик < 100  Цикл
    Счетчик = Счетчик + 1; МассивДанныхДляДокументов.Добавить(Новый Структура);
    Для Каждого Строка из МассивНастроек Цикл
        МассивДанныхДляДокументов[Счетчик].Вставить(Строка.Имя,Новый Структура);
        ЗаполнитьСтруктуруНастроекРекурсивно(МассивДанныхДляДокументов[Счетчик][Строка.Имя], Строка);
    КонецЦикла;
КонецЦикла;
[/1с]
   НачинающийВ1С
 
9 - 08.06.20 - 20:27
Спасибо всем за помощь.

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь можно задать вопрос "Как сделать?" и получить кучу ответов, что тебе это делать не надо. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.