COMSafeArray.Из массива 2

Конструкторы

Создает COMSafeArray с заданным типом элемента из элементов массива значений. Количество элементов по каждой из размерностей задается одним массивом. Нижние значения индексов по каждому измерению могут задаваться другим массивом.

Синтаксис

Новый COMSafeArray(<Массив>, <ТипЭлемента>, <Количество>, <НижняяГраница>)

Примеры платформы

Размер = Новый Массив;
Размер.Добавить(2);
Размер.Добавить(3);
Масс = Новый COMSafeArray(Массив, "VT_I4", Размер);
НижняяГраница = Новый Массив;
НижняяГраница.Добавить(-1);
НижняяГраница.Добавить(2);
Массив = Новый COMSafeArray(Массив, "VT_I4", Размер, НижняяГраница);
Полное описание, параметры и ограничения

COMSafeArray.Из массива 2

COMSafeArray (COMSafeArray)

Из массива 2

Доступен, начиная с версии 8.0.

Синтаксис:
Новый COMSafeArray(<Массив>, <ТипЭлемента>, <Количество>, <НижняяГраница>)
Параметры:

<Массив> (обязательный)
Тип: Массив.
Массив - источник данных для COMSafeArray.

<ТипЭлемента> (обязательный)
Тип: Строка.
Определяет тип элемента COMSafeArray.

<Количество> (обязательный)
Тип: Массив.
Количество элементов COMSafeArray по каждому из измерений. Массив целых чисел, больше 0. Размер массива равен числу измерений COMSafeArray.

<НижняяГраница> (необязательный)
Тип: Массив.
Минимальные значения индексов по каждому из измерений. Массив целых чисел. Размер массива равен числу измерений COMSafeArray.
Описание:

Создает COMSafeArray с заданным типом элемента из элементов массива значений.
Количество элементов по каждой из размерностей задается одним массивом. Нижние значения индексов по каждому измерению могут задаваться другим массивом.

Пример:

// Построить двумерный COMSafeArray с типом элемента VT_I4

// из двух строк и трех колонок. Значения элементов

// взять из массива.

Размер = Новый Массив;
Размер.Добавить(2);
Размер.Добавить(3);
Масс = Новый COMSafeArray(Массив, "VT_I4", Размер);

// То же, но строки нумеруются с -1, а колонки - с 2.

НижняяГраница = Новый Массив;
НижняяГраница.Добавить(-1);
НижняяГраница.Добавить(2);
Массив = Новый COMSafeArray(Массив, "VT_I4", Размер, НижняяГраница);

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Работать с индексами от −1 и 2, а не всегда от нуля

Матрица имеет две строки с индексами −1/0 и три колонки 2/3/4; показываем границы и обращение массивом индексов.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Собственная учебная база на Windows. Фрагмент вставьте в тело серверной процедуры ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи, выполняемой на Windows.

  2. Все значения и COMSafeArray создаются самим примером в памяти. COMОбъект, Excel/Word, внешние компоненты, базы и сеть не используются.

  3. Запускайте три задачи отдельно. Размеры маленькие и фиксированные; не заменяйте их неограниченными значениями из внешнего API.

  4. Имена GetDimensions/GetValue/SetValue/Resize — реальные имена методов установленной справки, не придуманный английский перевод.

  5. Сверка API/статические тесты не подтверждают фактическое выполнение COMSafeArray в установленной 1С.

ИсходныеСтроки = Новый Массив;
Первая = Новый Массив;
Первая.Добавить(10);
Первая.Добавить(20);
Первая.Добавить(30);
Вторая = Новый Массив;
Вторая.Добавить(40);
Вторая.Добавить(50);
Вторая.Добавить(60);
ИсходныеСтроки.Добавить(Первая);
ИсходныеСтроки.Добавить(Вторая);
Размеры = Новый Массив;
Размеры.Добавить(2);
Размеры.Добавить(3);
НижниеГраницы = Новый Массив;
НижниеГраницы.Добавить(-1);
НижниеГраницы.Добавить(2);
Матрица = Новый COMSafeArray(ИсходныеСтроки, "VT_I4", Размеры, НижниеГраницы);
Сообщить(Матрица.GetLowerBound(0) = -1);
Сообщить(Матрица.GetUpperBound(0) = 0);
Сообщить(Матрица.GetLowerBound(1) = 2);
Сообщить(Матрица.GetUpperBound(1) = 4);
Сообщить(Матрица.GetUpperBound(1) - Матрица.GetLowerBound(1) + 1 = Матрица.GetLength(1));
Сообщить(Матрица.GetValue(-1, 2) = 10);
Сообщить(Матрица.GetValue(0, 4) = 60);
ЗаполненнаяКопия = Новый COMSafeArray("VT_I4", Размеры, НижниеГраницы);
Для НомерСтроки = Матрица.GetLowerBound(0) По Матрица.GetUpperBound(0) Цикл
    Для НомерКолонки = Матрица.GetLowerBound(1) По Матрица.GetUpperBound(1) Цикл
        ЗаполненнаяКопия.SetValue(НомерСтроки, НомерКолонки, Матрица.GetValue(НомерСтроки, НомерКолонки));
    КонецЦикла;
КонецЦикла;
Индексы = Новый Массив;
Индексы.Добавить(-1);
Индексы.Добавить(2);
ЗаполненнаяКопия.SetValue(Индексы, 77);
Сообщить(ЗаполненнаяКопия.GetValue(Индексы) = 77);
Сообщить(ЗаполненнаяКопия.GetValue(-1, 2) = 77);
Сообщить(Матрица.GetValue(-1, 2) = 10);
Выгрузка = Матрица.Выгрузить();
Сообщить(Выгрузка.Получить(0).Получить(0) = 10);

Разбор по шагам

  1. Конструктор Из массива 2 получает массив размеров и массив нижних границ. Их длина равна числу измерений.

  2. Число элементов равно 2/3, а максимальные индексы 0/4. Размер и верхняя граница — не одно и то же.

  3. Проверяем формулу верхняя − нижняя + 1. Циклы обходят именно GetLowerBound...GetUpperBound, не ошибочное 0...GetLength−1.

  4. По типу элемента 2 создаёт второй массив с теми же заданными границами. Каждую ячейку инициализируем перед чтением.

  5. SetValue(Индексы,77) и GetValue(Индексы) используют массив двух индексов в порядке старшее→младшее. Выгрузка — обычные массивы 1С с индексами от нуля.

Как проверить результат

  1. Одиннадцать проверок дают Истина; в собственной второй матрице ячейка [−1,2] стала 77, в исходной осталось 10.

  2. Выгрузка первой строки/колонки читается индексами 0/0, а не −1/2.

Ожидаемый результат

Показаны нестандартные границы и обе формы чтения/записи индексов без ошибочного предположения о нуле.

На что обратить внимание

  1. В массиве индексов должно быть ровно столько чисел, сколько измерений.

  2. Нижние границы COM не переносятся как отрицательные индексы обычного Массив 1С.

  3. Не путайте массив размеров с массивом самих данных.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.