Выгрузка в Excel из 1С 8.3: от кнопки «Сохранить» до кода на встроенном языке

· 9 мин

Содержание

Чтобы создать файл 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 штатно.

Отчёт

  1. Сформируйте отчёт как обычно.
  2. Щёлкните в любом месте результата, чтобы фокус был на таблице.
  3. Нажмите Ctrl+S или кнопку с дискетой на панели отчёта.
  4. В окне сохранения выберите тип файла с расширением *.xlsx и укажите имя.

В веб-клиенте файл скачается через браузер в папку загрузок.

Печатная форма

В окне печати (счёт, накладная, акт) есть кнопка сохранения. Она открывает диалог, где можно отметить сразу несколько форматов: Excel, PDF, Word. Там же выбирается, сохранить ли файл на компьютер или присоединить его к документу. Рядом кнопка отправки по почте: вложение тоже можно сразу сделать в xlsx.

Список справочника или журнала документов

  1. Откройте список, например номенклатуру.
  2. Настройте отбор и колонки, если нужно.
  3. Выберите Ещё → Вывести список....
  4. Оставьте вывод в табличный документ и нажмите «ОК».
  5. Сохраните результат через 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

Рассылки отчётов

В типовых конфигурациях на БСП регулярная выгрузка настраивается без кода. Включите рассылки в Администрирование → Печатные формы, отчеты и обработки, затем создайте рассылку:

  1. Выберите один или несколько отчётов с нужными вариантами и настройками.
  2. Укажите формат — Excel (xlsx).
  3. Задайте получателей: почта, сетевая папка или FTP.
  4. Настройте расписание: например, каждый понедельник в 7:00.

Рассылку выполняет регламентное задание. В файловой базе оно работает только пока открыт хотя бы один сеанс, поэтому для надёжной ночной выгрузки нужна клиент-серверная база .

Своё регламентное задание

Если нужна нестандартная выгрузка, пишут регламентное задание с кодом из раздела про табличный документ. Оно формирует ТабличныйДокумент на сервере и пишет файл сразу в сетевую папку. Учтите два момента:

  • 👤 файл пишет не пользователь, а учётная запись службы сервера 1С — права на папку нужны ей;
  • 🚫 COM-Excel в серверном задании не используйте: Microsoft не поддерживает автоматизацию Office без интерактивного пользователя, процессы зависают.

Для пакетной выгрузки из одной обработки (например, 50 отчётов по подразделениям) формируйте документы в цикле и пишите каждый в свой файл. Имя собирайте из реквизитов: "Остатки_" + КодСклада + ".xlsx".

Ошибки и несовместимость при создании файла Excel

Диагностика: выберите симптом

Частые вопросы

Можно ли создать файл Excel из 1С, если Excel не установлен?
Да. Сохранение через Ctrl+S и метод ТабличныйДокумент.Записать() формируют xlsx средствами платформы. Excel нужен только для COM-соединения.
Как сделать несколько листов в одной книге?
Штатный метод записи сохраняет один табличный документ в один лист. Для нескольких листов используйте COM с Excel или соберите xlsx вручную по OpenXML.
Как сразу открыть выгруженный файл в Excel?
После сохранения на клиенте вызовите НачатьЗапускПриложения с путём к файлу: он откроется в программе, связанной с расширением xlsx.
Почему файл открывается в Excel, но формулы в нём не считаются?
Табличный документ сохраняет значения, а не формулы Excel. Нужны формулы — дописывайте их через COM, свойство Formula ячейки.
Можно ли выгрузить в Excel из 1С 8.3 через буфер обмена большой отчёт?
Можно, но на десятках тысяч строк копирование тормозит и портит длинные числа. Для больших объёмов сохраняйте в файл.