К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как создать файл Excel в 1С: способы, код и нюансы

Как создать файл Excel в 1С: табличный документ, COM-объект и пакет OpenXML. Примеры кода, выбор способа, частые ошибки и ответы на вопросы.

Выгрузка данных в Excel — одна из самых частых задач при работе с 1С: отчёты для руководства, прайс-листы для клиентов, обмен с контрагентами, которые не используют 1С. Платформа предлагает несколько принципиально разных способов создать файл Excel, и выбор между ними влияет на скорость, требования к серверу и качество результата.

Основных подхода три: сохранение табличного документа в формате XLSX, работа через COM-объект Excel.Application и формирование файла через пакет документов OpenXML. Первый способ самый простой и доступен везде, второй даёт полный контроль над форматированием, но требует установленного Excel, третий работает на сервере без офисного пакета.

Ниже разобран каждый способ с готовым кодом, условиями применения и типичными ошибками. Материал ориентирован на разработчиков и продвинутых пользователей, работающих с управляемыми формами и конфигурациями на платформе 8.3.

Способ 1: сохранение табличного документа в Excel

Табличный документ — встроенный объект платформы, который визуально похож на лист Excel и умеет сохраняться в форматы XLSX, XLS, ODS и другие. Это стандартный путь для выгрузки отчётов и печатных форм: вы формируете табличный документ привычными средствами (макеты, области, СКД), а затем одной строкой сохраняете его в файл.

Минимальный пример кода:

ТабДок = Новый ТабличныйДокумент;

ТабДок.Область("R1C1").Текст = "Номенклатура";

ТабДок.Область("R1C2").Текст = "Цена";

ТабДок.Область("R2C1").Текст = "Товар 1";

ТабДок.Область("R2C2").Текст = 1500;

