Как корректно конвертировать табличные документы Йоксель в PDF в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе в 1С:Предприятие 7.7 разработчики часто сталкиваются с ограничениями штатных механизмов печати. Популярным решением является использование внешней компоненты Йоксель (SpreadSheet.dll), которая значительно расширяет возможности работы с табличными документами. Однако при попытке экспортировать результат в формат PDF через встроенный графический конвертер возникают сложности: шрифты могут "поплыть", текст перестает помещаться на страницу А4, а привычные колонтитулы 1С пропадают. В этой статье мы подробно разберем, как победить эти проблемы программными методами и с помощью сторонних инструментов.

Причина проблем: особенности движка Йокселя

Прежде чем переходить к коду, проанализируем ситуацию. Графический конвертер Йокселя использует системные механизмы GDI для отрисовки документа. В отличие от современных версий 1С (8.3), где экспорт в PDF является нативным, в 1С 7.7 через Йоксель происходит фактически "рисование" документа в векторный или растровый формат внутри контейнера PDF. Основные причины неудач при конвертации следующие:

  1. Отсутствие поддержки Автомасштаба: Параметр АвтоМасштаб, установленный в таблице 1С, не передается автоматически в конвертер PDF. Нам придется рассчитывать его вручную.
  2. Разница в единицах измерения: Йоксель оперирует твипами (Twips). Один миллиметр равен 56.7 твипа. Ошибки округления при расчете полей и ширины колонок приводят к тому, что документ "вылетает" за границы листа.
  3. Проблема колонтитулов: Объект ГрафическийКонвертер.PDF не умеет подхватывать стандартные Header/Footer из настроек печати 1С.

Решение 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 дает эффект сжатия содержимого до размеров реального листа.

Решение 2: Использование внешнего PDF-принтера

Если программный метод кажется слишком громоздким или если критически важна идеальная передача системных шрифтов и встроенных колонтитулов, проанализируем альтернативный путь. Использование виртуального принтера позволяет 1С 7.7 "думать", что она просто печатает документ на бумагу, в то время как драйвер принтера перехватывает поток и формирует PDF.

Посмотрим на популярные инструменты для этой задачи:

Преимущества этого подхода:

  1. Корректная обработка колонтитулов (Header/Footer), заданных в ПараметрыСтраницы().
  2. Шрифты выглядят идентично тому, что пользователь видит в предварительном просмотре 1С.
  3. Возможность объединения нескольких печатных форм в один PDF-файл.

Решение 3: Как вернуть колонтитулы в Йоксель?

Если вы все же решили использовать ГрафическийКонвертер.PDF, но вам жизненно необходимы колонтитулы, выясним причину их отсутствия. Йоксель при конвертации в PDF не считывает настройки колонтитулов из объекта Таблица 1С.

Выходом из ситуации является программная имитация колонтитулов. Перед загрузкой таблицы в Йоксель нам необходимо:

  1. Определить количество строк, которые помещаются на одну страницу.
  2. В цикле по страницам вставлять в начало и конец каждой страницы дополнительные строки с нужным текстом (например, "Страница №...").
  3. Использовать метод НоваяСтраница() в таблице 1С, чтобы зафиксировать разрывы.

Это трудоемкий процесс, требующий точного расчета высоты каждой строки, но он позволяет получить полностью контролируемый результат внутри одного PDF-файла без внешних зависимостей.

Важные рекомендации по работе с текстом

Проанализируем ситуацию со шрифтами. Часто в PDF текст превращается в "картинку", которую нельзя скопировать. Это происходит, если конвертер не может найти подходящий шрифт в системе или если параметры КоличествоБитНаПиксел установлены слишком низко.

Совет: Используйте стандартные шрифты (Arial, Times New Roman, Courier New). При использовании специфических шрифтов убедитесь, что они установлены на сервере или рабочей станции, где происходит конвертация. В объекте Йоксель.ГрафическийКонвертер.PDF также стоит поэкспериментировать с разрешением (DPI), чтобы найти баланс между качеством текста и размером файла.

Заключение

Мы рассмотрели несколько способов решения проблемы "невлезания" печатных форм в PDF для 1С 7.7. Выбор метода зависит от ваших приоритетов:

Помните, что SpreadSheet.dll — инструмент мощный, но требующий ювелирной настройки каждой координаты. Надеемся, приведенные примеры кода помогут вам автоматизировать процесс формирования отчетности и избавят ваших пользователей от проблем с печатью.

← На главную