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

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

Как выгрузить таблицу значений в Excel в 1С

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

Таблица значений в 1С — это объект в памяти, у него нет встроенной кнопки «Сохранить в Excel». Чтобы получить файл .xlsx, данные нужно сначала представить в виде, который умеет сохраняться на диск: чаще всего это табличный документ, реже — прямая запись через COM-объект Excel или формирование файла построчно. Выбор способа зависит от объёма данных, наличия Excel на компьютере и требований к оформлению.

Ниже разобраны три рабочих подхода с готовым кодом: выгрузка через табличный документ (универсальный и самый простой), запись через COM-соединение с Excel (гибкое форматирование) и построчное формирование файла для больших объёмов. Отдельно рассмотрены типичные ошибки: потеря ведущих нулей в кодах, преобразование дат, падение производительности на десятках тысяч строк.

Все примеры написаны на встроенном языке 1С и работают как в управляемых, так и в обычных формах. Код можно вставить во внешнюю обработку, команду формы списка или кнопку на форме отчёта.

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

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

Табличный документ не требует установленного Excel, работает на сервере и на тонком клиенте, сохраняет файл в форматах XLSX, XLS, ODS. Ограничение — форматирование задаётся средствами табличного документа, а не Excel. COM-объект даёт полный доступ к возможностям Excel (стили, автофильтры, формулы), но требует установленного Microsoft Excel на той машине, где исполняется код, и заметно медленнее на больших объёмах. Построчная запись через ЗаписьТекста или потоки подходит для CSV, который Excel открывает напрямую.

Сравнение способов выгрузки

Табличный документ

Универсально, не нужен Excel, работает на сервере. Ограничение: форматирование только средствами 1С.

COM-объект Excel

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

CSV через ЗаписьТекста

Быстро на любых объёмах, минимум памяти. Ограничение: нет форматирования, проблемы с разделителями и кодировкой.

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

Основная идея: создать объект ТабличныйДокумент, перебрать строки таблицы значений и вывести их в ячейки, затем сохранить документ в формате XLSX. Это самый короткий и надёжный код.

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

// Шапка — имена колонок

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

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

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

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

КонецЦикла;

// Данные

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

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

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

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

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

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

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

КонецЦикла;

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

КонецЦикла;

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

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

Обратите внимание на запись значения в ячейку: используется свойство Текст, которое принимает строку. Если в колонке лежит число или дата, 1С автоматически преобразует значение в строковое представление. Если нужно, чтобы Excel воспринимал числа как числа (для сумм и сортировки), используйте параметр области СодержитЗначение и свойство Значение вместо Текст — тогда тип данных сохранится.

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

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

Этот способ нужен, когда требуется форматирование средствами самого Excel: цветные шапки, автофильтр, закрепление областей, формулы. Код создаёт экземпляр приложения Excel через COM и заполняет лист напрямую.

Попытка

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

Исключение

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

Возврат;

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

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

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

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

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

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

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

КонецЦикла;

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

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

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

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

Лист.Cells(НомерСтроки, НомерКолонки).Value =

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

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

КонецЦикла;

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

КонецЦикла;

Книга.SaveAs("C:\Temp\Выгрузка.xlsx", 51); // 51 = xlsx

Excel.Quit();

Обязательно завершайте работу вызовом Excel.Quit() и освобождайте объект. Если код прервётся с ошибкой до Quit, в памяти останется невидимый процесс EXCEL.EXE, который удерживает файл и потребляет ресурсы. На сервере такие процессы накапливаются и приводят к утечкам памяти.

Критическое ограничение: COM-объект работает только там, где установлен Excel и разрешён COM. На сервере под Linux или в модели сервиса этот способ недоступен. Кроме того, запись по одной ячейке через COM очень медленная: на 10 000 строк с десятью колонками выгрузка может занять минуты. Ускорение даёт запись массива целиком через Range.Value, но это требует формирования двумерного массива и аккуратной работы с типами.

Построчная выгрузка в CSV для больших объёмов

Если таблица содержит сотни тысяч строк, табличный документ может не поместиться в память, а COM будет работать неприемлемо долго. Практичный выход — записать CSV-файл, который Excel открывает штатно.

Запись = Новый ЗаписьТекста("C:\Temp\Выгрузка.csv",

КодировкаТекста.UTF8);

// Шапка

ЧастиСтроки = Новый Массив;

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

ЧастиСтроки.Добавить(Колонка.Имя);

КонецЦикла;

