Выгрузка в Excel из 1С 8.3: от кнопки «Сохранить» до кода на встроенном языке
Содержание
Чтобы создать файл Excel из 1С, откройте отчёт или печатную форму, нажмите Ctrl+S и выберите тип файла с расширением *.xlsx. Программисту то же самое даёт одна строка кода: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Excel на компьютере для этого не нужен, платформа пишет файл сама.
Сложности начинаются, когда нужно больше: формулы, несколько листов, выгрузка по расписанию, работа на сервере под Linux. Для каждого случая есть свой способ, и выбрать его лучше заранее, чем переписывать обработку после первого зависшего процесса EXCEL.EXE.
Какой способ выгрузки в Excel выбрать
Сначала короткое сравнение. Подробности по каждому способу — в разделах ниже.
| Способ | Когда подходит | Нужен ли Excel | Ограничения |
|---|---|---|---|
Сохранение вручную (Ctrl+S) | Разовая выгрузка отчёта, списка, печатной формы | Нет | Только то, что видно на экране |
ТабличныйДокумент.Записать() | Обработки, кнопки «Выгрузить», серверные задания | Нет | Один документ — один лист, без формул Excel |
COM-соединение Excel.Application | Формулы, несколько листов, диаграммы, автофильтр | Да, на той машине, где выполняется код | Только Windows, медленно при поячеечной записи |
| Сборка xlsx (OpenXML) вручную | Сервер на Linux, нестандартная структура книги | Нет | Много кода, нужно знать формат |
| Рассылки отчётов (БСП) | Регулярная выгрузка без программирования | Нет | Только отчёты, подключённые к рассылкам |
Для обычной выгрузки данных хватает табличного документа. COM берите, только когда без возможностей самого Excel никак: формулы, листы, диаграммы.
Как сохранить отчёт или печатную форму в Excel без программирования
Любой отчёт, печатная форма или список в 1С 8.3 выводится в табличный документ. А табличный документ платформа умеет сохранять в Excel штатно.
Отчёт
- Сформируйте отчёт как обычно.
- Щёлкните в любом месте результата, чтобы фокус был на таблице.
- Нажмите
Ctrl+Sили кнопку с дискетой на панели отчёта. - В окне сохранения выберите тип файла с расширением
*.xlsxи укажите имя.
В веб-клиенте файл скачается через браузер в папку загрузок.
Печатная форма
В окне печати (счёт, накладная, акт) есть кнопка сохранения. Она открывает диалог, где можно отметить сразу несколько форматов: Excel, PDF, Word. Там же выбирается, сохранить ли файл на компьютер или присоединить его к документу. Рядом кнопка отправки по почте: вложение тоже можно сразу сделать в xlsx.
Список справочника или журнала документов
- Откройте список, например номенклатуру.
- Настройте отбор и колонки, если нужно.
- Выберите
Ещё → Вывести список.... - Оставьте вывод в табличный документ и нажмите «ОК».
- Сохраните результат через
Ctrl+Sв xlsx.
Есть и быстрый путь: выделить строки в табличном документе, скопировать Ctrl+C и вставить в открытую книгу Excel. Для 20–30 строк так быстрее. Но длинные числа при вставке Excel может превратить в экспоненту: ИНН или номер счёта из 20 цифр станет 4,07E+19. Сохранение в файл этой проблемы обычно не даёт.
Создание файла Excel программно через табличный документ
Это основной способ для разработчика. Объект ТабличныйДокумент есть и на клиенте, и на сервере, а метод Записать() поддерживает форматы XLSX, XLS, ODS, MXL, PDF и другие. Excel и Office на машине не нужны, поэтому код работает и на сервере под Linux, и в веб-клиенте.
Пример: файл на сервере, сохранение на компьютер пользователя
&НаСервере
Функция СформироватьФайлНаСервере()
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область("R1C1").Текст = "Номенклатура";
ТабДок.Область("R1C2").Текст = "Количество";
ТабДок.Область("R1C1:R1C2").Шрифт = Новый Шрифт(, , Истина);
ТабДок.Область("R2C1").Текст = "Бумага А4";
ОбластьЧисла = ТабДок.Область("R2C2");
ОбластьЧисла.СодержитЗначение = Истина;
ОбластьЧисла.ТипЗначения = Новый ОписаниеТипов("Число");
ОбластьЧисла.Значение = 25;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
Данные = Новый ДвоичныеДанные(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
Адрес = СформироватьФайлНаСервере();
ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "Остатки.xlsx");
КонецПроцедуры
ФайловаяСистемаКлиент.СохранитьФайл — процедура Библиотеки стандартных подсистем. Она есть в БП 3.0, ЗУП 3.1, УТ 11 и других типовых. В самописной конфигурации без БСП используйте платформенные асинхронные методы получения файла с сервера.
Заполнение по макету
В реальной обработке ячейки по одной не заполняют. Рисуют макет с областями «Шапка» и «Строка», затем выводят:
Макет = ПолучитьМакет("МакетВыгрузки");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ТабДок.Вывести(ОбластьШапка);
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Шрифты, рамки, ширина колонок и объединения ячеек из макета переходят в Excel. Так оформление настраивается мышкой, а не кодом.
Записываете файл на сервере — путь указывается на сервере, а не на компьютере пользователя. C:\Выгрузка\ в коде серверной процедуры — это диск сервера 1С.
Выгрузка через COM-соединение с Excel
COM нужен, когда требуется то, чего табличный документ не умеет: живые формулы Excel, несколько листов в одной книге, автофильтр, диаграммы, защита листа. Код управляет настоящим Excel, поэтому он должен быть установлен там, где выполняется код. Обычно это клиент на Windows.
&НаКлиенте
Процедура ВыгрузитьЧерезCOM(Команда)
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось запустить Excel: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь;
Excel.ScreenUpdating = Ложь;
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
Лист.Name = "Остатки";
Лист.Cells(1, 1).Value = "Номенклатура";
Лист.Cells(1, 2).Value = "Количество";
Лист.Cells(1, 3).Value = "Цена";
Лист.Cells(1, 4).Value = "Сумма";
Лист.Range("A1:D1").Font.Bold = Истина;
Лист.Cells(2, 1).Value = "Бумага А4";
Лист.Cells(2, 2).Value = 25;
Лист.Cells(2, 3).Value = 350;
Лист.Range("D2").Formula = "=B2*C2";
Лист.Columns("A:D").AutoFit();
Книга.SaveAs("C:\Выгрузка\Остатки.xlsx", 51);
Книга.Close(Ложь);
Исключение
Сообщить("Ошибка при записи книги: " + ОписаниеОшибки());
КонецПопытки;
Excel.Quit();
КонецПроцедуры
Число 51 во втором параметре SaveAs — код формата xlsx (константа xlOpenXMLWorkbook). Без него Excel может сохранить книгу в формате по умолчанию, и расширение не совпадёт с содержимым. В ячейке D2 Excel посчитает сумму сам: 25 × 350 = 8 750.
Почему COM тормозит и как ускорить
Каждое обращение Cells(...).Value — отдельный вызов между процессами. На 10 000 строк по 10 колонок это 100 000 вызовов и несколько минут ожидания.
Что помогает:
- 🚀 отключить перерисовку:
Excel.ScreenUpdating = Ложь, как в примере; - 📦 передавать данные блоком: собрать значения в
COMSafeArrayи записать одним присваиванием вRange(...).Value; - 🔀 комбинировать способы: данные выгрузить табличным документом в xlsx, а COM-ом открыть готовый файл и дописать только формулы и автофильтр.
Третий приём на больших объёмах самый быстрый: тяжёлую работу делает платформа, Excel только «доводит» книгу.
Форматы OpenXML, ODS и сторонние инструменты
Файл xlsx — это ZIP-архив с XML-файлами внутри. Если Excel недоступен, а табличного документа мало (например, нужны несколько листов на сервере под Linux), книгу можно собрать вручную объектами ЗаписьZipФайла и ЗаписьXML.
Минимальный набор частей книги:
- 📄
[Content_Types].xml— типы содержимого; - 🔗
_rels/.relsиxl/_rels/workbook.xml.rels— связи частей; - 📘
xl/workbook.xml— список листов; - 📊
xl/worksheets/sheet1.xml,sheet2.xml— данные листов.
Строку можно записать прямо в ячейку, без отдельной таблицы общих строк:
<row r="1">
<c r="A1" t="inlineStr"><is><t>Бумага А4</t></is></c>
<c r="B1"><v>25</v></c>
</row>
Способ трудоёмкий, но даёт полный контроль и не зависит от Office. Практичный путь — взять шаблон: сохранить пустую книгу нужного вида из Excel, распаковать, положить XML-части в макет обработки и подставлять только данные листов.
ODS и LibreOffice
Формат ODS табличный документ пишет так же: ТипФайлаТабличногоДокумента.ODS. Excel такие файлы открывает. Если на сервере установлен LibreOffice, файл можно перевести в xlsx командой:
soffice --headless --convert-to xlsx --outdir C:\Выгрузка C:\Выгрузка\Остатки.ods
Сторонние .NET-библиотеки для работы с xlsx тоже подключают к 1С, но через COM-обёртку или внешнюю компоненту. Это вариант для своей разработки, в типовых конфигурациях его нет.
Настройка выгрузки: что сохраняется в Excel и как это контролировать
При записи табличного документа в xlsx переносится почти всё визуальное: шрифты, цвета, рамки, объединения, ширина колонок и высота строк. Чаще всего ломаются типы данных.
| Что видно в Excel | Причина | Что сделать в 1С |
|---|---|---|
| Числа выровнены влево, СУММ даёт 0 | Ячейка выведена как текст | Задать СодержитЗначение, ТипЗначения и Значение, а не Текст |
| Пробелы-разделители в числах мешают расчётам | Число отформатировано в строку с разделителем групп | Формат ЧГ=0 или вывод значением, а не текстом |
| ИНН, коды и счета стали числами | Длинная строка из цифр | Выводить как текст, не задавая числовой тип |
| Даты пришли строкой | Дата подставлена через Формат() | Передавать в ячейку значение типа «Дата» |
Ещё три настройки на стороне 1С:
- 🔤 выбирайте XLSX, а не XLS: у старого формата лимит 65 536 строк и 256 колонок, у xlsx — 1 048 576 строк и 16 384 колонки;
- 📏 ширину колонок задавайте в макете — в Excel она перейдёт как есть;
- 🧾 шапку над таблицей (название отчёта, параметры) отделяйте пустой строкой, иначе «Умная таблица» и автофильтр в Excel захватят её вместе с данными.
Автоматическая и пакетная выгрузка отчётов в Excel
Рассылки отчётов
В типовых конфигурациях на БСП регулярная выгрузка настраивается без кода. Включите рассылки в Администрирование → Печатные формы, отчеты и обработки, затем создайте рассылку:
- Выберите один или несколько отчётов с нужными вариантами и настройками.
- Укажите формат — Excel (xlsx).
- Задайте получателей: почта, сетевая папка или FTP.
- Настройте расписание: например, каждый понедельник в 7:00.
Рассылку выполняет регламентное задание. В файловой базе оно работает только пока открыт хотя бы один сеанс, поэтому для надёжной ночной выгрузки нужна клиент-серверная база .
Своё регламентное задание
Если нужна нестандартная выгрузка, пишут регламентное задание с кодом из раздела про табличный документ. Оно формирует ТабличныйДокумент на сервере и пишет файл сразу в сетевую папку. Учтите два момента:
- 👤 файл пишет не пользователь, а учётная запись службы сервера 1С — права на папку нужны ей;
- 🚫 COM-Excel в серверном задании не используйте: Microsoft не поддерживает автоматизацию Office без интерактивного пользователя, процессы зависают.
Для пакетной выгрузки из одной обработки (например, 50 отчётов по подразделениям) формируйте документы в цикле и пишите каждый в свой файл. Имя собирайте из реквизитов: "Остатки_" + КодСклада + ".xlsx".
Ошибки и несовместимость при создании файла Excel
Частые вопросы
Можно ли создать файл Excel из 1С, если Excel не установлен?
Ctrl+S и метод ТабличныйДокумент.Записать() формируют xlsx средствами платформы. Excel нужен только для COM-соединения.Как сделать несколько листов в одной книге?
Как сразу открыть выгруженный файл в Excel?
НачатьЗапускПриложения с путём к файлу: он откроется в программе, связанной с расширением xlsx.Почему файл открывается в Excel, но формулы в нём не считаются?
Formula ячейки.