Разработка в среде 1С:Предприятие 7.7 часто ставит перед нами задачи, которые выходят за рамки стандартных возможностей платформы. Одной из таких задач является получение настроек печати, которые пользователь задает в диалоге Файл — Параметры страницы, а также последующая конвертация этой формы в формат PDF с сохранением всех настроек (полей, ориентации и масштаба). В этой статье мы подробно разберем, как с помощью внешних библиотек TableDoc.dll, Йоксель и FormEx реализовать универсальный механизм захвата параметров и корректного формирования PDF-документа.
Для начала проанализируем ситуацию: у нас есть сформированная печатная форма, выведенная на экран. Нам необходимо «перехватить» её параметры. Платформа 1С 7.7 не предоставляет штатных методов для чтения установленных полей или ориентации уже открытого окна таблицы. Для решения этой задачи воспользуемся библиотекой TableDoc.dll и объектом МенеджерТабличногоДокумента.
Рассмотрим пример кода, который позволяет извлечь настройки из текущего активного окна:
// Предположим, что КонтТекущегоОкна мы получили с помощью FormEx (Сервис.ТекущееОкно)
ТабМенеджер = СоздатьОбъект("МенеджерТабличногоДокумента");
ТабМенеджер.УстановитьТаблицу(КонтТекущегоОкна);
ПараметрыСтраницы = ТабМенеджер.ПараметрыСтраницы;
// Извлекаем основные настройки
ПолеСлева = ПараметрыСтраницы.Left;
ПолеСправа = ПараметрыСтраницы.Right;
ПолеСверху = ПараметрыСтраницы.Top;
ПолеСнизу = ПараметрыСтраницы.Bottom;
Ориентация = ПараметрыСтраницы.Orient; // 1 - Портрет, 2 - Ландшафт
ИмяПринтера = ПараметрыСтраницы.DefaultPrinter;
Этот метод позволяет нам получить значения в миллиметрах, что критически важно для последующей передачи в конвертер PDF. Объект ПараметрыСтраницы также предоставляет доступ к свойствам Scale (масштаб в процентах) и PaperSize (код формата бумаги), что делает решение по-настоящему универсальным.
Когда параметры страницы получены, возникает следующая проблема: как определить реальную ширину сформированного отчета, чтобы понять, поместится ли он на лист A4 или его нужно масштабировать? Выясним причину, по которой стандартных средств 1С здесь недостаточно — платформа оперирует абстрактными единицами, в то время как для PDF нужны точные измерения.
Воспользуемся методом РассчитатьРазмеры компоненты Йоксель. Проанализируем пример кода:
// Получаем область всей таблицы
// Ч - количество строк, 18 - пример количества колонок
Ширина = 0;
Высота = 0;
Таб.Область(1, 1, Таб.ВысотаТаблицы(), Таб.ШиринаТаблицы()).РассчитатьРазмеры(Ширина, Высота);
// Ширина и Высота возвращаются в твипах (1 твип = 1/1440 дюйма)
Зная ширину в твипах, мы можем легко перевести её в миллиметры для сравнения с параметрами страницы. Помните, что 1 мм примерно равен 56.7 твипам. Это позволяет нам вычислить, выходит ли документ за границы печати.
Одной из самых сложных задач является эмуляция флажка «По ширине страницы» при сохранении в PDF. Рассмотрим по шагам, как программно реализовать этот алгоритм:
TableDoc.dll.ДоступнаяШирина / РеальнаяШиринаТаблицы.Посмотрим на пример логики принятия решения:
Если ширина печатной формы меньше, чем ширина листа A4 (с учетом полей), мы оставляем масштаб 100%. Если же форма шире (например, сложный отчет или широкая накладная), мы динамически устанавливаем ширину PDF-страницы под размер контента или сжимаем контент. Рассмотрим программный фрагмент:
Если ШиринаТаблицыВММ > (ШиринаЛиста - ПолеСлева - ПолеСправа) Тогда
// Если отчет слишком широкий, меняем размер страницы PDF
// или устанавливаем коэффициент масштабирования в конвертере Йокселя
Конвертер.ПараметрыСтраницы.Масштаб = Цел((ШиринаЛиста - ПолеСлева - ПолеСправа) / ШиринаТаблицыВММ * 100);
КонецЕсли;
Важно учитывать, что при прямом экспорте через Йоксель стандартные колонтитулы 1С (содержащие автозаменяемые символы типа #P для номера страницы) могут не обрабатываться автоматически. Также это касается строк, помеченных как «повторять на каждом листе».
Разберем способы обхода этого ограничения:
TableDoc.dll поможет настроить принтер перед печатью.ГраницаСтраницы() и вставить строки с текстом колонтитулов непосредственно в макет перед сохранением.Проанализируем еще один важный момент: где 1С хранит эти настройки, если мы не хотим использовать внешние компоненты? Параметры страницы сохраняются в реестре Windows по пути HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<ИмяБазы>\V7Default\PrintSettings. Информация там хранится в бинарном виде (структура DEVMODE). Хотя чтение реестра напрямую — задача трудоемкая, это может быть полезно для отладки или в специфических системных утилитах.
Также при работе с FormEx для захвата контекста окна, рекомендуется перед анализом параметров устанавливать режим ТолькоПросмотр(1). Это гарантирует, что все изменения, внесенные пользователем в диалогах, будут зафиксированы в объекте таблицы и доступны для считывания через TableDoc.dll.
Таким образом, комбинируя возможности Йокселя для рендеринга и TableDoc для получения метаданных страницы, мы создаем мощный инструмент для автоматизации документооборота в 1С 7.7, обеспечивая высокое качество PDF-файлов, сопоставимое с современными версиями платформы. В качестве альтернативы можно использовать обработку для сохранения печатных форм и отчетов в формате PDF.