Почему не работает АвтоМасштаб при сохранении табличного документа 1С в Excel и как это исправить?

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

При работе с печатными формами в 1С часто возникает задача подгнать ширину документа под размер одного листа. Для этого в коде платформы используется свойство АвтоМасштаб = Истина. На экране или при прямой печати из платформы 1С документ действительно идеально умещается по ширине страницы. Однако если сохранить сформированный табличный документ в файл формата Excel (XLS или XLSX) с помощью метода Записать(), то при открытии файла в MS Excel автоподгонка сбрасывается, и таблица вылезает за границы листа.

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

Причина проблемы и особенности платформы 1С

Проанализируем механику работы платформы 1С с файлами Excel. Когда мы вызываем команду сохранения табличного документа:

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

Встроенный конвертер 1С передает данные ячеек, их стили, границы, ориентацию страницы и поля. Однако параметр АвтоМасштаб в 1С является динамическим алгоритмом самого отображения печатной формы в окне 1С. В спецификации файлов Excel для автоматической подгонки листа под ширину требуются специальные параметры разметки (такие как FitToPage, FitToPagesWide и отключение фиксированного масштабирования Zoom = False).

Штатный механизм записи файлов в 1С эти специфические параметры разметки Excel в итоговую структуру файла не заносит. В результате MS Excel открывает полученную таблицу с масштабом по умолчанию (100%). Кроме того, при переходе с версии 1С 8.1 на 8.3 важно учитывать изменение в именовании свойств: вместо устаревшего ИмяПараметровПечати рекомендуется применять КлючПараметровПечати.

Способ 1. Использование фиксированного масштаба печати

Выясним наиболее простой и производительный способ решения задачи без привлекания сторонних библиотек и компонентов. Если ширина печатной формы фиксирована или ее примерный объем известен заранее, можно отказаться от динамического АвтоМасштаб и принудительно задать процент масштабирования с помощью свойства МасштабПечати.

В отличие от свойства АвтоМасштаб, числовой процент из свойства МасштабПечати платформа 1С корректно экспортирует в настройки разметки листа Excel (параметр Zoom).

Разберем пример кода:


ТабДокумент.АвтоМасштаб = Ложь;
ТабДокумент.МасштабПечати = 80; // Масштаб в процентах (например, 80%)
ТабДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ОТЧЕТА";
ТабДокумент.ОтображатьЗаголовки = Ложь;
ТабДокумент.ОтображатьСетку = Ложь;
ТабДокумент.Защита = Ложь;
ТабДокумент.ТолькоПросмотр = Истина;

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

В данном случае открытый в Excel документ сразу будет иметь установленный масштаб 80%, что позволит ширине таблицы уместиться на одном листе.

Способ 2. Корректировка сохраненного файла через COM-объект Excel

Если заранее неизвестно, насколько широкой получилась таблица, и требуется жестко задать условие «вместить по ширине на 1 страницу», можно отредактировать уже сохраненный файл Excel программно через COM-соединение. Этот вариант подходит для серверов или рабочих станций под управлением ОС Windows, где установлен Microsoft Excel.

Рассмотрим последовательность действий:

  1. Сохраняем табличный документ в файл через метод Записать().
  2. Подключаемся к приложению Excel через COMОбъект("Excel.Application").
  3. Открываем созданный файл и изменяем свойства PageSetup у нужного листа.
  4. Сохраняем и закрываем книга.

Посмотрим на практическую реализацию данного способа:


// 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: " + ОписаниеОшибки());
КонецПопытки;

Способ 3. Прямая модификация XML-структуры файла XLSX

Если сервер работает на Linux или в фоновом задании, где использование COM-объектов невозможно, можно применить прямой разбор структуры файла XLSX. Поскольку файл .xlsx представляет собой ZIP-архив с XML-файлами внутри, его можно доработать средствами 1С.

Разберем алгоритм по шагам:

  1. Сохраняем табличный документ из 1С в формате XLSX.
  2. Распаковываем полученный архив с помощью объекта ЧтениеZipФайла.
  3. В файле разметки листа (обычно это xl/worksheets/sheet1.xml) находим или создаем настройки печати:
    • В узел <sheetPr> добавляем атрибут <pageSetUpPr fitToPage="1"/>.
    • В тег <pageSetup> добавляем атрибуты fitToWidth="1" и fitToHeight="0".
  4. Упаковываем файлы обратно в ZIP-архив с помощью ЗаписьZipФайла с расширением XLSX.

Способ 4. Сохранение в формат PDF вместо Excel

Проанализируем альтернативный вариант. Если итоговый документ предназначен только для просмотра или отправки по электронной почте и не требует последующего редактирования пользователем в Excel, наиболее надежным решением будет экспорт в формат PDF.


ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.Записать(ПутьДок, ТипФайлаТабличногоДокумента.PDF);

При выгрузке в PDF встроенный движок 1С самостоятельно пересчитывает геометрические размеры всех областей с учетом установленного свойства АвтоМасштаб = Истина, благодаря чему документ сохраняет идеальный вид и корректно масштабируется по ширине страницы на любых устройствах и операционных системах.

← На главную