gifts2017

Настройка вывода на печать табличного документа в «1С:Предприятие 8.2»

Опубликовал Марина Строева (Glafira) в раздел Программирование - Практика программирования

Большинство обучающих материалов по программированию в системе 1С при описании формирования  печатных форм на основе объекта «Табличный документ» ограничиваются выводом готовой формы на экран. Для пользователей же куда более важным является то, как документ будет выглядеть в распечатанном виде. Рассмотрим свойства и методы табличного документа, относящиеся к настройкам печати.

Большинство обучающих материалов по программированию в системе 1С при описании формирования  печатных форм на основе объекта «Табличный документ» ограничиваются выводом готовой формы на экран. Для пользователей же куда более важным является то, как документ будет выглядеть в распечатанном виде. Здесь, кроме хорошо сверстанного макета, играют роль и установки параметров печати.

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

Рассмотрим свойства и методы табличного документа, относящиеся к настройкам печати (в приведенных примерах «ТабДок» это объект типа «Табличный документ»).

Свойство «ИмяПринтера» позволяет задать для печати принтер, отличный от установленного по умолчанию. Имя должно совпадать с именем принтера, заданным в системе:         

ТабДок.ИмяПринтера="HP LaserJet 3050 Series PCL 6";

При печати пакета документов  можно сэкономить время, установив признак разбора по копиям:

ТабДок.РазборПоКопиям=истина;

Число копий можно указать так:

ТабДок.КоличествоЭкземпляров=5;

Разумеется, можно задать поля:

ТабДок.ПолеСлева=20;//Поле слева 20мм, остальные поля 10мм (по умолчанию)

Еще несколько свойств страницы:

ТабДок.ОриентацияСтраницы=ОриентацияСтраницы.Ландшафт;
   
ТабДок.ЭкземпляровНаСтранице=2; //на листе будет размещено 2 страницы
   
ТабДок.Автомасштаб=истина; //аналогично настройкам масштаба  «по ширине страницы»

При необходимости можно указать конкретное значение масштабирования в процентах (свойство «МасштабПечати»).

Свойство «РазмерСтраницы» позволяет задать стандартные форматы страницы – “A3”, “A4”, “A5” (полный список вариантов доступен в справке 1С).

ТабДок.РазмерСтраницы="A3";// буква А должна быть английской

Для нестандартного размера бумаги (Custom) можно указать значения высоты и ширины страницы (в мм):

ТабДок.РазмерСтраницы="Custom";//нестандартный размер
 
  ТабДок.ВысотаСтраницы=350;
   
ТабДок.ШиринаСтраницы=350;

Также в табличном документе доступно управление выводом колонтитулов и их содержимым. Для этого служат свойства «ВерхнийКолонтитул» и «НижнийКолонтитул». Например:

    ТабДок.ВерхнийКолонтитул.Выводить=истина; //будет напечатан верхний колонтитул
    ТабДок.РазмерКолонтитулаСверху=7; //размер колонтитула 7мм (по умолчанию 10мм)
    ТабДок.ВерхнийКолонтитул.ВертикальноеПоложение=ВертикальноеПоложение.Верх;
    ТабДок.ВерхнийКолонтитул.НачальнаяСтраница=2;//колонтитул выводится со второй страницы
    ШрифтКолонтитула=Новый Шрифт("Courier New", 8,,Истина);
    ТабДок.ВерхнийКолонтитул.Шрифт=ШрифтКолонтитула; //наклонный шрифт
    ТабДок.ВерхнийКолонтитул.ТекстВЦентре="Верхний колонтитул";
    ТабДок.ВерхнийКолонтитул.ТекстСправа="Стр.[&НомерСтраницы] из [&СтраницВсего]"; //нумерация страниц
    ТабДок.ВерхнийКолонтитул.ТекстСлева="[&Дата]";//текущая дата

Сформированный документ отправляется на печать с помощью метода «Напечатать()». Возможно два варианта вызова.

1) Непосредственно на принтер:

ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
    ТабДок.Напечатать(истина);

2) Перед печатью будет выведен диалог печати:

ТабДок.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
    ТабДок.Напечатать(ложь);

Кроме того можно управлять и разбиением документа на страницы. Оценить  количество страниц в документе по настройкам текущего принтера можно так:

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

