42
"а"
Дата
Массив.Добавить()
1
2
3
SAFEARRAY.SetValue()

Методы почти все только на английском

GetValue, SetValue, GetUpperBound, GetLowerBound, GetDimensions, GetLength, GetType, IsResizable, Resize — у всех этих методов COMSafeArray нет русского имени, что для платформы 1С необычно (почти всё остальное двуязычно, Массив.Добавить() = Массив.Add()). Единственное исключение — Выгрузить() (по-английски Unload()), у него есть оба варианта.

Однородность типа

Все элементы COMSafeArray — одного VARTYPE, заданного при создании (см. Конструкторы). Записать значение другого типа через SetValue() — исключение. Исключение из этого правила — тип VT_VARIANT: он допускает значения любого типа, как обычный Массив.

Зачем нужен, а не Массив

COMSafeArray существует не для использования внутри обычного кода 1С, а для обмена данными с внешними COM-объектами через OLE Automation (Excel, Word, другие приложения с COM-интерфейсом, внешние компоненты). Когда метод внешнего объекта в своей документации ожидает параметр типа SAFEARRAY — обычный Массив 1С туда передать нельзя, только COMSafeArray. Внутри же кода 1С, где COM не участвует, обычный Массив удобнее практически во всём: индексация через [], Для Каждого, Добавить/Удалить, произвольные типы элементов без ограничений.

Многомерность нативная, а не вложенная

Многомерный Массив — это на самом деле массив массивов (вложенность), а измерения COMSafeArray — часть самого объекта, как отдельная сущность у COM/Windows API. Отсюда и другой синтаксис доступа: не Массив[i][j], а СМассив.GetValue(i, j), см. Чтение и запись значений. Собрать из COMSafeArray обычный Массив (в том числе вложенный для многомерного) — одним вызовом Выгрузить(), без ручного цикла.

Нет обхода Для Каждого

В отличие от всех остальных универсальных коллекций значений 1С, Для Каждого Элемент Из СМассив Цикл не работает — перебор только явным циклом по границам измерений, см. Измерения и границы.

Недоступен на тонком клиенте

Методы COMSafeArray работают на сервере, толстом клиенте и во внешнем соединении — но не на тонком клиенте, в отличие от Массива и остальных универсальных коллекций. Ожидаемое ограничение: COM-взаимодействие в принципе требует локальной OS-инфраструктуры, которой у тонкого/веб-клиента нет.

Нет фиксированной версии и сравнения по значению

У COMSafeArray нет аналога ФиксированныйМассив — неизменяемых версий не бывает. СМассив1 = СМассив2 сравнивает ссылки на объект, а не содержимое, как и у остальных ссылочных коллекций.

COMSafeArray