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

· 11 мин

Содержание

Создать файл Excel в 1С проще всего без Excel: заполните ТабличныйДокумент и вызовите ТД.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Платформа сама соберёт xlsx, причём и на клиенте, и на сервере под Linux. COM-объект Excel.Application нужен, только когда в книге должны быть живые формулы, автофильтр или несколько листов с особой логикой.

Пользователю программировать не нужно вообще: любой отчёт или печатную форму в 1С 8.3 можно сохранить в xlsx за три клика. Если же выгрузка нужна из обработки или по расписанию, пригодится готовый код на встроенном языке и разбор ошибок, на которых обычно спотыкаются.

Какой способ создания файла Excel выбрать

Перед тем как писать код, решите, что именно нужно получить. От этого зависит технология.

СпособКогда подходитНужен ли ExcelОграничения
Сохранить отчёт из интерфейсаРазовая выгрузка пользователемНетТолько то, что уже показывает отчёт
ТабличныйДокумент.ЗаписатьПрограммная выгрузка, обработки, регламентные заданияНетФормулы не переносятся, в файле только значения
COM Excel.ApplicationНужны формулы, автофильтр, сложная книгаДа, на том компьютере, где выполняется кодТолько Windows, медленно на больших объёмах
Сборка XLSX из XML и ZIPНестандартная структура книги без ExcelНетМного кода, нужно знать формат Office Open XML

Часто спрашивают про «объект XLSXWriter в 1С». Такого объекта в платформе нет: XlsxWriter — это библиотека для Python. Его роль в 1С выполняет тот же ТабличныйДокумент: быстро пишет xlsx без установленного Office. Если нужна полная свобода, файл собирают вручную через ЗаписьXML и ЗаписьZipФайла — об этом отдельный раздел ниже.

Правило практиков: данные формируйте табличным документом, а COM подключайте только для того, чего он не умеет. Можно даже совместить: сначала записать xlsx через ТабличныйДокумент, затем открыть его через COM и добавить формулы. Это в разы быстрее, чем заполнять Excel по одной ячейке.

Без программирования: сохранить отчёт или печатную форму в xlsx

Этот способ работает в любой типовой конфигурации на 8.3: Бухгалтерии 3.0, ЗУП 3.1, УТ 11, ERP.

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

У печатных форм в БСП-конфигурациях есть ещё вариант: кнопка сохранения в форме печати предлагает выбрать формат и сразу записать файл или прикрепить его к документу.

📌 Что важно знать о таком файле:

  • ✅ сохраняются шрифты, цвета, рамки, объединённые ячейки и ширина колонок;
  • ✅ суммы в отчётах на СКД обычно попадают в Excel числами, их можно складывать;
  • ⚠️ формул в файле нет — итоги записаны готовыми числами;
  • ⚠️ группировки строк отчёта переносятся, но вид «плюсиков» в Excel может отличаться.

Если суммы после открытия выровнены по левому краю и не складываются, значит, в отчёте они выведены текстом. Это решается на стороне разработчика, см. раздел про оформление.

Создание файла Excel в 1С через ТабличныйДокумент

Это основной программный способ. Код ниже работает в управляемой форме обработки: сервер формирует xlsx, клиент сохраняет его на диск пользователя.

&НаСервере
Функция СформироватьФайлНаСервере()

    ТД = Новый ТабличныйДокумент;

    Запрос = Новый Запрос;
    // Ваш запрос должен вернуть поля Наименование, Количество, Сумма
    Запрос.Текст = ТекстЗапроса();
    Выборка = Запрос.Выполнить().Выбрать();

    Заголовки = СтрРазделить("Номенклатура,Количество,Сумма", ",");
    Для Кол = 1 По Заголовки.Количество() Цикл
        Обл = ТД.Область(1, Кол, 1, Кол);
        Обл.Текст = Заголовки[Кол - 1];
        Обл.Шрифт = Новый Шрифт(Обл.Шрифт, , , Истина);
        Обл.ЦветФона = WebЦвета.СветлоСерый;
    КонецЦикла;

    Стр = 1;
    Пока Выборка.Следующий() Цикл
        Стр = Стр + 1;
        ТД.Область(Стр, 1, Стр, 1).Текст = Выборка.Наименование;
        ЗаписатьЧисло(ТД, Стр, 2, Выборка.Количество, "ЧДЦ=3");
        ЗаписатьЧисло(ТД, Стр, 3, Выборка.Сумма, "ЧДЦ=2");
    КонецЦикла;

    ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
    ТД.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

    Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
    УдалитьФайлы(ИмяФайла);
    Возврат Адрес;

КонецФункции

&НаСервереБезКонтекста
Процедура ЗаписатьЧисло(ТД, Стр, Кол, Значение, ФорматЧисла)
    Обл = ТД.Область(Стр, Кол, Стр, Кол);
    Обл.СодержитЗначение = Истина;
    Обл.ТипЗначения = Новый ОписаниеТипов("Число");
    Обл.Значение = Значение;
    Обл.Формат = ФорматЧисла;
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
    Адрес = СформироватьФайлНаСервере();
    ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "Остатки.xlsx");
КонецПроцедуры

Как это работает по шагам:

  1. Табличный документ заполняется построчно. Область(Верх, Лево, Низ, Право) с одинаковыми координатами — это одна ячейка.
  2. Процедура ЗаписатьЧисло кладёт в ячейку значение типа «Число», а не строку. Именно поэтому Excel потом считает суммы.
  3. ПолучитьИмяВременногоФайла("xlsx") даёт путь во временном каталоге сервера, Записать создаёт файл.
  4. Файл превращается в двоичные данные, уходит во временное хранилище и удаляется с диска сервера.
  5. На клиенте ФайловаяСистемаКлиент.СохранитьФайл из БСП показывает диалог сохранения. В конфигурации без БСП используйте асинхронные методы платформы для получения файла с сервера.

Для отчётов с постоянной шапкой удобнее нарисовать макет в Конфигураторе: области «Шапка» и «Строка» с параметрами. Тогда оформление настраивается мышью, а код сводится к Макет.ПолучитьОбласть, заполнению Параметры и ТД.Вывести.

Тот же Записать умеет и другие форматы: XLS (старый формат Excel 97–2003), ODS, PDF, DOCX, MXL. Тип выбирается значением перечисления ТипФайлаТабличногоДокумента.

Создание книги Excel через COM-соединение

COM даёт полный доступ к объектной модели Excel: всё, что можно сделать руками в Excel, можно сделать из кода 1С. Цена — Excel должен стоять на том компьютере, где выполняется код, а скорость падает на каждой ячейке.

&НаКлиенте
Процедура СоздатьКнигуЧерезCOM(Команда)

    Данные = ПолучитьДанныеНаСервере(); // Массив структур: Наименование, Количество, Сумма

    Попытка
        Excel = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Не удалось запустить Excel: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    Попытка
        Excel.DisplayAlerts = Ложь;
        Книга = Excel.Workbooks.Add();
        Лист = Книга.Worksheets(1);
        Лист.Name = "Остатки";

        Лист.Cells(1, 1).Value = "Номенклатура";
        Лист.Cells(1, 2).Value = "Количество";
        Лист.Cells(1, 3).Value = "Сумма";

        Стр = 1;
        Для Каждого Строка Из Данные Цикл
            Стр = Стр + 1;
            Лист.Cells(Стр, 1).Value = Строка.Наименование;
            Лист.Cells(Стр, 2).Value = Строка.Количество;
            Лист.Cells(Стр, 3).Value = Строка.Сумма;
        КонецЦикла;

        Лист.Cells(Стр + 1, 3).Formula = "=SUM(C2:C" + Формат(Стр, "ЧГ=0") + ")";

        Книга.SaveAs("C:\Выгрузка\Остатки.xlsx", 51);
        Книга.Close(Ложь);
        Excel.Quit();
    Исключение
        Excel.Quit();
        ВызватьИсключение;
    КонецПопытки;

