v8: Быстрый вывод данных в Excel по OLE с помощью COMSafeArray. Ключевые слова: Excel, COMSafeArray, вывод, таблица, ADO, select
Объект COMSafeArray в 1С 8 очень помогает с выводом больших таблиц в Excel.
Тысячи строк выводятся в секунды.
Пример вывода кода и наименования товаров в Excel.
Ексель=Новый COMОбъект("Excel.Application");
Ексель.Workbooks.Add();
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Код,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура");
ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
ВсегоСтрок = ТаблицаРезультата.Количество();
ВсегоКолонок = ТаблицаРезультата.Колонки.Количество();
МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоКолонок, ВсегоСтрок);
Для индСтрок = 0 По ТаблицаРезультата.Количество() - 1 Цикл
СтрокаТаблицы = ТаблицаРезультата[индСтрок];
Для индКолонок = 0 По ВсегоКолонок - 1 Цикл
МассивКОМ.SetValue(индКолонок, индСтрок, СтрокаТаблицы[индКолонок]);
КонецЦикла;
КонецЦикла;
Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ;
Ексель.Visible=1; //Делаем Ексель видимым
Еще один вариант с запросом через ADO
Обязательно в строке соединения указывать параметр IMEX=1, иначе некотрые данные в смешаных колонках могут пропадать
СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " +СокрЛП(ИмяФайла) +" ;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаСоединения;
Попытка
Connection.Open();
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат;
КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
ТекстЗапроса =
"SELECT
| Лист.*
|FROM
| [Лист1$] as Лист";
попытка
RS.Open(ТекстЗапроса, Connection);
исключение
Сообщить ("Проблемы с выполнением запроса");
Возврат;
КонецПопытки;
// Пример обработки полученного recordset
Соответствие = Новый Соответствие;
Таблица.Очистить();
Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
КонецЦикла;
Пока RS.EOF() = 0 Цикл
НоваяСтрока = Таблица.Добавить();
Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
НоваяСтрока["К" + Счетчик] = Поле.Value;
КонецЦикла;
// Обработка других полей
RS.MoveNext();
КонецЦикла;
// Завершение работы
RS.Close();
Connection.Close();
ЭлементыФормы.Таблица.СоздатьКолонки();
|