Проблема сохранения больших объемов данных из 1С:Предприятие 7.7 в формат Excel знакома многим разработчикам. При достижении порога в 5–10 тысяч строк стандартный метод Записать или системное меню «Сохранить как» начинают работать крайне медленно или вовсе вызывают зависание приложения. Проанализируем причины этой ситуации и разберем по шагам наиболее эффективные способы решения задачи.
Прежде чем переходить к решениям, разберем, почему штатный конвертер 1С 7.7 работает неэффективно. Основная вычислительная нагрузка ложится на расчет геометрии ячеек табличного документа (mxl). Движок пытается сопоставить старый формат электронных таблиц с текущей разметкой макета, учитывая высоту каждой строки, ширину колонок и особенно — объединенные ячейки. Чем больше в таблице элементов форматирования, тем медленнее происходит экспорт. В некоторых случаях процесс становится экспоненциально сложным, что и приводит к «мертвому» зависанию интерфейса.
Рассмотрим самый простой способ, который не требует подключения сторонних библиотек. Часто этого достаточно для ускорения процесса в несколько раз. Основная нагрузка создается при динамическом расчете высоты строк.
Шаг 1: Фиксированная высота строк. Откройте макет вашего отчета и для всех строк установите фиксированную высоту (не «Авто»). Это избавляет движок экспорта от необходимости пересчитывать высоту каждой ячейки в зависимости от содержимого при конвертации. Однако помните, что при этом может пострадать отображение длинных строк с переносами.
Шаг 2: Отказ от объединения ячеек. Объединенные ячейки — главный враг производительности при экспорте. Проанализируем структуру макета: если вы используете объединение ячеек по горизонтали для центрирования текста, замените его на свойство «По выделенным столбцам». Для этого:
Unmerge).Это позволит Excel гораздо быстрее обрабатывать структуру документа.
Если оптимизация макета не помогает, воспользуемся проверенным инструментом — компонентой Yoksel. Это мощное расширение для работы с таблицами в 1С 7.7, которое работает в десятки раз быстрее штатных средств.
Разберем пример кода для использования Yoksel:
// Создаем объект Йокселя
Йоксель = СоздатьОбъект("ТабличныйДокумент");
// Загружаем в него наш сформированный отчет (объект Таблица)
Йоксель.ЗагрузитьИзТаблицы(Таб);
// Сохраняем напрямую в формат Excel
Йоксель.Записать("C:\MyReport.xls", 1); // 1 - параметр конвертации в XLS
Преимущество этого метода в том, что Yoksel имеет собственный движок формирования бинарного файла Excel, который оптимизирован под большие объемы данных и корректно обрабатывает структуру mxl.
В ходе обсуждения было выяснено, что библиотека mxl_doctor.dll также отлично справляется с «лечением» проблемных файлов при сохранении. Она позволяет обойти внутренние ограничения платформы на расчет геометрии.
Чтобы воспользоваться этим методом, библиотеку необходимо зарегистрировать в системе. Рассмотрим ситуацию, когда возникают сложности с UNC-путями (например, если база находится на сетевом сервере). Рекомендуется скопировать dll в локальный каталог Bin платформы на рабочей станции пользователя или в системную папку SysWOW64.
Пример регистрации библиотеки через командную строку от имени администратора:
c:\windows\syswow64\regsvr32.exe "C:\PathToDll\mxl_doctor.dll"
Интересной альтернативой является сохранение таблицы в формате .html. Рассмотрим этот алгоритм:
Таб.Записать("отчет.html", "HTML");..xlsx за пару секунд.Если отчет уже сформирован и 1С 7.7 не может его сохранить, воспользуемся бесплатной утилитой от фирмы 1С — «1С:Работа с файлами». Проанализируем последовательность действий:
.mxl. С этим платформа обычно справляется без проблем.Excel (.xls).Современные движки (на базе платформы 8.x, которые используются в этой утилите) гораздо эффективнее преобразуют данные, чем устаревшие алгоритмы «семерки».
Проанализируем ситуацию, когда данных настолько много (более 65 536 строк), что старый формат XLS их не поддерживает. В этом случае единственным надежным способом будет:
1С++ и классов для прямой записи в формат XLSX (XML-структура). Это полностью исключает использование COM-объектов Excel и снимает ограничения на количество строк.ADO. Если оформление не важно, а нужны только «голые» данные, запись напрямую в файл Excel как в базу данных происходит практически мгновенно.Таким образом, для решения проблемы мы рекомендуем в первую очередь минимизировать использование объединенных ячеек в макете и установить фиксированную высоту строк. Если это не помогает, оптимальным выбором станет использование внешней компоненты Yoksel, которая является стандартом де-факто для расширения возможностей печатных форм в 1С 7.7.