Как сохранить файл в формате XLSM из 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов или обменов данными в 1С часто возникает задача выгрузки табличных документов в форматы Microsoft Office. Если с сохранением в стандартные форматы XLSX проблем обычно не возникает, то формат XLSM (книга Excel с поддержкой макросов) требует особого подхода, так как встроенные механизмы 1С не поддерживают запись файлов с макросами напрямую.

Давайте разберем, как решить эту задачу, используя возможности автоматизации через COM-объект.

Понимание проблемы

Формат XLSM — это, по сути, стандартный XLSX-архив, внутри которого содержится специфический проект VBA (макросы). Стандартная функция ТабДок.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX) создает корректный файл данных, но она не умеет «инжектировать» в него код макросов или присваивать файлу соответствующий атрибут поддержки макросов. Поэтому нам приходится использовать вспомогательный инструмент — установленный на компьютере Microsoft Excel.

Решение задачи по шагам

Рассмотрим процесс реализации данного функционала. Мы будем действовать в несколько этапов: сначала сохраним табличный документ как обычный XLSX, а затем откроем его через COM-интерфейс и пересохраним в нужный нам XLSM.

  1. Подготовим временный файл для первичной выгрузки данных из 1С.
  2. Создадим COM-объект приложения Excel.
  3. Откроем сформированный файл в Excel.
  4. Используем метод SaveAs с указанием соответствующего кода формата, поддерживающего макросы.

Пример кода для реализации

Давайте проанализируем фрагмент кода, который позволяет успешно выполнить данную операцию:


ИмяВременногоФайла = КаталогВременныхФайлов() + "123.xlsx";
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);

Ексель = Новый COMОбъект("Excel.Application"); 
Книга = Ексель.Workbooks.Open(ИмяВременногоФайла);     

// 52 соответствует формату xlOpenXMLWorkbookMacroEnabled
xlOpenXMLWorkbookMacroEnabled = 52;

ИмяВременногоФайлаМакрос = КаталогВременныхФайлов() + "1234.xlsm";
Книга.SaveAS(ИмяВременногоФайлаМакрос, xlOpenXMLWorkbookMacroEnabled);

Книга.Close();
Ексель.Quit();

Важные замечания по использованию метода

При использовании данного метода важно помнить о ряде технических ограничений:

Альтернативные подходы

Если ваша задача подразумевает масштабируемость или работу на серверных платформах (например, Linux), COM-объект не подойдет. В таких случаях мы рекомендуем рассмотреть следующие альтернативы:

  1. Использование библиотек Native API: Существуют внешние компоненты, написанные на C# или C++, которые позволяют работать с файлами OOXML без установленного Excel.
  2. Шаблонизация: Можно создать заранее подготовленный XLSM-шаблон с необходимыми макросами. В процессе работы 1С копирует этот файл и с помощью библиотек (например, SpreadsheetDocument) заполняет только данные в ячейках, не затрагивая область макросов.
  3. Сервис-ориентированная архитектура: Вы можете вынести формирование сложных документов во внешний микросервис (например, на языке Python или C#), который будет принимать данные из 1С через HTTP-запрос и отдавать готовый файл.

Таким образом, мы выяснили, что для локальных рабочих станций под управлением Windows использование COM-объекта является наиболее быстрым и эффективным решением для сохранения файлов в формате XLSM.

← На главную