Выгрузка данных в Excel

Часто в ходе работы в 1С требуется выбирать данные одновременно из разных источников (справочников, документов, регистров и т.д.) и сохранять эту сводную информацию в формате Excel (*.xls) или Табличных документов 1С (*.mxl). Затем, с помощью универсальной обработки "Загрузка данных из табличного документа", можно загрузить данные, например, в другую базу. В данной статье представлен метод выгрузки информации во внешнюю таблицу через Табличный Документ с сохранением форматов данных.

Итак, требуется выгрузить данные из Таблицы Значений, полученной в результате запроса, в таблицу *.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);
КонецЕсли;

КонецЕсли;

КонецПроцедуры

11 Comments

  1. evgefremov

    интересная информация, плохо что рассчитано только на эксель.

    может автор рассмотреть вариант с использованием бесплатных программ, типа опенофиса?

    Reply
  2. WKBAPKA

    на инфостарте этих статей о обработок для работы с эксель куча

    Reply
  3. Jonny_wk

    Все равно плюсую!

    Reply
  4. brunet

    лучше всего заполнить нужную информацию в таблицу значений а затем выгружать в excel.

    Reply
  5. ГердаКай

    Действительно зачем все так усложнять, когда в 1С везде предусмотрено сохранять любую информацию в Excel.

    Reply
  6. lsp71

    Всегда пользовался (и продолжаю сейчас) выводом в Excel через OLE: запускаем Excel и выводим в активную (автоматически создаваемую пустую) Workbook нужную ТЗ из 1С. Далее результат можно отформатировать средствами Excel (программирую это при наличии времени и терпения). Все работает как часы, вывод ТЗ в Excel оформлен отдельной процедурой в общем модуле. Есть маленькая хитрость: при выводе больших таблиц (более 2000 строк) 1С пишет данные в dbf-файл, который затем открывается в Excel. Это сделано для скорости и надежности (особенно на слабых компах).

    Но вот мне понадобилось не просто показать табличку в Excel на экране, а записать ее в файл и отправить по e-mail. И делает все это автоматически запускаемый раз в неделю отчет. Так вот, на записи xls-файла на диск он (или Excel) повисает (не всегда, но часто) с сообщением от Винды о недостатке системных ресурсов. Диспетчер задач показывает, что жрет ресурсы (время процессора) именно EXCEL.EXE. При запуске отчета в отладчике ошибка не проявляется.

    Так что спасибо за идею. Попробую описанным способом.

    Reply
  7. volconok27

    (1) evgefremov, спасибо за идею, будет время рассмотрю этот вариант

    Reply
  8. volconok27

    (4) brunet, так и есть — результат запроса выгружается в ТЗ, просто здесь рассмотрен альтернативный метод выгрузки в Excel

    Reply
  9. volconok27

    (5) ГердаКай, что вы имеете в виду — «в 1С везде предусмотрено сохранять любую информацию в Excel»? Здесь рассмотрен метод выгрузки в Excel из временной таблицы — таблицы значений

    Reply
  10. volconok27

    (6) lsp71, Пожалуйста. Поделитесь потом успехами? Тоже всегда пользовалась выводом в Excel через OLE. Идея этого метода родилась из-за необходимости сохранения формата данных

    Reply
  11. MrFlanker

    Вот так формировать табличный документ не проще ?

    Процедура _ПоказатьТаблицуЗначений(ТаблЗнач) // Выводит отчет с содержимым Запроса выгруженным в таблицу значений (для целей отладки)
    // Выводит отчет с содержимым Запроса выгруженным в таблицу значений (для целей отладки)
    // Пример использования: _ПоказатьТаблицуЗначений(Запрос.Выполнить().Выгрузить());
    ТабДокумент = Новый ТабличныйДокумент;
    Построитель = Новый ПостроительОтчета;
    Построитель.ИсточникДанных=Новый ОписаниеИсточникаДанных(ТаблЗнач);
    Построитель.Вывести(ТабДокумент);
    ТабДокумент.Показать();
    КонецПроцедуры
    

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *