Выгрузка в xlsx из 1С 8.3: от кнопки «Сохранить» до регламентного задания
Содержание
Создать файл 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.
- Сформируйте отчёт (ОСВ, анализ счёта, ведомость) или откройте печатную форму документа.
- Щёлкните мышью по табличной части с результатом, чтобы она стала активной.
- Нажмите
Ctrl+Sили кнопку с дискетой в командной панели отчёта. - В окне сохранения выберите тип файла xlsx и укажите имя.
У печатных форм в БСП-конфигурациях есть ещё вариант: кнопка сохранения в форме печати предлагает выбрать формат и сразу записать файл или прикрепить его к документу.
📌 Что важно знать о таком файле:
- ✅ сохраняются шрифты, цвета, рамки, объединённые ячейки и ширина колонок;
- ✅ суммы в отчётах на СКД обычно попадают в Excel числами, их можно складывать;
- ⚠️ формул в файле нет — итоги записаны готовыми числами;
- ⚠️ группировки строк отчёта переносятся, но вид «плюсиков» в Excel может отличаться.
Если суммы после открытия выровнены по левому краю и не складываются, значит, в отчёте они выведены текстом. Это решается на стороне разработчика, см. раздел про оформление.
Создание файла Excel в 1С через ТабличныйДокумент
Это основной программный способ. Код ниже работает в управляемой форме обработки: сервер формирует xlsx, клиент сохраняет его на диск пользователя.
&НаСервере
Функция СформироватьФайлНаСервере()
ТД = Новый ТабличныйДокумент;
Запрос = Новый Запрос;
// Ваш запрос должен вернуть поля Наименование, Количество, Сумма
Запрос.Текст = ТекстЗапроса();
Выборка = Запрос.Выполнить().Выбрать();
Заголовки = СтрРазделить("Номенклатура,Количество,Сумма", ",");
Для Кол = 1 По Заголовки.Количество() Цикл
Обл = ТД.Область(1, Кол, 1, Кол);
Обл.Текст = Заголовки[Кол - 1];
Обл.Шрифт = Новый Шрифт(Обл.Шрифт, , , Истина);
Обл.ЦветФона = WebЦвета.СветлоСерый;
КонецЦикла;
Стр = 1;
Пока Выборка.Следующий() Цикл
Стр = Стр + 1;
ТД.Область(Стр, 1, Стр, 1).Текст = Выборка.Наименование;
ЗаписатьЧисло(ТД, Стр, 2, Выборка.Количество, "ЧДЦ=3");
ЗаписатьЧисло(ТД, Стр, 3, Выборка.Сумма, "ЧДЦ=2");
КонецЦикла;
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТД.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
УдалитьФайлы(ИмяФайла);
Возврат Адрес;
КонецФункции
&НаСервереБезКонтекста
Процедура ЗаписатьЧисло(ТД, Стр, Кол, Значение, ФорматЧисла)
Обл = ТД.Область(Стр, Кол, Стр, Кол);
Обл.СодержитЗначение = Истина;
Обл.ТипЗначения = Новый ОписаниеТипов("Число");
Обл.Значение = Значение;
Обл.Формат = ФорматЧисла;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
Адрес = СформироватьФайлНаСервере();
ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "Остатки.xlsx");
КонецПроцедуры
Как это работает по шагам:
- Табличный документ заполняется построчно.
Область(Верх, Лево, Низ, Право)с одинаковыми координатами — это одна ячейка. - Процедура
ЗаписатьЧислокладёт в ячейку значение типа «Число», а не строку. Именно поэтому Excel потом считает суммы. ПолучитьИмяВременногоФайла("xlsx")даёт путь во временном каталоге сервера,Записатьсоздаёт файл.- Файл превращается в двоичные данные, уходит во временное хранилище и удаляется с диска сервера.
- На клиенте
ФайловаяСистемаКлиент.СохранитьФайлиз БСП показывает диалог сохранения. В конфигурации без БСП используйте асинхронные методы платформы для получения файла с сервера.
Для отчётов с постоянной шапкой удобнее нарисовать макет в Конфигураторе: области «Шапка» и «Строка» с параметрами. Тогда оформление настраивается мышью, а код сводится к Макет.ПолучитьОбласть, заполнению Параметры и ТД.Вывести.
Тот же Записать умеет и другие форматы: 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 (константа ExcelxlOpenXMLWorkbook). Без него 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 на сервере ставить нельзя, книгу собирают сами.
Минимальный набор файлов внутри архива:
[Content_Types].xml— типы содержимого частей пакета._rels/.rels— ссылка на основную часть, книгу.xl/workbook.xml— список листов.xl/_rels/workbook.xml.rels— связь книги с файлами листов.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.