ТабДок.Записать("C:\Выгрузка\Прайс.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Метод Записать() принимает путь к файлу и тип файла. Для современного формата используйте ТипФайлаТабличногоДокумента.XLSX, для старого формата Excel 97–2003 — XLS. Если файл с таким именем существует, он будет перезаписан без предупреждения, поэтому при пакетной выгрузке формируйте уникальные имена, например с датой и временем.

Главное ограничение способа — форматирование переносится не полностью. Условное форматирование, сводные таблицы, диаграммы и некоторые виды объединённых ячеек в Excel могут выглядеть иначе, чем в 1С. Для простых таблиц с данными, шапкой и числовыми колонками результат вполне достойный.

Способ 2: работа через COM-объект Excel.Application

Если нужен полный контроль над книгой Excel — формулы, автофильтры, закрепление областей, стили ячеек, несколько листов — используется автоматизация через COM. 1С создаёт экземпляр приложения Excel и управляет им как обычный макрос VBA.

Попытка

Excel = Новый COMОбъект("Excel.Application");

Исключение

Сообщить("Excel не установлен: " + ОписаниеОшибки());

Возврат;

КонецПопытки;

Excel.Visible = Ложь;

Книга = Excel.Workbooks.Add();

Лист = Книга.Worksheets(1);

Лист.Cells(1, 1).Value = "Номенклатура";

Лист.Cells(1, 2).Value = "Цена";

Лист.Cells(2, 1).Value = "Товар 1";

Лист.Cells(2, 2).Value = 1500;

Лист.Columns.AutoFit();

Книга.SaveAs("C:\Выгрузка\Прайс.xlsx");

Книга.Close(0);

Excel.Quit();

Excel = Неопределено;

Критическое требование: на компьютере, где выполняется код, должен быть установлен Microsoft Excel. Если код выполняется на сервере 1С, Excel должен стоять именно на сервере, что в корпоративной среде часто запрещено политиками безопасности и лицензирования. Поэтому COM-подход обычно применяют в файловых базах или в процедурах, выполняемых на клиенте.

Обязательно завершайте работу корректно: закройте книгу, вызовите Quit() и обнулите переменную. Иначе в диспетчере задач останутся «висящие» процессы EXCEL.EXE, которые со временем съедают память и блокируют файлы. Особенно это актуально при ошибках в середине кода — оборачивайте работу с Excel в Попытка/Исключение с гарантированным завершением.

Способ 3: пакет OpenXML без установленного Excel

Формат XLSX — это ZIP-архив с XML-файлами внутри. Платформа 1С умеет работать с такими пакетами через объект ПакетОтображаемогоДокумента и низкоуровневую запись ZIP, что позволяет создать файл Excel на сервере без установленного Office. Это правильный выбор для регламентных заданий и серверных выгрузок.

Технически способ сложнее: нужно сформировать структуру пакета — workbook.xml, листы, таблицу строк sharedStrings, стили. Ошибка в любом XML делает файл нечитаемым для Excel. На практике чаще используют готовые библиотеки и подсистемы (например, механизмы обмена из типовых конфигураций), либо комбинированный подход: табличный документ сохраняется в XLSX на сервере, что тоже не требует Excel.

Важно понимать: сохранение табличного документа в XLSX из первого способа на сервере тоже работает без установленного Office. Поэтому чистый OpenXML имеет смысл только тогда, когда нужны возможности, которых нет у табличного документа, — например, потоковая запись очень больших файлов с минимальным потреблением памяти.

Сравнение способов

Табличный документ + Записать()

Подходит для большинства выгрузок: простой код, работает на сервере без Office. Ограничение — неполное сохранение сложного форматирования.

COM-объект Excel.Application

Полный контроль: формулы, фильтры, стили, несколько листов. Требует установленный Excel там, где выполняется код, и аккуратного завершения процесса.

Пакет OpenXML

Серверная генерация без Office, контроль над структурой файла. Сложная реализация, высокая цена ошибки в XML.

Как выбрать способ под свою задачу

Выбор определяется тремя вопросами: где выполняется код (клиент или сервер), установлен ли Excel и насколько сложное форматирование нужно в итоговом файле. Для типовой выгрузки «таблица с данными» ответ почти всегда один — табличный документ.

Если файл должен содержать формулы Excel, которые пересчитываются при открытии, выпадающие списки или защищённые листы — без COM или OpenXML не обойтись. Если выгрузка выполняется регламентным заданием ночью на сервере, COM-вариант отпадает сразу.

Маршрут решения

Как выбрать действие

Нужна простая таблица с данными, код может выполняться на сервереИспользуйте табличный документ и метод Записать() с типом XLSX
Нужны формулы, автофильтры, несколько листов и есть установленный ExcelИспользуйте COM-объект Excel.Application с обязательным Quit() в конце
Выгрузка идёт регламентным заданием на сервере без Office и нужен большой файлФормируйте табличный документ порциями или используйте пакет OpenXML
Файл создаёт пользователь кнопкой в формеСохраните табличный документ во временное хранилище и предложите диалог сохранения на клиенте

Пошаговый сценарий: выгрузка данных из справочника

Типовая задача — выгрузить список номенклатуры с ценами в Excel по кнопке. Порядок действий одинаков для большинства подобных выгрузок.

Порядок действий
  1. 1
    Создайте новый объект ТабличныйДокумент и при необходимости подготовьте макет с областями шапки и строки
  2. 2
    Выполните запрос к данным (справочник, регистр) и обойдите выборку, заполняя области табличного документа
  3. 3
    Настройте ширину колонок, шрифт шапки и формат числовых ячеек через свойства областей
  4. 4
    Вызовите Записать() с типом файла XLSX — на сервере во временный файл, на клиенте — сразу в выбранный каталог
  5. 5
    Передайте файл пользователю через диалог сохранения или ПолучитьФайл() из временного хранилища
  6. 6
    Откройте полученный файл в Excel и проверьте данные, форматы чисел и кодировку текста

Пример заполнения по выборке из запроса:

Запрос = Новый Запрос("ВЫБРАТЬ Наименование, Цена ИЗ Справочник.Номенклатура");

Выборка = Запрос.Выполнить().Выбрать();

ТабДок = Новый ТабличныйДокумент;

ТабДок.Область("R1C1").Текст = "Номенклатура";

ТабДок.Область("R1C2").Текст = "Цена";

Строка = 2;

Пока Выборка.Следующий() Цикл

ТабДок.Область("R" + Строка + "C1").Текст = Выборка.Наименование;

ТабДок.Область("R" + Строка + "C2").Текст = Выборка.Цена;

Строка = Строка + 1;

КонецЦикла;

Если в выгрузке есть числа, которые Excel должен считать числами (суммы, количества), записывайте их в область как число, а не как строку. Иначе в Excel они попадут как текст, и пользователь не сможет строить по ним формулы без преобразования.
ПЗ
Практическое замечание

Частые ошибки и ограничения

Большинство проблем при создании Excel-файлов в 1С связаны не с самим кодом, а с окружением: правами на каталог, разрядностью, занятым файлом. Ниже — то, что встречается чаще всего.

Типичные ошибки
01
Запись в каталог без прав — метод Записать() падает с ошибкой доступа; используйте КаталогВременныхФайлов() или проверяйте права заранее
02
Файл открыт в Excel у пользователя — перезапись невозможна; добавляйте дату-время в имя файла или перехватывайте ошибку с понятным сообщением
03
COM-код на 64-разрядном сервере без 64-разрядного Excel — COMОбъект не создаётся; переносите выгрузку на клиент или заменяйте способ
04
Числа и даты записаны строками — в Excel ломаются сортировка и формулы; присваивайте значения в исходном типе
05
Не вызван Excel.Quit() — накапливаются процессы EXCEL.EXE и утечка памяти; завершайте приложение в блоке Исключение тоже
06
Кириллица в путях и именах при работе через внешние компоненты — часть старых библиотек некорректно обрабатывает Unicode; проверяйте на тестовом файле

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

Проверка результата

После формирования файла не ограничивайтесь отсутствием ошибок в коде — откройте файл в Excel и проверьте содержимое глазами. Автоматическая проверка в 1С тоже возможна: файл можно перечитать через ТабличныйДокумент.Прочитать() и сверить количество строк.

Контрольные точки

Как проверить результат

Файл открывается в Excel
Норма

Открывается без предупреждений о повреждении

Тревожный признак

Excel сообщает о нечитаемом содержимом или предлагает восстановление

Количество строк
Норма

Совпадает с количеством записей в выборке плюс шапка

Тревожный признак

Строк меньше — обрыв цикла, больше — лишние итоговые области

Числовые колонки
Норма

Числа выравнены вправо, по ним работает сумма в строке состояния

Тревожный признак

Числа выровнены влево и помечены как текст

Кириллица и спецсимволы
Норма

Текст отображается корректно

Тревожный признак

Кракозябры или потерянные символы — проблема кодировки

Частые вопросы

Можно ли создать файл Excel в 1С без установленного Microsoft Office?

Да. Сохранение табличного документа в формат XLSX выполняется средствами платформы и не требует Office ни на клиенте, ни на сервере. Без Excel не работает только способ через COM-объект Excel.Application.

Как добавить в файл несколько листов?

Через табличный документ штатно сохраняется один лист. Для нескольких листов используйте COM-автоматизацию (Workbook.Worksheets.Add) или формирование пакета OpenXML. Обходной вариант — сохранить несколько отдельных файлов и объединить их макросом на стороне Excel.

Почему Excel открывает файл с предупреждением о несоответствии формата?

Чаще всего файл сохранён с расширением XLS, хотя фактически записан в другом формате, или наоборот. Убедитесь, что расширение имени файла соответствует переданному значению ТипФайлаТабличногоДокумента: XLSX для XLSX, XLS для старого формата.

Как выгрузить данные в Excel из регламентного задания на сервере?

Формируйте табличный документ в серверной процедуре, сохраняйте его методом Записать() в сетевой каталог или во временное хранилище с последующей записью в нужное место. COM-объект в регламентных заданиях не используйте — на сервере Excel обычно не установлен и не должен быть.

Что делать, если выгрузка большого отчёта занимает много времени?

Основные затраты — построчное обращение к областям табличного документа. Ускорить можно выводом через макет с областью-строкой вместо адресации R1C1, отключением перерисовки и разбиением выгрузки на части. Для очень больших объёмов рассмотрите CSV — он открывается в Excel и формируется на порядок быстрее.

Можно ли создать файл старого формата XLS для совместимости?

Да, передайте в метод Записать() значение ТипФайлаТабличногоДокумента.XLS. Учитывайте ограничение старого формата — около 65 тысяч строк на лист. Если данных может быть больше, используйте XLSX.

Итог

Что важно запомнить

Для большинства задач достаточно табличного документа и метода Записать() с типом XLSX — это работает везде и не требует Office. COM-объект нужен для сложного форматирования, но требует установленный Excel и аккуратного завершения процесса. Всегда проверяйте готовый файл: типы чисел, количество строк и открытие без предупреждений.