Как сохранить табличные документы MXL в форматы XLSX, PDF и HTML в 1С 7.7 без установленного MS Office?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Платформа 1С:Предприятие 7.7, несмотря на свой почтенный возраст, до сих пор успешно решает учетные задачи во многих организациях. Однако одной из ее главных проблем является отсутствие штатной поддержки современных форматов экспорта отчетов. Базовый функционал позволяет сохранять таблицы (файлы .mxl) интерактивно только в устаревший формат XLS (Excel 95/97), который накладывает жесткие ограничения на количество строк, искажает цвета и некорректно обрабатывает сложные объединенные ячейки.

Для решения этой проблемы разработчиками долгое время использовалась легендарная библиотека Йоксель. Но ее сборка из исходников под современные стандарты крайне затруднена, а развитие проекта давно остановилось. В качестве современной, быстрой и функциональной альтернативы была разработана внешняя компонента v7Moxel (автор — Dmitry Dreytser, известный под ником MadDAD). Компонента написана на C# с использованием .NET Framework и библиотеки OpenXML, что позволяет ей сохранять отчеты в формате XLSX (Excel 2007 и выше), а также в PDF и HTML абсолютно автономно — наличие установленного Microsoft Office или LibreOffice на сервере или локальной машине пользователя не требуется.

В этой статье мы подробно разберем возможности компоненты v7Moxel, процесс ее установки, настройки, интеграции в код 1С 7.7, а также рассмотрим примеры решения сопутствующих технических проблем.

Основные возможности компоненты v7Moxel

Компонента предоставляет разработчику 1С 7.7 богатый инструментарий для работы с печатными формами:

Системные требования и установка компоненты

Для успешной работы компоненты на рабочих станциях и серверах должны быть выполнены следующие требования:

  1. Установленный пакет .NET Framework версии 4.6.1 или выше.
  2. Наличие административных прав при первичной регистрации компоненты в операционной системе.

Разберем процесс установки по шагам:

  1. Скачайте архив с релизами компоненты с официального репозитория проекта на GitHub.
  2. Распакуйте содержимое архива в каталог базы данных 1С (или в отдельную папку на диске, например, C:\v7Moxel\).
  3. Для регистрации библиотеки в системном реестре запустите файл Register.cmd от имени Администратора (правой кнопкой мыши -> «Запуск от имени администратора»). Данный скрипт вызывает утилиту RegAsm.exe из состава .NET Framework и регистрирует COM-сервер под программным идентификатором AddIn.Moxel.Converter.

Программный интерфейс (API) компоненты

Компонента поддерживает стандартный интерфейс интеграции 1С ILanguageExtender и предоставляет разработчику несколько ключевых методов (доступны как англоязычные, так и русскоязычные синонимы):

Практические примеры интеграции в код 1С 7.7

Рассмотрим подробнее, как реализовать различные сценарии экспорта отчетов программным путем.

Сценарий 1. Программный экспорт активной таблицы в формат XLSX

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


Процедура ЭкспортироватьТаблицуВXLSX(Таб, ПутьКФайлу)
    // Шаг 1. Пытаемся загрузить внешнюю компоненту
    Если ЗагрузитьВнешнююКомпоненту("v7Moxel.dll") = 0 Тогда
        Сообщить("Не удалось загрузить внешнюю компоненту v7Moxel.dll!", "!");
        Возврат;
    КонецЕсли;

    // Шаг 2. Создаем объект конвертера
    Попытка
        Конвертер = СоздатьОбъект("AddIn.Moxel.Converter");
    Исключение
        Сообщить("Не удалось создать COM-объект AddIn.Moxel.Converter. Проверьте регистрацию в реестре!", "!");
        Возврат;
    КонецПопытки;

    // Шаг 3. Передаем таблицу в память компоненты
    Попытка
        Конвертер.ЗагрузитьИзПамяти(Таб);
    Исключение
        Сообщить("Ошибка при передаче табличного документа в компоненту: " + ОписаниеОшибки(), "!");
        Возврат;
    КонецПопытки;

    // Шаг 4. Записываем таблицу в формате XLSX (код формата = 1)
    Попытка
        Конвертер.Записать(ПутьКФайлу, 1);
        Сообщить("Документ успешно экспортирован в формат XLSX: " + ПутьКФайлу, "i");
    Исключение
        Сообщить("Ошибка записи файла: " + ОписаниеОшибки(), "!");
    КонецПопытки;
КонецПроцедуры

Сценарий 2. Экспорт отчета в формат PDF с автоматическим определением параметров страницы

Выясним, как ведет себя компонента при сохранении в PDF. Начиная с версии 0.2, v7Moxel автоматически считывает настройки ориентации страницы (портрет или ландшафт) и масштаб. Нам достаточно предварительно настроить параметры печати у самой таблицы 1С:


