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

23.02.12

Разработка - Универсальные функции

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

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

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

 


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



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



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

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

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

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

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

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

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

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

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

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

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

            КонецЦикла;

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

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

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

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

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

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

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

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

            КонецЦикла;

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

        КонецЕсли;



    КонецЕсли;



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



Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5390    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    46269    dimanich70    83    

164

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6830    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57316    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    8596    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22746    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
0. andy-cj 56 24.02.12 03:11 Сейчас в теме
Я думаю многие программисты сталкивались с проблемой масштабирования разрабатываемых печатных форм документов, то печатная форма вылазит вправо, то сиротливо ютится в углу страницы. В этой статье предоставлен алгоритм решающий эту проблему.

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

1. Magister 134 24.02.12 03:11 Сейчас в теме
Делал похожее, в итоге отказаться пришлось.
1) На некоторых принтерах глючит.
2) Если печатная форма формируется на сервере (актуально для управляемых форм) - можно 5 минут ждать, пока отработает.
3) Опять таки, иногда работает не сильно быстро даже на клиенте - на самых ходовых документах задержка была ощутимая.
2. corelius 4 16.10.14 16:12 Сейчас в теме
Вредительский код. Во-первых:
1. что за строка "Если ТабДокумент.КоличествоСтраниц()" ??? Где оператор "Тогда"???
2. в этом участке кода "зацикливание": "Пока ИсходноеКоличествоСтраниц=ТабДокумент.КоличествоСтраниц() Цикл". Переменная ИсходноеКоличествоСтраниц не меняется напротяжении всей работы алгоритма.

Бредовый код....
user1878860; sasha777666; dachnik; +3 1 Ответить
3. andy-cj 56 17.10.14 23:11 Сейчас в теме
(2) corelius, Уважаемый Олег, публикация висит здесь с 2012 года. Был предложен алгоритм, вставлено с реальной разработки, это работает не у одного клиента. С того времени сайт пережил глобальные изменения, возможно что-то потерялось в публикации или проблемы форматированием, следить за актуальностью не собираюсь. Неужели вы думаете что за два года не нашлось бы любителей помокать в говно автора? Не работает Ctrl+C - Ctrl+V? Очень жаль, мой друг, не используйте, напишите лучше. Срать умеют все, не все могут культурно общаться, к сожалению.
user1706724; +1 Ответить
4. StripyCat 16.06.15 14:57 Сейчас в теме
В строке
Если ТабДокумент.КоличествоСтраниц()
на самом деле должно быть
Если ТабДокумент.КоличествоСтраниц() < ИсходноеКоличествоСтраниц Тогда

И в самом начале имеет смысл поставить
ТабДокумент.АвтоМасштаб = Ложь;
иначе вся эта конструкция может не работать как нужно.

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