С помощью методов «ПроверитьВывод()» и «ПроверитьПрисоединение()» можно определить, умещается ли табличный документ или массив областей табличного документа на странице в высоту и в ширину при текущих настройках принтера.

Надо иметь ввиду, что работа последних трех методов зависит от установленного принтера. Если методу не удается его найти, вызывается исключение.

Принудительно вставить разрывы страниц позволяют методы «ВывестиВертикальныйРазделительСтраниц()» и «ВывестиГоризонтальныйРазделительСтраниц()».

Таким образом, можно управлять постраничным выводом на печать и контролировать заполнение страницы:

Если Не ТабДок.ПроверитьВывод(МассивВыводимыхОбластей) Тогда
       
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЕсли;

Важной характеристикой платформы «1С:Предприятие 8.2» является строгое разделение свойств и методов по контексту исполнения. Если все приведенные выше свойства доступны в любом контексте, то перечисленные методы недоступны на тонком клиенте. Исключением является метод «Напечатать()», доступность которого по понятным причинам ограничена клиентской частью. Это означает, что формирование табличного документа должно происходить на сервере, а отправлять его на печать следует в клиентской процедуре.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Андрей Данилюк (DanilaDru) 04.04.11 14:10
А имя принтера получается установить в веб-клиенте?
2. Александр Медведев (anig99) 04.04.11 15:09
Открываем конфигуратор. Справка и читаем всё тоже самое
Короче минус!!!!!
O-Planet; chemezov; +2 Ответить
3. Марина Строева (Glafira) 04.04.11 17:36
DanilaDru пишет:

А имя принтера получается установить в веб-клиенте?

Ну, по крайней мере на веб-клиенте это свойство доступно.
4. Андрей Данилюк (DanilaDru) 06.04.11 14:16
(3)А есть способы понять на стороне веб-клиента какие принтеры у пользователя подключены?. По сути база может быть запущено с какого угодно компа и не факт, что в системе будет принтер "HP LaserJet 3050 Series PCL 6".
5. Марина Строева (Glafira) 07.04.11 06:19
В 1С нет своих средств получить список установленных принтеров.
Можно использовать службу WMI - готовый пример на http://www.1c-h.ru/?p=1360.
Также см.статью http://infostart.ru/public/21019/, в том числе комментарии
Saint13; Созинов; Ksu; Manticor; +4 Ответить 1
6. Андрей Данилюк (DanilaDru) 07.04.11 10:58
(5)Спасибо за информацию.
7. Cергей Иванов (semfart) 30.06.11 09:27
А как дать команду двусторонней печати?
8. Александр Медведев (anig99) 30.06.11 10:15
(7) никак. нет такой команды, т.к. двусторонняя печать относится к внутренним командам принтера, т.е. управляются драйвером. Всё, что может 1с - это управлять СОДЕРЖАНИЕМ страницы. Двусторонняя печать, выбор лотков, типа бумаги и т.д. - это за пределами возможностей 1с. Можно такими вещами управлять только через WMI, shell и т.д., но это всё равно будет не очень кошерное решение - нужно будет в коде учитывать разных пользователей, компы и т.д.
Простое решение, которое я нашел - это копии принтеров с разными настройками. Заводим в системе несколько копий одного принтера. Называем их как-нибудь унифицировано. Например, "Верхний лоток", "нижний лоток двухсторонняя печать", "нижний лоток односторонняя печать", и настраиваем эти принтеры в соответствии. Дальше эти настройки надо будет закрепить в 1с - вывести на экран печатную форму, в настройках страницы выбрать принтер, настроить его опять-таки в соответствии и вывести на печать. Если в печатной форме указано название сохраняемых настроек (см. типовые), то в следующий раз всё выйдет именно на нужный принтер с теми настройками. Немного муторно, зато работает без кодинга.
9. Люба Калашникова (Lubocka) 13.08.11 18:49
"Если Не ТабДок.ПроверитьВывод(МассивВыводимыхОбластей) Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;"

Подскажите мне с этим примером, а именно метод .ВывестиГоризонтальныйРазделительСтраниц()

Где он ставиться? При 1-й строке, на последней? Или каждый раз?
Играет ли какую-нибудь роль АвтоМасштаб()