КонецПроцедуры

Детали, которые решают, заработает ли код:

  • 🔹 51 во втором параметре SaveAs — это формат xlsx (константа Excel xlOpenXMLWorkbook). Без него Excel может записать файл в формате по умолчанию.
  • 🔹 DisplayAlerts = Ложь отключает вопрос «Файл уже существует, заменить?». Иначе невидимый Excel повиснет в ожидании ответа.
  • 🔹 Свойство Formula принимает английские имена функций и запятую-разделитель аргументов: =SUM(...), =IF(A1>0,1,0). Для русских имён есть FormulaLocal.
  • 🔹 Номер строки склеивайте через Формат(Стр, "ЧГ=0"), иначе при 1000 строк получится C1 000 с пробелом.
  • 🔹 Excel.Quit() вызывается и в ветке ошибки. Без этого в диспетчере задач копятся процессы EXCEL.EXE.

COM-автоматизацию Excel на сервере 1С лучше не использовать. Служба сервера работает под отдельной учётной записью без рабочего стола, Microsoft такой сценарий не поддерживает, а зависший Excel блокирует рабочий процесс. На сервере пишите через ТабличныйДокумент.

Чтобы ускорить заполнение, данные передают в Excel не по ячейке, а одним присвоением диапазону. Для этого в 1С есть объект COMSafeArray: заполняете массив и пишете его в Range(...).Value целиком. Ещё проще описанный выше приём: сформировать xlsx табличным документом, а через COM открыть его методом Excel.Workbooks.Open(Путь) и только добавить формулы.

Оформление: шрифты, числа, ширина колонок, формулы

Оформление задаётся по-разному в зависимости от технологии. Ниже — самые нужные свойства для обоих путей.

Что нужноТабличныйДокументCOM Excel
Жирный шрифтОбл.Шрифт = Новый Шрифт(Обл.Шрифт, , , Истина)Лист.Range("A1:C1").Font.Bold = Истина
ЗаливкаОбл.ЦветФона = WebЦвета.СветлоСерыйЛист.Range("A1:C1").Interior.Color = 15921906
Формат числаОбл.Формат = "ЧДЦ=2"Лист.Range("C:C").NumberFormat = "#,##0.00"
Ширина колонкиТД.Область("C3").ШиринаКолонки = 40Лист.Columns("A:C").AutoFit()
РамкиОбл.Обвести(Линия, Линия, Линия, Линия)Лист.Range("A1:C10").Borders.LineStyle = 1
Закрепить шапкуТД.ФиксацияСверху = 1через окно книги ActiveWindow
АвтофильтрнетЛист.Range("A1:C1").AutoFilter()
Формуланет, только значение.Formula = "=SUM(C2:C10)"

Число 15921906 в таблице — это светло-серый RGB(242, 242, 242), посчитанный по формуле Excel: 242 + 242×256 + 242×65536. Excel хранит цвет в порядке «синий-зелёный-красный», поэтому формула именно такая.

Для рамок в табличном документе создайте линию заранее: Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1).

Почему числа превращаются в текст

Самая частая претензия к выгрузке: в Excel суммы лежат слева, с зелёным треугольником, и СУММ даёт ноль. Причина одна: в ячейку табличного документа записали строку. Обычно так выглядит код с Обл.Текст = Формат(Сумма, "ЧДЦ=2").

Исправление — писать значение, а не текст: СодержитЗначение = Истина, ТипЗначения числовой, Значение — само число, а внешний вид задаёт свойство Формат. В макетах то же самое настраивается в свойствах ячейки: заполнение «Параметр» и тип значения «Число».

Даты

С датами та же история. Запишите в ячейку значение типа «Дата» с Формат = "ДФ=dd.MM.yyyy", и Excel распознает настоящую дату, по которой работают сортировка и фильтр.

Сборка XLSX вручную через ZIP и XML

Файл xlsx — это ZIP-архив с XML-файлами внутри. Когда табличного документа мало (например, нужна книга с десятью листами, именованными диапазонами или проверкой данных), а Excel на сервере ставить нельзя, книгу собирают сами.