Процедура ЭкспортироватьТаблицуВPDF(Таб, ПутьКФайлу)
    // Загружаем компоненту
    Если ЗагрузитьВнешнююКомпоненту("v7Moxel.dll") = 0 Тогда
        Предупреждение("Компонента v7Moxel.dll не найдена!");
        Возврат;
    КонецЕсли;
    
    Конвертер = СоздатьОбъект("AddIn.Moxel.Converter");
    
    // Задаем параметры страницы на уровне 1С
    // 1 - Портрет, 2 - Ландшафт. Зададим ландшафтную ориентацию
    Таб.ПараметрыСтраницы(2, 100, 1, 5, 5, 5, 5, 0, 0, 1, 1, ); 
    
    // Загружаем документ в конвертер
    Конвертер.ЗагрузитьИзПамяти(Таб);
    
    // Записываем в формате PDF (код формата = 3)
    Попытка
        Конвертер.Записать(ПутьКФайлу, 3);
        Предупреждение("Файл PDF успешно сформирован!");
    Исключение
        Сообщить("Не удалось сохранить PDF: " + ОписаниеОшибки(), "!");
    КонецПопытки;
КонецПроцедуры

Сценарий 3. Глобальный перехват интерактивной записи таблиц

Рассмотрим очень удобный механизм, который предлагает разработчик компоненты. Вместо написания кода под каждую кнопку выгрузки, мы можем один раз при запуске системы включить глобальный перехват штатного механизма записи таблиц 1С. В этом случае, когда пользователь выбирает меню «Файл - Сохранить как», он автоматически получает возможность сохранять в XLSX и PDF прямо из стандартного диалогового окна 1С.

Для реализации этого механизма откройте модуль Причало Настройки (процедура ПриНачалеРаботыСистемы) в Конфигураторе и добавьте следующий код:


Процедура ПриНачалеРаботыСистемы()
    // Загружаем компоненту конвертации mxl документов
    Если ЗагрузитьВнешнююКомпоненту("v7Moxel.dll") = 1 Тогда
        Попытка
            ГлобальныйКонвертер = СоздатьОбъект("AddIn.Moxel.Converter");
            // Включаем глобальный перехват стандартных диалогов записи
            ГлобальныйКонвертер.ПерехватитьЗапись(1);
            Сообщить("Компонента v7Moxel успешно инициализирована. Стандартный экспорт в XLS заменен на XLSX.", "I");
        Исключение
            Сообщить("Ошибка инициализации AddIn.Moxel.Converter: " + ОписаниеОшибки(), "!");
        КонецПопытки;
    Иначе
        Сообщить("Внимание! Компонента v7Moxel.dll не загружена. Экспорт в XLSX и PDF будет недоступен.", "!");
    КонецЕсли;
КонецПроцедуры

Решение проблемы нехватки памяти при конвертации тяжелых отчетов

Проанализируем техническую проблему, с которой часто сталкиваются пользователи старых конфигураций 1С 7.7. При формировании крупных годовых отчетов, оборотно-сальдовых ведомостей или реестров документов, таблица в памяти 1С может занимать десятки и сотни мегабайт. Архитектура 1С 7.7 является 32-битной, что ограничивает максимальный объем используемой процессом оперативной памяти в 2 ГБ. Внутренние механизмы парсинга библиотек .NET (в частности, ClosedXML) при построении DOM-модели XML-документа Excel могут кратно увеличивать потребление памяти во время конвертации.

Разработчик компоненты элегантно решил эту проблему. Начиная с версии 0.3, библиотека автоматически оценивает размер передаваемого табличного документа. Если размер таблицы превышает внутренний порог (2 МБ), компонента выполняет следующие действия:

  1. Сбрасывает сериализованные данные таблицы во временный файл на жестком диске.
  2. Запускает внешний легковесный процесс taskrunner.exe (который поставляется вместе с dll-файлом компоненты).
  3. Внешний процесс в фоновом режиме считывает временный файл, производит ресурсоемкую операцию конвертации в XLSX, PDF или HTML и сохраняет готовый файл в целевую директорию.
  4. Компонента внутри 1С ожидает завершения работы внешнего процесса, при этом сама 1С не расходует драгоценную оперативную память основного процесса 1cv7.exe.

Важное примечание для системных администраторов: Чтобы данный функционал работал стабильно, убедитесь, что исполняемый файл taskrunner.exe находится в той же папке, что и зарегистрированная библиотека v7Moxel.dll, а у пользователя 1С есть права на запуск сторонних исполняемых файлов в операционной системе и запись во временный каталог Windows (%TEMP%).

Исправление ошибок форматирования и визуального отображения

В процессе эволюции компоненты v7Moxel были устранены критические ошибки визуализации, которые ранее мешали качественному переходу на безбумажный документооборот:

Используя компоненту v7Moxel, вы получаете мощный инструмент для модернизации 1С 7.7, позволяющий пользователям формировать современные, красивые и удобные документы для обмена с контрагентами и клиентами.

← На главную