Имя: Пароль:
1C
1С v8
Проблема с заполнением двухмерного массива.
, ,
0 Rajva2
 
17.09.15
21:29
Заполняем массив из ХМЛ. Количество строк может быть разным, потому добавляем их по мере необходимости.
Но почему то при установлении реквизита "ДвумерныйМассив[нСтрока][нКолонка] = ЗначениеУзла;"  ЗначениеУзла заносится по всему массиву в колонку нКолонка.
т.е. имеем ДвумерныйМассив[0][0]="1" , а когда заносим ДвумерныйМассив[1][0]="2", то и ДвумерныйМассив[0][0] становится = "2" и так по всем реквизитам.
Получаем массив, в котором все строки одинаковы и равны последней загруженной.
Я что-то, где-то не догоняю. Подскажите, пожалуйста.
Вот код.

    Процедура КнопкаВыполнитьНажатие(Кнопка)

    ДвумерныйМассив = Новый Массив;
    МассивВторогоПорядка = Новый Массив (6);

    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(файл);

    нСтрока = -1;
    Пока Чтение.Прочитать() Цикл
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяУзла = Чтение.Имя;
            Если ИмяУзла = "стр" тогда
                ДвумерныйМассив.Добавить(МассивВторогоПорядка);
                нСтрока = нСтрока + 1;
                нКолонка = -1;
            КонецЕсли;
        ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда    
            ЗначениеУзла = Чтение.Значение;
            нКолонка = нКолонка + 1;
            ДвумерныйМассив[нСтрока][нКолонка] = ЗначениеУзла;
        КонецЕсли;
    КонецЦикла;
1 NcSteel
 
17.09.15
21:34
потому что "ЗначениеУзла" является ссылочным  типом и меняется значение в массиве старое значение от Чтение.Прочитать()....

Сылочные типы млять!
2 Rajva2
 
17.09.15
21:42
(1) не очень силен в "Сылочные типы млять!" , тогда надо присвоение делать как то так

            ДвумерныйМассив[нСтрока][нКолонка] = ЗначениеУзла.Значени;

Но что-то такого нет.
3 NcSteel
 
17.09.15
21:59
(2) Еще раз .... посмотри что такое "ЗначениеУзла"....
4 NcSteel
 
17.09.15
22:00
(3) А именно тип, уверен, что не строка
5 Rajva2
 
17.09.15
22:02
У меня конечно два часа ночи, но в отладчике вижу.
Тип - строка.
6 NcSteel
 
17.09.15
22:04
ну значит ты не договариваешь... проверяй итерации отладкой,
7 hhhh
 
17.09.15
22:07
(5) вот же, реально бред

ДвумерныйМассив.Добавить(МассивВторогоПорядка);

один и тот же массив добавляешь.
8 Rajva2
 
17.09.15
22:10
(7) ну что то примерно такое я и полагал, но делал вроде все по науке.
9 Rajva2
 
17.09.15
22:12
А.П. Габец и Д.И. Гончаров (под редакцией М.Г. Радченко).
"1С:Предприятие 8.1. Простые примеры разработки"

Как создать многомерный массив?

Массив является линейной динамической коллекцией с произвольным типом значений. Поэтому значениями массива могут выступать другие массивы.
То есть создание массива массивов и решает задачу создания многомерного массива.
Это можно делать при использовании конструктора массива (листинг 2.3) или в процессе добавления очередных элементов к массиву (листинг 2.4).

Листинг 2.3. Создание многомерного массива
ДвумерныйМассив = Новый Массив (2, 8);

Листинг 2.4. Создание многомерного массива добавлением элементов
ДвумерныйМассив = Новый Массив;
МассивВторогоПорядка = Новый Массив (8);
ДвумерныйМассив.Добавить(МассивВторогоПорядка);
ДвумерныйМассив.Добавить(МассивВторогоПорядка);
10 NcSteel
 
17.09.15
22:16
(7) Вот и ответ.... "ссылочные типы!"
11 Rajva2
 
17.09.15
22:18
(10) Согласен.
И как быть?
12 Fedor-1971
 
18.09.15
08:44
(11) попробуй так:                ДвумерныйМассив.Добавить(Новый Массив(6));
13 Fedor-1971
 
18.09.15
08:47
не критично, но: инициализируй  нКолонка =0 до цикла, и приращивай после вставки элемента.
Если будет битый файл то получишь ошибку "Индекс вне диапазона" на втором условии.
14 Rajva2
 
18.09.15
09:21
(12) Огромное человеческое спасибо! Вот это помощь, не то что некоторые "Сылочные типы млять!".

(13) а как сделать "инициализируй  нКолонка =0 до цикла"? у меня в одном цикле идет заполнение двумерного массива и "нКолонка = 0" будет использоваться несколько раз.
Согласен, что " = -1 " не очень красивая конструкция :)
15 Fedor-1971
 
18.09.15
09:30
(14) Например, так:
нКолонка = -1;
нСтрока = -1;
Пока Чтение.Прочитать() Цикл
и дальше ничего менять не придётся.
16 Rajva2
 
18.09.15
09:38
(15) Почему же не придется ничего менять?
новая строка создается по условию

            Если ИмяУзла = "стр" тогда
                ДвумерныйМассив.Добавить(МассивВторогоПорядка);
                нСтрока = нСтрока + 1;
                нКолонка = -1;

добавляется новая строка нСтрока + 1
а вот нКолонка должна обнулиться.
17 Fedor-1971
 
18.09.15
09:45
(16) Я имел в виду если инициализировать не нКолонка = 0, а нКолонка = -1 твой код работы с ячейками таблицы не изменится.
Ошибка? Это не ошибка, это системная функция.