Как формировать сложные файлы Excel в 1С на macOS без COM-объектов?

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

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

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

В чем причина системных ограничений на macOS

Основная сложность заключается в фундаментальных архитектурных различиях между операционными системами. Разберем ключевые факторы, влияющие на работу с файлами электронных таблиц:

  1. Отсутствие технологии COM/OLE Automation. Интерфейс межпрограммного взаимодействия Component Object Model (COM) является исключительно частью ядра Windows. В macOS его нет на системном уровне. Конструкция вида Новый COMОбъект("Excel.Application") в среде Mac не поддерживается в принципе.
  2. Ограничения встроенного табличного документа. Платформа 1С:Предприятие умеет нативно сохранять отчеты в формате XLSX без стороннего софта (с помощью свойства ТипФайлаТабличногоДокумента.XLSX). Однако объект ТабличныйДокумент имеет функциональные рамки: он не умеет создавать многостраничные книги с несколькими листами, не поддерживает сводные таблицы (Pivot Tables), макросы VBA, списки проверки данных и сложные динамические графики.

Таким образом, когда от разработчика требуется создать не просто линейную плоскую ведомость, а сложный интерактивный отчет с формулами и разметкой, стандартного экспорта становится недостаточно. Рассмотрим практические решения этой задачи.

Решение 1. Шаблонизация через нативный OpenXML (ЗаписьZipФайла и ЗаписьXML)

Современный формат электронных таблиц .xlsx представляет собой упакованный ZIP-архив с XML-документами и служебными файлами связей. Этот метод является полностью кроссплатформенным, не требует внешних библиотек, компиляции бинарных файлов и установки пакета Microsoft Office на устройство пользователя.

Разберем алгоритм по шагам:

  1. Создадим эталонный файл .xlsx в Excel, настроив визуальное оформление, шапки, формулы и связи между листами. В ячейках, куда необходимо передать динамические показатели из базы, укажем уникальные текстовые метки (например, [НомерСчета], [СуммаИтог]).
  2. Распакуем шаблон во временную папку средствами платформы 1С с помощью объекта ЧтениеZipФайла.
  3. Скорректируем файлы данных внутри архива. Обычно текстовые значения хранятся в xl/sharedStrings.xml, а разметка листов — в каталоге xl/worksheets/ (файлы sheet1.xml, sheet2.xml). Для изменения структуры применим объекты ЧтениеXML и ЗаписьXML либо выполним направленную строковую замену методами работы со строками.
  4. Соберем отредактированную структуру обратно в архив, используя ЗаписьZipФайла, и сохраним с расширением .xlsx.

Посмотрим на пример распаковки и упаковки шаблона средствами встроенного языка 1С:


// Распаковываем исходный шаблон отчета
АрхивЧтение = Новый ЧтениеZipФайла(ПутьКШаблону);
АрхивЧтение.ИзвлечьВсе(КаталогРаспаковки, РежимВосстановленияПутейФайловZIP.Восстанавливать);
АрхивЧтение.Закрыть();

// ... На этом шаге считываем sheet1.xml или sharedStrings.xml,
// модифицируем узлы через ЗаписьXML или строковую подстановку ...

// Упаковываем структуру обратно в итоговый документ XLSX
АрхивЗапись = Новый ЗаписьZipФайла(ПутьКИтоговомуФайлу, , , СжатиеZIP.Максимальное);
АрхивЗапись.Добавить(КаталогРаспаковки + "/*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути);
АрхивЗапись.Записать();

Преимущество метода: сформированный файл сохраняет все сложные элементы оформления, формулы, правила условного форматирования и макросы оригинального шаблона без единой внешней зависимости.

Решение 2. Вынос генерации на сторону сервера

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

Разделим выполнение программного кода:

  1. Клиентский вызов инициирует серверную процедуру.
  2. Вся тяжелая логика построения сложного документа выполняется в директиве НаСервере. Если сервер развернут под Windows, там доступны привычные системные механизмы и установленные библиотеки.
  3. Сформированный результат конвертируется в объект ДвоичныеДанные и передается обратно клиенту на macOS.
  4. Клиентская часть 1С просто сохраняет полученный поток байтов на диск через метод ДвоичныеДанные.Записать() или запускает просмотр средствами операционной системы.

Решение 3. Использование AppleScript через терминал (osascript)

Если на Mac установлен пакет Microsoft Office (например, Office 2016 или актуальные версии Microsoft 365 для Mac), мы можем взаимодействовать с ним напрямую. Вместо недоступного механизма COM на macOS применяется встроенная система автоматизации AppleScript / JXA (JavaScript for Automation).

Вызов скриптов из 1С выполняется через запуск системной консольной утилиты osascript:

  1. Формируем текст управляющего скрипта AppleScript (команды открытия документа, активации ячеек, записи значений, пересчета формул или запуска макроса).
  2. Сохраняем сценарий во временный файл скрипта с расширением .scpt либо передаем его через параметры запуска.
  3. Используем метод 1С ЗапуститьПриложение() или НачатьЗапускПриложения() для запуска утилиты osascript.

Посмотрим на пример вызова системной утилиты для выполнения сценария управления Excel:


КоманднаяСтрока = "osascript -e 'tell application ""Microsoft Excel"" to open POSIX file """ + ПутьКФайлу + """'";
ЗапуститьПриложение(КоманднаяСтрока, , Истина);

Этот метод позволяет полностью использовать мощь настольного Excel под управлением macOS, если офисный пакет установлен на машине пользователя.

Решение 4. Вспомогательные консольные утилиты и внешние компоненты

Если требуется полностью изолировать процесс выгрузки от офисного пакета, но при этом необходимо формировать таблицы на клиенте с нуля динамическим кодом, эффективным подходом выступает интеграция с CLI-утилитами или создание внешних компонент:

  1. Использование внешних компонент на базе .NET Core / C#. С развитием кроссплатформенного .NET Core внешние компоненты Native API для 1С могут собираться под архитектуру macOS (динамические библиотеки с расширением dylib). С помощью библиотек OpenXML в изолированной среде компоненты создаются файлы любой сложности.
  2. Использование легковесных фоновых скриптов. На macOS из 1С через ЗапуститьПриложение() можно передавать структурированные данные (в формате JSON или CSV) локальному скрипту (например, на Python с модулями обработки таблиц). Скрипт компонует файл по правилам и складывает готовый документ в рабочий каталог пользователя.

Выбор конкретного пути зависит от архитектуры вашей базы. Если используется клиент-серверный вариант — перенесите генерацию в контекст НаСервере. Если клиент файловый или работает автономно на Mac — наиболее надежным и быстрым решением остается непосредственная шаблонизация OpenXML через встроенные объекты ЗаписьZipФайла и ЗаписьXML.

← На главную