Запись.ЗаписатьСтроку(СтрСоединить(ЧастиСтроки, ";"));

// Данные

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

ЧастиСтроки = Новый Массив;

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

ЧастиСтроки.Добавить(Строка(СтрокаТЗ[Колонка.Имя]));

КонецЦикла;

Запись.ЗаписатьСтроку(СтрСоединить(ЧастиСтроки, ";"));

КонецЦикла;

Запись.Закрыть();

Разделитель «;» выбран потому, что в русской локали Excel ожидает именно точку с запятой как разделитель CSV. Если значение само содержит точку с запятой или перевод строки, его нужно обернуть в кавычки и удвоить внутренние кавычки — иначе структура файла сломается. Кодировка UTF-8 без BOM иногда открывается в Excel с «кракозябрами»; надёжнее использовать UTF-8 с BOM или кодировку Windows-1251.

Помните: CSV не хранит типы данных. Код номенклатуры «00123» откроется в Excel как число 123, а «1.02» может превратиться в дату. Если сохранность кодов критична, CSV не подходит — используйте табличный документ с текстовым форматом ячеек.

Передача файла пользователю в управляемом приложении

В клиент-серверном варианте код часто выполняется на сервере, а файл нужен на компьютере пользователя. Прямая запись по пути «C:\Temp\...» на сервере создаст файл на сервере, и пользователь его не увидит.

Типовая схема: на сервере сформировать табличный документ, записать его во временный файл и поместить двоичные данные во временное хранилище; на клиенте получить данные из хранилища и предложить пользователю сохранить файл через диалог. В тонком клиенте для этого используются методы НачатьПолучениеФайлов или ПолучитьФайл, в веб-клиенте — ПолучитьФайл с показом диалога сохранения браузера.

Порядок действий для клиент-серверной выгрузки
  1. 1
    На сервере сформируйте табличный документ и заполните его из таблицы значений
  2. 2
    Запишите документ во временный файл в формате XLSX и поместите двоичные данные во временное хранилище
  3. 3
    Верните адрес хранилища на клиент
  4. 4
    На клиенте вызовите НачатьПолучениеФайлов с диалогом сохранения
  5. 5
    Проверьте, что файл открывается в Excel и содержит все строки

Проверка результата и типичные ошибки

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

Частая проблема — значения составного типа и ссылки. Если в ячейке таблицы значений лежит ссылка на справочник, в Excel попадёт её строковое представление («Номенклатура 000000123» или просто наименование, в зависимости от настроек). Если нужен именно код или артикул — выводите явно СтрокаТЗ.Номенклатура.Код, а не саму ссылку.

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

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

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

Равно числу строк таблицы значений плюс шапка

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

Строк меньше — цикл прервался или данные отфильтрованы

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

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

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

Значения выровнены влево как текст, суммы не считаются

Коды с ведущими нулями
Норма

Код «00123» отображается полностью

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

Код превратился в 123 — потерян формат

Блокировка файла
Норма

Файл открывается повторно без ошибок

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

Файл занят процессом — не завершён COM-объект Excel

FAQ

Можно ли выгрузить таблицу значений в Excel без программирования?

Если таблица значений выведена на форму как табличное поле, её можно вывести в табличный документ стандартной командой «Вывести список» (доступна в меню «Ещё» формы списка) и сохранить полученный документ как XLSX. Для произвольной таблицы значений внутри обработки без кода не обойтись.

Как выгрузить таблицу значений на сервере, где нет Excel?

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

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

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

Что делать, если таблица содержит сотни тысяч строк?

Табличный документ на таком объёме потребляет много памяти и формируется медленно. Варианты: выгрузка в CSV построчно, пакетная запись в табличный документ частями с последующим объединением файлов, либо выгрузка через запрос сразу в СКД с сохранением результата. Для аналитики больших объёмов CSV обычно практичнее всего.

Как сохранить форматирование: цвета, ширину колонок, автофильтр?

В табличном документе можно задать цвет фона, шрифт и ширину колонок через свойства областей — это сохранится в XLSX. Автофильтр и закрепление строк задаются только через COM-объект Excel либо добавляются пользователем вручную после открытия файла.

Файл сохраняется, но не открывается в Excel — в чём причина?

Чаще всего несовпадение расширения и реального формата: например, файл записан как XLS (ТипФайлаТабличногоДокумента.XLS), а назван .xlsx. Проверьте, что тип файла в методе Записать() соответствует расширению. Также убедитесь, что запись завершилась без исключений и файл не занят другим процессом.

Итог

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

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