Как выгрузить печатную форму из 1С в Excel с сохраненными параметрами печати?

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При формировании широких печатных форм в 1С (таких как документ Табель учета рабочего времени в конфигурации ЗУП 2.5) разработчики и пользователи часто сталкиваются с неудобством: после выгрузки таблицы в формат Excel и отправки файла по почте получатель при выводе на печать видит разорванные таблицы. По умолчанию документ открывается с книжной ориентацией страниц и стандартным масштабом, из-за чего правая часть колонок переносится на отдельные листы.

Разберем природу этой проблемы, выясним, где на самом деле хранятся параметры печати, и рассмотрим практические способы настройки альбомной ориентации и масштаба страницы прямо из 1С.

Почему стандартная выгрузка 1С не сохраняет параметры страницы

Распространено заблуждение, что параметры печати относятся исключительно к настройкам программы Microsoft Excel на конкретном компьютере. Это не так: форматы электронных таблиц содержат специальные служебные блоки для хранения разметки страницы, полей, ориентации и правил подгонки по ширине.

Проблема заключается в том, как платформа 1С выполняет экспорт. При сохранении табличного документа методом ТабличныйДокумент.Записать() в старый бинарный формат ТипФайлаТабличногоДокумента.XLS (Excel 97–2003) платформа корректно переносит значения, границы ячеек и оформление, но игнорирует свойства самого макета: ОриентацияСтраницы, АвтоМасштаб и ПоШиринеСтраницы. В результате созданный файл открывается со стандартными для Excel параметрами по умолчанию.

Для решения задачи рассмотрим несколько практических подходов: от программной модификации сформированного файла через OLE/COM до архитектурных альтернатив.

Способ 1. Постобработка файла через COM-объект Excel

Если на компьютере, где формируется отчет (или на рабочем месте пользователя), установлен Microsoft Office, мы можем применить следующий алгоритм: сохранить табличный документ во временный файл, открыть его программно через COM-соединение, применить требуемые параметры страницы через объект PageSetup, сохранить и отправить адресату.

Посмотрим на пример кода на встроенном языке 1С, выполняющий настройку ориентации, полей и масштабирования:


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

Попытка
    ExcelApp = Новый COMОбъект("Excel.Application");
    ExcelApp.DisplayAlerts = Ложь;
    ExcelApp.ScreenUpdating = Ложь;
    
    РабочаяКнига = ExcelApp.Workbooks.Open(ИмяФайла);
    Лист = РабочаяКнига.ActiveSheet;
    
    // Настройка ориентации: 1 - Портрет (xlPortrait), 2 - Альбом (xlLandscape)
    Лист.PageSetup.Orientation = 2;
    
    // Подгонка документа под ширину страницы
    Лист.PageSetup.Zoom = Ложь;
    Лист.PageSetup.FitToPagesWide = 1;
    Лист.PageSetup.FitToPagesTall = 0;
    
    // Установка полей документа (значения передаются в пунктах через перевод из сантиметров)
    Лист.PageSetup.LeftMargin   = ExcelApp.CentimetersToPoints(1.0);
    Лист.PageSetup.RightMargin  = ExcelApp.CentimetersToPoints(1.0);
    Лист.PageSetup.TopMargin    = ExcelApp.CentimetersToPoints(1.5);
    Лист.PageSetup.BottomMargin = ExcelApp.CentimetersToPoints(1.5);
    
    РабочаяКнига.Save();
    РабочаяКнига.Close();
    ExcelApp.Quit();
    
    // Теперь файл готов к прикреплению в электронное письмо
Исключение
    Если ExcelApp <> Неопределено Тогда
        ExcelApp.Quit();
    КонецЕсли;
    ВызватьИсключение "Ошибка при настройке параметров печати Excel: " + ОписаниеОшибки();
КонецПопытки;

Проанализируем важные свойства объекта PageSetup:

  1. Ориентация страницы (Orientation): принимает значение 2 (соответствует константе xlLandscape) для альбомного режима.
  2. Управление масштабированием (Zoom, FitToPagesWide, FitToPagesTall): если свойству Zoom присвоено значение Ложь, Excel включает режим масштабирования по страницам. Параметр FitToPagesWide = 1 сжимает таблицу до ширины одного листа, а FitToPagesTall = 0 оставляет количество страниц по высоте неограниченным, чтобы строки свободно распределялись вниз.

Ограничения использования COM-технологии

Несмотря на простоту реализации, решение через Excel.Application имеет технические ограничения, о которых необходимо помнить:

  1. Неприменимо на стороне сервера 1С: запуск компонентов MS Office в серверных процессах категорически не поддерживается Microsoft. Это приводит к зависаниям службы сервера, утечкам памяти и блокировкам модальными окнами.
  2. Зависимость от операционной системы: COM-объекты работают исключительно под управлением Windows и недоступны на серверах под Linux.
  3. Требование лицензий: на машине, выполняющей код, должен быть установлен и активирован пакет Microsoft Office.

Способ 2. Экспорт в формат XLSX вместо XLS

Если платформа 1С обновлена до актуальных релизов технологической платформы 8.3, функционал выгрузки в современный формат XLSX (OpenXML) работает значительно полнее, чем устаревший экспорт в XLS.

Разберем порядок действий при подготовке табличного документа:


// Устанавливаем параметры макета средствами 1С
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.ПоШиринеСтраницы = 1;

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

При выгрузке в формат XLSX платформа переносит параметры ОриентацияСтраницы и масштабирования внутрь разметки XML-файла. В большинстве современных версий платформы этого достаточно, чтобы документ открылся у конечного пользователя уже в альбомной ориентации без вызова сторонних COM-объектов.

Способ 3. Прямая модификация структуры XLSX (без Excel)

В серверном коде или на Linux-серверах, когда требуется гарантированно задать точные параметры разметки без участия Microsoft Office, можно применить постобработку архива XLSX штатным механизмом работы с архивами 1С.

Файл формата .xlsx представляет собой ZIP-контейнер. Посмотрим на логику решения:

  1. Сохраняем табличный документ в файл с расширением .zip.
  2. Распаковываем архив во временный каталог с помощью объекта ЧтениеZipФайла.
  3. Находим XML-файл рабочего листа (путь xl/worksheets/sheet1.xml).
  4. С помощью объектов ЧтениеXML и ЗаписьXML (или текстовой замены) корректируем атрибуты узла pageSetup, устанавливая orientation="landscape", а также включаем флаг fitToPage="1" в узле параметров листа sheetPr.
  5. Запаковываем измененные файлы обратно с помощью ЗаписьZipФайла и меняем расширение на .xlsx.

Этот способ полностью автономен, работает на любой платформе, выполняется мгновенно и не создает сторонних процессов в операционной системе.

Способ 4. Использование формата PDF для неизменяемых отчетов

Проанализируем бизнес-требования к задаче: если табель или расчетный лист отправляется адресату исключительно для проверки, подписания или печати, а редактирование цифр не требуется, оптимальным выбором будет отказ от формата электронных таблиц в пользу PDF.

Штатный метод 1С гарантированно фиксирует геометрические параметры макета в PDF:


ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.ПоШиринеСтраницы = 1;

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

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

← На главную