bdd2

Настройка вывода на печать табличного документа в «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) 229 04.04.11 14:10 Сейчас в теме
А имя принтера получается установить в веб-клиенте?
2. Александр Медведев (anig99) 2470 04.04.11 15:09 Сейчас в теме
Открываем конфигуратор. Справка и читаем всё тоже самое
Короче минус!!!!!
O-Planet; chemezov; +2 Ответить
3. Марина Строева (Glafira) 199 04.04.11 17:36 Сейчас в теме
DanilaDru пишет:

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

Ну, по крайней мере на веб-клиенте это свойство доступно.
4. Андрей Данилюк (DanilaDru) 229 06.04.11 14:16 Сейчас в теме
(3)А есть способы понять на стороне веб-клиента какие принтеры у пользователя подключены?. По сути база может быть запущено с какого угодно компа и не факт, что в системе будет принтер "HP LaserJet 3050 Series PCL 6".
5. Марина Строева (Glafira) 199 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) 229 07.04.11 10:58 Сейчас в теме
(5)Спасибо за информацию.
7. Cергей Иванов (semfart) 30.06.11 09:27 Сейчас в теме
А как дать команду двусторонней печати?
8. Александр Медведев (anig99) 2470 30.06.11 10:15 Сейчас в теме
(7) никак. нет такой команды, т.к. двусторонняя печать относится к внутренним командам принтера, т.е. управляются драйвером. Всё, что может 1с - это управлять СОДЕРЖАНИЕМ страницы. Двусторонняя печать, выбор лотков, типа бумаги и т.д. - это за пределами возможностей 1с. Можно такими вещами управлять только через WMI, shell и т.д., но это всё равно будет не очень кошерное решение - нужно будет в коде учитывать разных пользователей, компы и т.д.
Простое решение, которое я нашел - это копии принтеров с разными настройками. Заводим в системе несколько копий одного принтера. Называем их как-нибудь унифицировано. Например, "Верхний лоток", "нижний лоток двухсторонняя печать", "нижний лоток односторонняя печать", и настраиваем эти принтеры в соответствии. Дальше эти настройки надо будет закрепить в 1с - вывести на экран печатную форму, в настройках страницы выбрать принтер, настроить его опять-таки в соответствии и вывести на печать. Если в печатной форме указано название сохраняемых настроек (см. типовые), то в следующий раз всё выйдет именно на нужный принтер с теми настройками. Немного муторно, зато работает без кодинга.
9. Люба Калашникова (Lubocka) 36 13.08.11 18:49 Сейчас в теме
"Если Не ТабДок.ПроверитьВывод(МассивВыводимыхОбластей) Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;"

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

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

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


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