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

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

Как программно выгрузить таблицу из 1С в Excel

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

Программная выгрузка таблицы из 1С в Excel — типовая задача при автоматизации обмена данными: менеджеры просят прайс в «икселе», бухгалтерия — реестр платежей, а руководство — отчёт, который открывается без установленной 1С. Встроенный язык платформы даёт несколько способов решить эту задачу, и выбор зависит от того, где выполняется код (клиент или сервер), установлен ли на машине Microsoft Excel и какой объём данных нужно выгрузить.

Самый универсальный путь — сформировать табличный документ (объект ТабличныйДокумент) и сохранить его методом Записать() с типом файла XLSX. Этот способ не требует установленного Excel, работает на сервере и подходит для большинства отчётов. Альтернатива — обращение к Excel через COM-объект Excel.Application, что даёт полный контроль над форматированием, но работает только там, где установлен офисный пакет, и заметно медленнее на больших объёмах.

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

Какие способы выгрузки существуют и когда какой выбирать

В платформе 1С:Предприятие 8.3 фактически три рабочих метода программной выгрузки табличных данных в формат Excel. Первый — сохранение табличного документа через Записать() в формат XLSX или XLS (MXL тоже открывается Excel, но это внутренний формат 1С, а не «настоящий» эксель-файл). Второй — построчная запись через COM-объект Excel.Application. Третий — формирование файла через пакетный документ (объект ПакетОтображаемыхДокументов) либо выгрузку в CSV с последующим открытием в Excel, что подходит для очень больших объёмов.

Критерии выбора простые. Если код выполняется на сервере или Excel на компьютере отсутствует — только табличный документ. Если нужны формулы Excel, закрепление областей, автофильтры и фирменное оформление ячеек — COM-объект, но будьте готовы к тому, что выгрузка 50 тысяч строк займёт минуты. Если данных сотни тысяч строк и форматирование не важно — CSV через объект ТекстовыйДокумент будет на порядок быстрее.

Сравнение вариантов

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

Не требует Excel, работает на сервере, быстро. Ограничение: нет формул Excel и сложных стилей, только то, что умеет табличный документ.

COM-объект Excel.Application

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

CSV через ТекстовыйДокумент

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

Выгрузка табличного документа в XLSX: основной метод

Ключевой объект — ТабличныйДокумент. Его можно заполнить вручную через области, построить по макету с помощью построителя отчёта или получить из СКД (схемы компоновки данных). После заполнения достаточно одной строки: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);. Платформа сама сформирует корректный xlsx-файл, который откроется в Excel, LibreOffice и Google Таблицах.

Пример простейшей выгрузки таблицы значений в файл:

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

// Заголовки колонок

НомерКолонки = 1;

Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл

Область = ТабДок.Область(1, НомерКолонки);

Область.Текст = Строка(Колонка.Имя);

Область.Шрифт = Новый Шрифт(,, Истина); // жирный

НомерКолонки = НомерКолонки + 1;

КонецЦикла;

// Данные

НомерСтроки = 2;

Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл

НомерКолонки = 1;

Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл

ТабДок.Область(НомерСтроки, НомерКолонки).Текст =

Строка(СтрокаТЗ[Колонка.Имя]);

НомерКолонки = НомерКолонки + 1;

КонецЦикла;

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

ТабДок.Записать("C:\Temp\Выгрузка.xlsx",

ТипФайлаТабличногоДокумента.XLSX);

Обратите внимание на два момента. Во-первых, значения лучше выводить в том типе, в котором они хранятся: если присвоить области число через Область.Значение (в макетах) или выводить через СКД, Excel получит числовой формат и сможет считать суммы. Преобразование всего подряд в строку — частая причина жалоб «Excel не считает итог». Во-вторых, путь к файлу на сервере — это путь на сервере 1С, а не на компьютере пользователя; если код выполняется на сервере, файл нужно передать клиенту через временное хранилище.

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

Передача файла с сервера на клиент

В тонком и веб-клиенте файловая операция Записать() на клиенте часто недоступна или нежелательна, поэтому типовая схема такая: серверная процедура формирует табличный документ, записывает его во временный файл и кладёт двоичные данные во временное хранилище; клиентская процедура забирает данные и сохраняет файл через диалог сохранения.

// Серверная функция

Функция СформироватьФайлНаСервере()

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

// ... заполнение табличного документа ...

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");

ТабДок.Записать(ИмяВременногоФайла,

ТипФайлаТабличногоДокумента.XLSX);

ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);

Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные,

Новый УникальныйИдентификатор);

УдалитьФайлы(ИмяВременногоФайла);

Возврат Адрес;

КонецФункции

На клиенте остаётся вызвать ПолучитьФайл(Адрес, "Отчёт.xlsx", Истина) или асинхронный аналог НачатьПолучениеФайлов — пользователь увидит стандартный диалог сохранения. Не забывайте удалять временные файлы на сервере: при массовой выгрузке они забивают каталог временных файлов и могут привести к переполнению диска.

Выгрузка через COM-объект Excel.Application

Когда требуется «живой» Excel-файл с формулами, автофильтром, закреплённой шапкой и корпоративным оформлением, используют прямое обращение к приложению Excel. Метод доступен только на машине с установленным Microsoft Office и только в контексте, где разрешены COM-объекты (обычно толстый или тонкий клиент на Windows, либо сервер под Windows с установленным Office).

Попытка

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

Исключение

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

Возврат;

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

Excel.Visible = Ложь; // не показывать окно

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

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

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

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

НомерСтроки = 2;

Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл

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

Лист.Cells(НомерСтроки, 2).Value = СтрокаТЗ.Цена;

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

Лист.Range("A1:B1").Font.Bold = Истина;

Лист.Columns.AutoFit();

Книга.SaveAs("C:\Temp\Прайс.xlsx");

Книга.Close(Ложь);

Excel.Quit();

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

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

Выгрузка результата запроса и СКД-отчёта

Часто исходником служит не таблица значений, а запрос. Результат запроса удобно выгружать через построитель отчёта: он сам формирует табличный документ с заголовками колонок. Достаточно установить текст запроса, выполнить построитель и вывести результат в табличный документ, после чего записать его в XLSX.

Для отчётов на СКД всё ещё проще: программно выполните компоновку через КомпоновщикМакетаКомпоновкиДанных и ПроцессорКомпоновкиДанных, выведите результат в табличный документ и сохраните. Так вы получите в Excel ровно тот вид, который пользователь видит на экране, включая группировки и итоги. Учтите, что группировки СКД в XLSX переносятся как статичные строки — сворачивать их в Excel будет нельзя.

Если выгрузка делается «для людей», добавьте в табличный документ автоширину колонок через свойство области или заранее задайте ширину в макете. Файл, в котором все колонки сжаты и текст обрезан, пользователи воспринимают как сломанный, хотя данные в нём корректны.
ПЗ
Практическое замечание

Большие объёмы: CSV как альтернатива

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

Тонкости CSV: разделитель «точка с запятой» корректно распознаётся русской локалью Excel, а запятая — нет; файл лучше сохранять в UTF-8 с BOM, иначе кириллица при открытии двойным щелчком может отобразиться кракозябрами. Числа с дробной частью и даты приведите к единому формату заранее — Excel будет парсить их по региональным настройкам конкретного компьютера.

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

Проверка результата и контроль качества выгрузки

После выгрузки откройте файл и сверьте три вещи: количество строк данных (должно совпадать с количеством строк источника плюс шапка), типы колонок (числа должны суммироваться, даты — сортироваться как даты) и читаемость кириллицы. Полезно автоматизировать контроль: до записи файла посчитайте контрольную сумму, например итог по числовой колонке, и сравните её с итогом в Excel.

Если выгрузка выполняется регламентно, добавьте журналирование: фиксируйте время начала, количество выгруженных строк и факт успешной записи файла. Это позволит быстро отличить ситуацию «файл не сформировался» от «файл сформировался, но его не забрали».

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

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

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

Число строк данных источника + 1 строка заголовка

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

Строк меньше — оборвался цикл; больше — задвоение данных

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

Excel считает сумму по колонке, сортировка числовая

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

Числа выровнены влево и не суммируются — записаны как текст

Кириллица
Норма

Русский текст читается сразу после открытия

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

Кракозябры — неверная кодировка файла

Процессы после COM-выгрузки
Норма

В диспетчере задач нет лишних EXCEL.EXE

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

Процессы копятся — не вызван Excel.Quit()

Ограничения и риски

Формат XLS (старый бинарный формат Excel) имеет ограничение около 65 тысяч строк на лист — при больших объёмах используйте XLSX. Табличный документ при записи в XLSX не переносит макросы, диаграммы Excel и некоторые виды условного форматирования; если это критично, формируйте файл шаблоном через COM и заполняйте данными.

С точки зрения безопасности: не выгружайте в файлы персональные данные и финансовую информацию без необходимости, а если выгружаете — контролируйте, куда сохраняется файл и кто имеет к нему доступ. Каталоги вроде C:\Temp доступны всем пользователям машины, что для конфиденциальных выгрузок недопустимо.

Итог

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

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

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

Можно ли выгрузить в Excel без установленного на компьютере Office?

Да. Способ через ТабличныйДокумент и Записать() с типом XLSX формирует файл средствами самой платформы 1С и не требует Excel ни на клиенте, ни на сервере. Ограничение только в COM-подходе — ему установленный Office необходим.

Почему в выгруженном файле числа не суммируются?

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

Как выгрузить файл пользователю, если код выполняется на сервере?

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

Чем отличается запись в XLS от записи в XLSX?

XLS — устаревший формат с ограничением примерно в 65 тысяч строк на лист. XLSX — современный формат, поддерживающий более миллиона строк и меньший размер файла. Для новых разработок всегда выбирайте XLSX.

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

Последовательная запись по ячейкам через COM — самый медленный вариант. Варианты решения: выгружать блоками через массив в свойство Range.Value, перейти на ТабличныйДокумент или для очень больших данных использовать CSV с последующим открытием в Excel.

Можно ли выгрузить несколько таблиц на разные листы одного файла?

Через COM-объект — да: создавайте дополнительные листы через Книга.Worksheets.Add() и заполняйте каждый. Через ТабличныйДокумент штатной многостраничности при записи в XLSX нет — обычно формируют несколько файлов либо переходят на COM для этой задачи.