При работе в 1С:Предприятие 7.7 разработчики часто сталкиваются с ограничениями штатных механизмов печати. Популярным решением является использование внешней компоненты Йоксель (SpreadSheet.dll), которая значительно расширяет возможности работы с табличными документами. Однако при попытке экспортировать результат в формат PDF через встроенный графический конвертер возникают сложности: шрифты могут "поплыть", текст перестает помещаться на страницу А4, а привычные колонтитулы 1С пропадают. В этой статье мы подробно разберем, как победить эти проблемы программными методами и с помощью сторонних инструментов.
Прежде чем переходить к коду, проанализируем ситуацию. Графический конвертер Йокселя использует системные механизмы GDI для отрисовки документа. В отличие от современных версий 1С (8.3), где экспорт в PDF является нативным, в 1С 7.7 через Йоксель происходит фактически "рисование" документа в векторный или растровый формат внутри контейнера PDF. Основные причины неудач при конвертации следующие:
АвтоМасштаб, установленный в таблице 1С, не передается автоматически в конвертер PDF. Нам придется рассчитывать его вручную.ГрафическийКонвертер.PDF не умеет подхватывать стандартные Header/Footer из настроек печати 1С.Рассмотрим наиболее гибкий вариант — ручное управление размерами страницы через объект Йоксель.ГрафическийКонвертер.PDF. Чтобы документ всегда вписывался в формат А4 (будь то книжная или альбомная ориентация), мы должны вычислить коэффициент масштабирования исходя из реальной ширины области печати.
Разберем по шагам алгоритм, предложенный опытными разработчиками:
// Определим константу для перевода миллиметров в твипы
ТвиповНаМиллиметр = 56.7;
// Создаем объекты Йокселя
Йоксель = СоздатьОбъект("ТабличныйДокумент");
Йоксель.ЗагрузитьИзТаблицы(АктивныйКонтекст); // Загружаем нашу печатную форму
// Рассчитываем реальные размеры содержимого
ШиринаТабДокумента = 0;
ВысотаТабДокумента = 0;
Йоксель.Область().РассчитатьРазмеры(ШиринаТабДокумента, ВысотаТабДокумента);
// Определяем ориентацию (если нужно автоматическое определение)
Если (ШиринаТабДокумента / ВысотаТабДокумента <= 1.3) Тогда
Ориентация = 1; // Портрет
Иначе
Ориентация = 2; // Альбом
КонецЕсли;
// Устанавливаем эталонные размеры листа A4 в твипах
Если Ориентация = 1 Тогда
ВыбШиринаСтраницы = 11909; // 210 мм
ВыбВысотаСтраницы = 16839; // 297 мм
Иначе
ВыбШиринаСтраницы = 16839;
ВыбВысотаСтраницы = 11909;
КонецЕсли;
// Задаем поля (например, по 5 мм)
ПолеСлева = 5 * ТвиповНаМиллиметр;
ПолеСправа = 5 * ТвиповНаМиллиметр;
ПолеСверху = 5 * ТвиповНаМиллиметр;
ПолеСнизу = 5 * ТвиповНаМиллиметр;
// Вычисляем коэффициент масштаба, чтобы все влезло по ширине
Масштаб = (ВыбШиринаСтраницы - ПолеСлева - ПолеСправа) / ШиринаТабДокумента;
// Настраиваем конвертер
Конвертер = СоздатьОбъект("Йоксель.ГрафическийКонвертер.PDF");
Конвертер.Документ = Йоксель;
// Важный нюанс: размеры страницы в конвертере задаются с учетом обратного масштаба
Конвертер.ШиринаСтраницы = ВыбШиринаСтраницы / Масштаб;
Конвертер.ВысотаСтраницы = (ВыбВысотаСтраницы) / Масштаб;
Конвертер.ПолеСлева = ПолеСлева / Масштаб;
Конвертер.ПолеСверху = ПолеСверху / Масштаб;
Конвертер.ПолеСправа = ПолеСправа / Масштаб;
Конвертер.ПолеСнизу = ПолеСнизу / Масштаб;
// Устанавливаем качество (битость)
Конвертер.КоличествоБитНаПиксел = 24;
// Сохраняем результат
Конвертер.ЗаписатьВФайл("C:\MyReport.pdf");
В данном примере мы используем РассчитатьРазмеры для получения фактической ширины данных. Это позволяет нам имитировать поведение "По ширине страницы". Обратите внимание, что при делении размеров на Масштаб мы фактически "растягиваем" виртуальный холст Йокселя, что при рендеринге в PDF дает эффект сжатия содержимого до размеров реального листа.
Если программный метод кажется слишком громоздким или если критически важна идеальная передача системных шрифтов и встроенных колонтитулов, проанализируем альтернативный путь. Использование виртуального принтера позволяет 1С 7.7 "думать", что она просто печатает документ на бумагу, в то время как драйвер принтера перехватывает поток и формирует PDF.
Посмотрим на популярные инструменты для этой задачи:
Преимущества этого подхода:
ПараметрыСтраницы().Если вы все же решили использовать ГрафическийКонвертер.PDF, но вам жизненно необходимы колонтитулы, выясним причину их отсутствия. Йоксель при конвертации в PDF не считывает настройки колонтитулов из объекта Таблица 1С.
Выходом из ситуации является программная имитация колонтитулов. Перед загрузкой таблицы в Йоксель нам необходимо:
НоваяСтраница() в таблице 1С, чтобы зафиксировать разрывы.Это трудоемкий процесс, требующий точного расчета высоты каждой строки, но он позволяет получить полностью контролируемый результат внутри одного PDF-файла без внешних зависимостей.
Проанализируем ситуацию со шрифтами. Часто в PDF текст превращается в "картинку", которую нельзя скопировать. Это происходит, если конвертер не может найти подходящий шрифт в системе или если параметры КоличествоБитНаПиксел установлены слишком низко.
Совет: Используйте стандартные шрифты (Arial, Times New Roman, Courier New). При использовании специфических шрифтов убедитесь, что они установлены на сервере или рабочей станции, где происходит конвертация. В объекте Йоксель.ГрафическийКонвертер.PDF также стоит поэкспериментировать с разрешением (DPI), чтобы найти баланс между качеством текста и размером файла.
Мы рассмотрели несколько способов решения проблемы "невлезания" печатных форм в PDF для 1С 7.7. Выбор метода зависит от ваших приоритетов:
Помните, что SpreadSheet.dll — инструмент мощный, но требующий ювелирной настройки каждой координаты. Надеемся, приведенные примеры кода помогут вам автоматизировать процесс формирования отчетности и избавят ваших пользователей от проблем с печатью.