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

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

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

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

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

Выбор способа зависит от контекста. Если код выполняется на клиенте или сервере типовой конфигурации и нужен обычный файл XLSX — проще всего использовать табличный документ. Если требуется управлять форматированием на стороне Excel (стили, автофильтры, несколько листов) — применяют COM. Если сервер работает под Linux без установленного Excel — остаётся только табличный документ или формирование XML/CSV вручную.

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

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

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

Платформа предлагает два штатных моста к Excel. Первый — табличный документ, который умеет сохраняться в форматы XLS, XLSX, ODS, MXL и другие. Второй — COM-соединение с приложением Excel, доступное только на Windows и только там, где Excel физически установлен. Оба подхода рабочие, но с разными ограничениями по производительности и окружению.

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

Это основной и рекомендуемый метод. Алгоритм: создать табличный документ, в цикле вывести заголовки колонок и строки таблицы значений, затем записать результат в файл с указанием типа XLSX.

Функция СохранитьТЗвExcel(ТЗ, ИмяФайла)

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

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

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

Для Каждого Колонка Из ТЗ.Колонки Цикл

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

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

КонецЦикла;

// Данные

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

Для Каждого СтрокаТЗ Из ТЗ Цикл

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

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

Для Каждого Колонка Из ТЗ.Колонки Цикл

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

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

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

КонецЦикла;

КонецЦикла;

ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

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

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

Метод работает на сервере и на клиенте, под Windows и Linux, не требует установленного Excel. Это делает его единственным вариантом для серверов на Linux и для фоновых заданий на сервере без офисного пакета.

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

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

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

Процедура ВыгрузитьЧерезCOM(ТЗ, ИмяФайла)

Попытка

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

Исключение

Сообщить("Excel не установлен или COM недоступен");

Возврат;

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

Excel.DisplayAlerts = Ложь;

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

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

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

Для Каждого Колонка Из ТЗ.Колонки Цикл

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

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

КонецЦикла;

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

Для Каждого СтрокаТЗ Из ТЗ Цикл

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

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

Для Каждого Колонка Из ТЗ.Колонки Цикл

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

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

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

КонецЦикла;

КонецЦикла;

Книга.SaveAs(ИмяФайла);

Книга.Close();

Excel.Quit();

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

КонецПроцедуры

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

Способ 3: CSV и ручное формирование файла

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

Процедура СохранитьТЗвCSV(ТЗ, ИмяФайла)

Текст = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);

// Заголовок

СтрокаЗаголовка = "";

Для Каждого Колонка Из ТЗ.Колонки Цикл

СтрокаЗаголовка = СтрокаЗаголовка + ";" + Колонка.Имя;

КонецЦикла;

Текст.ЗаписатьСтроку(Сред(СтрокаЗаголовка, 2));

Для Каждого СтрокаТЗ Из ТЗ Цикл

СтрокаДанных = "";

Для Каждого Колонка Из ТЗ.Колонки Цикл

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

Значение = СтрЗаменить(Значение, ";", ",");

СтрокаДанных = СтрокаДанных + ";" + Значение;

КонецЦикла;

Текст.ЗаписатьСтроку(Сред(СтрокаДанных, 2));

КонецЦикла;

Текст.Закрыть();

КонецПроцедуры

Два практических момента. В русской локали Excel по умолчанию ждёт разделитель «;», а не запятую — при запятой все данные могут попасть в одну колонку. И значения, содержащие разделитель или перевод строки, нужно экранировать или очищать, иначе структура строк «поедет».

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

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

Универсально, работает на сервере и Linux, сохраняет базовое форматирование. Не подходит, если нужны формулы Excel и тонкая настройка книги.

COM Excel.Application

Полный контроль над книгой, формулы, листы, автофильтры. Требует Windows и установленного Excel, рискованно на сервере.

CSV вручную

Быстро и без зависимостей, подходит для обмена большими объёмами. Нет типов, форматирования и нескольких листов.

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

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

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

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

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

Код выполняется на сервере или в фоновом заданииИспользуйте табличный документ с записью в XLSX
Нужны формулы, несколько листов и автофильтры, Excel установлен у пользователяПрименяйте COM-объект Excel.Application с обязательным Quit()
Файл уходит в стороннюю систему или объём очень большойФормируйте CSV с разделителем «;» и кодировкой UTF-8
Сервер работает под LinuxCOM исключён — только табличный документ или CSV

Типичные ошибки и как их избежать

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

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

Ещё одна неочевидная ошибка — выгрузка значений ссылочного типа. Если в колонке лежит ссылка на номенклатуру, Строка(Ссылка) даст представление, которое обычно и нужно, но при COM-записи ссылка может сериализоваться некорректно. Перед выгрузкой явно решите, что должно попасть в файл: наименование, код, артикул — и выводите именно это поле.

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

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

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

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

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

Строк данных = ТЗ.Количество(), плюс строка заголовка

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

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

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

Excel видит числа, работает автосумма

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

Числа выровнены влево как текст — значения выгружены строкой

Даты
Норма

Даты распознаются Excel как даты

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

Даты стали текстом или съехал формат день/месяц

Открытие файла
Норма

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

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

Excel сообщает об ошибке формата — запись прервана или файл заблокирован

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

FAQ

Можно ли сохранить таблицу значений в Excel без кода, штатными средствами?

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

Почему на сервере 1С код с COMОбъект("Excel.Application") выдаёт ошибку?

На сервере обычно не установлен Excel, а служба агента 1С работает под учётной записью без права интерактивного запуска COM-приложений. Даже если Excel установить, Microsoft не поддерживает автоматизацию Office из служб. Решение — переписать выгрузку на табличный документ.

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

Не преобразуйте значения через Строка(). При выводе в табличный документ используйте макет с параметрами и присваивайте значения напрямую — платформа сохранит тип, и при записи в XLSX числа и даты попадут в файл с правильным типом. При COM-записи присваивайте в Cells значение без строкового преобразования.

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

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

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

Через табличный документ напрямую нет — он сохраняется как один лист. Варианты: использовать COM, где можно создавать произвольное число Worksheets, либо формировать несколько отдельных файлов. В управляемых формах также можно собрать пакет через объединение результатов построчно, но проще всего многослойные книги делать именно через COM.

Файл формируется, но Excel ругается на повреждение при открытии. В чём причина?

Чаще всего запись файла была прервана (исключение в середине процесса, нехватка места) или файл остался заблокирован другим процессом. Проверьте, что Записать() выполняется в Попытка/Исключение, процесс Excel корректно завершается через Quit(), а путь записи доступен. Также убедитесь, что тип файла в Записать() соответствует расширению имени файла.