Разработчики, работающие с платформой 1С:Предприятие 7.7, часто сталкиваются с ограничением штатных средств при выгрузке данных. Стандартный метод Записать() позволяет сохранять отчеты в формате Excel 97 (.xls), однако современные требования часто подразумевают использование формата XLSX. Это связано не только с требованиями заказчиков, но и с техническими лимитами: старый формат ограничен 65 536 строками, в то время как новый поддерживает более миллиона.
В этой статье мы подробно разберем, как преодолеть эти ограничения, проанализируем типичные ошибки при конвертации и рассмотрим несколько способов получения полноценного файла XLSX прямо из "семерки".
Этот способ является наиболее популярным, так как он использует установленный на компьютере пакет Microsoft Office. Логика процесса заключается в следующем: сначала мы сохраняем файл стандартным методом 1С в формате .xls, а затем программно открываем его через Excel и пересохраняем в новом формате.
Рассмотрим по шагам реализацию этого алгоритма. Обратите внимание на важный нюанс: расширение файла в методе SaveAs должно строго соответствовать переданному числовому коду формата.
Разберем пример кода:
// 1. Сначала сохраняем штатным средством во временный файл XLS
ИмяФайлаXLS = КаталогВременныхФайлов() + "temp_export.xls";
ПечТабл.Записать(ИмяФайлаXLS, "XLS");
// 2. Создаем объект Excel и выполняем конвертацию
Попытка
Эксель = СоздатьОбъект("Excel.Application");
// Отключаем отображение окон и предупреждений, чтобы не мешать пользователю
Эксель.Visible = 0;
Эксель.DisplayAlerts = 0;
Книга = Эксель.WorkBooks.Open(ИмяФайлаXLS);
// Определяем версию Excel для выбора кода формата
// Для XLSX используется код 51 (xlOpenXMLWorkbook)
// Код 56 соответствует старым версиям XLS (97-2003)
// Код 52 используется для файлов с поддержкой макросов (XLSM)
Если Число(Эксель.Version) >= 12 Тогда
// Формат XLSX для Excel 2007 и выше
КодФормата = 51;
ПолноеИмяФайлаXLSX = "C:\Выгрузка_Заказ_123.xlsx";
Книга.SaveAs(ПолноеИмяФайлаXLSX, КодФормата);
Иначе
Сообщить("Версия Excel не поддерживает XLSX!");
КонецЕсли;
Книга.Close();
Эксель.Quit();
Эксель = "";
Сообщить("Файл успешно сохранен: " + ПолноеИмяФайлаXLSX);
Исключение
Сообщить("Ошибка при работе с Excel: " + ОписаниеОшибки());
// Обязательно очищаем объект в случае ошибки
Эксель = "";
КонецПопытки;
Проанализируем ситуацию, когда Excel выдает сообщение: "Формат или расширение файла являются недопустимыми". Это происходит, если вы пытаетесь обмануть систему, просто переименовав расширение файла или указав неверный FileFormatNum.
Многие начинающие разработчики используют код 56. Важно запомнить: код 56 — это формат Excel 97-2003 (.xls). Если вы сохраняете файл с расширением .xlsx, но передаете код 56, структура файла останется старой, и Excel при открытии зафиксирует несоответствие "внутренностей" файла его "обертке" (расширению).
Для корректной работы всегда используйте код 51 для обычных книг XLSX. Также убедитесь, что на компьютере установлен пакет совместимости, если используется очень старая версия Office, хотя в современных реалиях это встречается редко.
Иногда использование Excel.Application невозможно (например, на сервере, где не установлен Office, или из-за низкой скорости работы COM-объекта). В таких случаях на помощь приходят внешние библиотеки, такие как ClosedXML или EPPlus, работающие через обертки для .NET (например, NetObjectTo1C или Elisy .Net Bridge).
Проанализируем важный технический момент из практики: для работы современных библиотек конвертации часто требуется установленный .NET Framework версии 4.6.1 или выше. Если в вашей системе установлена версия 4.0, внешняя компонента может отрабатывать без видимых ошибок, но результирующий файл будет поврежден или не создастся вовсе.
Преимущества этого подхода:
excel.exe в диспетчере задач.Если нам необходимо бесплатное решение для автоматической конвертации, мы можем рассмотреть использование LibreOffice. Он отлично справляется с задачей преобразования форматов через командную строку.
Алгоритм действий следующий: мы так же сохраняем файл в .xls из 1С, а затем вызываем системную команду для конвертации. Выглядит это примерно так:
ИмяФайлаXLS = "C:\temp\report.xls";
ПечТабл.Записать(ИмяФайлаXLS, "XLS");
// Путь к исполняемому файлу LibreOffice
ПутьКLibre = """C:\Program Files\LibreOffice\program\soffice.exe""";
ПараметрыКонвертации = "--headless --convert-to xlsx --outdir ""C:\ReadyReports"" """ + ИмяФайлаXLS + """";
КомандаСистемы(ПутьКLibre + " " + ПараметрыКонвертации);
Параметр --headless позволяет запустить процесс в фоновом режиме без открытия графического интерфейса, что идеально подходит для работы в составе регламентных заданий или при массовой выгрузке отчетов.
Работа с 1С 7.7 и Excel требует аккуратности в управлении ресурсами. Выясним основные правила, которые помогут избежать утечек памяти и блокировок файлов:
SaveAs обязательно вызывайте Эксель.Quit().Эксель = "";), иначе процесс может остаться в памяти до закрытия самой 1С.КаталогВременныхФайлов(), чтобы не замусоривать рабочие каталоги пользователей.Попытка...Исключение, чтобы программа не "вылетала" у пользователей без Office.Подводя итог, можно сказать: несмотря на почтенный возраст 1С 7.7, задача сохранения данных в современные форматы решается достаточно эффективно. Основной секрет успеха заключается в правильном указании числовых констант форматов (51 для XLSX) и обеспечении актуальной версии программного окружения (Excel или .NET Framework).