Перехват печати (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 не будет опубликован. Обязательные поля помечены *