Разработка и Конфигурация · 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 на сервере недоступен, а структура файла нестандартная.
Сравнение способов выгрузки
Подходит для большинства задач: отчёты, прайсы, реестры. Работает на сервере без Excel. Ограничение — нет формул и диаграмм Excel.
Нужен, когда требуются формулы, макросы, диаграммы, сводные таблицы. Требует установленный Excel, медленный, нестабилен в фоновых заданиях.
Быстрый вариант для плоской таблицы из запроса. Минимум кода, но слабый контроль оформления.
Для интеграций и очень больших объёмов. Excel открывает CSV, но теряется форматирование и типы данных.
Выгрузка через табличный документ: основной метод
Табличный документ — универсальный объект платформы. Его можно заполнить программно построчно, вывести из макета или получить как результат отчёта на СКД, а затем одной командой сохранить в файл Excel.
Минимальный пример: создаём табличный документ, пишем значения в ячейки и сохраняем. Метод Записать() принимает путь к файлу и тип файла. Для современного формата используется ТипФайлаТабличногоДокумента.XLSX, для старого — XLS.
ТабДок = Новый ТабличныйДокумент;
// Шапка
ТабДок.Область("R1C1").Текст = "Номенклатура";
ТабДок.Область("R1C2").Текст = "Цена";
ТабДок.Область("R1C3").Текст = "Остаток";
// Данные из запроса
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1000
| Товары.Ссылка.Наименование КАК Наименование,
| Товары.Цена КАК Цена
|ИЗ Справочник.Номенклатура КАК Товары");
НомерСтроки = 2;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТабДок.Область("R" + НомерСтроки + "C1").Текст = Выборка.Наименование;
ТабДок.Область("R" + НомерСтроки + "C2").Текст = Выборка.Цена;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Записать("C:\Выгрузки\Прайс.xlsx",
ТипФайлаТабличногоДокумента.XLSX);
Обратите внимание: числа, записанные через свойство Текст, попадут в Excel как текст. Чтобы Excel воспринимал значение как число, используйте параметр расшифровки области или записывайте значение через Область().Значение в тех версиях, где это доступно, либо формируйте документ через макет с типом параметра «Число». Проще всего выводить данные через макет табличного документа с параметрами — тогда типы сохраняются корректно.
Для отчётов на СКД всё ещё проще: результат компоновки выводится в табличный документ штатно, и его можно сразу записать в файл. Это стандартный приём для регламентной рассылки отчётов.
- 1Сформируйте ТабличныйДокумент: программно, из макета или из результата СКД
- 2Проверьте типы данных в ячейках — числа не должны уходить как текст
- 3Вызовите ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX)
- 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 = Ложь отключает большинство диалогов.
Как проверить результат выгрузки
После формирования файла откройте его в Excel и проверьте несколько контрольных точек. Количество строк данных должно совпадать с количеством записей в выборке — сверьте с результатом запроса в консоли. Числовые колонки должны суммироваться: выделите столбец и посмотрите сумму в строке состояния Excel.
Проверьте даты: они должны распознаваться как даты (выравнивание вправо по умолчанию, возможность отфильтровать по месяцам). Убедитесь, что кириллица отображается корректно — проблемы с кодировкой особенно характерны для CSV. Если файл формируется регламентным заданием, добавьте в код запись в журнал регистрации с количеством выгруженных строк и путём к файлу.
Как проверить результат
Совпадает с числом записей в выборке запроса
Строк меньше или больше — проверяйте фильтры запроса и цикл выгрузки
Excel считает сумму при выделении столбца
Сумма не считается — числа записаны как текст
Текст читается, переносы и разделители не ломают структуру
Кракозябры или съехавшие столбцы — проблема кодировки или разделителя
В диспетчере задач нет лишних 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. Всегда проверяйте типы данных, количество строк и место сохранения файла.