А еще лучше, примерчик. Т.к. у меня никак не работает.
10. nirbolz 19.06.12 13:56
Да, странно что windows Не понимает значение реквизита РазмерСтраницы табличного документа "Custom" как нестандартный размер страницы. А нестандартный размер страницы в windows понимается 1с как "Windows:256". Следовательно у меня не получается задать из 1с размеры страницы.
11. Константин Пономаренко (kostia.ck) 06.07.12 14:28
12. Андрей Данилюк (DanilaDru) 06.07.12 16:19
(11)и ловить баги в первых рядах :) Лучше подождать когда стабилизируется.
jekyllkem; +1 Ответить
13. Константин Куликов (Светлый ум) 09.07.13 19:35
Открываем конфигуратор. Справка и читаем всё тоже самое
Короче минус!!!!!


Нифига, за колонтитулы плюс - прочитал, и теперь во всю использую.
14. Екатерина Свирина (kancerina) 12.10.13 12:39
Спасибо за полезную информацию!
15. Павел Мокосеев (pvl_mksv) 31.07.14 14:13
Спасибо! Полезно, добавлю от себя, что в случае использования сетевого принтера, имя принтера задается как \\%HostName%\%PrinterName%. Подозреваю, что с локальными именами тоже не все так просто, так как принтер в системе можно обозвать хоть неприличным словом.
16. Наталья Константиновна (bnk72) 11.08.14 10:28
(8) anig99, в 7.7 так и делала (устанавливала локальный принтер через TCP/IP Port), настраивала в свойствах вкладка Допольнительно/Умолчания нужные параметры, печатала 1 раз на него с заходом в свойства принтера, а затем уже на печать без предварительного просмотра. В 8.3 так не получается (на параметры по умолчанию наплевать, вернее степлировать степлирует, а вот заместо двусторонней печати шлепает односторонюю). Кто нибудь знает как заставить слушаться?
17. Наталья Константиновна (bnk72) 13.08.14 08:54
Специально проверила в 8.2 немедленную печать на тот же принтер - здесь дуплексную печать видит и выполняет. Напишу разработчикам, думаю это баг платформы...
18. Наталья Константиновна (bnk72) 13.08.14 10:19
Обновила платформу на 8.3.5.1098. Стала тестировать - заметила что в 8.3 настройка дуплексной печати вынесена в "Параметры страницы". Выставила дуплекс, отправила на печать - теперь печатает дуплекс и при немедленной печати других документов. Может кому поможет. Но возникли непонятки с теми документами, которые уже были напечатаны ранее, почему-то ориентация страницы слетела. Теперь в предварительном просмотре принудительно ставлю ландшафт, отправляю на печать - печатает портрет...
pvl_mksv; +1 Ответить
19. Наталья Константиновна (bnk72) 13.08.14 10:56
А, тут дело теперь в макете страницы, видать когда я экспериментировала - пробовала. Не пойму, в 8 уже настройка печати для каждого документа (точнее "экземпляра документа" ) сохраняется в базе?
20. Руслан Хабибуллин (RuslanKhanow) 12.03.15 13:07
(7) semfart, ТабличныйДокумент.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
21. Татьяна Арсенян (Tanya_o) 29.04.15 11:24
ТабДок.ВерхнийКолонтитул.ТекстСправа="Стр.[&НомерСтраницы] из [&СтраницВсего]"; //нумерация страниц


Подскажите пожалуйста, а можно задать параметр с какого номера считать номер страницы
Пример в текущем отчете это первая страница но надо считать с 122. Т.е.
Страница 122, 123(122+1(1- это номер страницы в этом отчете)) , 124 (122+2), 1255 (122+3) и т.д.
22. Артём (-null-) 19.08.15 11:48
(21) Tanya_o, Присоединяюсь к вопросу! Как указать начальный номер страницы, выводимый в колонтитул (не с какой страницы начать выводить колонтитул, а как задать начальный номер) ?
23. Ivon (Ivon) 30.12.15 14:20
Как напечатать только страницу 1 и не печатать остальные? Если это можно.
24. Артём Романенков (user594726_artyem.romanenkov) 17.10.16 08:17
Здравствуйте!
Подскажите, пожалуйста, как объединить ячейки табличного документа с одинаковыми значениями в рамках одного столбца и поместить значение по центру. Н-р, "Контрагент", "Договор контрагента".