Имя: Пароль:
1C
1С v8
Многомерный массив - индекс за пределами...
,
0 Rounder
 
29.12.11
10:17
Вроде не пятница - а туплю.
Задача - есть толпа строковых значений в списке СписПодр, нужно их поместить в двумерный массив по 5 в строку.
Что я делаю не так?

МассивПодразделений = Новый Массив;
   Для Сч = 0 По СписПодр.Количество() - 1 Цикл
       МассивПодразделений[Цел(Сч/5)][Сч] = СписПодр[Сч].Значение.Наименование;
       КонецЦикла;

Получаю ошибку на первом же элементе, что индекс находится за границами...
1 Ненавижу 1С
 
гуру
29.12.11
10:20
Ну а кто память под элементы будет выделять?
2 Maxus43
 
29.12.11
10:23
Описание:

Создает массив из указанного количества элементов. Если задано несколько параметров, то будет создан массив, элементами которого являются массивы (и т.д. в зависимости от количества параметров). Фактически, конструктор позволяет создать массивы массивов, которые могут являться аналогом многомерного массива.
Пример:

// массив с 0 элементами
Массив1 = Новый Массив;

// массив из 10 элементов,
// каждый из которых является массивом из 2 элементов,
// каждый из которых является массивом из 4 элементов
Массив2 = Новый Массив(10,2,4);
3 Rounder
 
29.12.11
10:25
Т.е. динамически массив может создаваться только одномерный?
4 vmv
 
29.12.11
10:26
МассивПодразделений = Новый Массив;
ВложенныйМассив     = Новый Массив;  
ШагВыборки = 0;
Для Сч = 0 По СписПодр.Количество() - 1 Цикл
  ВложенныйМассив.Добавить(СписПодр[Сч].Значение.Наименование);    
  Если ШагВыборки = 5 Тогда
     МассивПодразделений.Добавить(ВложенныйМассив);
     ВложенныйМассив = Новый Массив;
     ШагВыборки = 0;
  КонецЕсли;
  ШагВыборки = ШагВыборки + 1;
КонецЦикла;

как то так, ето элементарно Ватсон)
5 Maxus43
 
29.12.11
10:26
т.е. МассивПодразделений = Новый Массив - создаёт пустой одномерный массив
6 Rounder
 
29.12.11
10:29
Спасибо ответившим.
Думал по иному... :)
а (5), фактически (3), только другими словами :)
7 vmv
 
29.12.11
10:31
Если ШагВыборки = 5 Тогда
     МассивПодразделений.Добавить(ВложенныйМассив);
           ШагВыборки = 0;
  КонецЕсли;


МассивПодразделений.Добавить(ВложенныйМассив);

тут вроде копировать нужно вложенный

ибо

ВложенныйМассив = Новый Массив;

может "убить" сохраненный вложений, массивы работают напрмую с памятью, также как указатели в срр, собственно платформа на срр писана - посему так себя и ведут
8 vmv
 
29.12.11
10:33
вообще когда уже в платформу введут указатели, уже итак ввели столько щняг, что студентам, щкольникам и девущкам - догора закрыта в 1С.

так почему бы не ввести еще и указатели)
9 Rounder
 
29.12.11
10:34
:)))
10 Ненавижу 1С
 
гуру
29.12.11
10:36
(8) ага, еще и ссылки (Си++) только у них тут и так заворуха - уже есть ссылки на таблицыи объекты - ссылочного типа
11 vmv
 
29.12.11
10:38
(10) ну ведь с Null и Неопределено все уже пришли к согласию, думаю ничто не помешает прийти к согласию и с понятиями Объект.Ссылка, &Объект )
12 Maxus43
 
29.12.11
10:40
(11) с Неопределено он не смирится никак
13 Ненавижу 1С
 
гуру
29.12.11
10:42
(12) да, я против, согласен на Неопределено как пустой указатель максимум
14 Maxus43
 
29.12.11
10:43
(13) есть один важный нюанс... Нуралиеву пофиг на что ты согласен) Что имеем то и имеем
15 vmv
 
29.12.11
10:45
(12) кто с++?  дык, техология разработки платформы исторически построена на метотодологии - урви лучшее в популярных системах программирования и выдай в 1С. Откуда в 1С механизмы мхл, коллекций и пр., еще на заре 7.7 был договор с мелкомягкими на слив библиотек офисс в 1С.

можно заключить такой же договора с другими прозябающими на безрыбье системами. Все равно весь мир уже кодит на 1С, глупо зажимать системный функционал и не поделиться)
16 Ненавижу 1С
 
гуру
29.12.11
10:46
(14) а вот с этим я полностью согласен
17 Ненавижу 1С
 
гуру
29.12.11
10:46
(15) "весь мир уже кодит на 1С"
еще скажи вся Вселенная
18 vmv
 
29.12.11
10:48
(17) бери выше, есть уже конфы "1С: Небожители", "1С: Райский сад", "1С: Управление адом"
19 Rounder
 
29.12.11
10:56
Сделал так...
МассивПодразделений = Новый Массив;
   ВложенныйМассив = Новый Массив;
   Для Сч = 0 По СписПодр.Количество() - 1 Цикл
       Если Цел((Сч + 1)/5) = (Сч + 1)/5 Тогда
           ВложенныйМассив.Добавить(СписПодр[Сч].Значение.Наименование);
           МассивПодразделений.Добавить(ВложенныйМассив);
           ВложенныйМассив.Очистить();
       Иначе
           ВложенныйМассив.Добавить(СписПодр[Сч].Значение.Наименование);
       КонецЕсли;
КонецЦикла;
20 vmv
 
29.12.11
11:01
(19) если работате как надо, то почему не вынесено из условия

ВложенныйМассив.Добавить(СписПодр[Сч].Значение.Наименование);


надо же к чему-то придраться, представь, что ты на аттестации)
21 vmv
 
29.12.11
11:02
и зачем в цикле ИНАЧЕ, лишния, ацдке непроизводительная, инструкция компилятору
22 vmv
 
29.12.11
11:04
да и проверку кратности 5 нужно делать через остаток от деления %, а не кащмарной операцией вичисления.

садис - два!)
23 Rounder
 
29.12.11
11:04
Логично.
Учусь же :)
Сча все поправлю и оптимизирую
24 Rounder
 
29.12.11
11:16
Вообще красота...

   МассивПодразделений = Новый Массив;
   ВложенныйМассив = Новый Массив;
   Для Сч = 0 По СписПодр.Количество() - 1 Цикл
       ВложенныйМассив.Добавить(СписПодр[Сч].Значение.Наименование);
       Если (Сч + 1)%5 = 0 Тогда
           МассивПодразделений.Добавить(ВложенныйМассив);
           ВложенныйМассив.Очистить();
       КонецЕсли;
   КонецЦикла;
25 vmv
 
29.12.11
11:19
(24) теперь можно оформлять патент и жить припеваючи на отчисления с этого алгоритма
26 Rounder
 
29.12.11
11:23
С тобой же придется делиться :)
27 Maxus43
 
29.12.11
11:28
(26) со всеми из этой ветки, а то в суд подадим
28 Rounder
 
29.12.11
11:34
Подвели вы меня ребята... Эх...
Пошел получать патент - а там проверили алгоритм и завернули на исправление...
29 Rounder
 
29.12.11
12:02
Вобщем пришлось делать так:
Кол = СписПодр.Количество();
МассивПодразделений = Новый Массив(Цел(Кол/5) + 1, 5);
Для Сч = 0 По Кол - 1 Цикл
   МассивПодразделений[Цел(Сч/5)][Сч%5] = СписПодр[Сч].Значение.Наименование;
КонецЦикла;
Ошибка? Это не ошибка, это системная функция.