Выгрузка данных в 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 не будет опубликован. Обязательные поля помечены *