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

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

Как из 1С выгрузить в Excel программно

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

Программная выгрузка из 1С в Excel нужна, когда данные требуется передавать регулярно: прайсы для клиентов, отчёты для руководства, выгрузки для банков и маркетплейсов. Ручное сохранение через «Файл → Сохранить как» не подходит для автоматизации — в регламентных заданиях и обменах файл должен формироваться без участия пользователя.

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

Ниже разобраны рабочие примеры кода, условия выбора метода, типичные ошибки и способы проверить, что файл сформировался корректно. Примеры приведены для платформы 1С:Предприятие 8.3, но большинство приёмов работает и на более ранних версиях.

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

Всего практически применимых подходов четыре. Первый — заполнение объекта «Табличный документ» и его сохранение в формате XLSX или XLS. Это штатный механизм платформы: не требует установленного Excel, работает на сервере и в регламентных заданиях, сохраняет базовое форматирование (шрифты, границы, цвета, объединения ячеек).

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

Третий вариант — выгрузка результата запроса или таблицы значений через построитель отчёта в табличный документ. Подходит, когда нужна быстрая выгрузка «плоской» таблицы без сложного оформления. Четвёртый — запись CSV или XML-таблицы (SpreadsheetML) как обходной путь, когда Excel на сервере недоступен, а структура файла нестандартная.

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

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

Подходит для большинства задач: отчёты, прайсы, реестры. Работает на сервере без Excel. Ограничение — нет формул и диаграмм Excel.

COM-объект Excel.Application

Нужен, когда требуются формулы, макросы, диаграммы, сводные таблицы. Требует установленный Excel, медленный, нестабилен в фоновых заданиях.

Построитель отчёта

Быстрый вариант для плоской таблицы из запроса. Минимум кода, но слабый контроль оформления.

CSV как промежуточный формат

Для интеграций и очень больших объёмов. Excel открывает CSV, но теряется форматирование и типы данных.

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

Табличный документ — универсальный объект платформы. Его можно заполнить программно построчно, вывести из макета или получить как результат отчёта на СКД, а затем одной командой сохранить в файл Excel.

Минимальный пример: создаём табличный документ, пишем значения в ячейки и сохраняем. Метод Записать() принимает путь к файлу и тип файла. Для современного формата используется ТипФайлаТабличногоДокумента.XLSX, для старого — XLS.

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

// Шапка

ТабДок.Область("R1C1").Текст = "Номенклатура";

ТабДок.Область("R1C2").Текст = "Цена";

ТабДок.Область("R1C3").Текст = "Остаток";

// Данные из запроса

Запрос = Новый Запрос(

"ВЫБРАТЬ ПЕРВЫЕ 1000

| Товары.Ссылка.Наименование КАК Наименование,

| Товары.Цена КАК Цена

|ИЗ Справочник.Номенклатура КАК Товары");

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ТабДок.Область("R" + НомерСтроки + "C1").Текст = Выборка.Наименование;

ТабДок.Область("R" + НомерСтроки + "C2").Текст = Выборка.Цена;

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

КонецЦикла;

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

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

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

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

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

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

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

Попытка

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

Исключение

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

Возврат;

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

Excel.Visible = Ложь; // не показывать окно

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

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

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

Лист.Cells(1, 2).Value = "Цена";

Строка = 2;

Пока Выборка.Следующий() Цикл

Лист.Cells(Строка, 1).Value = Выборка.Наименование;

Лист.Cells(Строка, 2).Value = Выборка.Цена;

Строка = Строка + 1;

КонецЦикла;

Лист.Columns("A:B").AutoFit();

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

Книга.Close(Ложь);

Excel.Quit();

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

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

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

Выгрузка запроса через построитель отчёта

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

Построитель = Новый ПостроительОтчета;

Построитель.Текст =

"ВЫБРАТЬ

| Контрагенты.Наименование,

| Контрагенты.ИНН,

| Контрагенты.КПП

|ИЗ Справочник.Контрагенты КАК Контрагенты";

Построитель.Выполнить();

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

Построитель.Вывести(ТабДок);

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

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

Метод хорош для служебных выгрузок и отладки: минимум кода, автоматическая шапка. Ограничения — слабый контроль форматирования и порядка строк, а также то, что итоги и группировки придётся настраивать отдельно через настройки построителя.

CSV как обходной путь для больших объёмов

При выгрузке сотен тысяч строк табличный документ потребляет много памяти, а COM работает неприемлемо долго. В таких случаях данные пишут в CSV через объект ЗаписьТекста — построчно, с минимальным расходом памяти. Excel открывает CSV напрямую или через мастер импорта.

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

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

Запись.ЗаписатьСтроку("Номенклатура;Цена");

Пока Выборка.Следующий() Цикл

Запись.ЗаписатьСтроку(

СтрЗаменить(Выборка.Наименование, ";", ",")

+ ";" + Формат(Выборка.Цена, "ЧРД=.; ЧГ="));

КонецЦикла;

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

Нюансы: разделитель «;» используется в русской локали Excel, запятая — в английской. Точку с запятой внутри текстовых значений нужно экранировать или заменять. Числа форматируйте с точкой как разделителем дробной части, иначе Excel может распознать их как дату или текст. Кодировка UTF-8 с BOM обычно открывается в Excel корректно.

Частые ошибки и как их избежать

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

Вторая ошибка — путь к файлу указывается на диск клиента, а код выполняется на сервере. В клиент-серверном режиме файл «C:\Выгрузки\...» создастся на сервере, и пользователь его не увидит. Нужно либо сохранять файл на сервере и передавать на клиент через хранилище значений и ПолучитьФайл(), либо выполнять запись на клиенте.

Третья группа проблем связана с COM: зависшие процессы Excel, ошибки «Класс не зарегистрирован» при несовпадении разрядности, диалоговые окна Excel (запрос на сохранение, предупреждения безопасности), которые блокируют выполнение в фоне. Свойство Excel.DisplayAlerts = Ложь отключает большинство диалогов.

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

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

После формирования файла откройте его в Excel и проверьте несколько контрольных точек. Количество строк данных должно совпадать с количеством записей в выборке — сверьте с результатом запроса в консоли. Числовые колонки должны суммироваться: выделите столбец и посмотрите сумму в строке состояния Excel.

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

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

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

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

Совпадает с числом записей в выборке запроса

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

Строк меньше или больше — проверяйте фильтры запроса и цикл выгрузки

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

Excel считает сумму при выделении столбца

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

Сумма не считается — числа записаны как текст

Кириллица и спецсимволы
Норма

Текст читается, переносы и разделители не ломают структуру

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

Кракозябры или съехавшие столбцы — проблема кодировки или разделителя

Процессы Excel после COM-выгрузки
Норма

В диспетчере задач нет лишних EXCEL.EXE

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

Процессы накапливаются — Quit() не вызывается

FAQ

Можно ли выгрузить в Excel без установленного Microsoft Office?

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

Почему в файле числа сохранились как текст и как это исправить?

Причина — запись значений через свойство Текст области табличного документа: платформа передаёт всё строками. Используйте макет табличного документа с параметрами, где тип значения сохраняется, либо при COM-выгрузке присваивайте значения через Cells().Value, передавая число, а не строку.

Как выгрузить файл в регламентном задании на сервере?

Используйте табличный документ с методом Записать() — он полностью работает на сервере. COM-объект Excel в серверных фоновых заданиях ненадёжен и официально не рекомендован для таких сценариев. Путь сохранения должен быть доступен учётной записи, под которой работает сервер 1С.

Что делать, если выгружается очень большая таблица и 1С «падает» по памяти?

Табличный документ держит всё в памяти, поэтому для сотен тысяч строк он не подходит. Переключитесь на построчную запись CSV через ЗаписьТекста или разбейте выгрузку на несколько файлов-пакетов. Также проверьте, не выбираете ли вы лишние поля в запросе.

Как передать сформированный файл с сервера пользователю?

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

Можно ли заполнить готовый Excel-шаблон с формулами и логотипом?

Да, это основной сценарий для COM-подключения: откройте файл шаблона через Workbooks.Open(), заполните ячейки данных и сохраните под новым именем. Формулы, оформление и изображения шаблона сохранятся. Альтернатива без Excel — использовать табличный документ, сформированный из макета 1С, но формулы Excel в нём не сохранятся.

Итог

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

Основной способ программной выгрузки из 1С в Excel — табличный документ с методом Записать() в формат XLSX: работает везде, не требует Office. COM-объект Excel.Application нужен только для формул и шаблонов и требует аккуратного завершения процесса. Для больших объёмов используйте CSV. Всегда проверяйте типы данных, количество строк и место сохранения файла.