Имя: Пароль:
1C
1С v8
ComArray в обычный массив
, ,
0 Herber
 
31.07.12
11:02
Функция Excel_ПолучитьДанные_COMArray(пФайл,  СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
   ДвумерныйМассив = Новый Массив;
   
   #Если Клиент Тогда
       Состояние("Открытие Excel");
   #КонецЕсли
   
   Если XLSОбъект = Неопределено Тогда
       XLSОбъект = Новый COMОбъект("Excel.Application");
       XLSОбъект.Visible       = Ложь;
       XLSОбъект.DisplayAlerts = Ложь;
   КонецЕсли;
   
   Попытка
       Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
   Исключение
       Сообщить ("Проблемы с подключением к Excel" );
       Возврат Неопределено;
   КонецПопытки;
   
   Лист = Book.Sheets(1);
   КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
   КолвоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;
   
   
   Таблица = Новый ТаблицаЗначений;
   
   Если СтруктураКолонок = Неопределено Тогда
       
       Для Счетчик = 1 По КолвоКолонок Цикл
           Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
       КонецЦикла;
       
   Иначе
       
       МаксимальныйНомерКолонки = 0;
       Для каждого КлючИЗначение Из СтруктураКолонок Цикл
           Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
           МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение);
       КонецЦикла;
       
       КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки);
       
   КонецЕсли;
   
   НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
   КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);   // 3802
   КонСтрока = Мин(КонСтрока, КолвоСтрок);
   
   // Массив типа COMSafeArray
   Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
   КолвоСтрок   = Массив.GetUpperBound(1);
   
   
   Для НомерСтроки = 1 По КолвоСтрок Цикл
       
       #Если Клиент Тогда
           Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
           ОбработкаПрерыванияПользователя();
       #КонецЕсли
       
       НоваяСтрока = Таблица.Добавить();
       МассивВторогоПорядка = Новый Массив();
       Если СтруктураКолонок = Неопределено Тогда
           
           Для НомерКолонки = 1 По КолвоКолонок Цикл
               
               НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки);
               Если НомерКолонки = 1 Тогда
                   МассивВторогоПорядка.Добавить(Массив.GetValue(НомерКолонки, НомерСтроки));
               ИначеЕсли НомерКолонки = 2 Тогда
                   МассивВторогоПорядка.Добавить(Массив.GetValue(НомерКолонки, НомерСтроки));
               ИначеЕсли НомерКолонки = 3 Тогда
                   Жир =СокрЛП(Массив.GetValue(НомерКолонки, НомерСтроки));
                   Если ПустаяСтрока(Жир)  Тогда
                       МассивВторогоПорядка.Добавить(Массив.GetValue(НомерКолонки, НомерСтроки));    
                       МассивВторогоПорядка.Добавить("Жир");
                   Иначе
                       МассивВторогоПорядка.Добавить(Массив.GetValue(НомерКолонки, НомерСтроки));
                   КонецЕсли;
           
                   
               ИначеЕсли НомерКолонки = 4 Тогда
                   МассивВторогоПорядка.Добавить(Массив.GetValue(НомерКолонки, НомерСтроки));
               ИначеЕсли НомерКолонки = 5 Тогда
                   МассивВторогоПорядка.Добавить(Массив.GetValue(НомерКолонки, НомерСтроки));
               ИначеЕсли НомерКолонки = 6 Тогда
                   МассивВторогоПорядка.Добавить(Массив.GetValue(НомерКолонки, НомерСтроки));
                   ДвумерныйМассив.Добавить(МассивВторогоПорядка);
                   МассивВторогоПорядка = Новый Массив;

               ИначеЕсли НомерКолонки = 7 Тогда
                   МассивВторогоПорядка.Добавить(Массив.GetValue(НомерКолонки, НомерСтроки));
                                   КонецЕсли;
               
               
           КонецЦикла;    
           КонецЕсли;    
               
       КонецЦикла;
            XLSОбъект.Application.Quit();
       Возврат ДвумерныйМассив;

       КонецФункции    

Как из этого массива в обычный перевести ?
1 Rie
 
31.07.12
11:05
Циклом по старшему измерению, а там - Выгрузить()
2 Rie
 
31.07.12
11:05
+(1) Просто Выгрузить(), безо всяких циклов.
3 Herber
 
31.07.12
11:05
У ComArry нет метода выгрузить
4 Господин ПЖ
 
31.07.12
11:06
разрешаю обойти коллекцию и сделать getvalue или что у него там
5 Herber
 
31.07.12
11:06
СомМассив=  Excel_ПолучитьДанные_COMArray(...)

Массив = Новый Массив;

Массив = СомМассив;

Так тоже не вариант
6 Господин ПЖ
 
31.07.12
11:07
>Так тоже не вариант

вариант... но не в 1С
7 Herber
 
31.07.12
11:10
Данные.GetValue(НомерКолонки, НомерСтроки)
8 Herber
 
31.07.12
11:14
А как через Выгрузить() сделать ?
9 Rie
 
31.07.12
11:21
(3) Странно...

COMSafeArray.Выгрузить (COMSafeArray.Unload)
COMSafeArray (COMSafeArray)
Выгрузить (Unload)
Синтаксис:

Выгрузить()
Возвращаемое значение:

Тип: Массив.

Описание:

Создает массив значений и копирует в него содержимое COMSafeArray.
Если COMSafeArray имеет более чем одно измерение, то элементами полученного массива значений будут вложенные массивы значений, и так от старшего индекса до самого младшего.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

МассивЗначений = Массив.Выгрузить();
10 Rie
 
31.07.12
11:24
(8)
Массив1С = Массив.Выгрузить();
// Массив - это твой COMSafeArray из (0)