gifts2017

Перехват печати (Native API)

Опубликовал Андрей (andboss) в раздел Программирование - Внешние компоненты

Внешняя компонента для перехвата печати в 1С (Native API, 8.2, 8.3)

Представляю вашему вниманию внешнюю компоненту для перехвата события "Печать" в 1С.

Перед печатью компонента генерирует внешнее событие, которое можно обработать.

Для использования:

В модуле управляемого приложения

Перем Hooklib; //обязательно после создания хранить контекст компоненты в глоб. переменной

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    Если Источник = "PrintHook" И Событие = "PrintStarting" Тогда
	    СохранитьТабДок();
    КонецЕсли; 
	
КонецПроцедуры

Процедура ПриНачалеРаботыСистемы()
	
	//в общем макете(двоичные данные) компонента в виде zip-архива (hooklib.dll и MANIFEST.xml)
	Если ПодключитьВнешнююКомпоненту("ОбщийМакет.HookLib", "Hooklib", AddInType.Native) Тогда
		Hooklib = Новый("AddIn.Hooklib.PrintHook");
		//Hooklib.ЗапретПечати = Истина;
		Hooklib.Перехват(); 
	Иначе
		Сообщить("Компонента не подключена");
	КонецЕсли; 
			                          
КонецПроцедуры

Возможен запрет на распечатывание установкой свойства Hooklib.ЗапретПечати = Истина;

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

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

Наименование Файл Версия Размер Кол. Скачив.
КомпонентаСПримером
.7z 115,14Kb
27.07.15
34
.7z 115,14Kb 34 Скачать

См. также

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

Комментарии

1. Александр Медведев (anig99) 21.07.15 13:01
Ай, спасибо!!!! Ай, молодца!!! Обязательно попробую! Очень нужна для лечения моей параноии
9. script Мальчинко (script) 21.07.15 17:44
10. Сергей (Che) Коцюра (CheBurator) 21.07.15 19:25
тыщу лет подобное на клюшках формексом реализовано.
хорошо что и здесь появилось.
11. Максим Кузнецов (Makushimo) 22.07.15 08:25
12. Антон Рощин (wolfsoft) 22.07.15 08:52
Не очень понятно, откуда берётся информация для сохранения печатаемого табличного документа?
13. Андрей (andboss) 22.07.15 10:20
(12) wolfsoft, Через АктивноеОкно() и перебор элементов управляемой формы. Ничего лучшего, к сожалению, пока не придумал...
14. script Мальчинко (script) 22.07.15 12:23
Через АктивноеОкно() и перебор элементов управляемой формы

Т.е. в обычных формах работать не будет?
15. Александр Медведев (anig99) 22.07.15 16:15
(13) andboss, да-да! Должно работать в обычных формах. А то как-то не очень правильно получится!
16. Сергей Боровик (BorovikSV) 24.07.15 10:03
(0) А не пробовали перехватывать то что фактически выводят, т.е. в момент отрисовки документа для устройства? и сохранять например в JPG, PNG или PDF?
17. Андрей (andboss) 24.07.15 10:36
(16) BorovikSV, Пробовал. Если знакомы с WinAPI то вывод идет на PDC(Printer Device Context), просто так скопировать этот контекст невозможно, он write-only. Только разве перехватом собственно функций вывода(DrawText и проч.). Вообщем проблем там масса.
18. Андрей (andboss) 24.07.15 10:38
(14) script, Если 1С разродится и сделает АктивноеОкно() в обычном приложении то заработает.
19. Алексей Шачнев (efin) 28.07.15 17:44
andboss, имеет смысл перекачать компоненту, или она просто подешевела, поэтому дата публикации 27 июля?

Кстати, на почту упало сообщение, что Вы мне что-то отвечали в комментариях, но этого нет и не видно всего сообщения: "efin, перехват сохранения уже есть. Точнее была. Её поче..."

Модеры чудят.
20. Андрей (andboss) 28.07.15 20:24
(19) efin, просто сделал дешевле. компонента та же. сейчас экспериментирую с перехватом записи в файлы (например сделать запрет сохранения через файл/сохранить как)
21. script Мальчинко (script) 31.07.15 00:55
Ну хоть так....

Для УТ 10 90% печ. форм выводится через общую форму ПечатьДокумента.
Вставил процедуру обработки внешнего события в нее, и получил подобие активного окна.... очень не нравиться, но не знаю что еще можно здесь поделать.

Правда теперь можно получить ссылку на печатаемый документ.
22. script Мальчинко (script) 31.07.15 01:19
(20) andboss,

а еще бы перехватить событие "Сохранить как" и "Сохранить копию". Дождемся?
23. Андрей (andboss) 31.07.15 08:06
(22) script, сейчас экспериментирую с этим... и еще с буфером обмена
24. Вадим Купинов (izofen) 31.07.15 10:56
Как подключить компоненту. Судя по коду должна подключится сама, но она не подключается?


Процедура ПриНачалеРаботыСистемы()
	//в общем макете(двоичные данные) компонента в виде zip-архива (hooklib.dll и MANIFEST.xml)
	Если ПодключитьВнешнююКомпоненту("ОбщийМакет.HookLib", "Hooklib", AddInType.Native) Тогда
		Hooklib = Новый("AddIn.Hooklib.PrintHook");
		//Hooklib.ЗапретПечати = Истина;
		Hooklib.Перехват(); 
	Иначе
		Сообщить("Компонента не подключена");
	КонецЕсли; 
			                          
КонецПроцедуры
...Показать Скрыть
25. Андрей (andboss) 31.07.15 13:14
(24) izofen, в примере конфигурации подключается из макета. можете попробовать из файла
 ПодключитьВнешнююКомпоненту("d:\...\hooklib.dll", "Hooklib", AddInType.Native) 
26. script Мальчинко (script) 04.08.15 00:18
У меня нормально подключилась из макета и работает в обычном приложении.
27. Александр Медведев (anig99) 18.08.15 10:54
(21) может какая другая внешняя компонента для перебора активных окон в 1с?
28. Иванов Иван (slauter77) 18.09.15 17:38
Подключить из макета не удалось. Подключилась только с диска. Рушит 1с при отправке на печать. Обычное приложение.
Прикрепленные файлы:
29. Андрей (andboss) 18.09.15 20:25
(28) slauter77, !обязательно после создания хранить контекст компоненты в глобальной переменной
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа