При выгрузке отчетов и различных печатных форм из платформы 1С:Предприятие в формат Excel разработчики часто сталкиваются с одной неприятной особенностью: стандартный метод Записать() объекта ТабличныйДокумент сохраняет данные на лист со стандартным системным именем (например, «Лист1» или «Sheet1»). Изменить это имя напрямую через свойства самого табличного документа невозможно. Однако на практике пользователям крайне важно видеть понятные и структурированные названия вкладок, особенно если в один файл выгружается несколько разных отчетов.
В этой статье мы подробно рассмотрим все существующие способы решения этой задачи. Мы разберем как современные кроссплатформенные механизмы платформы 1С, так и альтернативные варианты, включая работу через COM-объекты, ADOX и прямое манипулирование XML-структурой файла.
Начиная с современных версий платформы 1С:Предприятие 8.3, разработчикам доступен штатный, быстрый и чрезвычайно удобный механизм — объект ПакетОтображаемыхДокументов. Главное преимущество этого метода заключается в том, что он является кроссплатформенным. Код будет одинаково успешно выполняться как на операционной системе Windows, так и под управлением Linux, не требуя установки пакета Microsoft Office на сервере или на компьютере пользователя.
Давайте разберем по шагам, как реализовать этот алгоритм в коде:
ПакетОтображаемыхДокументов.Состав нашего пакета.ТабличныйДокумент во временное хранилище и свяжем его с созданным элементом пакета.Наименование.Рассмотрим практический пример кода на встроенном языке 1С:
// 1. Инициализируем пакет отображаемых документов
Пакет = Новый ПакетОтображаемыхДокументов;
// 2. Добавляем новый элемент в состав пакета
ЭлементПакета = Пакет.Состав.Добавить();
// 3. Помещаем табличный документ во временное хранилище
// Это обязательное условие для корректного связывания данных с пакетом
АдресХранилища = ПоместитьВоВременноеХранилище(ТабличныйДокумент, Новый УникальныйИдентификатор);
ЭлементПакета.Данные = АдресХранилища;
// 4. Задаем имя будущего листа Excel
// Именно это свойство отвечает за наименование вкладки в книге Excel
ЭлементПакета.Наименование = "Продажи_За_Месяц";
// 5. Записываем сформированный пакет в файл XLSX
ПутьКФайлу = "C:\Reports\Отчет_По_Продажам.xlsx";
Пакет.Записать(ПутьКФайлу, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
Этот метод идеально подходит не только для одиночных файлов, но и для создания многостраничных книг Excel. Если нам требуется выгрузить несколько разных отчетов на отдельные вкладки в один файл, мы просто добавляем необходимое количество элементов в состав пакета, указывая для каждого свой собственный ТабличныйДокумент и уникальное значение свойства Наименование.
Перед тем как передавать строку в свойство Наименование, крайне важно выполнить предварительную подготовку текста. Дело в том, что Microsoft Excel накладывает жесткие ограничения на имена листов. Если их проигнорировать, система вызовет критическую ошибку во время сохранения либо результирующий файл окажется поврежденным. Проанализируем эти правила:
\, /, ?, *, :, [, ]. Их необходимо программно удалять или заменять на пробелы.Давайте напишем вспомогательную функцию, которую можно использовать в общем модуле для очистки потенциально некорректных имен перед их использованием:
Функция ПодготовитьИмяЛистаExcel(ИсходноеИмя) Экспорт
// Удаляем или заменяем запрещенные символы
ЗапрещенныеСимволы = "\/?*:[]";
Результат = ИсходноеИмя;
Для Индекс = 1 По СтрДлина(ЗапрещенныеСимволы) Цикл
СимволЗамены = Сред(ЗапрещенныеСимволы, Индекс, 1);
Результат = СтрЗаменить(Результат, СимволЗамены, " ");
КонецЦикла;
// Ограничиваем длину до 31 символа
Если СтрДлина(Результат) > 31 Тогда
Результат = Лев(Результат, 31);
КонецЕсли;
// Убираем лишние пробелы по краям
Результат = СокрЛП(Результат);
// Если имя оказалось пустым, задаем дефолтное значение
Если ПустаяСтрока(Результат) Тогда
Результат = "Лист_Отчета";
КонецЕсли;
Возврат Результат;
КонецФункции
Этот метод относится к классическим и применяется преимущественно в тех случаях, когда разработка ведется строго в среде Windows, на компьютерах пользователей гарантированно установлен Microsoft Excel, и требуется выполнить сложные манипуляции с файлом (например, настроить условное форматирование, защитить листы паролями или построить сложные графики).
Давайте выясним принцип работы данного метода: сначала мы стандартным образом сохраняем наш табличный документ во временный XLSX-файл, а затем открываем его через COM-объект Excel для переименования первой вкладки.
Посмотрим на пример реализации данного алгоритма:
// Шаг 1. Сохраняем исходный документ во временный файл
ВременныйПуть = ПолучитьИмяВременногоФайла("xlsx");
ТабличныйДокумент.Записать(ВременныйПуть, ТипФайлаТабличногоДокумента.XLSX);
// Шаг 2. Подключаемся к Excel через COM
Попытка
ExcelApp = Новый COMОбъект("Excel.Application");
ExcelApp.DisplayAlerts = Ложь; // Отключаем диалоговые окна предупреждений
// Открываем сохраненную книгу
Книга = ExcelApp.Workbooks.Open(ВременныйПуть);
// Обращаемся к первому листу и переименовываем его
Если Книга.Sheets.Count > 0 Тогда
ИмяЛиста = ПодготовитьИмяЛистаExcel("Январь 2024");
Книга.Sheets(1).Name = ИмяЛиста;
КонецЕсли;
// Сохраняем книгу под постоянным именем и закрываем приложение
ИтоговыйПуть = "C:\Reports\Готовый_Отчет.xlsx";
Книга.SaveAs(ИтоговыйПуть);
Книга.Close();
ExcelApp.Quit();
Исключение
// В случае ошибки обязательно закрываем процесс Excel, чтобы избежать утечки памяти в системе
Если НЕ ExcelApp = Неопределено Тогда
ExcelApp.Quit();
КонецЕсли;
ВызватьИсключение "Не удалось переименовать лист через COM: " + ОписаниеОшибки();
КонецПопытки;
Важное примечание: Использование COM-объектов имеет ряд существенных недостатков. Во-первых, этот метод работает достаточно медленно и требует значительных ресурсов процессора. Во-вторых, он абсолютно несовместим с серверами под управлением операционных систем Linux. Наконец, при аварийном завершении работы сессий процессы EXCEL.EXE могут оставаться "зависшими" в памяти сервера, что со временем существенно снизит общую производительность системы.
Этот метод упоминался в качестве одного из возможных обходных путей на специализированных форумах разработчиков. Библиотека ADOX позволяет работать с файлами Excel как с полноценными реляционными базами данных, где листы книги воспринимаются системой как таблицы схемы данных.
Преимущество этого подхода перед классическим COM-соединением заключается в том, что для его работы не требуется установленный пакет Microsoft Office. Однако на компьютере (или сервере) должны присутствовать системные драйверы баз данных (например, Microsoft Access Database Engine). Кроме того, сам синтаксис работы с ADOX достаточно сложен для написания, отладки и последующей поддержки.
На сегодняшний день, с появлением полноценной поддержки работы с XLSX в платформе 1С через встроенные пакеты отображаемых документов, метод ADOX практически полностью утратил свою актуальность и считается устаревшим. Его применение целесообразно лишь в редких случаях поддержки унаследованного кода на старых версиях платформ 1С (таких как 1С 7.7 или ранние редакции 8.2).
Для высоконагруженных серверных решений, где критически важна максимальная скорость работы и отсутствует техническая возможность использования COM, существует продвинутый метод прямой модификации файлов формата OpenXML. Как известно, современный файл с расширением .xlsx физически представляет собой обычный ZIP-архив, содержащий внутри себя набор структурированных XML-файлов.
Давайте проанализируем схему реализации данного подхода:
.xlsx обычным методом Записать().ЧтениеZipФайла, распаковываем полученный файл во временный рабочий каталог.xl/workbook.xml. Именно этот файл отвечает за метаданные книги и общую структуру ее листов.ЧтениеXML и ЗаписьXML или просто считывая его содержимое как строку) и находим тег <sheet>, у которого атрибут name равен исходному системному значению (например, "Лист1").ЗаписьZipФайла запаковываем все файлы из временной папки обратно в единый архив с расширением .xlsx.Этот способ демонстрирует высочайшую скорость обработки файлов любого объема, однако он требует от разработчика максимальной аккуратности при парсинге XML-файлов, чтобы случайно не нарушить целостность внутренней структуры структуры метаданных документа Microsoft Excel.
Мы подробно изучили различные практические подходы к изменению имени листа при выгрузке отчетов. Подводя итог, можно дать следующие рекомендации: