При работе с печатными формами в 1С часто возникает задача подгнать ширину документа под размер одного листа. Для этого в коде платформы используется свойство АвтоМасштаб = Истина. На экране или при прямой печати из платформы 1С документ действительно идеально умещается по ширине страницы. Однако если сохранить сформированный табличный документ в файл формата Excel (XLS или XLSX) с помощью метода Записать(), то при открытии файла в MS Excel автоподгонка сбрасывается, и таблица вылезает за границы листа.
Рассмотрим подробно, почему возникают подобные сложности, как правильно подготавливать табличный документ в 1С 8.3 и какими способами можно добиться размещения таблицы по ширине страницы при экспорте в Excel.
Проанализируем механику работы платформы 1С с файлами Excel. Когда мы вызываем команду сохранения табличного документа:
ТабДокумент.Записать(ПутьДок, ТипФайлаТабличногоДокумента.XLSX);
Встроенный конвертер 1С передает данные ячеек, их стили, границы, ориентацию страницы и поля. Однако параметр АвтоМасштаб в 1С является динамическим алгоритмом самого отображения печатной формы в окне 1С. В спецификации файлов Excel для автоматической подгонки листа под ширину требуются специальные параметры разметки (такие как FitToPage, FitToPagesWide и отключение фиксированного масштабирования Zoom = False).
Штатный механизм записи файлов в 1С эти специфические параметры разметки Excel в итоговую структуру файла не заносит. В результате MS Excel открывает полученную таблицу с масштабом по умолчанию (100%). Кроме того, при переходе с версии 1С 8.1 на 8.3 важно учитывать изменение в именовании свойств: вместо устаревшего ИмяПараметровПечати рекомендуется применять КлючПараметровПечати.
Выясним наиболее простой и производительный способ решения задачи без привлекания сторонних библиотек и компонентов. Если ширина печатной формы фиксирована или ее примерный объем известен заранее, можно отказаться от динамического АвтоМасштаб и принудительно задать процент масштабирования с помощью свойства МасштабПечати.
В отличие от свойства АвтоМасштаб, числовой процент из свойства МасштабПечати платформа 1С корректно экспортирует в настройки разметки листа Excel (параметр Zoom).
Разберем пример кода:
ТабДокумент.АвтоМасштаб = Ложь;
ТабДокумент.МасштабПечати = 80; // Масштаб в процентах (например, 80%)
ТабДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ОТЧЕТА";
ТабДокумент.ОтображатьЗаголовки = Ложь;
ТабДокумент.ОтображатьСетку = Ложь;
ТабДокумент.Защита = Ложь;
ТабДокумент.ТолькоПросмотр = Истина;
ТабДокумент.Записать(ПутьДок, ТипФайлаТабличногоДокумента.XLSX);
В данном случае открытый в Excel документ сразу будет иметь установленный масштаб 80%, что позволит ширине таблицы уместиться на одном листе.
Если заранее неизвестно, насколько широкой получилась таблица, и требуется жестко задать условие «вместить по ширине на 1 страницу», можно отредактировать уже сохраненный файл Excel программно через COM-соединение. Этот вариант подходит для серверов или рабочих станций под управлением ОС Windows, где установлен Microsoft Excel.
Рассмотрим последовательность действий:
Записать().COMОбъект("Excel.Application").PageSetup у нужного листа.Посмотрим на практическую реализацию данного способа:
// 1. Сохраняем файл штатно
ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
// 2. Корректируем параметры страницы через COM
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Worksheets(1);
// Включаем подгонку по ширине страницы
Лист.PageSetup.Zoom = Ложь;
Лист.PageSetup.FitToPagesWide = 1; // Уместить на 1 страницу по ширине
Лист.PageSetup.FitToPagesTall = 0; // Количество страниц по высоте не ограничиваем
Книга.Save();
Excel.Quit();
Excel = Неопределено;
Исключение
Сообщить("Ошибка при настройке параметров печати в Excel: " + ОписаниеОшибки());
КонецПопытки;
Если сервер работает на Linux или в фоновом задании, где использование COM-объектов невозможно, можно применить прямой разбор структуры файла XLSX. Поскольку файл .xlsx представляет собой ZIP-архив с XML-файлами внутри, его можно доработать средствами 1С.
Разберем алгоритм по шагам:
ЧтениеZipФайла.xl/worksheets/sheet1.xml) находим или создаем настройки печати:
<sheetPr> добавляем атрибут <pageSetUpPr fitToPage="1"/>.<pageSetup> добавляем атрибуты fitToWidth="1" и fitToHeight="0".ЗаписьZipФайла с расширением XLSX.Проанализируем альтернативный вариант. Если итоговый документ предназначен только для просмотра или отправки по электронной почте и не требует последующего редактирования пользователем в Excel, наиболее надежным решением будет экспорт в формат PDF.
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.Записать(ПутьДок, ТипФайлаТабличногоДокумента.PDF);
При выгрузке в PDF встроенный движок 1С самостоятельно пересчитывает геометрические размеры всех областей с учетом установленного свойства АвтоМасштаб = Истина, благодаря чему документ сохраняет идеальный вид и корректно масштабируется по ширине страницы на любых устройствах и операционных системах.