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