Автоматическое масштабирование табличного документа при печати

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

Добрый день, друзья. В рамках решения одной из рабочих задач оптимимизации печати документов и был создан данный алгоритм. Несомненным преимуществом данного алгоритма является то, что пользователю не нужно мучится с настройками масштаба печатной формы и подгонять ее под разные принтеры. Данный алгоритм обрабатывает две ситуации, первая это когда количество страниц большое и уменьшением масштаба печати можно добиться максимального заполнения страниц (например в конце табличного документа появляется «хвостик», который не влазит на предыдущую страницу и выводится в начале следующей, фактически последний лист выходит пустой), вторая ситуация когда печатная форма занимает 1 лист, но заполнение не полное, в таком варианте алгоритм увеличивает масштаб печати, до значения позволяющего полностью заполнить печатный лист.
      Хочу обратить внимание, на то что при выполнении алгоритма используются драйвера принтера, и если в системе не установлено ни одного принтера выполнение функции вызовет исключение. Также было замечено что обращение к функции «ТабДокумент.КоличествоСтраниц() » занимает продолжительное время, скорее всего из-за использования драйвера принтера для подсчета количества страниц. Просьба учесть вышеперечисленные моменты при использовании данного алгоритма.

      Поцедуру можно поместить в общий модуль обработчиков печатных форм.

 

Процедура КорректировкаМасштабаТабДокумента(ТабДокумент,МинимальныйПроцентМасштаба=60) Экспорт

    Если типЗнч(ТабДокумент)=Тип(«ТабличныйДокумент») Тогда

        //уменшение масштаба для уменьшения количества страниц

        ИсходныйМасштаб = 100;

        ТабДокумент.МасштабПечати = 100;

        ИсходноеКоличествоСтраниц = ТабДокумент.КоличествоСтраниц();

        ТабДокумент.МасштабПечати = МинимальныйПроцентМасштаба;

        Если ТабДокумент.КоличествоСтраниц()

            КоличествоОптимизированныхСтраниц = ТабДокумент.КоличествоСтраниц();

            ТекущийПроцентМасштаба = МинимальныйПроцентМасштаба;

            Пока КоличествоОптимизированныхСтраниц=ТабДокумент.КоличествоСтраниц() Цикл

                ТекущийПроцентМасштаба = ТекущийПроцентМасштаба+1;

                ТабДокумент.МасштабПечати = ТекущийПроцентМасштаба;

            КонецЦикла;

            ТабДокумент.МасштабПечати = ТабДокумент.МасштабПечати1;

        Иначе //эффекта нет возвращаем мастаб печати обратно

            ТабДокумент.МасштабПечати = ИсходныйМасштаб;

            //увеличение масштаба для максимального заполнения страниц

            ТекущийПроцентМасштаба = ИсходныйМасштаб;

            Пока ИсходноеКоличествоСтраниц=ТабДокумент.КоличествоСтраниц() Цикл

                ТекущийПроцентМасштаба = ТекущийПроцентМасштаба+1;

                ТабДокумент.МасштабПечати = ТекущийПроцентМасштаба;

            КонецЦикла;

            ТабДокумент.МасштабПечати = ТабДокумент.МасштабПечати1;

        КонецЕсли;

    КонецЕсли;

КонецПроцедуры

5 Comments

  1. andy-cj

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

    Перейти к публикации

    Reply
  2. Magister

    Делал похожее, в итоге отказаться пришлось.

    1) На некоторых принтерах глючит.

    2) Если печатная форма формируется на сервере (актуально для управляемых форм) — можно 5 минут ждать, пока отработает.

    3) Опять таки, иногда работает не сильно быстро даже на клиенте — на самых ходовых документах задержка была ощутимая.

    Reply
  3. corelius

    Вредительский код. Во-первых:

    1. что за строка «Если ТабДокумент.КоличествоСтраниц()» ??? Где оператор «Тогда»???

    2. в этом участке кода «зацикливание»: «Пока ИсходноеКоличествоСтраниц=ТабДокумент.КоличествоСтраниц() Цикл». Переменная ИсходноеКоличествоСтраниц не меняется напротяжении всей работы алгоритма.

    Бредовый код….

    Reply
  4. andy-cj

    (2) corelius, Уважаемый Олег, публикация висит здесь с 2012 года. Был предложен алгоритм, вставлено с реальной разработки, это работает не у одного клиента. С того времени сайт пережил глобальные изменения, возможно что-то потерялось в публикации или проблемы форматированием, следить за актуальностью не собираюсь. Неужели вы думаете что за два года не нашлось бы любителей помокать в говно автора? Не работает Ctrl+C — Ctrl+V? Очень жаль, мой друг, не используйте, напишите лучше. Срать умеют все, не все могут культурно общаться, к сожалению.

    Reply
  5. StripyCat

    В строке

    Если ТабДокумент.КоличествоСтраниц()

    на самом деле должно быть

    Если ТабДокумент.КоличествоСтраниц() < ИсходноеКоличествоСтраниц Тогда

    И в самом начале имеет смысл поставить

    ТабДокумент.АвтоМасштаб = Ложь;

    иначе вся эта конструкция может не работать как нужно.

    Ну и параметр МинимальныйПроцентМасштаба на мой взгляд имеет смысл передавать 85-88. Иначе очень мелко получается. А так, оптимальный масштаб где-то в районе 92-93% лежит. И вот эти 1-2% алгоритм выбирает, чтобы не оставалось «висячих» строк.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *