Итак, требуется выгрузить данные из Таблицы Значений, полученной в результате запроса, в таблицу *.xls или *.mxl.
Сделать это можно посредством OLE:
Эксель = СоздатьОбъект("Excel.Application");
и затем выводить данные в таблицу по ячейкам. При этом необходимо устанавливать формат представления данных для каждой ячейки.
Второй способ — выводить данные через Табличный Документ, в этом случае при записи этого документа (метод Записать) формат ячеек сохраняется.
В статье представлены 2 процедуры. Первая формирует Табличный Документ, переменная ТабЗначений — Таблица Значений, полученная в результате выполнения запроса. Вторая осуществляет сохранение Табличного Документа в таблицу формата *.xls или *.mxl.
Процедура СформироватьТД(ТабЗначений)
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
ОбластьЗаголовка = ТабДок.ПолучитьОбласть(1, , 1, );
ДетальнаяСтрока = ТабДок.ПолучитьОбласть(1, , 1, );
КоличествоКолонок = ТабЗначений.Колонки.Количество();
Для КолонкаТЗ = 0 По КоличествоКолонок - 1 Цикл //Формирование заголовков колонок
Область = ОбластьЗаголовка.Область(1, КолонкаТЗ + 1);
Область.Текст = ТабЗначений.Колонки[КолонкаТЗ].Имя;
Область.ЦветФона = WEBЦвета.СветлоЖелтый;
КонецЦикла;
ТабДок.Вывести(ОбластьЗаголовка);
Для Каждого СтрокаТЗ Из ТабЗначений Цикл //Заполнение Табличного Документа данными из Таблицы Значений
Для ТекущееПоле = 0 По КоличествоКолонок - 1 Цикл
Область = ДетальнаяСтрока.Область(1, ТекущееПоле + 1);
Область.СодержитЗначение = Истина;
КС = Новый КвалификаторыСтроки(20);
Массив = Новый Массив;
Массив.Добавить(ТипЗнч(СтрокаТЗ[ТекущееПоле]));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
Область.ТипЗначения = ОписаниеТиповС;
Область.Значение = СтрокаТЗ[ТекущееПоле];
КонецЦикла;
ТабДок.Вывести(ДетальнаяСтрока);
КонецЦикла;
ТабДок.ОтображатьСетку = Истина;
ЗаписатьТабДок(ТабДок);
ТабДок.Показать();
КонецПроцедуры
Процедура ЗаписатьТабДок(ТабличныйДокумент)
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбора.Заголовок = "Сохранение документа";
ДиалогВыбора.МножественныйВыбор = Ложь;
ДиалогВыбора.ИндексФильтра = 0;
ДиалогВыбора.Фильтр = "Табличный документ (*.mxl)|*.mxl|Лист Excel (*.xls)|*.xls";
ИмяФайла = "МатериалыВЭксплуатации" + СтрЗаменить(Строка(Подразделение), " ", "");
ДиалогВыбора.ПолноеИмяФайла = ИмяФайла;
Если ДиалогВыбора.Выбрать() Тогда
ФайлНаДиске = Новый Файл(ДиалогВыбора.ПолноеИмяФайла);
Если нРег(ФайлНаДиске.Расширение) = ".mxl" Тогда
ТабличныйДокумент.Записать(ДиалогВыбора.ПолноеИмяФайла,ТипФайлаТабличногоДокумента.MXL);
ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".xls" Тогда
ТабличныйДокумент.Записать(ДиалогВыбора.ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);
ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".txt" Тогда
ТабличныйДокумент.Записать(ДиалогВыбора.ПолноеИмяФайла,ТипФайлаТабличногоДокумента.TXT);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
интересная информация, плохо что рассчитано только на эксель.
может автор рассмотреть вариант с использованием бесплатных программ, типа опенофиса?
на инфостарте этих статей о обработок для работы с эксель куча
Все равно плюсую!
лучше всего заполнить нужную информацию в таблицу значений а затем выгружать в excel.
Действительно зачем все так усложнять, когда в 1С везде предусмотрено сохранять любую информацию в Excel.
Всегда пользовался (и продолжаю сейчас) выводом в Excel через OLE: запускаем Excel и выводим в активную (автоматически создаваемую пустую) Workbook нужную ТЗ из 1С. Далее результат можно отформатировать средствами Excel (программирую это при наличии времени и терпения). Все работает как часы, вывод ТЗ в Excel оформлен отдельной процедурой в общем модуле. Есть маленькая хитрость: при выводе больших таблиц (более 2000 строк) 1С пишет данные в dbf-файл, который затем открывается в Excel. Это сделано для скорости и надежности (особенно на слабых компах).
Но вот мне понадобилось не просто показать табличку в Excel на экране, а записать ее в файл и отправить по e-mail. И делает все это автоматически запускаемый раз в неделю отчет. Так вот, на записи xls-файла на диск он (или Excel) повисает (не всегда, но часто) с сообщением от Винды о недостатке системных ресурсов. Диспетчер задач показывает, что жрет ресурсы (время процессора) именно EXCEL.EXE. При запуске отчета в отладчике ошибка не проявляется.
Так что спасибо за идею. Попробую описанным способом.
(1) evgefremov, спасибо за идею, будет время рассмотрю этот вариант
(4) brunet, так и есть — результат запроса выгружается в ТЗ, просто здесь рассмотрен альтернативный метод выгрузки в Excel
(5) ГердаКай, что вы имеете в виду — «в 1С везде предусмотрено сохранять любую информацию в Excel»? Здесь рассмотрен метод выгрузки в Excel из временной таблицы — таблицы значений
(6) lsp71, Пожалуйста. Поделитесь потом успехами? Тоже всегда пользовалась выводом в Excel через OLE. Идея этого метода родилась из-за необходимости сохранения формата данных
Вот так формировать табличный документ не проще ?
Показать