Скопировать матрицу и изменить только старшее измерение

Учебные задачи

Resize меняет число строк и нижнюю границу, сохраняет старые значения и не обещает содержимое новых ячеек.

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

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

Подготовка

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

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

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

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

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

Исходная = Новый COMSafeArray("VT_I4", 2, 2);
Исходная.SetValue(0, 0, 1);
Исходная.SetValue(0, 1, 2);
Исходная.SetValue(1, 0, 3);
Исходная.SetValue(1, 1, 4);
Копия = Новый COMSafeArray(Исходная);
Копия.SetValue(0, 0, 9);
Сообщить(Исходная.GetValue(0, 0) = 1);
Копия.SetValue(0, 0, 1);
Если Не Копия.IsResizable() Тогда
    ВызватьИсключение "Собственная матрица не допускает Resize";
КонецЕсли;
Копия.Resize(3, -1);
Сообщить(Копия.GetLength(0) = 3);
Сообщить(Копия.GetLength(1) = 2);
Сообщить(Копия.GetLowerBound(0) = -1);
Сообщить(Копия.GetUpperBound(0) = 1);
Сообщить(Копия.GetValue(-1, 0) = 1);
Сообщить(Копия.GetValue(0, 1) = 4);
Копия.SetValue(1, 0, 5);
Копия.SetValue(1, 1, 6);
Сообщить(Копия.GetValue(1, 1) = 6);
Копия.Resize(1, 2);
Сообщить(Копия.GetLowerBound(0) = 2);
Сообщить(Копия.GetUpperBound(0) = 2);
Сообщить(Копия.GetValue(2, 0) = 1);
Сообщить(Копия.GetValue(2, 1) = 2);
Сообщить(Исходная.GetLength(0) = 2);
Сообщить(Исходная.GetValue(1, 1) = 4);

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

  1. Конструктор Из COMSafeArray копирует собственную исходную матрицу. Меняем ячейку копии и проверяем независимость оригинала.

  2. IsResizable проверяем до Resize. Метод допускает изменение только старшего, нулевого измерения и его нижней границы.

  3. Resize(3,−1) переносит старые две строки на индексы −1/0 и добавляет строку с индексом 1. Колонок по-прежнему две.

  4. Новые значения неопределённы. Мы не читаем их как нули, а сначала записываем 5/6.

  5. Resize(1,2) сокращает копию до одной первой строки с новым индексом 2. Данные остальных строк копии теряются; оригинал остаётся 2×2.

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

  1. Четырнадцать логических проверок дают Истина, если собственная матрица поддерживает Resize.

  2. После сокращения копия содержит одну строку 1/2 с индексом 2; исходная матрица всё ещё содержит 1/2 и 3/4.

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

Показаны независимое копирование, сохранение порядка при сдвиге границы и потеря данных при сокращении.

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

  1. Resize не меняет число колонок второго измерения.

  2. Новые ячейки нельзя считать нулевыми без явной инициализации.

  3. Сокращение уничтожает лишние строки самой копии; это не фильтр с возможностью отмены.

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

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

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

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

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