В процессе разработки часто возникает задача формирования отчетов или выгрузок в формате Excel непосредственно на стороне сервера, например, в модуле объекта обработки или документа. Традиционный метод с использованием COMОбъект("Excel.Application") часто оказывается неприменимым, так как на сервере может быть не установлен пакет Microsoft Office, а использование COM-технологий в серверных сессиях считается плохим тоном из-за проблем с производительностью и стабильностью. Рассмотрим, как решить эту задачу штатными средствами платформы 1С и альтернативными методами.
Если ваша задача ограничивается созданием одного листа, самым надежным и быстрым способом будет использование объекта ТабличныйДокумент. Этот метод полностью автономен и не требует наличия стороннего ПО на сервере. Разберем по шагам, как это реализовать:
ТабличныйДокумент.Записать(), указывая тип файла.Рассмотрим пример кода:
ТабДок = Новый ТабличныйДокумент;
// Здесь логика заполнения документа:
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);
// Сохранение на сервере
ПутьКФайлу = "C:\Temp\Report.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Важно помнить, что современные версии платформы 1С (8.3.10 и выше) отлично справляются с конвертацией в формат XLSX. Если же сервер работает под управлением Linux, этот метод остается единственным «штатным» способом генерации файлов без использования внешних библиотек.
Когда необходимо создать файл, состоящий из нескольких листов (например, по одному листу на каждое подразделение), стандартный ТабличныйДокумент в одиночку не справится. Для этой цели проанализируем возможности объекта ПакетОтображаемыхДокументов. Этот объект позволяет объединить несколько табличных документов в один файл, где каждый документ станет отдельной вкладкой в Excel.
Рассмотрим алгоритм действий:
ПакетОтображаемыхДокументов.ТабличныйДокумент.Состав пакета.Наименование элемента пакета.Пример реализации в модуле объекта:
Пакет = Новый ПакетОтображаемыхДокументов;
// Формируем первый лист
ТабДок1 = Новый ТабличныйДокумент;
ТабДок1.Область("R1C1").Текст = "Данные листа 1";
ЭлементПакета1 = Пакет.Состав.Добавить(ТабДок1);
ЭлементПакета1.Наименование = "Продажи"; // Это имя станет названием закладки в Excel
// Формируем второй лист
ТабДок2 = Новый ТабличныйДокумент;
ТабДок2.Область("R1C1").Текст = "Данные листа 2";
ЭлементПакета2 = Пакет.Состав.Добавить(ТабДок2);
ЭлементПакета2.Наименование = "Остатки";
// Записываем общий файл
Пакет.Записать("C:\Reports\MultiSheet.xlsx", ТипФайлаПакетОтображаемыхДокументов.XLSX);
Важный нюанс: при задании свойства Наименование (Title) следует учитывать ограничения Excel: длина имени листа не должна превышать 31 символ, а также запрещено использовать спецсимволы, такие как ":", "/", "\", "?", "*", "[", "]". Платформа автоматически заменит недопустимые знаки на подчеркивание, но о длине строки лучше позаботиться заранее.
Если требования к файлу выходят за рамки простого вывода данных (например, нужно сформировать файл с жестко заданными типами колонок в понимании СУБД), можно использовать драйверы Microsoft Access Database Engine. Этот метод работает через COMОбъект, но обращается не к приложению Excel, а к системной библиотеке доступа к данным. Это допустимо на сервере Windows, если установлены соответствующие компоненты.
Проанализируем пример создания файла через ADOX.Catalog и вставки данных через SQL-запросы:
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\Data.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=Yes"";";
// Создаем файл и структуру таблицы
Catalog = Новый COMОбъект("ADOX.Catalog");
Catalog.ActiveConnection = СтрокаПодключения;
Table = Новый COMОбъект("ADOX.Table");
Table.Name = "Лист1";
Table.Columns.Append("Артикул");
Table.Columns.Append("Количество");
Catalog.Tables.Append(Table);
Catalog = Неопределено;
// Заполняем данными через SQL
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрокаПодключения);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = "INSERT INTO [Лист1$] (Артикул, Количество) VALUES ('A123', 10)";
Command.Execute();
Connection.Close();
Этот метод более сложен в поддержке, но он позволяет работать с Excel как с базой данных, что иногда удобно для интеграционных задач.
Выясним причины, по которым следует предпочесть тот или иной метод в зависимости от окружения:
ТабличныйДокумент или ПакетОтображаемыхДокументов. COM-объекты и OLEDB там не работают.Недостаточно памяти. В таких случаях рекомендуется разбивать процесс на части или использовать фоновые задания.XLSX (рекомендуется 8.3.12+). В более ранних версиях экспорт в Excel мог работать некорректно (терялись цвета, шрифты или объединения ячеек).Таким образом, мы рассмотрели основные способы создания Excel-файлов на сервере. Оптимальным выбором для большинства задач является ПакетОтображаемыхДокументов, так как он сочетает в себе простоту разработки, поддержку многолистовости и полную независимость от установленного на сервере программного обеспечения.