06 марта 2018

1с как добавить к эксель-файлу столбик из массива значений целиком

Ситуация. У вас есть excel-файл с данным. Вам нужно в нем средствами платформы 1с добавить колонку со значениями. При чем присоединять желательно не построчно, а  разом, все значения целиком. Иначе если файл большой, то этот процесс займет неприлично долгое время! Оказывается такое возможно с помощью COMSafeArray!

Итак у вас есть какие то данные, хранящиеся в одномерном массиве, например колонка Артикулов.
ИсходныйМассив = Выгрузка.ВыгрузитьКолонку("Артикул");
Создаем из него двумерный массив
Массив1 = новый Массив;
Массив1.Добавить(ИсходныйМассив);
Далее используем многомерный массив SAFEARRAY для обмена данными между COM-объектами, т.е. между 1с и Excel. Создадим его с помощью оболочки COMSafeArray. Подробно о ней почитайте в синтакс-помошнике.

Общая процедура создания SAFEARRAY
// Создание COMSafeArray
МассивКом = Новый COMSafeArray(«VT_Variant», ВсегоКолонок, ВсегоСтрок);
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
  Для Кол = 0 По ВсегоКолонок — 1 Цикл
    МассивКом.SetValue(Кол, Стр, Значение);
  КонецЦикла;
КонецЦикла;
Поэтому мы создаем наш SAFEARRAY вот так
МассивКОМ = Новый COMSafeArray(МАссив1, "VT_VARIANT", 1, ИсходныйМассив.Количество() );
Выбираем в экселе столбик ячеек в одной колонке
СтолбикАртикул = Лист.Range(Лист.Cells(5, 5),Лист.Cells(ВсегоСтрок, 5));
Меняем формат ячеек на строковый, если нужно
СтолбикАртикул .NumberFormat = "@";
И  просто присваиваем значению Value целиком весь массив
Попытка
        СтолбикАртикул.Value = МассивКОМ;

Исключение
        Эксель.WorkBooks.close();
        Эксель.Quit();
        Сообщить("Ошибка при вставке массива. Подробно: " + ОписаниеОшибки());
        Возврат

КонецПопытки;
Затем не забудьте сохранить файл
//Записываем файл
    Попытка
        Эксель.ActiveWorkBook.save();
        Состояние("Файл успешно сохранен!");
        Эксель.WorkBooks.close();
        Эксель.Quit();
       
    Исключение
        Сообщить("Файл не сохранен! "+ОписаниеОшибки());
    КонецПопытки;
 Маленьких открытий каждый день!