Автоматизация · 9 мин
Как добавить лист в Excel из 1С
Как программно добавить лист в Excel из 1С через COM-объект, сохранить табличный документ в несколько листов и выгрузить данные без установленного Excel.
Задача добавить лист в Excel из 1С возникает при выгрузке отчётов, обмене данными с контрагентами и формировании многостраничных файлов для аналитики. В зависимости от ситуации применяются три подхода: работа через COM-объект Excel.Application, сохранение табличного документа в формате XLSX с несколькими страницами и формирование файла без установленного Excel через пакетную структуру Open XML.
Выбор способа зависит от того, где выполняется код — на клиенте или на сервере, установлен ли Microsoft Excel, и нужно ли просто дописать лист в существующий файл или создать книгу с нуля. Ниже разобраны рабочие варианты с готовыми фрагментами кода на встроенном языке 1С.
Какой способ выбрать: сравнение подходов
Прежде чем писать код, определите условия выполнения. COM-автоматизация требует установленного Excel и работает только под Windows, зато даёт полный контроль над книгой: листы, формулы, форматирование, диаграммы. Сохранение табличного документа не требует Excel, но ограничено возможностями табличного документа 1С.
Сравнение вариантов
Полный доступ к книге, добавление листов в существующий файл. Требует установленный Excel, работает только на Windows-клиенте или сервере с Excel.
Несколько табличных документов сохраняются как листы одного XLSX. Excel не нужен, работает на сервере и в Linux. Нельзя дописать лист в готовый файл.
Построчная вставка данных в лист как в таблицу. Подходит для больших выгрузок, но нет форматирования.
Для разовой выгрузки на рабочем месте бухгалтера обычно достаточно COM-объекта. Для регламентных заданий на сервере, где Excel не установлен, используйте пакет отображаемых документов — это штатный механизм платформы.
Добавление листа через COM-объект Excel.Application
Это классический способ, когда Excel установлен на компьютере, где выполняется код. Основные шаги: создать COM-объект, открыть или создать книгу, добавить лист методом Sheets.Add(), заполнить данными и сохранить.
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open("C:\Отчеты\Выгрузка.xlsx");
// Добавить лист в конец книги
НовыйЛист = Книга.Sheets.Add(, Книга.Sheets(Книга.Sheets.Count));
НовыйЛист.Name = "Продажи";
НовыйЛист.Cells(1, 1).Value = "Номенклатура";
НовыйЛист.Cells(1, 2).Value = "Сумма";
Книга.Save();
Книга.Close();
Excel.Quit();Обратите внимание на параметры метода Add: первый аргумент — лист, перед которым вставить новый, второй — лист, после которого вставить. Чтобы добавить лист в конец, укажите вторым параметром последний существующий лист. Если вызвать Sheets.Add() без параметров, лист вставится перед активным.
Имя листа задаётся свойством Name. Учитывайте ограничения Excel: имя не длиннее 31 символа и не должно содержать символы \ / ? * [ ] :. При нарушении Excel выдаст ошибку, и код прервётся.
Добавление листа в существующий файл без потери данных
Частая задача — дописать лист в уже существующую книгу, не затрагивая остальные. Для этого файл открывается методом Workbooks.Open() с полным путём, а не создаётся заново через Workbooks.Add().
- 1Проверьте существование файла через объект Файл или НайтиФайлы
- 2Откройте книгу: Excel.Workbooks.Open(ПутьКФайлу)
- 3Проверьте, нет ли листа с таким именем — переберите Книга.Sheets и сравните Name
- 4Добавьте лист: Книга.Sheets.Add(, Книга.Sheets(Книга.Sheets.Count))
- 5Заполните данными и сохраните: Книга.Save()
- 6Закройте книгу и завершите Excel: Close() и Quit()
Если лист с таким именем уже существует, метод Add не вызовет ошибку — Excel просто создаст лист, а присвоение Name завершится неудачей. Поэтому перед добавлением проверяйте дубликаты перебором коллекции Sheets или удаляйте старый лист методом Delete(), предварительно отключив предупреждения через Excel.DisplayAlerts = Ложь.
Несколько листов через пакет отображаемых документов (без Excel)
На сервере 1С Excel обычно не установлен, и COM-подход не работает. Платформа предлагает штатную альтернативу: объект ПакетОтображаемыхДокументов сохраняет несколько табличных документов в один файл XLSX, где каждый документ становится отдельным листом.
Пакет = Новый ПакетОтображаемыхДокументов;
Элемент = Пакет.Состав.Добавить();
Элемент.Данные = ПоместитьВоВременноеХранилище(ТабДокПродажи);
Элемент.Наименование = "Продажи";
Элемент = Пакет.Состав.Добавить();
Элемент.Данные = ПоместитьВоВременноеХранилище(ТабДокЗакупки);
Элемент.Наименование = "Закупки";
Пакет.Записать("C:\Отчеты\Сводный.xlsx", ТипФайлаПакетаОтображаемыхДокументов.XLSX);Наименование элемента пакета становится именем листа в файле. Способ работает на любой операционной системе, не требует Excel и подходит для регламентных заданий и фоновой выгрузки. Ограничение: нельзя дописать лист в уже существующий файл — пакет всегда создаёт новую книгу.
Заполнение нового листа данными из запроса
После добавления листа данные обычно выгружают из результата запроса. Самый производительный приём при работе через COM — не писать в ячейки по одной в цикле, а присваивать диапазону массив значений, однако из 1С напрямую это неудобно, поэтому на практике чаще используют построчную запись с отключённым обновлением экрана.
Установите Excel.ScreenUpdating = Ложь перед циклом выгрузки и верните Истина после — это заметно ускоряет заполнение больших таблиц. Для очень больших выборок (десятки тысяч строк) COM-выгрузка становится медленной; в этом случае надёжнее сформировать табличный документ и сохранить его в XLSX штатным методом ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX).
Проверка результата и контроль ошибок
После выполнения кода убедитесь, что лист действительно добавлен и данные на месте. Программно это делается перебором коллекции листов и проверкой количества заполненных строк через свойство UsedRange.
Как проверить результат
Перебор Книга.Sheets находит лист с нужным именем
Лист отсутствует или называется 'Лист1' — присвоение Name не сработало
UsedRange.Rows.Count соответствует ожидаемому числу строк
Количество строк равно 1 — записана только шапка, цикл выгрузки не выполнился
Файл открывается в Excel, дата изменения обновилась
Файл заблокирован или старая дата — Save() не выполнился из-за ошибки
Дополнительно проверьте диспетчер задач после массовых выгрузок: не должно оставаться процессов EXCEL.EXE, запущенных из-под 1С. Их наличие — признак того, что где-то в коде не вызывается Quit().
Часто задаваемые вопросы
Можно ли добавить лист в Excel из 1С, если Excel не установлен?
Да. Используйте пакет отображаемых документов — он сохраняет несколько табличных документов как листы одного файла XLSX без участия Excel. Ограничение: нельзя дописать лист в уже существующий файл, создаётся новая книга.
Как добавить лист не в конец, а в начало книги?
Вызовите Книга.Sheets.Add(Книга.Sheets(1)) — первым параметром передаётся лист, перед которым будет вставлен новый. Либо после добавления переместите лист методом НовыйЛист.Move(Книга.Sheets(1)).
Почему возникает ошибка «Ошибка при вызове конструктора (COMОбъект)»?
Чаще всего Excel не установлен на компьютере, где выполняется код, либо код выполняется на сервере 1С под Linux. Также возможны проблемы с разрядностью: 64-разрядный сервер 1С и 32-разрядный Excel могут конфликтовать. Решение — перенести выгрузку на клиента или использовать пакет отображаемых документов.
Как удалить лист из книги через 1С?
Отключите предупреждения (Excel.DisplayAlerts = Ложь), затем вызовите Книга.Sheets("ИмяЛиста").Delete(). Помните, что удаление необратимо — перед удалением убедитесь, что лист не содержит нужных данных.
Как скопировать лист из одной книги в другую?
Откройте обе книги в одном экземпляре Excel и вызовите Книга1.Sheets("Лист").Copy(, Книга2.Sheets(Книга2.Sheets.Count)) — лист будет скопирован в конец второй книги вместе с форматированием и формулами.
Выгрузка большого отчёта через COM занимает очень много времени. Что делать?
Отключите обновление экрана (ScreenUpdating = Ложь) и автопересчёт формул. Если это не помогает, откажитесь от COM: сформируйте табличный документ и сохраните его методом Записать() в формат XLSX — это в разы быстрее на больших объёмах.
Что важно запомнить
На клиенте с установленным Excel добавляйте лист через COM-объект методом Sheets.Add(), не забывая про Quit() в блоке исключения. На сервере без Excel используйте пакет отображаемых документов — он сохраняет несколько табличных документов как листы одного XLSX. Проверяйте длину и символы имени листа, а после выгрузки — отсутствие зависших процессов Excel.