Разработка и Конфигурация · 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С.
Полное форматирование, формулы, автофильтры. Ограничение: нужен установленный Excel, медленно на больших объёмах, не работает на Linux-сервере.
Быстро на любых объёмах, минимум памяти. Ограничение: нет форматирования, проблемы с разделителями и кодировкой.
Выгрузка через табличный документ
Основная идея: создать объект ТабличныйДокумент, перебрать строки таблицы значений и вывести их в ячейки, затем сохранить документ в формате 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На сервере сформируйте табличный документ и заполните его из таблицы значений
- 2Запишите документ во временный файл в формате XLSX и поместите двоичные данные во временное хранилище
- 3Верните адрес хранилища на клиент
- 4На клиенте вызовите НачатьПолучениеФайлов с диалогом сохранения
- 5Проверьте, что файл открывается в Excel и содержит все строки
Проверка результата и типичные ошибки
После выгрузки откройте файл и сверьте: количество строк совпадает с размером таблицы значений (плюс строка шапки), числа распознаются как числа, даты — как даты, коды с ведущими нулями не потерялись. Расхождение количества строк чаще всего означает, что цикл прервался по ошибке или таблица была отфильтрована до выгрузки.
Частая проблема — значения составного типа и ссылки. Если в ячейке таблицы значений лежит ссылка на справочник, в Excel попадёт её строковое представление («Номенклатура 000000123» или просто наименование, в зависимости от настроек). Если нужен именно код или артикул — выводите явно СтрокаТЗ.Номенклатура.Код, а не саму ссылку.
Как проверить результат
Равно числу строк таблицы значений плюс шапка
Строк меньше — цикл прервался или данные отфильтрованы
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-процессов.