Разработка и Конфигурация · 13 мин
Как программно выгрузить таблицу из 1С в Excel
Как программно выгрузить таблицу из 1С в Excel: методы Записать, COM-объект Excel.Application, табличный документ, примеры кода, ошибки и проверка результата.
Программная выгрузка таблицы из 1С в Excel — типовая задача при автоматизации обмена данными: менеджеры просят прайс в «икселе», бухгалтерия — реестр платежей, а руководство — отчёт, который открывается без установленной 1С. Встроенный язык платформы даёт несколько способов решить эту задачу, и выбор зависит от того, где выполняется код (клиент или сервер), установлен ли на машине Microsoft Excel и какой объём данных нужно выгрузить.
Самый универсальный путь — сформировать табличный документ (объект ТабличныйДокумент) и сохранить его методом Записать() с типом файла XLSX. Этот способ не требует установленного Excel, работает на сервере и подходит для большинства отчётов. Альтернатива — обращение к Excel через COM-объект Excel.Application, что даёт полный контроль над форматированием, но работает только там, где установлен офисный пакет, и заметно медленнее на больших объёмах.
Ниже разобраны оба подхода с примерами кода, ограничениями, типичными ошибками и способами проверки результата. Материал ориентирован на разработчика или продвинутого пользователя, умеющего открыть конфигуратор и вставить процедуру в общий модуль или внешнюю обработку.
Какие способы выгрузки существуют и когда какой выбирать
В платформе 1С:Предприятие 8.3 фактически три рабочих метода программной выгрузки табличных данных в формат Excel. Первый — сохранение табличного документа через Записать() в формат XLSX или XLS (MXL тоже открывается Excel, но это внутренний формат 1С, а не «настоящий» эксель-файл). Второй — построчная запись через COM-объект Excel.Application. Третий — формирование файла через пакетный документ (объект ПакетОтображаемыхДокументов) либо выгрузку в CSV с последующим открытием в Excel, что подходит для очень больших объёмов.
Критерии выбора простые. Если код выполняется на сервере или Excel на компьютере отсутствует — только табличный документ. Если нужны формулы Excel, закрепление областей, автофильтры и фирменное оформление ячеек — COM-объект, но будьте готовы к тому, что выгрузка 50 тысяч строк займёт минуты. Если данных сотни тысяч строк и форматирование не важно — CSV через объект ТекстовыйДокумент будет на порядок быстрее.
Сравнение вариантов
Не требует Excel, работает на сервере, быстро. Ограничение: нет формул Excel и сложных стилей, только то, что умеет табличный документ.
Полный контроль: формулы, автофильтры, стили. Ограничение: нужен установленный Excel, работает только на клиенте или сервере с Office, медленно на больших объёмах.
Максимальная скорость и минимальная память. Ограничение: нет форматирования, возможны проблемы с разделителями и кодировкой при открытии.
Выгрузка табличного документа в XLSX: основной метод
Ключевой объект — ТабличныйДокумент. Его можно заполнить вручную через области, построить по макету с помощью построителя отчёта или получить из СКД (схемы компоновки данных). После заполнения достаточно одной строки: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);. Платформа сама сформирует корректный xlsx-файл, который откроется в Excel, LibreOffice и Google Таблицах.
Пример простейшей выгрузки таблицы значений в файл:
ТабДок = Новый ТабличныйДокумент;
// Заголовки колонок
НомерКолонки = 1;
Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
Область = ТабДок.Область(1, НомерКолонки);
Область.Текст = Строка(Колонка.Имя);
Область.Шрифт = Новый Шрифт(,, Истина); // жирный
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Данные
НомерСтроки = 2;
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
НомерКолонки = 1;
Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
ТабДок.Область(НомерСтроки, НомерКолонки).Текст =
Строка(СтрокаТЗ[Колонка.Имя]);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Записать("C:\Temp\Выгрузка.xlsx",
ТипФайлаТабличногоДокумента.XLSX);
Обратите внимание на два момента. Во-первых, значения лучше выводить в том типе, в котором они хранятся: если присвоить области число через Область.Значение (в макетах) или выводить через СКД, Excel получит числовой формат и сможет считать суммы. Преобразование всего подряд в строку — частая причина жалоб «Excel не считает итог». Во-вторых, путь к файлу на сервере — это путь на сервере 1С, а не на компьютере пользователя; если код выполняется на сервере, файл нужно передать клиенту через временное хранилище.
- 1Сформируйте данные: таблица значений, результат запроса или отчёт СКД.
- 2Создайте объект ТабличныйДокумент и выведите заголовки и строки (или используйте макет).
- 3Вызовите Записать() с типом файла XLSX и полным путём.
- 4При серверном выполнении поместите файл во временное хранилище и передайте на клиент через ПолучитьФайл или НачатьПолучениеФайла.
- 5Откройте файл и проверьте количество строк, типы колонок и кодировку кириллицы.
Передача файла с сервера на клиент
В тонком и веб-клиенте файловая операция Записать() на клиенте часто недоступна или нежелательна, поэтому типовая схема такая: серверная процедура формирует табличный документ, записывает его во временный файл и кладёт двоичные данные во временное хранилище; клиентская процедура забирает данные и сохраняет файл через диалог сохранения.
// Серверная функция
Функция СформироватьФайлНаСервере()
ТабДок = Новый ТабличныйДокумент;
// ... заполнение табличного документа ...
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяВременногоФайла,
ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные,
Новый УникальныйИдентификатор);
УдалитьФайлы(ИмяВременногоФайла);
Возврат Адрес;
КонецФункции
На клиенте остаётся вызвать ПолучитьФайл(Адрес, "Отчёт.xlsx", Истина) или асинхронный аналог НачатьПолучениеФайлов — пользователь увидит стандартный диалог сохранения. Не забывайте удалять временные файлы на сервере: при массовой выгрузке они забивают каталог временных файлов и могут привести к переполнению диска.
Выгрузка через COM-объект Excel.Application
Когда требуется «живой» Excel-файл с формулами, автофильтром, закреплённой шапкой и корпоративным оформлением, используют прямое обращение к приложению Excel. Метод доступен только на машине с установленным Microsoft Office и только в контексте, где разрешены COM-объекты (обычно толстый или тонкий клиент на Windows, либо сервер под Windows с установленным Office).
Попытка
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;
КонецЦикла;
Лист.Range("A1:B1").Font.Bold = Истина;
Лист.Columns.AutoFit();
Книга.SaveAs("C:\Temp\Прайс.xlsx");
Книга.Close(Ложь);
Excel.Quit();
Excel = Неопределено;
Два критичных правила. Первое: всегда завершайте процесс через Excel.Quit() и обнуляйте переменную, иначе в диспетчере задач будут копиться зависшие процессы EXCEL.EXE, которые держат файлы и память. Второе: оборачивайте работу в Попытка/Исключение с гарантированным закрытием в блоке, который выполнится при ошибке, — иначе при сбое посередине выгрузки окно Excel останется висеть невидимым.
Выгрузка результата запроса и СКД-отчёта
Часто исходником служит не таблица значений, а запрос. Результат запроса удобно выгружать через построитель отчёта: он сам формирует табличный документ с заголовками колонок. Достаточно установить текст запроса, выполнить построитель и вывести результат в табличный документ, после чего записать его в XLSX.
Для отчётов на СКД всё ещё проще: программно выполните компоновку через КомпоновщикМакетаКомпоновкиДанных и ПроцессорКомпоновкиДанных, выведите результат в табличный документ и сохраните. Так вы получите в Excel ровно тот вид, который пользователь видит на экране, включая группировки и итоги. Учтите, что группировки СКД в XLSX переносятся как статичные строки — сворачивать их в Excel будет нельзя.
Если выгрузка делается «для людей», добавьте в табличный документ автоширину колонок через свойство области или заранее задайте ширину в макете. Файл, в котором все колонки сжаты и текст обрезан, пользователи воспринимают как сломанный, хотя данные в нём корректны.
Большие объёмы: CSV как альтернатива
Табличный документ держит все данные в памяти, а COM-Excel на сотнях тысяч строк работает неприемлемо долго. Для выгрузок такого масштаба практичнее формировать CSV: объект ТекстовыйДокумент или потоковая запись через ЗаписьТекста позволяют писать файл построчно, не накапливая данные в памяти.
Тонкости CSV: разделитель «точка с запятой» корректно распознаётся русской локалью Excel, а запятая — нет; файл лучше сохранять в UTF-8 с BOM, иначе кириллица при открытии двойным щелчком может отобразиться кракозябрами. Числа с дробной частью и даты приведите к единому формату заранее — Excel будет парсить их по региональным настройкам конкретного компьютера.
Проверка результата и контроль качества выгрузки
После выгрузки откройте файл и сверьте три вещи: количество строк данных (должно совпадать с количеством строк источника плюс шапка), типы колонок (числа должны суммироваться, даты — сортироваться как даты) и читаемость кириллицы. Полезно автоматизировать контроль: до записи файла посчитайте контрольную сумму, например итог по числовой колонке, и сравните её с итогом в Excel.
Если выгрузка выполняется регламентно, добавьте журналирование: фиксируйте время начала, количество выгруженных строк и факт успешной записи файла. Это позволит быстро отличить ситуацию «файл не сформировался» от «файл сформировался, но его не забрали».
Как проверить результат
Число строк данных источника + 1 строка заголовка
Строк меньше — оборвался цикл; больше — задвоение данных
Excel считает сумму по колонке, сортировка числовая
Числа выровнены влево и не суммируются — записаны как текст
Русский текст читается сразу после открытия
Кракозябры — неверная кодировка файла
В диспетчере задач нет лишних EXCEL.EXE
Процессы копятся — не вызван Excel.Quit()
Ограничения и риски
Формат XLS (старый бинарный формат Excel) имеет ограничение около 65 тысяч строк на лист — при больших объёмах используйте XLSX. Табличный документ при записи в XLSX не переносит макросы, диаграммы Excel и некоторые виды условного форматирования; если это критично, формируйте файл шаблоном через COM и заполняйте данными.
С точки зрения безопасности: не выгружайте в файлы персональные данные и финансовую информацию без необходимости, а если выгружаете — контролируйте, куда сохраняется файл и кто имеет к нему доступ. Каталоги вроде C:\Temp доступны всем пользователям машины, что для конфиденциальных выгрузок недопустимо.
Что важно запомнить
Базовый способ — ТабличныйДокумент и метод Записать() с типом XLSX: он не требует Excel и работает на сервере. COM-объект Excel.Application нужен только для формул и сложного оформления и требует установленного Office. Для очень больших выгрузок используйте CSV. Всегда проверяйте количество строк, типы колонок и кодировку, а при COM-выгрузке — завершайте процесс Excel.
Частые вопросы
Можно ли выгрузить в Excel без установленного на компьютере Office?
Да. Способ через ТабличныйДокумент и Записать() с типом XLSX формирует файл средствами самой платформы 1С и не требует Excel ни на клиенте, ни на сервере. Ограничение только в COM-подходе — ему установленный Office необходим.
Почему в выгруженном файле числа не суммируются?
Почти всегда причина в том, что значения записаны в ячейки как текст — например, через обёртку Строка() при выводе. Выводите числа и даты в исходном типе, тогда Excel распознает их корректно и позволит строить формулы и сводные таблицы.
Как выгрузить файл пользователю, если код выполняется на сервере?
Запишите табличный документ во временный файл на сервере, поместите двоичные данные во временное хранилище, а на клиенте получите файл через ПолучитьФайл или асинхронный аналог — пользователь увидит диалог сохранения. Временный файл на сервере после этого удалите.
Чем отличается запись в XLS от записи в XLSX?
XLS — устаревший формат с ограничением примерно в 65 тысяч строк на лист. XLSX — современный формат, поддерживающий более миллиона строк и меньший размер файла. Для новых разработок всегда выбирайте XLSX.
Выгрузка через COM зависает на больших объёмах. Что делать?
Последовательная запись по ячейкам через COM — самый медленный вариант. Варианты решения: выгружать блоками через массив в свойство Range.Value, перейти на ТабличныйДокумент или для очень больших данных использовать CSV с последующим открытием в Excel.
Можно ли выгрузить несколько таблиц на разные листы одного файла?
Через COM-объект — да: создавайте дополнительные листы через Книга.Worksheets.Add() и заполняйте каждый. Через ТабличныйДокумент штатной многостраничности при записи в XLSX нет — обычно формируют несколько файлов либо переходят на COM для этой задачи.