Сохранение табличных документов 8.1 в различных форматах MS Excel 2003-2007

Как известно, 1С:Предприятие 8.1 имеет довольно ограниченное количество форматов в которых можно сохранить табличный документ. Вашему вниманию предлагается простая процедура, которая восполняет в какой-то мере этот недостаток.

Зачем это нужно? Дело в том, что при сохранении табличного документа в формате Excel средствами платформы 8.1 файл получается просто неприличных размеров и совершенно непригоден к рассылке. К примеру, прайс-листы с картинками могли иметь размер до 15-20 Мб. После сохранения в формате 2007 размер уменьшался на порядок. В результате я написал процедуру, которая сохраняет MXL в XLSX. Но умные люди посоветовали, что не нужно плодить обработки и процедуры для одного формата. Поэтому я написал более универсальную процедуру, которая в идеале поддерживает все форматы MS Excel 2003 — 2007, в том числе Dbf, Pdf и таблицы Open (Libre) office. Я включил в процедуру наиболее востребованные по моему мнению форматы. Но каждый для себя может добавить необходимые форматы. Как говорится, MSDN Вам в помощь.

 

Тестировалось на MS Office 2003 с установленным пакетом совместимости и MS Office 2010.

Ниже приведена процедура сохранения табличного документа. Идея проста — табличный документ сохраняется средствами 1С в формате Excel 97, а потом средствами Excel сохраняется в выбранном формате. Прилагается простенькая обработка, демонстрирующая этот метод. Вы можете не скачивать обработку — модуль прост и понятен. А интерфейсную часть реализовать — как Ваша фантазия позволит.

Ограничения:

Необходимо иметь установленный MS Excel 2003 с пакетом совместимости 2007 или MS Excel 2007 — 2010

 

 

// константы форматов 2003
//  xlCSVWindows = 23;
//  xlDBF2 = 7;
//  xlDBF3 = 8;
//  xlDBF4 = 11;
//  xlDIF = 9;
//  xlExcel9795 = 43;
//  xlTextWindows = 20;
//  xlUnicodeText = 42;
//  xlWebArchive = 45;
//  xlXMLSpreadsheet = 46;
//  xlXMLData = 47;

// основные константы 2007
//  These are the main file formats in Excel 2007-2010:
//  51 = xlOpenXMLWorkbook (without macro’s in 2007-2010, xlsx)
//  52 = xlOpenXMLWorkbookMacroEnabled (with or without macro’s in 2007-2010, xlsm)
//  50 = xlExcel12 (Excel Binary Workbook in 2007-2010 with or without macro’s, xlsb)
//  56 = xlExcel8 (97-2003 format in Excel 2007-2010, xls)

//  57 = PDF 
//  60 = xlOpenDocumentSpreadsheet  OpenDocument Spreadsheet

////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
Перем СоответствиеРасширений;
Перем
СоответствиеВерсий;
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

// Запись табличного документа в формате 2007 EXCEL
//
// Параметры
//  <пТабДок>  — <ТабличныйДокумент> — табличный документ
//  <пИмяФайла>  — <Строка> — имя исходного файла.
//  <пФорматФайла>  — <Число> — константа, определяющая формат файла
//
Процедура ЗаписатьMXLВФормате2007(пТабДок, пИмяФайла, пФорматФайла = 51) Экспорт

    Если НЕ ЗначениеЗаполнено(пИмяФайла) Тогда Возврат КонецЕсли;
   
ОбъектФайл = Новый Файл(пИмяФайла);
   
Расширение = СоответствиеРасширений.Получить(пФорматФайла);
   
ИмяНовогоФайла = ОбъектФайл.Путь + ОбъектФайл.ИмяБезРасширения + Расширение;
   
ИмяВременногоФайла = КаталогВременныхФайлов() + Лев(Строка(Новый УникальныйИдентификатор), 8) + «.xls»;
   
пТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS);
   
Excel = Новый COMОбъект(«Excel.Application»);
    Если
Excel.Version < СоответствиеВерсий.Получить(пФорматФайла) Тогда
       
Сообщить(«В текущей версии Excel выбранный формат файла не поддерживается. Преобразование не выполнено!», СтатусСообщения.Важное);
       
Excel.Quit();
       
Excel = Неопределено;
        Возврат;
    КонецЕсли;
   
Excel.Visible = Ложь;
   
Excel.DisplayAlerts = Ложь;//чтобы EXCEL не спрашивал о перезаписи файла
   
КнигаExcel = Excel.WorkBooks.Open(ИмяВременногоФайла);
    Попытка
        Если
пФорматФайла = 57 Тогда //PDF
           
КнигаExcel.ExportAsFixedFormat(0, ИмяНовогоФайла, 0);
        Иначе
           
КнигаExcel.SaveAs(ИмяНовогоФайла, пФорматФайла);
        КонецЕсли;
    Исключение
       
Сообщить(«Не удалось сохранить файл: » + ОписаниеОшибки());
    КонецПопытки;
   
КнигаExcel.Close();
   
Excel.DisplayAlerts = Истина;
   
Excel.Quit();
   
Excel = Неопределено;
   
УдалитьФайлы(ИмяВременногоФайла);

КонецПроцедуры // ЗаписатьВФормате2007()

////////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ — ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА

////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ

СоответствиеРасширений = Новый Соответствие;
СоответствиеРасширений.Вставить(51, «.xlsx»);
СоответствиеРасширений.Вставить(45, «.mht»);
СоответствиеРасширений.Вставить(46, «.xml»);
СоответствиеРасширений.Вставить(23, «.csv»);
СоответствиеРасширений.Вставить(9«.dif»);
СоответствиеРасширений.Вставить(8«.dbf»);
//работает только в 2007
СоответствиеРасширений.Вставить(47, «.xml»);
СоответствиеРасширений.Вставить(57«.pdf»);
СоответствиеРасширений.Вставить(60«.ods»);

СоответствиеВерсий = Новый Соответствие;
СоответствиеВерсий.Вставить(51, «11.0»);
СоответствиеВерсий.Вставить(45, «11.0»);
СоответствиеВерсий.Вставить(46, «11.0»);
СоответствиеВерсий.Вставить(23, «11.0»);
СоответствиеВерсий.Вставить(9«11.0»);
СоответствиеВерсий.Вставить(8«11.0»);
//работает только в 2007
СоответствиеВерсий.Вставить(47, «12.0»);
СоответствиеВерсий.Вставить(57,«12.0»);
СоответствиеВерсий.Вставить(60,«12.0»);

