Честно говоря, это не столько публикация, сколько антисклерозник для меня самого. Вот как Трактор делает - собрал свои наработки, укомпоновал и выложил, удобно отовсюду доставать. А поскольку я этот блок свой уже пару раз про...любил и заново написал, то во избежание - пусть будет таким образом. Как говорится, "в копипасте - щастье".
// Внимание! Исходная таблица тДанных должна содержать только данные простых типов!!!
Процедура БыстроВывестиТаблицуЗначенийВExcel(тДанных,рПутьИмяФайла,рОткрыватьДляПросмотра=Ложь) Экспорт
Попытка
Если тДанных.Количество()=0 Или ПустаяСтрока(рПутьИмяФайла) Тогда Возврат КонецЕсли;
// если таблица для экселя спецслужебная, то выводим в двумерный массив, и теперь уже знаем его размеры
квоКолонокДЭ=тДанных.Колонки.Количество();
квоСтрокДЭ=тДанных.Количество()+1; // припуск на заголовок
РезДокумент=Новый Массив(квоКолонокДЭ,квоСтрокДЭ);
// заголовки
мКолонокДат=Новый Массив;
Для итерКолонок=1 По квоКолонокДЭ Цикл
кол=тДанных.Колонки[итерКолонок-1];
РезДокумент[итерКолонок-1][0]=кол.Заголовок;
Если кол.ТипЗначения.СодержитТип(Тип("Дата")) Тогда мКолонокДат.Добавить(кол.Имя) КонецЕсли;
КонецЦикла;
// основные данные
квоиз=" из "+СокрЛП(квоСтрокДЭ-1);
Для й=0 По квоСтрокДЭ-2 Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
Состояние("Вывод в Excel: "+Строка(й+1)+квоиз);
#КонецЕсли
стро=тДанных.Получить(й);
Для итерКолонок=1 По квоКолонокДЭ Цикл
знч=стро[итерКолонок-1];
Если мКолонокДат.Найти(тДанных.Колонки[итерКолонок-1])<>Неопределено Тогда
// выгрузка в эксель через COMSafeArray не понимает совсем пустые даты, поэтому надо это учесть!!!
знч=?(ЗначениеЗаполнено(знч),знч,Дата(1900,1,1));
КонецЕсли;
РезДокумент[итерКолонок-1][й+1]=знч;
КонецЦикла;
КонецЦикла;
// сохраняем все в произвольный тип, подробнее см. типизацию в описании конструктора "По типу элемента 1"
рТипМассива="VT_VARIANT";
рМассив=Новый COMSafeArray(РезДокумент,рТипМассива,квоКолонокДЭ,квоСтрокДЭ);
Ексель=Новый COMОбъект("Excel.Application");
Книга=Ексель.Workbooks.Add();
Если Книга.WorkSheets.Count=0 Тогда
Лист=Книга.WorkSheets.Add();
Иначе
Лист=Книга.WorkSheets.Item(1); // нумерация с 1
КонецЕсли;
// самое главное: диапазону ячеек можно просто присвоить SafeArray со значениями
рНачало=Лист.Cells(1,1);
рКонец=Лист.Cells(квоСтрокДЭ,квоКолонокДЭ);
Лист.Range(рНачало,рКонец).Value=рМассив;
//
// соответствие форматов: xlOpenXMLWorkbook=51 это xlsx, xlExcel12=50 это xlsb, xlExcel8=56 это xls
стрпф=Новый Структура("xls,xslx,xlsb",56,51,50);
рФайл=Новый Файл(СокрЛП(рПутьИмяФайла));
расш=СтрЗаменить(рФайл.Расширение,".","");
рФормат=?(стрпф.Свойство(расш),стрпф[расш],51); // по умолчанию xlsx
Книга.SaveAs(СокрЛП(рПутьИмяФайла),рФормат);
Если рОткрыватьДляПросмотра Тогда
#Если Клиент Тогда
Ексель.Visible=Истина;
#КонецЕсли
КонецЕсли;
//
Ексель=Null;
Исключение
Сообщить("БыстроВывестиТаблицуЗначенийВExcel, ошибка: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;
КонецПроцедуры
Желающим плюсить - сюда: //infostart.ru/public/269846/
Ну а первоисточник, который применял я, здесь: http://kb.mista.ru/article.php?id=707
Поскольку моё тут только конкретное воплощение, публикацию особо плюсить не стоит, и вообще она life.