На форуме есть ответы на вопрос, но не могу прикрутить к своей реализации.
И так, при нажатии на кнопку получаю Диалог:
&НаКлиенте
Процедура ВыполнитьВыгрузку(Команда)
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
//......
Если ДиалогОткрытияФайла.Выбрать() Тогда
ИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
Файл = СохранитьНаСервере();
ВыгрузитьДанные(Файл);
ПолучитьФайл(Файл, ИмяФайла);
КонецЕсли
КонецПроцедуры
&НаСервере
Функция СохранитьНаСервере()
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Книга = Excel.Workbooks.Add();
ИмяВрем = ПолучитьИмяВременногоФайла(".xls");
Excel.DefaultSaveFormat = 56;
Книга.SaveCopyAs(ИмяВрем);
Возврат ИмяВрем;
КонецФункции
Показать
Сомневаюсь в коде выше, была ошибка о том, что невозможно получить файл из временного хранилища.
Через ДвоичныеДанные пробовал, к какому-то результату не привело.
В итоге после нескольких попыток, случилось так, что пишет ошибку -21477467262(0x80004002) которая говорит о том, что Excel не установлен, хотя ранее подключалось без проблем. Хотелось бы понять как взаимодействовать или может посоветует кто толковый ГАЙД по этой теме?
также вопрос в данном случае, как перетащить переменную "Книга".
Изначально именно в этом ошибка и была, и пока с ней разбирался, вылезло о том что Excel нету...
В любом случае возвращать имя временного файла некорректно. Ни в виде переменной, ни в виде двоичных данных.
НаСервере вам необходимо сам файл эксель обернуть в двоичные данные и поместить во временное хранилище, после чего ссылку на временное хранилище передать НаКлиент.
&НаКлиенте
Процедура ВыполнитьВыгрузку(Команда)
// Подготовить файл на сервере
СсылкаВХранилище = ПодготовитьНаСервере();
// Выбрать файл
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'");
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файл для сохранения!'");
Если ДиалогОткрытияФайла.Выбрать() Тогда
ИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
Иначе
Возврат;
КонецЕсли;
// Запишем даннные в файл
ДанныеФайла = ПолучитьИзВременногоХранилища(СсылкаВХранилище);
ДанныеФайла.Записать(ИмяФайла);
ПоказатьОповещениеПользователя("Файл записан!",,"Файл " + ИмяФайла + " записан.",,СтатусОповещенияПользователя.Информация);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПодготовитьНаСервере()
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Книга = Excel.Workbooks.Add();
ИмяВрем = ПолучитьИмяВременногоФайла(".xls");
Excel.DefaultSaveFormat = 56;
Книга.SaveCopyAs(ИмяВрем);
Книга.Close();
Excel.Quit();
// Упаковка файла
ФайлДанных = Новый ДвоичныеДанные(ИмяВрем);
СсылкаВХранилище = ПоместитьВоВременноеХранилище(ФайлДанных);
Возврат СсылкаВХранилище;
КонецФункции
Показать
Но вообще работа с COM иногда выходит боком, так как уже сейчас заметная доля серверов работает по Linux. Стоит подумать над вариантом (5) с табличным документом. Вообщем желательно отвязываться от платформы, да и по времени COM работает гораздо дольше.
Точно. Тормоза (при передаче больших файлов), правда будут, но тут от этого никуда. Если есть просто необходимость сохранить что - то в excel - то проще сделать через создание табличного документа и через макет сохранять в формате excel. тут и установленный excel как таковой не понадобится. А еще можно через ADO - тут тоже excel не нужен.