При формировании широких печатных форм в 1С (таких как документ Табель учета рабочего времени в конфигурации ЗУП 2.5) разработчики и пользователи часто сталкиваются с неудобством: после выгрузки таблицы в формат Excel и отправки файла по почте получатель при выводе на печать видит разорванные таблицы. По умолчанию документ открывается с книжной ориентацией страниц и стандартным масштабом, из-за чего правая часть колонок переносится на отдельные листы.
Разберем природу этой проблемы, выясним, где на самом деле хранятся параметры печати, и рассмотрим практические способы настройки альбомной ориентации и масштаба страницы прямо из 1С.
Распространено заблуждение, что параметры печати относятся исключительно к настройкам программы Microsoft Excel на конкретном компьютере. Это не так: форматы электронных таблиц содержат специальные служебные блоки для хранения разметки страницы, полей, ориентации и правил подгонки по ширине.
Проблема заключается в том, как платформа 1С выполняет экспорт. При сохранении табличного документа методом ТабличныйДокумент.Записать() в старый бинарный формат ТипФайлаТабличногоДокумента.XLS (Excel 97–2003) платформа корректно переносит значения, границы ячеек и оформление, но игнорирует свойства самого макета: ОриентацияСтраницы, АвтоМасштаб и ПоШиринеСтраницы. В результате созданный файл открывается со стандартными для Excel параметрами по умолчанию.
Для решения задачи рассмотрим несколько практических подходов: от программной модификации сформированного файла через OLE/COM до архитектурных альтернатив.
Если на компьютере, где формируется отчет (или на рабочем месте пользователя), установлен 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:
Orientation): принимает значение 2 (соответствует константе xlLandscape) для альбомного режима.Zoom, FitToPagesWide, FitToPagesTall): если свойству Zoom присвоено значение Ложь, Excel включает режим масштабирования по страницам. Параметр FitToPagesWide = 1 сжимает таблицу до ширины одного листа, а FitToPagesTall = 0 оставляет количество страниц по высоте неограниченным, чтобы строки свободно распределялись вниз.Несмотря на простоту реализации, решение через Excel.Application имеет технические ограничения, о которых необходимо помнить:
Если платформа 1С обновлена до актуальных релизов технологической платформы 8.3, функционал выгрузки в современный формат XLSX (OpenXML) работает значительно полнее, чем устаревший экспорт в XLS.
Разберем порядок действий при подготовке табличного документа:
// Устанавливаем параметры макета средствами 1С
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.ПоШиринеСтраницы = 1;
// Сохраняем документ в формате OpenXML
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
При выгрузке в формат XLSX платформа переносит параметры ОриентацияСтраницы и масштабирования внутрь разметки XML-файла. В большинстве современных версий платформы этого достаточно, чтобы документ открылся у конечного пользователя уже в альбомной ориентации без вызова сторонних COM-объектов.
В серверном коде или на Linux-серверах, когда требуется гарантированно задать точные параметры разметки без участия Microsoft Office, можно применить постобработку архива XLSX штатным механизмом работы с архивами 1С.
Файл формата .xlsx представляет собой ZIP-контейнер. Посмотрим на логику решения:
.zip.ЧтениеZipФайла.xl/worksheets/sheet1.xml).ЧтениеXML и ЗаписьXML (или текстовой замены) корректируем атрибуты узла pageSetup, устанавливая orientation="landscape", а также включаем флаг fitToPage="1" в узле параметров листа sheetPr.ЗаписьZipФайла и меняем расширение на .xlsx.Этот способ полностью автономен, работает на любой платформе, выполняется мгновенно и не создает сторонних процессов в операционной системе.
Проанализируем бизнес-требования к задаче: если табель или расчетный лист отправляется адресату исключительно для проверки, подписания или печати, а редактирование цифр не требуется, оптимальным выбором будет отказ от формата электронных таблиц в пользу PDF.
Штатный метод 1С гарантированно фиксирует геометрические параметры макета в PDF:
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.ПоШиринеСтраницы = 1;
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Файл PDF сохраняет фиксированные границы, корректную альбомную ориентацию и отправляется на принтер нажатием одной кнопки без необходимости предварительного форматирования пользователем.