Часто возникает ситуация, когда печатная форма, идеально выглядящая в 1С, после сохранения в Microsoft Excel "разъезжается" и не помещается по ширине на один лист формата А4. Если такие файлы создаются массово, например, для отправки клиентам по почте, ручная правка каждого документа становится трудоемкой и неудобной задачей. Давайте разберем, как решить эту проблему раз и навсегда, используя разные подходы: от простых настроек до программной автоматизации.
Проанализируем основные причины проблемы. Они кроются в различиях механизмов рендеринга и расчета ширины колонок в 1С и в Excel. То, что 1С считает достаточной шириной, Excel может интерпретировать иначе, добавляя свои отступы и учитывая настройки принтера по умолчанию. Наша задача — заставить Excel отображать документ так, как нам нужно, прямо в момент сохранения из 1С.
Это самый простой и быстрый способ, который стоит попробовать в первую очередь. Часто проблема решается небольшой корректировкой исходного макета печатной формы, для чего полезно изучить руководство по редактированию. Этот метод не требует программирования и доступен даже начинающим разработчикам.
Разберем по шагам, на что обратить внимание при создании внешней печатной формы:
Начните с небольшого уменьшения ширины самых "проблемных", широких колонок в макете. Сохраните конфигурацию, сформируйте отчет в режиме "Предприятие" и выгрузите в Excel. Проверьте результат. Повторяйте, пока не добьетесь нужного эффекта. Важный совет: оставляйте небольшой запас, не делайте ширину "впритык", так как на разных компьютерах с разными настройками результат может незначительно отличаться.
Arial, Times New Roman или Calibri.
Этот метод хорошо работает для большинства простых и умеренно сложных отчетов. Его главный плюс — простота, а минус — необходимость ручного подбора параметров.
Если правка макета не помогает или требуется гарантированный результат для сложных отчетов, можно прибегнуть к автоматизации через COM-объект. Этот способ позволяет программно управлять файлом Excel после его сохранения, устанавливая нужные параметры печати. Для этого на компьютере, где выполняется код (на сервере или на клиенте), должен быть установлен Microsoft Excel.
Основная идея — после сохранения табличного документа в файл, мы подключаемся к этому файлу через COMОбъект("Excel.Application") и задаем для листа свойство "Вписать в 1 страницу по ширине".
Посмотрим на пример кода (подобным образом может выполняться выгрузка с группировкой):
// Предполагается, что ТабДокумент уже сформирован
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
// Подключаемся к Excel через COM
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось подключиться к MS Excel. Проверьте, установлена ли программа.");
Возврат;
КонецПопытки;
// Открываем созданный нами файл
Книга = Excel.Workbooks.Open(ИмяФайла);
Лист = Книга.Worksheets(1); // Получаем первый лист
// --- Самое главное ---
// Устанавливаем параметры страницы для этого листа
Лист.PageSetup.Zoom = Ложь; // Отключаем ручное масштабирование
Лист.PageSetup.FitToPagesWide = 1; // Устанавливаем "вписать в 1 страницу по ширине"
Лист.PageSetup.FitToPagesTall = Ложь; // Отключаем ограничение по высоте (чтобы было сколько угодно страниц в высоту)
// Опционально: можно настроить поля, чтобы выиграть еще больше места
// Значения задаются в пунктах (1 дюйм = 72 пункта)
Лист.PageSetup.LeftMargin = Excel.Application.InchesToPoints(0.5);
Лист.PageSetup.RightMargin = Excel.Application.InchesToPoints(0.5);
Лист.PageSetup.TopMargin = Excel.Application.InchesToPoints(0.5);
Лист.PageSetup.BottomMargin = Excel.Application.InchesToPoints(0.5);
// Сохраняем изменения и закрываем файл
Книга.Save();
Книга.Close();
Excel.Quit();
// После этого файл по пути ИмяФайла готов к отправке
// и при открытии в Excel у него уже будут правильные настройки печати.
// ... код для отправки файла по почте или передачи пользователю
Этот метод является наиболее надежным для решения проблемы, так как он не зависит от "погрешностей" конвертации 1С, а напрямую устанавливает финальные настройки в самом Excel-файле.
Это продвинутый метод, который не требует установленного MS Excel на сервере. Файлы формата .xlsx по своей сути являются ZIP-архивами, внутри которых лежат XML-файлы с данными и настройками. Мы можем программно распаковать архив, внести изменения в нужный XML и запаковать обратно.
Для установки параметра "Вписать по ширине" необходимо найти XML-файл листа (обычно /xl/worksheets/sheet1.xml) и добавить в него тег <pageSetUpPr fitToPage="1"/> внутрь тега <sheetPr>.
Пример фрагмента XML-файла листа после модификации:
...
<sheetPr>
<pageSetUpPr fitToPage="1"/>
</sheetPr>
...
Этот способ требует работы с архиваторами (например, ЗаписьZipФайла и ЧтениеZipФайла в 1С) и объектами для работы с XML. Он сложнее в реализации, но дает полную независимость от стороннего ПО и отлично подходит для серверных операций.
Давайте зададимся вопросом: а действительно ли менеджерам нужен именно Excel-файл? В диалоге на форуме выяснилось, что файлы отправляются по электронной почте. Если получателю не нужно редактировать данные, а только просматривать и печатать, то идеальным решением будет сохранение в формате PDF.
Формат PDF гарантирует, что документ на любом устройстве будет выглядеть в точности так же, как в окне предварительного просмотра 1С, в отличие от сложных задач вроде печати книжкой. Все проблемы с шириной, шрифтами и разметкой исчезают.
Сохранить табличный документ в PDF очень просто:
ИмяФайлаPDF = "C:\Отчеты\МойОтчет.pdf";
ТабДокумент.Записать(ИмяФайлаPDF, ТипФайлаТабличногоДокумента.PDF);
Это самый надежный способ сохранить внешний вид документа. Предложите этот вариант пользователям — возможно, он полностью закроет их потребности и окажется самым простым и эффективным решением.
Таким образом, у нас есть целый арсенал средств для борьбы с "расползающимися" отчетами. Рекомендуем двигаться от простого к сложному: начните с правки макета, если не поможет — используйте программную настройку через COM, а для отправки неизменяемых документов смело выбирайте PDF.