Разработка и Конфигурация · 11 мин
Как записать данные из 1С в файл Excel
Как записать данные из 1С в файл Excel: табличный документ, COM-объект Excel.Application, запись без Excel. Примеры кода, ошибки и проверка результата.
Запись данных из 1С в файл Excel — одна из самых частых задач при обмене с контрагентами, выгрузке отчётов и подготовке прайс-листов. В зависимости от ситуации применяются три подхода: сохранение табличного документа в формате XLSX, работа через COM-объект Excel.Application и формирование файла без установленного Excel на компьютере. У каждого способа есть свои ограничения по скорости, требованиям к окружению и совместимости.
Выбор метода определяется двумя вопросами: где выполняется код (на клиенте или на сервере) и установлен ли Microsoft Excel на этой машине. Простейший вариант — заполнить табличный документ и вызвать его метод Записать() с типом файла XLSX: он не требует Excel вообще и работает на сервере. COM-подход даёт полный контроль над форматированием, но требует установленного Excel и работает только под Windows.
Как выбрать способ записи в Excel
Прежде чем писать код, определите условия выполнения. Если обработка запускается в файловой базе на компьютере бухгалтера с установленным Office, допустим любой вариант. Если код выполняется на сервере 1С под Linux или в фоновом задании, COM-объект недоступен, и единственный рабочий путь — табличный документ или формирование файла программно.
Второй критерий — объём данных. Табличный документ комфортно работает с тысячами строк, но при выгрузке сотен тысяч записей потребление памяти резко растёт. В таких случаях данные либо разбивают на несколько файлов, либо выгружают в CSV, который Excel открывает напрямую.
Как выбрать действие
Запись через табличный документ — универсальный способ
Табличный документ — встроенный объект платформы, который умеет сохраняться в форматы XLSX, XLS, ODS, PDF и другие. Это основной и рекомендуемый способ записи в Excel, потому что он не зависит от внешних программ. Достаточно создать объект, заполнить ячейки и вызвать метод записи.
Типовой код выглядит так: создаётся объект ТабличныйДокумент, в цикле по выборке или таблице значений заполняются области, затем вызывается ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Путь к файлу должен быть доступен тому процессу, где выполняется код: на сервере — серверному каталогу, на клиенте — локальному диску пользователя.
ТабДок = Новый ТабличныйДокумент;
Строка = 1;
Для Каждого Товар Из ТаблицаТоваров Цикл
ТабДок.Область("R" + Строка + "C1").Текст = Товар.Наименование;
ТабДок.Область("R" + Строка + "C2").Текст = Товар.Цена;
Строка = Строка + 1;
КонецЦикла;
ТабДок.Записать("C:\Выгрузка\Товары.xlsx", ТипФайлаТабличногоДокумента.XLSX);Обратите внимание на адресацию ячеек: область задаётся в формате «R{строка}C{колонка}», например R1C1. Если файл с таким именем уже существует, он будет перезаписан без предупреждения. Если файл открыт в Excel в момент записи, платформа выдаст ошибку доступа — это одна из самых частых причин сбоев.
Использование макета для оформления
Когда нужна шапка с заголовками, объединённые ячейки и рамки, удобнее заранее подготовить макет табличного документа в конфигураторе. В макете создают именованные области «Шапка», «Строка», «Подвал», затем в коде последовательно получают области через Макет.ПолучитьОбласть(), заполняют параметры и выводят через ТабДок.Вывести(). Такой подход отделяет оформление от логики и упрощает поддержку.
Запись через COM-объект Excel.Application
COM-подключение даёт доступ ко всем возможностям Excel: формулы, автофильтры, условное форматирование, диаграммы, закрепление областей. Код создаёт объект Excel.Application, добавляет книгу и заполняет лист через коллекцию Cells. Способ работает только на Windows-клиенте или Windows-сервере с установленным Microsoft Office.
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
Лист.Cells(1, 1).Value = "Наименование";
Лист.Cells(1, 2).Value = "Цена";
Книга.SaveAs("C:\Выгрузка\Товары.xlsx");
Excel.Quit();Критически важно завершать работу вызовом Excel.Quit() и освобождать объект, иначе в диспетчере задач остаются зависшие процессы EXCEL.EXE. При массовых выгрузках это приводит к утечке памяти и блокировке файлов. Рекомендуется оборачивать весь код в попытку-исключение и в секции исключения также закрывать Excel.
Ускорение записи через COM
Построчная запись через Cells() медленная: каждый вызов — отдельное COM-обращение. Для ускорения отключают обновление экрана (Excel.ScreenUpdating = False) и автопересчёт формул, а массивы данных записывают диапазоном целиком. Даже с этими мерами на больших объёмах табличный документ обычно быстрее и стабильнее.
Запись без Excel и без табличного документа
Файл XLSX — это ZIP-архив с XML-файлами внутри, поэтому теоретически его можно сформировать программно через ЗаписьXML и упаковку. На практике такой путь оправдан редко: он трудоёмок и подвержен ошибкам в структуре. Гораздо чаще вместо него используют формат CSV или MXL.
CSV подходит, когда не нужны оформление и несколько листов: данные пишутся построчно через ЗаписьТекста с разделителем-точкой с запятой. Excel открывает такие файлы напрямую. Ограничения: нет форматирования, возможны проблемы с кодировкой (сохраняйте в UTF-8 с BOM) и с автоматическим преобразованием длинных чисел в экспоненциальную запись.
Сравнение вариантов
Универсальный, без Excel, сервер и клиент. Ограничение: большой расход памяти на сотнях тысяч строк
Полное форматирование и формулы. Ограничение: нужен установленный Office, только Windows, риск зависших процессов
Максимально быстро для огромных объёмов. Ограничение: нет оформления, один лист, нюансы с кодировкой
Полный контроль без зависимостей. Ограничение: высокая трудоёмкость, легко получить повреждённый файл
Запись на клиенте и на сервере: в чём разница
В клиент-серверном режиме код с директивой &НаСервере выполняется на сервере 1С, и путь C:\Выгрузка\ будет указывать на диск сервера, а не компьютера пользователя. Это типичная ошибка: файл успешно создаётся, но пользователь его не находит. Решение — записать файл во временное хранилище на сервере, а затем передать на клиент через ПолучитьФайл() или НачатьПолучениеФайлов().
На тонком и веб-клиенте прямой записи на диск нет: файл сначала помещается во временное хранилище, затем пользователю предлагается диалог сохранения. В тонком клиенте также недоступна работа с файловой системой без расширения работы с файлами — его нужно запросить через НачатьПодключениеРасширенияРаботыСФайлами().
Проверка результата и типичные ошибки
После записи откройте файл и проверьте три вещи: количество строк совпадает с источником, числа не превратились в текст (признак — зелёные треугольники в углу ячеек и невозможность посчитать сумму), даты отображаются корректно. Числа становятся текстом, когда в ячейку записывают строковое представление — записывайте значения числового типа, а не форматированные строки.
Частая проблема с COM — ошибка «Ошибка при вызове конструктора (COMОбъект)»: она означает, что Excel не установлен, разрядность Office не совпадает с разрядностью клиента 1С или COM-компонент не зарегистрирован. Проверьте разрядность: 64-битный клиент 1С требует 64-битный Office для прямого COM-подключения.
Как проверить результат
Открывается без предупреждений о повреждении
Сообщение о невозможности открыть или восстановлении содержимого
Совпадает с числом записей в источнике плюс шапка
Строк меньше — данные обрезаны или цикл завершился досрочно
Автосумма в Excel считает значения корректно
Ячейки с зелёным треугольником, сумма равна нулю
Кириллица читается при открытии
Кракозябры — файл сохранён не в UTF-8 с BOM
FAQ
Что важно запомнить
Основной способ записи из 1С в Excel — табличный документ с методом Записать() в формате XLSX: он работает везде и не требует Office. COM-объект оставьте для задач со сложным форматированием и всегда закрывайте Excel через Quit(). Проверяйте, где выполняется код, и не забывайте про лимиты строк и типы данных.
Можно ли записать файл Excel на сервере 1С без установленного Office?
Да. Табличный документ сохраняется в XLSX штатными средствами платформы и не требует Excel ни на сервере, ни на клиенте. Достаточно заполнить объект ТабличныйДокумент и вызвать Записать() с типом ТипФайлаТабличногоДокумента.XLSX.
Почему возникает ошибка при создании COMОбъект("Excel.Application")?
Чаще всего Excel не установлен на машине, где выполняется код, либо разрядность Office не совпадает с разрядностью клиента 1С. Также COM недоступен на Linux-сервере и в веб-клиенте. Проверьте установку Office и разрядность обеих программ.
Как записать числа, чтобы в Excel считались суммы?
Передавайте в ячейку значения числового типа, а не строки с форматированием. В табличном документе задайте параметру области числовое значение, в COM используйте Value с числом. Строки вида «1 234,56» Excel воспринимает как текст.
Что делать, если строк больше миллиона?
Лист XLSX вмещает около миллиона строк. Разбейте данные на несколько листов или файлов, либо выгружайте в CSV — он не имеет жёсткого лимита, хотя Excel при открытии всё равно покажет только первый миллион строк.
Как передать файл пользователю, если запись выполняется на сервере?
Запишите файл во временный каталог сервера, поместите его во временное хранилище функцией ПоместитьВоВременноеХранилище(), а на клиенте получите через диалог сохранения или НачатьПолучениеФайлов(). Прямая запись на диск пользователя с сервера невозможна.
Чем отличается сохранение в XLS от XLSX?
XLS — устаревший формат с ограничением около 65 тысяч строк, нужен только для совместимости со старыми версиями Excel. XLSX — современный формат с большим лимитом строк и меньшим размером файла, используйте его по умолчанию.