Как программно сохранить файл Excel из формата .xls в .xlsx в 1С

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

При интеграции 1С с внешними системами часто возникает необходимость программной обработки файлов электронных таблиц. Одной из типичных задач является конвертация старого формата Excel 97-2003 (.xls) в современный формат Office Open XML (.xlsx). В данной статье мы подробно разберем, как реализовать этот процесс, проанализируем различные подходы и выявим подводные камни, с которыми сталкиваются разработчики.

Способ 1. Использование COM-объекта Excel.Application

Традиционный метод решения задачи заключается в использовании механизма COM-автоматизации. Этот способ предполагает взаимодействие 1С с установленным в операционной системе приложением Microsoft Excel. Рассмотрим по шагам, как правильно реализовать сохранение файла в новом формате.

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

Рассмотрим пример правильной реализации:


// Определяем пути к файлам
ПутьКСтаромуФайлу = "C:\Files\Document.xls";
// Формируем новый путь, заменяя расширение
ПутьКНовомуФайлу = Лев(ПутьКСтаромуФайлу, СтрДлина(ПутьКСтаромуФайлу) - 4) + ".xlsx";

ФайлИнфо = Новый Файл(ПутьКСтаромуФайлу);
Если ФайлИнфо.Существует() Тогда
    Попытка
        // Создаем COM-объект
        Excel = Новый COMОбъект("Excel.Application");
        Excel.Visible = Ложь;
        Excel.DisplayAlerts = Ложь; // Отключаем предупреждения (например, о перезаписи)

        // Открываем книгу
        РабочаяКнига = Excel.Workbooks.Open(ПутьКСтаромуФайлу);

        // Сохраняем в формате XLSX (код 51)
        РабочаяКнига.SaveAs(ПутьКНовомуФайлу, 51);

        // Закрываем книгу и приложение
        РабочаяКнига.Close();
        Excel.Quit();
        
        // Очищаем переменные для освобождения памяти
        РабочаяКнига = Неопределено;
        Excel = Неопределено;
    Исключение
        Сообщить("Ошибка при работе с Excel: " + ОписаниеОшибки());
        Если Excel <> Неопределено Тогда
            Excel.Quit();
        КонецЕсли;
    КонецПопытки;
КонецЕсли;

Проанализируем важные детали этого кода:

  1. Параметр 51: Это ключевой момент. Метод SaveAs принимает в качестве второго аргумента константу xlOpenXMLWorkbook. Без её указания Excel может попытаться сохранить содержимое старого формата в файл с новым расширением, что приведет к ошибке "файл поврежден" при попытке открытия.
  2. Свойство DisplayAlerts: Установка значения Ложь позволяет избежать остановки выполнения кода, если Excel захочет задать вопрос (например, "Файл уже существует, заменить?").
  3. Управление памятью: Крайне важно вызывать Excel.Quit() и обнулять переменные. Если этого не сделать, в системе будут копиться «зомби-процессы» EXCEL.EXE, которые со временем могут парализовать работу сервера.

Разновидности форматов при сохранении через COM

В зависимости от ваших задач, могут потребоваться и другие форматы. Рассмотрим наиболее полезные коды для метода SaveAs:

Способ 2. Использование встроенного объекта ТабличныйДокумент

Выясним причину, почему использование COM-объекта не всегда является оптимальным. Во-первых, он работает только на Windows. Во-вторых, требует лицензии на Microsoft Office. В-третьих, работает медленно и нестабильно при массовой обработке.

Начиная с версии 8.3, платформа 1С предоставляет мощный встроенный инструмент — ТабличныйДокумент, который умеет читать и записывать файлы Excel нативно. Рассмотрим, как выполнить конвертацию этим способом:


ПутьКСтаромуФайлу = "C:\Files\Document.xls";
ПутьКНовомуФайлу = "C:\Files\Document.xlsx";

// Создаем пустой табличный документ
ТабДок = Новый ТабличныйДокумент;

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

Разберем преимущества этого метода:

Однако стоит учитывать ограничение: при чтении файла через ТабличныйДокумент могут быть потеряны специфические элементы, такие как сложные макросы, сложные диаграммы или специфическое условное форматирование, которое поддерживается только "родным" Excel.

Рекомендации по выбору метода

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

  1. Если вам нужно просто перенести данные и базовое форматирование, и при этом код должен работать на сервере (особенно под Linux) — используйте ТабличныйДокумент.
  2. Если файл содержит сложные макросы, связи между книгами или специфическую разметку, которую 1С не может интерпретировать корректно — используйте COM-объект Excel.Application с обязательным кодом формата 51.
  3. При работе через COM всегда оборачивайте код в блоки Попытка...Исключение, чтобы гарантированно закрыть процесс Excel в случае критической ошибки.

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

← На главную