Разработка и Конфигурация · 11 мин
Как в 1С выгрузить таблицу значений в Excel
Как выгрузить таблицу значений из 1С в Excel: через табличный документ, COM-объект Excel и готовый файл. Примеры кода, типичные ошибки и проверка результата.
Таблица значений в 1С — это универсальная структура данных в памяти, которая не имеет встроенной кнопки «сохранить в Excel». Чтобы получить файл .xlsx, таблицу сначала нужно преобразовать в табличный документ, а затем сохранить его в нужном формате, либо записать данные напрямую в книгу Excel через COM-объект. Оба подхода рабочие, но у них разные ограничения по скорости, платформе и оформлению.
Выбор способа зависит от контекста: разовая выгрузка из отчёта, регламентная выгрузка на сервере без установленного Excel или интерактивная выгрузка с форматированием ячеек. Ниже разобраны три практических сценария с готовым кодом, указаны типичные ошибки и способы проверить, что файл сформировался корректно.
Почему таблицу значений нельзя сохранить напрямую
Объект ТаблицаЗначений существует только в оперативной памяти сеанса 1С. У него нет метода записи в файл Excel — доступны лишь сериализация через ЗначениеВФайл() (собственный бинарный формат) и выгрузка в XML. Формат xlsx платформа напрямую из таблицы значений не формирует.
Поэтому задача всегда сводится к промежуточному шагу: данные из колонок и строк таблицы переносятся либо в табличный документ (родной формат 1С, умеющий сохраняться в xlsx), либо в объектную модель Excel через COM. Понимание этого ограничения избавляет от поиска несуществующего метода «СохранитьВExcel» у таблицы значений.
Способ 1: выгрузка через табличный документ
Это рекомендуемый вариант в большинстве случаев: он работает и на клиенте, и на сервере, не требует установленного Excel и корректно работает в Linux-окружении и веб-клиенте. Схема такая: создаём ТабличныйДокумент, выводим в первую строку имена колонок, затем построчно выводим значения, после чего сохраняем.
Процедура ВыгрузитьВExcel(Таблица, ИмяФайла)
ТабДок = Новый ТабличныйДокумент;
// Шапка — имена колонок
НомерКолонки = 1;
Для Каждого Колонка Из Таблица.Колонки Цикл
ТабДок.Область(1, НомерКолонки).Текст = Колонка.Имя;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Данные
НомерСтроки = 2;
Для Каждого СтрокаТЗ Из Таблица Цикл
НомерКолонки = 1;
Для Каждого Колонка Из Таблица.Колонки Цикл
ТабДок.Область(НомерСтроки, НомерКолонки).Текст =
Строка(СтрокаТЗ[Колонка.Имя]);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
Обратите внимание на запись значений: присваивать свойству Текст нужно строку, поэтому значения приводятся функцией Строка(). Если нужно сохранить числа как числа (чтобы в Excel работали формулы и фильтры), используйте вместо Текст свойство области Значение — но тогда тип значения в таблице значений должен быть числовым.
Метод Записать() принимает полный путь к файлу. На сервере убедитесь, что у пользователя, под которым работает сервер 1С, есть права на запись в целевой каталог. Для интерактивной выгрузки на клиенте путь можно получить через диалог сохранения файла.
- 1Создайте объект ТабличныйДокумент
- 2Выведите в первую строку имена колонок таблицы значений
- 3В цикле выведите строки данных, приводя значения к строке или записывая через свойство Значение
- 4Вызовите ТабДок.Записать() с типом файла XLSX
- 5Откройте полученный файл и проверьте шапку и число строк
Способ 2: выгрузка через COM-объект Excel
Когда требуется полноценное форматирование — ширина колонок, цвета, формулы, несколько листов — используют прямое обращение к Excel через COM-соединение. Способ работает только там, где установлен Microsoft Excel: обычно это клиентское рабочее место под Windows. На сервере приложений без Excel и на Linux метод неприменим.
Процедура ВыгрузитьЧерезCOM(Таблица, ИмяФайла)
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
НомерКолонки = 1;
Для Каждого Колонка Из Таблица.Колонки Цикл
Лист.Cells(1, НомерКолонки).Value = Колонка.Имя;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
НомерСтроки = 2;
Для Каждого СтрокаТЗ Из Таблица Цикл
НомерКолонки = 1;
Для Каждого Колонка Из Таблица.Колонки Цикл
Лист.Cells(НомерСтроки, НомерКолонки).Value =
СтрокаТЗ[Колонка.Имя];
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Книга.SaveAs(ИмяФайла);
Книга.Close();
Excel.Quit();
КонецПроцедуры
Главный недостаток — скорость: запись в Excel по одной ячейке через COM очень медленная на больших таблицах. Если строк тысячи, выгрузка может занять минуты. Практический приём ускорения — формировать двумерный массив и присваивать его целому диапазону Range одним вызовом, либо всё же использовать табличный документ.
Способ 3: выгрузка без программирования
Если данные уже выведены в отчёт или табличный документ на форме, программировать ничего не нужно. В типовых конфигурациях и управляемых формах табличный документ сохраняется штатно: Файл → Сохранить как (или кнопка сохранения на панели), затем выбор типа файла «Лист Excel (*.xlsx)». Результат аналогичен программной записи табличного документа.
Для таблиц на форме (например, табличная часть документа или динамический список) доступен пункт «Вывести список» / «Сохранить» через контекстное меню — содержимое выводится в табличный документ, который дальше сохраняется в xlsx тем же способом. Это самый быстрый путь для разовой выгрузки пользователем без доработки конфигурации.
Ограничение подхода: выгружается то, что видно на экране, включая группировки и итоги, а не исходная таблица значений. Если нужна «чистая» таблица без оформления отчёта, используйте программный способ.
Сравнение вариантов
Универсально: клиент, сервер, Linux, веб-клиент. Быстро на больших объёмах. Ограничение — базовое форматирование.
Полный контроль над оформлением, формулами и листами. Требует установленный Excel, работает только под Windows, медленно на больших таблицах.
Без программирования, подходит для разовых выгрузок. Выгружается видимое представление, а не исходная таблица значений.
Как учесть типы данных и производительность
Даты, числа и булевы значения при записи через свойство Текст превращаются в строки, и в Excel с ними нельзя выполнять вычисления. Если это критично, записывайте значения через свойство области Значение или через COM (там Value сохраняет тип). Проверьте, что колонка таблицы значений имеет состав типа без лишних примитивов — смешанный тип «Строка + Число» часто даёт неожиданный результат.
По производительности: обращение к области табличного документа по координатам в цикле — приемлемый вариант до десятков тысяч строк. Для очень больших выгрузок эффективнее собрать макет с областями-строками и выводить их методами Поместить/Вывести, либо использовать построитель отчёта. COM-вариант на больших объёмах без пакетной записи диапазона практически непригоден.
Частая ситуация: в выгруженном файле числа «слипаются» в текст и Excel не считает суммы. Причина — запись через свойство Текст. Переведите запись на свойство Значение области или в COM используйте Value, и типы сохранятся.
Типичные ошибки и их признаки
Отдельная группа проблем — кодировка и локаль. Русские имена колонок и строковые значения сохраняются корректно, но дробная часть чисел при записи через Текст зависит от региональных настроек сеанса: где-то разделителем будет точка, где-то запятая. Это ещё один аргумент в пользу записи чисел как чисел, а не строк.
Как проверить результат выгрузки
После формирования файла откройте его в Excel и сверьте три вещи: число строк данных совпадает с количеством строк таблицы значений (плюс одна строка шапки), порядок и состав колонок соответствуют таблице, числовые колонки распознаны как числа (по ним работает автосумма). Несовпадение числа строк почти всегда означает ошибку в индексах цикла.
Для автоматической проверки в коде можно после Записать() проверить существование файла и его размер через объект Файл: пустой или нулевой файл — признак сбоя записи. При COM-выгрузке дополнительно убедитесь через диспетчер задач, что процесс Excel завершился.
Как проверить результат
Строк данных столько же, сколько в таблице значений, плюс шапка
Строк больше или меньше — ошибка в цикле или лишняя пустая строка
Excel видит числа, работает автосумма и сортировка по значению
Числа выровнены влево как текст, сумма не считается
EXCEL.EXE отсутствует в диспетчере задач после завершения
Процесс висит, файл заблокирован для повторной записи
FAQ
Можно ли выгрузить таблицу значений в Excel на сервере 1С под Linux?
Да, через табличный документ: метод Записать() с типом XLSX работает на сервере под Linux без каких-либо дополнительных компонентов. COM-вариант на Linux недоступен, так как требует установленный Microsoft Excel.
Почему в файле все числа стали текстом?
Потому что значения записаны через свойство Текст области табличного документа, которое принимает только строки. Записывайте значения через свойство Значение области или используйте COM с присвоением Value — тогда типы сохранятся.
Как выгрузить в Excel несколько таблиц на разные листы?
Через COM-объект: создавайте дополнительные листы методом Книга.Worksheets.Add() и заполняйте каждый своей таблицей. Через табличный документ многостраничность не поддерживается — формируйте отдельный файл на каждую таблицу.
Выгрузка большой таблицы через COM занимает очень много времени. Что делать?
Не пишите по одной ячейке: сформируйте массив значений и присвойте его целому диапазону Range одной операцией — это ускоряет выгрузку в десятки раз. Альтернатива — перейти на табличный документ, который на больших объёмах работает заметно быстрее COM.
Можно ли выгрузить таблицу значений в старый формат .xls?
Да, при сохранении табличного документа укажите соответствующий тип файла (XLS97 или XLS в зависимости от версии платформы). Учтите ограничение старого формата — около 65 тысяч строк на лист; для больших таблиц используйте XLSX.
Как дать пользователю выбрать, куда сохранить файл?
На клиенте используйте диалог сохранения файла (ДиалогВыбораФайла с режимом Сохранение), получите от пользователя полный путь и передайте его в метод Записать(). На сервере диалог недоступен — файл сохраняется в заданный каталог и затем передаётся клиенту через временное хранилище.
Что важно запомнить
Таблица значений не сохраняется в Excel напрямую: данные переносят в табличный документ и записывают методом Записать() в формате XLSX — это универсальный и быстрый способ. COM-объект Excel даёт полное форматирование, но требует установленный Excel и аккуратного завершения процесса. Числа записывайте как значения, а не как текст, и проверяйте результат по числу строк и типам колонок.