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

Внешняя компонента для перехвата печати в 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).

23 Comments

  1. anig99

    Ай, спасибо!!!! Ай, молодца!!! Обязательно попробую! Очень нужна для лечения моей параноии

    Reply
  2. script

    ВОТ ОГРОМНОЕ СПАСИБИЩЕ

    Reply
  3. CheBurator

    тыщу лет подобное на клюшках формексом реализовано.

    хорошо что и здесь появилось.

    Reply
  4. Makushimo

    Нужная вещь.

    Reply
  5. wolfsoft

    Не очень понятно, откуда берётся информация для сохранения печатаемого табличного документа?

    Reply
  6. andboss

    (12) wolfsoft, Через АктивноеОкно() и перебор элементов управляемой формы. Ничего лучшего, к сожалению, пока не придумал…

    Reply
  7. script
    Через АктивноеОкно() и перебор элементов управляемой формы

    Т.е. в обычных формах работать не будет?

    Reply
  8. anig99

    (13) да-да! Должно работать в обычных формах. А то как-то не очень правильно получится!

    Reply
  9. BorovikSV

    (0) А не пробовали перехватывать то что фактически выводят, т.е. в момент отрисовки документа для устройства? и сохранять например в JPG, PNG или PDF?

    Reply
  10. andboss

    (16) BorovikSV, Пробовал. Если знакомы с WinAPI то вывод идет на PDC(Printer Device Context), просто так скопировать этот контекст невозможно, он write-only. Только разве перехватом собственно функций вывода(DrawText и проч.). Вообщем проблем там масса.

    Reply
  11. andboss

    (14) script, Если 1С разродится и сделает АктивноеОкно() в обычном приложении то заработает.

    Reply
  12. efin

    andboss, имеет смысл перекачать компоненту, или она просто подешевела, поэтому дата публикации 27 июля?

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

    Модеры чудят.

    Reply
  13. andboss

    (19) efin, просто сделал дешевле. компонента та же. сейчас экспериментирую с перехватом записи в файлы (например сделать запрет сохранения через файл/сохранить как)

    Reply
  14. script

    Ну хоть так….

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

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

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

    Reply
  15. script

    (20)

    а еще бы перехватить событие «Сохранить как» и «Сохранить копию». Дождемся?

    Reply
  16. andboss

    (22) script, сейчас экспериментирую с этим… и еще с буфером обмена

    Reply
  17. izofen

    Как подключить компоненту. Судя по коду должна подключится сама, но она не подключается?

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

    Показать

    Reply
  18. andboss

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

     ПодключитьВнешнююКомпоненту(«d:…hooklib.dll», «Hooklib», AddInType.Native) 
    Reply
  19. script

    У меня нормально подключилась из макета и работает в обычном приложении.

    Reply
  20. anig99

    (21) может какая другая внешняя компонента для перебора активных окон в 1с?

    Reply
  21. slauter77

    Подключить из макета не удалось. Подключилась только с диска. Рушит 1с при отправке на печать. Обычное приложение.

    Reply
  22. andboss

    (28) slauter77, !обязательно после создания хранить контекст компоненты в глобальной переменной

    Reply
  23. Andle

    Можете ее пересобрать для 64-bit платформы?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *