?-1
?0
?1
?2

В отличие от Массива, у COMSafeArray индексы измерения не обязаны начинаться с 0 — нижнюю границу можно задать явно при создании (см. Конструкторы), в том числе отрицательную.

МетодПараметрВозвращает
GetDimensions()Число — количество измерений массива
GetUpperBound(НомерИзмерения)НомерИзмерения (Число, необязательный, по умолчанию 0)Число — верхняя граница указанного измерения
GetLowerBound(НомерИзмерения)НомерИзмерения (Число, необязательный, по умолчанию 0)Число — нижняя граница указанного измерения

У всех трёх — только английское имя, русского аналога Измерения/ВГраница для COMSafeArray не существует, в отличие от Массива.

НомерИзмерения нумерует сами измерения массива, а не элементы внутри измерения, и с нуля: 0 — старшее (первое) измерение, 1 — следующее и так далее. У одномерного массива поэтому единственное измерение — 0, а не 1.

СМассив = Новый COMSafeArray("VT_R8", 4);
 
СМассив.GetDimensions();     // 1
СМассив.GetLowerBound(0);    // 0
СМассив.GetUpperBound(0);    // 3

Для многомерного — тот же принцип, но с номером конкретного измерения:

СМассив = Новый COMSafeArray("VT_BSTR", 3, 2); // 3 на 2
 
СМассив.GetDimensions();     // 2
СМассив.GetLowerBound(0);    // 0
СМассив.GetUpperBound(0);    // 2
СМассив.GetLowerBound(1);    // 0
СМассив.GetUpperBound(1);    // 1

Номер измерения меньше 0 или больше максимального — платформа не выбрасывает исключение, а выводит сообщение «Значение индекса выходит за границы диапазона» и ничего не делает.

Перебор элементов — циклом от GetLowerBound() до GetUpperBound() включительно для каждого измерения, Для Каждого по COMSafeArray не работает, как по обычной коллекции:

Для Индекс = СМассив.GetLowerBound(0) По СМассив.GetUpperBound(0) Цикл
    // СМассив.GetValue(Индекс)
КонецЦикла;

Само чтение и запись значений по индексам — Чтение и запись значений.

COMSafeArray