100
201
302

У COMSafeArray нет обращения через квадратные скобки, как у Массива (Массив[Индекс]) — только через методы GetValue()/SetValue(), оба существуют только под английским именем.

МетодПараметрыВозвращает
GetValue(Индекс0, Индекс1, ...)по одному индексу на каждое измерение, от старшегозначение элемента
GetValue(Индексы)Индексы — Массив индексов, от старшегозначение элемента
SetValue(Индекс0, Индекс1, ..., Значение)индексы + Значение последним параметром
SetValue(Индексы, Значение)Индексы — Массив индексов, + Значение
СМассив = Новый COMSafeArray("VT_I4", 3);
 
СМассив.SetValue(0, 10);
СМассив.SetValue(1, 20);
СМассив.SetValue(2, 30);
 
СМассив.GetValue(1);  // 20

Для многомерного — индекс на каждое измерение, в том же порядке, что и при создании (от старшего к младшему):

СМассив = Новый COMSafeArray("VT_BSTR", 2, 2); // 2 на 2
 
СМассив.SetValue(0, 0, "A1");
СМассив.SetValue(0, 1, "B1");
СМассив.SetValue(1, 0, "A2");
СМассив.SetValue(1, 1, "B2");

Индексы можно передать и одним Массивом вместо списка через запятую — удобно, когда число измерений заранее неизвестно:

Индексы = Новый Массив;
Индексы.Добавить(1);
Индексы.Добавить(0);
СМассив.GetValue(Индексы);

Значение, не соответствующее заявленному при создании ТипЭлемента (кроме VT_VARIANT), вызовет исключение при SetValue().

Выгрузить() — весь массив целиком

Массив = СМассив.Выгрузить();

Единственный метод COMSafeArray, у которого есть русское имя (Unload() — по-английски). Создаёт обычный Массив 1С и копирует туда всё содержимое — для многомерного COMSafeArray элементами результата будут вложенные массивы, как у обычного многомерного Массива 1С. Не нужно вручную перебирать GetLowerBound()/GetUpperBound(), если нужен именно весь массив целиком.

COMSafeArray