28 Comments

  1. cool.vlad4

    Была же функция сохранения, но только в pdf? Я думаю они не сильно отличаются…

    Reply
  2. ediks

    (1) Как-то не прижилась рассылка в PDF. Нужен именно Excel.

    Хотя PDF у нас тоже используется, но для других целей.

    Reply
  3. cool.vlad4

    (2) ну, я немного не то имел ввиду;-)

    Reply
  4. ediks

    (3) Если имеется в виду Надстройка 2007 Microsoft Office: сохранение в формате PDF (Майкрософт), то она устанавливается только для 2007. Для MS Office 2003 такой надстройки нет. А у нас в основном используется 2003.

    Но, наверное, можно применить точно такой же принцип и для PDF. Только надо найти константу формата при использовании SaveAs 🙂

    Reply
  5. cool.vlad4

    (4) Как раз на это я и намекал

    Но, наверное, можно применить точно такой же принцип и для PDF. Только надо найти константу формата при использовании SaveAs 🙂

    с точностью до наоборот …на портале уже 2 или 3 раза публиковали ф-цию сохранения в pdf. Отличаются они несильно. Я, то не против нет…но как мне кажется нерационально для каждого формата по статье.

    Reply
  6. cool.vlad4

    Вот кстати и совет — напишите сразу ф-цию сохранения в разные форматы — pdf, csv, чего там еще, xml — для полноты картины.

    Reply
  7. Angeros

    Т.е. как я понял процедура берет xls открывает его втихую екселем и сохраняет как xlsx.

    Кстати у метода есть ограничения. попробуйте проделать такой фокус с таблой где число колонок более 256 либо строк более чем 65535.

    Reply
  8. Yashazz

    (7) Кстати да, а для таблицы, например, в 80000 строк есть шансы сохранить в эксель? Чтоб сразу в xlsx безо всяких скрытных открытий-переоткрытий через com? Например, получается ли через ADO или, допустим, csv (не как текстовый)?

    Reply
  9. ediks

    (7) Естественно, ограничение по количеству колонок и строк никто не отменял. Но это ограничение скорее не метода, а MS Excel до версии 2003 включительно. В 2007 ограничения не такие жесткие — 16к колонок и 1М строк.

    Если есть метод сохранить MXL в XLS средствами платформы 8.1, обходящий это ограничение — в студию.

    Reply
  10. Angeros

    (8)Лично не пробовал но через ком или адо проблем не должно быть.

    Reply
  11. Vitaslon

    а чем вам мешает штатный механизм? через файл-сохранить копию

    Reply
  12. ediks

    (11) Через штатный механизм файл получается очень большим, я это подробно описал в начале статьи. Попробуйте MXL сохранить средствами платформы 8.1, а потом сохранить в формате xlsx в Excel. Только файл возьмите размером в несколько Мб, чтобы почувствовать разницу.

    Reply
  13. ediks

    (5) А такой вариант годится?

    Reply
  14. cool.vlad4

    (13) ну, вот, теперь больше нет необходимости делать по статье на каждый формат

    Reply
  15. Vitaslon

    (12)

    извеняюсь

    читал быстро, и видемо это я пропустиЛ)

    Reply
  16. Tokiy

    Спасибо, ediks, очень пригодилась статья!

    Reply
  17. Santur

    В 2003 есть вот такая константа

    //  xlDBF3 = 8;

    ,

    а вот в 2010 офисе этот формат не прокатывает, постоянно выдает ошибку

    Ошибка при вызове метода контекста (SaveAs): Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

    Можно ли в 2010 офисе сохранить в формате xlDBF3 ???

    Reply
  18. ediks

    (17) Сейчас попробовал под Excel 2003 сохранить mxl в DBF III — все ОК. Вечером попробую под 2010. Не пробовали mxl сохранить в xls, а потом в Excel сохранить в DBF III? Может Excel в принципе не может сохранить такой файл? Может какие-нибудь заголовки мешают? По идее, в файле должны быть только колонки данных без всяких красивостей и т.д. и т.п.

    Reply
  19. ediks

    (17) Попробовал конвертировать файл отчета с заголовком — получил ошибку SaveAs. Удалил заголовки — все ОК.

    Reply
  20. Santur

    (18) я из 1С сохраняю в xls и потом открываю этот xls и пытаюсь сохранить в dbfIII

    oBook.SaveAs(КаталогЭкспортаДанных+»»+ИмяDbfФайла, 8, , , , , , , , 866);

    Файл Excel выглядит след. образом

    зы: аттач — выгрузка в xls из демо базы ЗУП

    Reply
  21. ediks

    (20) Попробуйте удалить строки в файле с 1 по 6 и сохранить в ДБФ. Что получится? Я писал в (19), что удалил заголовки и у меня сохранился ДБФ.

    Reply
  22. Santur

    (21) удалил сверху непосредственно все, до лиц. счетов, ФИО и сумм…и все равно собака выдает ошибку «….Метод SaveAs из класса Workbook завершен неверно»

    я начинаю подозревать, что причина в том, что у ячеек не указан формат, т.е. в mxl он не заполнен, если смотреть в xls, то стоит общий.

    Reply
  23. ediks

    (22) тут ничего не могу сказать — пути Microsoft неисповедимы. Если сам Великий и Ужасный Excel не может сохранить свой xls, то никакая обработка 1С не спасет.

    Reply
  24. SpartakM

    Подскажите, а если нет установленного Excel на компьютере, а при сохранении средствами платформы, создается файл 20мб, и картинки все «съезжают» со своих мест. Если сохранять этот же файл опен офисом, через сохранить как, устанавливаю тот же формат (Excel 2003-2007), и размер файла уменьшается до 2-3мб.

    Так вот, вопрос, может знаете, как сохранять, чтобы файл сразу создавался размером 2-3мб, а не 20мб.

    Reply
  25. ediks

    (24) Как уменьшить средствами 1С размер файла я не знаю. В самом Excel 2003 где-то есть пункт меню — сжать картинки. Платформа 8.2 умеет сохранять в формате Excel 2007.

    Reply
  26. andru_dv

    Спасибо, полезная обработка!

    Reply
  27. Seven2000

    Здравствуйте!

    А как Word-овский документ, созданный в 1С, сохранить в PDF?

    Reply
  28. ediks

    (27) Указать в параметрах пФорматФайла = 57 процедуры Процедура ЗаписатьMXLВФормате2007(пТабДок, пИмяФайла, пФорматФайла = 51). Но это прокатит только в Office 2007 и старше

    Reply

Leave a Comment

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