Разработчики, работающие с историческими конфигурациями на платформе 1С 7.7, часто сталкиваются с проблемой совместимости форматов. Одной из наиболее острых задач в последнее время стала корректность отображения отчетов на мобильных устройствах, в частности на iPhone (iOS). Старый формат .xls (BIFF8), который генерируют популярные компоненты вроде Йоксель, современные мобильные операционные системы часто открывают некорректно или отказываются открывать вовсе из-за соображений безопасности и устаревания структуры файла.
В этой статье мы подробно разберем, как решить задачу программной конвертации файлов из .xls в современный формат .xlsx или универсальный .pdf, чтобы ваши клиенты могли комфортно просматривать отчеты на любых устройствах. Мы проанализируем несколько подходов: от использования системных утилит Microsoft Office до автоматизации через COM-объекты и внешние библиотеки.
Проанализируем наиболее быстрый способ, который не требует написания сложных циклов по перебору ячеек. В составе Microsoft Office (начиная с версии 2007 и выше) присутствует малоизвестная, но очень эффективная утилита excelcnv.exe. Она предназначена именно для конвертации файлов между форматами в фоновом режиме.
Рассмотрим пример кода, который позволяет вызвать эту утилиту прямо из 1С 7.7. Важным нюансом здесь является очистка веток реестра, так как при повторных запусках утилита может выдавать сообщение о некорректном завершении предыдущей сессии, что блокирует автоматизацию.
// Подготовим пути к файлам
ТекстКоманды = "reg delete HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Resiliency\StartupItems /f " +
"& ""C:\Program Files\Microsoft Office\Office15\excelcnv.exe"" -oice """ +
НовИмяФайлаXLSX + """ """ + ИмяСтарогоФайлаXLS + """";
// Выполним команду в системе
КомандаСистемы(ТекстКоманды);
Разберем, что происходит в этом коде. Сначала мы принудительно удаляем ключ реестра StartupItems, который отвечает за восстановление после сбоев — это гарантирует, что Excel не будет задавать лишних вопросов. Затем вызывается сам конвертер с ключом -oice, где первым параметром указывается путь к новому файлу, а вторым — к исходному. Это решение работает крайне быстро, буквально за 1-2 секунды, что критично для массовой рассылки отчетов.
Если нам требуется более гибкий контроль над процессом (например, объединение нескольких листов или настройка параметров печати перед сохранением), логично использовать механизм COM. Выясним, как правильно реализовать перенос данных из временных .xls файлов, созданных Йокселем, в новую книгу .xlsx.
Посмотрим на пример функции, которая создает новую книгу и копирует туда листы из исходных файлов:
Функция глНоваяКнигаExcel(СписокЛистовКниги) Экспорт
Состояние("Создание новой книги EXCEL....");
Попытка
Excel = СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки,"!");
Возврат 0;
КонецПопытки;
Excel.Visible = 0; // Работаем в невидимом режиме для скорости
Попытка
Книга = Excel.Workbooks.Add;
Исключение
Excel = 0;
Сообщить(ОписаниеОшибки, "!");
Возврат 0;
КонецПопытки;
Для Л = 1 По СписокЛистовКниги.РазмерСписка() Цикл
НазваниеЛиста = "";
ВремФайл = СписокЛистовКниги.ПолучитьЗначение(Л, НазваниеЛиста);
Попытка
ИсхКнига = Excel.Workbooks.Open(СокрЛП(ВремФайл));
Исключение
Сообщить("Ошибка открытия временного файла: " + ВремФайл, "!");
Продолжить;
КонецПопытки;
ВставляемыйЛист = ИсхКнига.Worksheets(1);
ВставляемыйЛист.Copy(Книга.Sheets(Л));
ИсхКнига.Close(0);
Книга.Sheets(Л).Name = НазваниеЛиста;
КонецЦикла;
// Удаляем пустые листы, созданные по умолчанию
Попытка
Excel.DisplayAlerts = 0; // Отключаем подтверждение удаления
Для Л = Книга.Sheets.Count По (СписокЛистовКниги.РазмерСписка() + 1) Шаг -1 Цикл
Книга.Sheets(Л).Delete();
КонецЦикла;
Excel.DisplayAlerts = 1;
Исключение
КонецПопытки;
Возврат Excel;
КонецФункции
Важно помнить, что при работе с версиями Office выше 2010 могут сработать параметры безопасности (Protected View), которые блокируют вставку из "старых" форматов. В этом случае необходимо либо настроить Центр управления безопасностью Excel (добавить папки в надежные расположения), либо использовать метод с excelcnv.exe, описанный выше.
Рассмотрим ситуацию, когда на сервере не установлен Microsoft Office или его использование затруднено лицензионными ограничениями. В этом случае отличной альтернативой выступает LibreOffice. Он обладает мощным интерфейсом командной строки для конвертации документов.
Для реализации этого метода нам потребуется вызвать исполняемый файл soffice.exe со специальными ключами. Проанализируем структуру такой команды:
--headless — запускает программу без графического интерфейса.--convert-to xlsx — указывает целевой формат (можно указать pdf).--outdir — задает папку, куда будет сохранен результат.Пример вызова из 1С 7.7:
ПутьКПрограмме = """C:\Program Files\LibreOffice\program\soffice.exe""";
Параметры = " --headless --convert-to xlsx """ + ИмяФайлаXLS + """ --outdir """ + КаталогВыгрузки + """";
КомандаСистемы(ПутьКПрограмме + Параметры);
Этот способ часто работает стабильнее, чем COM-соединение с Excel, так как LibreOffice лучше изолирован от пользовательских настроек интерфейса и не требует чистки реестра.
Если формат .xlsx не является критичным и достаточно просто предоставить клиенту читаемый отчет, то PDF — идеальный выбор. Выясним, как автоматизировать создание PDF без лишних диалоговых окон.
Профессиональным решением будет использование виртуальных принтеров с поддержкой COM-интерфейса, таких как Bullzip PDF Printer или PDFCreator. В отличие от стандартного метода "Печать на принтер", эти компоненты позволяют программно передать имя файла.
Алгоритм действий будет следующим:
СоздатьОбъект("Bullzip.PDFPrinterSettings")).SetValue("Output", "путь_к_файлу.pdf").SetValue("ShowSaveAS", "never") и SetValue("ShowSettings", "never") для полной тишины процесса.Подведем итог нашему анализу. Выбор метода зависит от ваших условий:
1. Если важна максимальная скорость и установлен MS Office:
Используйте утилиту excelcnv.exe. Это самый "легкий" способ перевести старый двоичный формат в современный XML-пакет .xlsx.
2. Если нужно объединять данные из разных источников или менять структуру:
Ваш выбор — COM-объект Excel.Application. Это даст полный контроль над каждой ячейкой, но потребует тщательной обработки ошибок и контроля за тем, чтобы процессы EXCEL.EXE не "зависали" в памяти сервера.
3. Если требуется кроссплатформенность и бесплатность:
Используйте LibreOffice в режиме headless. Это наиболее надежный вариант для серверных решений под нагрузкой.
4. Если отчет предназначен только для чтения:
Сразу конвертируйте в PDF. Это гарантирует 100% идентичность отображения у клиента, независимо от того, открывает он файл на iPhone, Android или стационарном ПК.
Таким образом, мы рассмотрели основные технические подходы к решению проблемы устаревших форматов в 1С 7.7. Внедрение любого из этих методов позволит значительно повысить лояльность ваших пользователей, обеспечив им доступ к информации в удобном и современном виде.