Как ускорить долгое открытие и чтение больших файлов Excel в 1С

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

При автоматизации загрузки прайс-листов, каталогов и отчетов объемом в десятки тысяч строк разработчики часто сталкиваются со значительным зависанием программы на этапе выполнения метода Workbooks.Open. При работе через OLE-объект Excel.Application открытие тяжелого файла может занимать от десятков секунд до нескольких минут. Разберем основные причины такого поведения и рассмотрим практические способы оптимизации процесса.

Анализ причин медленного открытия книги Excel

Выясним, какие факторы приводят к существенным задержкам при вызове метода открытия книги:

  1. Автоматический пересчет формул. Если в файле содержится множество расчетных колонок (например, пересчет цен по курсу с другого листа), Excel по умолчанию пересчитывает всю цепочку зависимостей сразу при открытии.
  2. Опрос принтера по умолчанию. Во время инициализации документа Excel обращается к системному драйверу принтера для расчета макета страниц, шрифтов и разрывов. Если принтер сетевой или недоступен, возникают критические тайм-ауты.
  3. События и внешние связи. При открытии книги могут инициироваться обновления связей с внешними источниками, а также запускаться макросы книги.
  4. Раздутый используемый диапазон. Применение стилей или форматирования ко всей колонке целиком заставляет движок Excel считывать миллионы пустых ячеек в память.

Оптимизация параметров COM-объекта Excel.Application

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

Частая проблема: при попытке отключить автоматический расчет формул через Excel.Calculation = -4135 (константа xlCalculationManual) возникает ошибка Нельзя установить свойство Calculation класса Application. Это связано с тем, что в объектной модели Excel режим пересчета нельзя переключить, пока не открыта хотя бы одна книга. Чтобы обойти это ограничение, создадим временную пустую книгу, переведем расчет в ручной режим, а затем загрузим целевой файл.

Посмотрим на пример кода на платформе 1С:


Excel = СоздатьОбъект("Excel.Application");
Excel.Visible = 0;
Excel.DisplayAlerts = 0;
Excel.ScreenUpdating = 0;
Excel.EnableEvents = 0;

// Создаем временную книгу для переключения режима пересчета
ВременнаяКнига = Excel.Workbooks.Add();
Excel.Calculation = -4135; // xlCalculationManual
ВременнаяКнига.Close(0);

// Открываем целевой файл с явными параметрами
// 1-й параметр: Имя файла
// 2-й параметр (UpdateLinks): 0 - не обновлять связи
// 3-й параметр (ReadOnly): 1 - открыть только для чтения
Книга = Excel.Workbooks.Open(ДокументПрайсЛист, 0, 1);
Лист = Книга.WorkSheets(1);

Разберем по шагам ключевые параметры метода Workbooks.Open:

  1. Параметр отключения связей (UpdateLinks = 0). Предотвращает попытки Excel подключиться к внешним файлам и сетевым каталогам.
  2. Открытие только для чтения (ReadOnly = 1). Исключает блокировку файла, создание временных служебных копий и снижает накладные расходы операционной системы.
  3. Отключение событий (EnableEvents = 0). Блокирует выполнение встроенных процедур Workbook_Open.

Устранение сетевых задержек принтера

Проанализируем системные настройки. Если даже пустой файл или файл небольшого размера открывается с задержкой, переключите в операционной системе принтер по умолчанию на виртуальный (например, Microsoft Print to PDF или виртуальный XPS-принтер). Это полностью снимет задержки сетевого стека при определении параметров страницы.

Оптимизация формата исходного файла

Если есть возможность управлять форматом выгрузки прайс-листа или выполнить предварительное пересохранение, обратите внимание на формат хранения данных:

  1. Двоичный формат XLSB. Книги в формате двоичной книги Excel (.xlsb) открываются и парсятся значительно быстрее стандартных XML-архивов .xlsx за счет отсутствия распаковки XML-структуры.
  2. Формат XLS (Excel 97-2003). В ряде случаев бинарный формат старых версий считывается быстрее современных архивов при использовании OLE.
  3. Очистка хвостов диапазона. Удаление неиспользуемых пустых строк ниже фактических данных и последующее сохранение файла приводят границы листа к реальному размеру.

Альтернативные способы чтения без OLE-объекта Excel

При регулярной обработке больших прайс-листов (от 50 000 строк и более) использование OLE Automation становится узким местом по скорости. Рассмотрим более производительные подходы к загрузке данных:

  1. Выгрузка в текстовый формат (CSV / TSV). Если поставщик или внешняя программа позволяет формировать выгрузку в виде текстового файла с разделителями, это дает максимальный прирост производительности. Чтение через встроенный объект Текст в 1С 7.7 обрабатывает 75 000 строк за пару секунд.
  2. Использование внешних компонент. Специализированные библиотеки для прямого чтения табличных документов напрямую работают с двоичной структурой файлов без запуска фонового процесса Excel, обеспечивая кратное ускорение загрузки.
  3. Чтение через ADO / OLE DB. Чтение файла Excel как реляционной базы данных с помощью SQL-запроса позволяет быстро извлечь данные напрямую в оперативную память без инициализации графической подсистемы табличного процессора.
← На главную