При работе с крупными базами данных на платформе 1С 7.7 программисты часто сталкиваются с необходимостью выгрузки огромных отчетов (100 000 строк и более) в формат Excel. Стандартные средства платформы и популярные внешние компоненты, такие как Йоксель, могут вести себя непредсказуемо: либо процесс занимает десятки минут, либо данные обрезаются на отметке 65 536 строк. Разберем подробно, почему это происходит и как решить эти задачи эффективно.
Первоначальная проблема, с которой сталкиваются пользователи, — аномально долгое время формирования файла. Если выгрузка 28 тысяч строк занимает около 1700 секунд, это явный признак технической ошибки в алгоритме. Проанализируем ситуацию: в нормальных условиях Йоксель должен обрабатывать около 100 тысяч строк за 115–120 секунд. Если скорость значительно ниже, следует обратить внимание на следующие моменты:
Рассмотрим пример штатного сохранения, который работает достаточно быстро для небольших объемов:
ИмяФайла = "C:\Reports\Sales.xls";
т.Записать(ИмяФайла, "XLS");
// Время работы для 2200 строк составляет примерно 2.8 сек.
Многие разработчики ошибочно полагают, что ограничение в 65 536 строк — это недоработка 1С или Йокселя. Выясним истинную причину: это жесткое ограничение формата Excel 97-2003 (XLS). Индексация строк в этом формате ограничена 16 битами, что физически не позволяет записать большее число строк на один лист. Йоксель работает именно с этим форматом, поэтому при попытке сохранить 180 000 строк «естественно» сохранятся только первые 65 536.
Для сохранения большего объема данных необходимо использовать формат Excel 2007+ (XLSX), который поддерживает более 1 миллиона строк.
Если вам достаточно 65 тысяч строк, но вы хотите добиться максимальной скорости, используйте методы работы с объектом в памяти. Разберем по шагам, как ускорить Йоксель:
Конвертер.ЗаписатьВФайл() вместо поэтапного обращения к каждой ячейке через COM-интерфейс.Посмотрим на пример замера скорости: при правильной настройке 102 528 строк должны обрабатываться за 115 секунд (с учетом того, что в итоговый XLS попадет только часть данных).
Рассмотрим простой и эффективный «лайфхак», не требующий сторонних компонент. Если данных много (например, 150 000 строк), мы можем сохранить таблицу из 1С в формате HTML.
Проанализируем алгоритм:
Таблица в 1С.Таб.Записать(ИмяФайла, "HTML");..xls.Современные версии Excel (начиная с 2007) корректно открывают такие файлы, игнорируя лимит строк XLS, так как фактически это текстовый документ. После открытия пользователь может пересохранить его в полноценный .xlsx.
Для программной записи полноценных XLSX файлов без участия установленного Excel на сервере, разберем метод работы через ADO. Это позволяет записывать данные напрямую в файл как в базу данных.
Conn = СоздатьОбъект("ADODB.Connection");
Conn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";");
// Далее выполняем SQL-команды INSERT INTO для записи данных
Этот метод является самым быстрым для записи «сырых» данных (без оформления), так как он не тратит время на отрисовку ячеек и расчет графических параметров.
Рассмотрим вариант, предложенный опытными разработчиками: использование бесплатной утилиты от фирмы 1С. Она умеет открывать родные файлы .mxl (созданные в 1С 7.7) и конвертировать их в современные форматы.
Разберем процесс автоматизации:
.mxl.КомандаСистемы() вызывается внешняя утилита с параметрами командной строки для конвертации mxl -> xlsx.Это позволяет сохранить все оформление, шрифты и цвета, при этом полностью обходя лимит в 65 536 строк, так как формат XLSX его не имеет.
Поскольку развитие оригинального Йокселя остановилось, рассмотрим его современное продолжение — компоненту v7Moxel. Она была специально разработана для поддержки экспорта в XLSX, PDF и HTML напрямую из 1С 7.7.
Посмотрим на пример кода с использованием улучшенной компоненты:
// Загружаем компоненту
ЗагрузитьВнешнююКомпоненту("v7moxel.dll");
Таб = СоздатьОбъект("Таблица");
// ... заполнение таблицы ...
// Сохраняем в XLSX (тип 1 обычно соответствует XLSX в данной компоненте)
Таб.Записать(ИмяФайла, 1);
Важный момент: При использовании сторонних библиотек всегда проверяйте их совместимость с разрядностью вашей операционной системы и версии SQL (если используется).
Проанализировав ситуацию, мы видим, что проблема медленной выгрузки в 1С 7.7 решается либо оптимизацией кода (уходом от форматирования каждой ячейки), либо использованием более современных инструментов.
Основные выводы:
Йоксель, но проверьте алгоритм на наличие лишних циклов..xls. Переходите на .xlsx через v7Moxel или ADO.HTML или конвертацию через внешнюю утилиту «Работа с файлами».