При разработке отчетов или обменов данными в 1С часто возникает задача выгрузки табличных документов в форматы Microsoft Office. Если с сохранением в стандартные форматы XLSX проблем обычно не возникает, то формат XLSM (книга Excel с поддержкой макросов) требует особого подхода, так как встроенные механизмы 1С не поддерживают запись файлов с макросами напрямую.
Давайте разберем, как решить эту задачу, используя возможности автоматизации через COM-объект.
Формат XLSM — это, по сути, стандартный XLSX-архив, внутри которого содержится специфический проект VBA (макросы). Стандартная функция ТабДок.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX) создает корректный файл данных, но она не умеет «инжектировать» в него код макросов или присваивать файлу соответствующий атрибут поддержки макросов. Поэтому нам приходится использовать вспомогательный инструмент — установленный на компьютере Microsoft Excel.
Рассмотрим процесс реализации данного функционала. Мы будем действовать в несколько этапов: сначала сохраним табличный документ как обычный XLSX, а затем откроем его через COM-интерфейс и пересохраним в нужный нам XLSM.
COM-объект приложения Excel.SaveAs с указанием соответствующего кода формата, поддерживающего макросы.Давайте проанализируем фрагмент кода, который позволяет успешно выполнить данную операцию:
ИмяВременногоФайла = КаталогВременныхФайлов() + "123.xlsx";
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
Ексель = Новый COMОбъект("Excel.Application");
Книга = Ексель.Workbooks.Open(ИмяВременногоФайла);
// 52 соответствует формату xlOpenXMLWorkbookMacroEnabled
xlOpenXMLWorkbookMacroEnabled = 52;
ИмяВременногоФайлаМакрос = КаталогВременныхФайлов() + "1234.xlsm";
Книга.SaveAS(ИмяВременногоФайлаМакрос, xlOpenXMLWorkbookMacroEnabled);
Книга.Close();
Ексель.Quit();
При использовании данного метода важно помнить о ряде технических ограничений:
COM-объекта на серверной стороне (в фоновых заданиях или на веб-сервере) крайне не рекомендуется. Это может приводить к появлению «зомби-процессов» Excel.exe в памяти, которые не закрываются автоматически, что со временем ведет к исчерпанию оперативной памяти сервера.Если ваша задача подразумевает масштабируемость или работу на серверных платформах (например, Linux), COM-объект не подойдет. В таких случаях мы рекомендуем рассмотреть следующие альтернативы:
OOXML без установленного Excel.XLSM-шаблон с необходимыми макросами. В процессе работы 1С копирует этот файл и с помощью библиотек (например, SpreadsheetDocument) заполняет только данные в ячейках, не затрагивая область макросов.Таким образом, мы выяснили, что для локальных рабочих станций под управлением Windows использование COM-объекта является наиболее быстрым и эффективным решением для сохранения файлов в формате XLSM.