Как открыть, отредактировать и сохранить существующий файл Excel в 1С через COM-объект?

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

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

Рассмотрим подробно, почему возникают эти ошибки и как правильно построить алгоритм работы с COM-объектом Excel.Application.

Причина ошибки при открытии и сохранении файла

Проанализируем распространенную ошибку в логике работы с объектами Excel. Если вызван метод открытия файла Workbooks.Open(ПутьКФайлу), а следом за ним выполняется команда Workbooks.Add(), программа создает новую пустую книгу. В результате все дальнейшие изменения вносятся в новый документ, а попытка вызвать SaveAs приводит к ошибке блокировки файла или несоответствию ссылок на активную книгу.

Чтобы корректно отредактировать существующий файл Excel, следует придерживаться следующего порядка действий:

  1. Открываем существующий файл и сохраняем ссылку на рабочую книгу в переменную: Книга = Эксель.Workbooks.Open(ПутьКФайлу);.
  2. Получаем нужный лист через коллекцию Worksheets: Лист = Книга.Worksheets(1);.
  3. Вносим требуемые изменения в ячейки листа.
  4. Сохраняем изменения непосредственно в этот же файл с помощью метода Книга.Save(); (без использования SaveAs).
  5. Закрываем книгу и завершаем работу процесса Excel.

Причина ошибки 0x800a03ec при записи формул

Выясним причину возникновения ошибки 0x800a03ec при попытке установить значение свойства FormulaR1C1. Данное исключение генерируется Microsoft Excel в следующих случаях:

Разберем варианты правильной установки формул через COM-объект:

1. Использование русскоязычной формулы (свойство FormulaLocal):

Лист.Cells(2, 2).FormulaLocal = "=ГИПЕРССЫЛКА(""https://google.com"";""Гугл"")";

2. Использование англоязычной формулы (свойство Formula):

Лист.Cells(2, 2).Formula = "=HYPERLINK(""https://google.com"", ""Гугл"")";

Готовое решение: корректный алгоритм работы с Excel

Рассмотрим полный пример кода 1С для открытия существующего файла, редактирования ячеек, записи формулы, сохранения и корректного освобождения COM-объекта из памяти:


ПутьКФайлу = "C:\Docs\PriceList.xlsx";

Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    // Отключаем отображение диалоговых окон и предупреждений Excel
    Эксель.DisplayAlerts = Ложь; 
Исключение
    Сообщить("Не удалось запустить MS Excel. Проверьте, установлен ли он на компьютере.");
    Возврат;
КонецПопытки;

Попытка
    // 1. Открываем существующую книгу
    Книга = Эксель.Workbooks.Open(ПутьКФайлу);
    Лист  = Книга.Worksheets(1);
    
    // 2. Определяем количество заполненных строк
    КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
    
    // 3. Заполняем данные в цикле
    Для НомерСтроки = 1 По КоличествоСтрок Цикл
        Лист.Cells(НомерСтроки, 2).Value = 1;
    КонецЦикла;
    
    // 4. Записываем формулу с помощью FormulaLocal
    Лист.Cells(2, 3).FormulaLocal = "=ГИПЕРССЫЛКА(""https://google.com"";""Гугл"")";
    
    // 5. Сохраняем изменения в открытом файле
    Книга.Save();
    
    // 6. Закрываем книгу и завершаем работу Excel
    Книга.Close();
    Эксель.Quit();
    
    Сообщить("Файл успешно отредактирован и сохранен!");
Исключение
    Сообщить("Произошла ошибка при обработке файла: " + ОписаниеОшибки());
    
    // В случае ошибки принудительно завершаем процесс
    Эксель.Quit();
КонецПопытки;

// Очищаем переменную для освобождения COM-объекта
Эксель = Неопределено;

Альтернативный кроссплатформенный вариант без COM

Посмотрим на альтернативное решение без использования COM-объекта. Использование `Excel.Application` ограничено операционной системой Windows и требует наличия установленного пакета Microsoft Office. Если код исполняется на сервере 1С под управлением Linux, следует использовать встроенный объект ТабличныйДокумент:


ПутьКФайлу = "C:\Docs\PriceList.xlsx";

ТабДок = Новый ТабличныйДокумент;

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

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

← На главную