Минимальный набор файлов внутри архива:

  1. [Content_Types].xml — типы содержимого частей пакета.
  2. _rels/.rels — ссылка на основную часть, книгу.
  3. xl/workbook.xml — список листов.
  4. xl/_rels/workbook.xml.rels — связь книги с файлами листов.
  5. xl/worksheets/sheet1.xml — сами данные: строки <row> и ячейки <c>.

Стили (xl/styles.xml) и общий словарь строк (xl/sharedStrings.xml) необязательны. Строку можно записать прямо в ячейку, указав атрибут t="inlineStr".

В 1С каждый XML-файл формируется объектом ЗаписьXML во временный каталог, а архив собирается через ЗаписьZipФайла: метод Добавить для каждого файла с сохранением относительных путей, затем Записать. Расширение готового архива меняете на .xlsx.

Способ трудоёмкий: ошибка в одном атрибуте — и Excel откроет файл с сообщением о повреждённом содержимом. Берите его, только если первые два варианта точно не подходят.

Ошибки при записи и сохранении файла

Большинство сбоев сводится к правам на каталог, занятому файлу или отсутствию Excel. Выберите свой симптом:

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

Ещё два ограничения Excel, о которые спотыкаются при выгрузке из 1С: в ячейке помещается не больше 32 767 символов, а имя листа — не длиннее 31 символа и без знаков \ / ? * [ ] :. Длинные комментарии к документам и названия контрагентов в имени листа лучше заранее обрезать.

Выгрузка в Excel по расписанию

Когда один и тот же файл нужен каждое утро, ручную выгрузку заменяют автоматической. Вариантов три.

Рассылка отчётов. В типовых конфигурациях на БСП есть подсистема рассылки отчётов. Она по расписанию формирует выбранный отчёт и отправляет его на почту или кладёт в папку, формат файла — в том числе xlsx. Программировать ничего не нужно, настраивает администратор базы.

Регламентное задание. Разработчик добавляет в конфигурацию или расширение регламентное задание с расписанием и общий модуль с процедурой выгрузки. Внутри — тот же код с ТабличныйДокумент.Записать, только без клиентской части: файл пишется сразу в сетевую папку или отправляется письмом. COM здесь не годится по причинам, описанным выше.

Дополнительная обработка. Во многих типовых конфигурациях внешнюю обработку можно подключить как дополнительную и назначить ей расписание без правки конфигурации.

Особенность файловой базы: регламентные задания выполняет один из запущенных клиентских сеансов. Если ночью базу никто не открывает, выгрузка не сработает. Для надёжной работы по расписанию нужна клиент-серверная база либо сеанс, запущенный с параметром /AllowExecuteScheduledJobs -Force.

Проверка перед запуском выгрузки по расписанию
Выполнено: 0 / 6

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

Можно ли создать файл Excel в веб-клиенте 1С?
Да, через табличный документ: файл формируется на сервере и передаётся браузеру для сохранения. COM-объекты в веб-клиенте недоступны.
Чем отличается XLS от XLSX при записи из 1С?
XLS — двоичный формат Excel 97–2003 с лимитом 65 536 строк. XLSX — современный формат на XML, вмещает больше миллиона строк и меньше весит. Если получатель не работает в Excel 2003, выбирайте XLSX.
Откроется ли файл, созданный 1С, в LibreOffice или МойОфис?
Да. Табличный документ пишет стандартный xlsx, его открывают все распространённые редакторы. Для LibreOffice можно сразу сохранить ODS.
Как выгрузить в Excel несколько листов без COM?
Один табличный документ даёт один лист. Для книги с несколькими листами откройте записанный файл через COM и добавьте листы либо соберите xlsx вручную через ZIP и XML.
Почему выгрузка через COM идёт десятки минут?
Каждое обращение к Cells — отдельный вызов между процессами 1С и Excel. На 10 000 строк по 10 колонок это 100 000 вызовов. Пишите данные массивом в диапазон или формируйте файл табличным документом.