Как программно создать многолистовой Excel-файл в модуле объекта 1С на сервере?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача формирования отчетов или выгрузок в формате Excel непосредственно на стороне сервера, например, в модуле объекта обработки или документа. Традиционный метод с использованием COMОбъект("Excel.Application") часто оказывается неприменимым, так как на сервере может быть не установлен пакет Microsoft Office, а использование COM-технологий в серверных сессиях считается плохим тоном из-за проблем с производительностью и стабильностью. Рассмотрим, как решить эту задачу штатными средствами платформы 1С и альтернативными методами.

Метод 1. Использование Табличного документа для простых файлов

Если ваша задача ограничивается созданием одного листа, самым надежным и быстрым способом будет использование объекта ТабличныйДокумент. Этот метод полностью автономен и не требует наличия стороннего ПО на сервере. Разберем по шагам, как это реализовать:

  1. Создаем экземпляр объекта ТабличныйДокумент.
  2. Заполняем его данными (используя области и параметры).
  3. Вызываем метод Записать(), указывая тип файла.

Рассмотрим пример кода:


ТабДок = Новый ТабличныйДокумент;
// Здесь логика заполнения документа:
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);

// Сохранение на сервере
ПутьКФайлу = "C:\Temp\Report.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Важно помнить, что современные версии платформы 1С (8.3.10 и выше) отлично справляются с конвертацией в формат XLSX. Если же сервер работает под управлением Linux, этот метод остается единственным «штатным» способом генерации файлов без использования внешних библиотек.

Метод 2. Создание многолистового Excel-файла через ПакетОтображаемыхДокументов

Когда необходимо создать файл, состоящий из нескольких листов (например, по одному листу на каждое подразделение), стандартный ТабличныйДокумент в одиночку не справится. Для этой цели проанализируем возможности объекта ПакетОтображаемыхДокументов. Этот объект позволяет объединить несколько табличных документов в один файл, где каждый документ станет отдельной вкладкой в Excel.

Рассмотрим алгоритм действий:

  1. Создаем основной объект ПакетОтображаемыхДокументов.
  2. Для каждого будущего листа создаем отдельный ТабличныйДокумент.
  3. Добавляем каждый табличный документ в коллекцию Состав пакета.
  4. Устанавливаем имена листов через свойство Наименование элемента пакета.
  5. Сохраняем пакет.

Пример реализации в модуле объекта:


Пакет = Новый ПакетОтображаемыхДокументов;

// Формируем первый лист
ТабДок1 = Новый ТабличныйДокумент;
ТабДок1.Область("R1C1").Текст = "Данные листа 1";
ЭлементПакета1 = Пакет.Состав.Добавить(ТабДок1);
ЭлементПакета1.Наименование = "Продажи"; // Это имя станет названием закладки в Excel

// Формируем второй лист
ТабДок2 = Новый ТабличныйДокумент;
ТабДок2.Область("R1C1").Текст = "Данные листа 2";
ЭлементПакета2 = Пакет.Состав.Добавить(ТабДок2);
ЭлементПакета2.Наименование = "Остатки";

// Записываем общий файл
Пакет.Записать("C:\Reports\MultiSheet.xlsx", ТипФайлаПакетОтображаемыхДокументов.XLSX);

Важный нюанс: при задании свойства Наименование (Title) следует учитывать ограничения Excel: длина имени листа не должна превышать 31 символ, а также запрещено использовать спецсимволы, такие как ":", "/", "\", "?", "*", "[", "]". Платформа автоматически заменит недопустимые знаки на подчеркивание, но о длине строки лучше позаботиться заранее.

Метод 3. Использование драйверов OLEDB (ADO) без установки Excel

Если требования к файлу выходят за рамки простого вывода данных (например, нужно сформировать файл с жестко заданными типами колонок в понимании СУБД), можно использовать драйверы 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 как с базой данных, что иногда удобно для интеграционных задач.

Рекомендации по работе на сервере

Выясним причины, по которым следует предпочесть тот или иной метод в зависимости от окружения:

Таким образом, мы рассмотрели основные способы создания Excel-файлов на сервере. Оптимальным выбором для большинства задач является ПакетОтображаемыхДокументов, так как он сочетает в себе простоту разработки, поддержку многолистовости и полную независимость от установленного на сервере программного обеспечения.

← На главную