gifts2017

Групповая печать HTML-страниц

Опубликовал Анатолий Златов (zan_od) в раздел Печать - Пакетная печать

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

Задача: пакетная печать деклараций с сайта "Новой Почты" (украинский перевозчик). Стандартный способ отправить текущую страницу браузера на печать - вызов функции "parentWindow.Print()". Но эта функция открывает стандартный диалог выбора принтера, что для пакетной печати совсем не удобно. Поиск способов обойти эту проблему привел к следующему решению:

На форме обработки размещен элемент "ПолеHTMLДокумента".

Модуль формы обработки:
Процедура ПечатьСтраницыНаФорме()
	Скрипт = "
	|Sub PrintPage()
	//|	MsgBox ""test""
	|       OLECMDID_PRINT = 6
	|       OLECMDEXECOPT_DONTPROMPTUSER = 2
	|       OLECMDEXECOPT_PROMPTUSER = 1
	|       call WB.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER,1)
	|End Sub";
	
	Документ = ЭлементыФормы.ПолеHTMLДокумента.Документ;
	
	УзелСкрипта = Документ.createElement("script");
	УзелСкрипта.type = "text/VBScript";
	УзелСкрипта.text = Скрипт;
    Документ.getElementsByTagName("head").Item(0).appendChild(УзелСкрипта);
	
	УзелОбъекта = Документ.createElement("object");
	УзелОбъекта.id = "WB";
	УзелОбъекта.CLASSID = "CLSID:8856F961-340A-11D0-A96B-00C04FD705A2";
	Документ.getElementsByTagName("body").Item(0).appendChild(УзелОбъекта);
	
	Документ.parentWindow.PrintPage();
КонецПроцедуры

Процедура ПолеHTMLДокументаДокументСформирован(Элемент)
	ПечатьСтраницыНаФорме();
	Закрыть();
КонецПроцедуры

Процедура ПриОткрытии()
	ЭлементыФормы.ПолеHTMLДокумента.Документ.URL = АдресСтраницы;
КонецПроцедуры

Модуль объекта обработки: 
Процедура Печать(Адрес) Экспорт
	АдресСтраницы = Адрес;
	Форма = ПолучитьФорму("Форма");
	Форма.ОткрытьМодально();
КонецПроцедуры

Вызвать печать можно следующим образом (пример):
ОбработкаПечати = Обработки.ПечатьHTML.Создать();
Для Каждого АдресСтраницы Из МассивАдресов Цикл
	ОбработкаПечати.Печать(АдресСтраницы);
КонецЦикла;

Обработка печатает на принтер по умолчанию (можно обойти через WMI).
Работоспособность обработки проверялась на ОС Windows 7.

В браузере Internet Explorer в настройках безопасности нужно разрешить запуск скриптов и ActiveX. Это можно сделать, например, так:
1. Для группы "Надежные узлы" установить уровень безопасности "Низкий".
2. Добавить URL сайта, с которого будет печать, в группу "Надежные узлы".


Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ПечатьHTML.epf
.epf 6,32Kb
25.08.14
3
.epf 6,32Kb 3 Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение

Комментарии

1. Пользователь Инфостарта (infostart user) 27.08.14 20:49
вот еще способ, используя этот же метод, только поизящней

  
        Адрес = "http://infostart.ru/public/298928/"; //для примера страница этой публикации
	COMОбъект = Новый COMОбъект("InternetExplorer.Application");
	COMОбъект.navigate(Адрес);
	
	Пока COMОбъект.readyState < 4 Цикл
		Продолжить;
	КонецЦикла;
	
	Если НЕ СразуНаПринтер Тогда
                COMОбъект.Visible = 1;
		COMОбъект.ExecWB(6, 1);
	Иначе
		COMОбъект.ExecWB(6, 2);
	КонецЕсли;
...Показать Скрыть


более подробно прочитать про метод можно здесь Метод ExecWB
2. Саша Безымяный (help1Ckr) 28.08.14 12:10
за выложенный код обработки однозначнго плюс. Все бы так делали)
3. Анатолий Златов (zan_od) 28.08.14 12:46
(1) infostart user, согласен
На этот способ я наткнулся позже, когда решил выяснить, что это - объект "8856F961-340A-11D0-A96B-00C04FD705A2"?

Мой вариант я нашел на stackoverflow, он больше подходит для встраивания в Web-страницу на сервере (правда, работает только в IE)

Ваш вариант однозначно лучше - не открывается форма, не нужно встраивать скрипт в тело HTML, единственно смущает цикл "Пока COMОбъект.readyState < 4" (процессор уйдет в 100%), но на небольших по размеру страницах это несущественно.
Также я думаю, что он подойдет для печати PDF из браузера - надо попробовать.
4. Пользователь Инфостарта (infostart user) 28.08.14 17:30
(3) zan_od, по поводу readyState - не думаю, что это тяжело для процессора, мы же просто проверяем значение свойства, которые говорит нам загружена страница или нет.

да, по пдф тоже вариант, открыть в браузере пдф с помощью сторонней проги, например акробатридера и распечатать, даже где-то вроде видел такое.
5. Анатолий Златов (zan_od) 28.08.14 20:55
(4) infostart user, дело не только в readyState, даже просто пустой цикл вгоняет процессор в 100%, правда на моей машине пришлось нагрузить процессор миллионом, чтобы просто увидеть скачок
Для инд = 1 По 1000000 Цикл
КонецЦикла;
Конечно, реально таких циклов при загрузке страниц не будет.

А pdf IE10 открывает без посторонних программ, не знаю как насчет предыдущих версий (в восьмой еще нет, проверил).
6. Дмитрий Коваль (Criativve) 16.03.16 19:14
(1) infostart user,

Тоже пользовался этим методом, но возникла потребность при печати убирать колонтитулы и отступы от краев. При печати из браузера в предварительном просмотре их можно убрать, но если печатать программно - они все равно вылазят. Может кто-то сталкивался с такой проблемой и знает решение?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа