При автоматизации выгрузки печатных форм из платформы 1С 7.7 в формат PDF разработчики часто сталкиваются с проблемой искажения разметки. Табличный документ (Moxcel), который на экране и при обычной печати идеально умещается по ширине страницы, после конвертации через внешние библиотеки (например, Yoksel) выгружается с нарушением ориентации, полей или обрезкой колонок. Разберем причины такого поведения платформы и детально рассмотрим несколько рабочих способов решения этой задачи.
Выясним причину, почему прямой перенос таблицы через компоненту не всегда сохраняет разметку печати:
Таблица не предоставляет разработчику штатных методов для чтения параметров уже сформированного табличного документа (полей, ориентации, масштабирования «по ширине листа»). Метод ПараметрыСтраницы() позволяет только задавать свойства перед выводом, но не считывать их из открытого окна.Проанализируем наиболее надежный и универсальный вариант. При отправке таблицы на печать штатным методом платформы Таблица.Напечатать(0) 1С 7.7 самостоятельно передает драйверу принтера все установленные параметры: ориентацию, поля и масштаб. Чтобы сформировать файл PDF в фоновом режиме без вывода диалоговых окон, используются виртуальные принтеры с COM-интерфейсом (например, PDFCreator версий 1.x или BullZip PDF Printer).
Рассмотрим по шагам логику настройки такого процесса:
Посмотрим на пример управления очередью печати через COM-объект PDFCreator.clsPDFCreator:
// Инициализация COM-объекта принтера
PDFApp = СоздатьОбъект("PDFCreator.clsPDFCreator");
Если PDFApp.cStart("/NoProcessingAtStartup") = 0 Тогда
Предупреждение("Не удалось инициализировать PDFCreator");
Возврат;
КонецЕсли;
ИмяФайла = "Document_" + НомерДок + ".pdf";
КаталогВыгрузки = "C:\PDF_Export\";
// Настройка параметров автоматического сохранения
PDFApp.cOption("UseAutosave") = 1;
PDFApp.cOption("UseAutosaveDirectory") = 1;
PDFApp.cOption("AutosaveDirectory") = КаталогВыгрузки;
PDFApp.cOption("AutosaveFilename") = ИмяФайла;
PDFApp.cOption("AutosaveFormat") = 0; // 0 - формат PDF
PDFApp.cClearCache();
// Печать таблицы 1С на установленный виртуальный принтер
Таб.ПараметрыСтраницы(,,,,"PDFCreator");
Таб.Напечатать(0);
// Запуск обработки очереди и ожидание готовности файла
PDFApp.cPrinterStop = 0;
ВремяОжидания = 0;
Пока (PDFApp.cOutputFilename = "") И (ВремяОжидания < 30) Цикл
PDFApp.cSleep(500);
ВремяОжидания = ВремяОжидания + 1;
КонецЦикла;
PDFApp.cClose();
Если требуется формировать документы строго внутри процесса без использования служб печати, разберем подход с ручным расчетом геометрии через методы компоненты ТабличныйДокумент.
Для корректного размещения таблицы на листе выполним расчет физических габаритов выводимой области:
РассчитатьРазмеры(Ширина, Высота) для рабочей области. Метод возвращает габариты таблицы в твипах (1 мм ≈ 56.7 твипа).Ориентация (1 — книжная, 2 — альбомная).
// Пример настройки параметров страницы перед экспортом
ТабДок = СоздатьОбъект("ТабличныйДокумент");
ТабДок.ЗагрузитьИзТаблицы(Таб);
Ширина = 0;
Высота = 0;
ТабДок.Область().РассчитатьРазмеры(Ширина, Высота);
// Если ширина таблицы превышает стандартный размер листа А4 за вычетом полей
Если Ширина > 10500 Тогда
// Устанавливаем альбомную ориентацию
ТабДок.ПараметрыСтраницы.Ориентация = 2;
Иначе
ТабДок.ПараметрыСтраницы.Ориентация = 1;
КонецЕсли;
// Конвертация в PDF
Конвертер = СоздатьОбъект("КонвертерТабличногоДокументаВPDF");
Конвертер.ТабличныйДокумент = ТабДок;
Конвертер.ЗаписатьВФайл(КаталогВыгрузки + ИмяФайла);
Рассмотрим случай, когда табличные формы уже открыты пользователем на экране, а параметры печати были изменены интерактивно. Для чтения сохраненных параметров страницы можно использовать два пути:
HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<ИмяБазы>\.... Прочитав эти ключи через WScript.Shell, можно восстановить оригинальные параметры страницы перед конвертацией.Разберем еще один альтернативный вариант, исключающий необходимость тонкой настройки драйверов принтеров. Табличный документ сохраняется из 1С 7.7 в файл формата .mxl. Далее отдельная утилита «1С:Предприятие — Работа с файлами» запускается из командной строки в пакетном режиме, открывает файл и сохраняет его в PDF с полным сохранением геометрии и разметки страниц.
Таким образом, выбор метода зависит от архитектуры решения: для массовой фоновой выгрузки оптимально использовать связку с COM-объектом PDF-принтера, а для работы исключительно внутри памяти 1С — расчет габаритов в твипах средствами Yoksel.