| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Как узнать, что отчет печатается на принтер ?
			 
			
			AX 2009 
		
		
		
		
		
		
			Есть конкретный Report (в узле АОТ - Reports). Как можно в коде этого Report узнать, что он сейчас печатается на принтер ? Задача - предотвратить повторную печать именно на принтер или не предотвращать, но логировать повторные случаи печати. Это нужно чтобы знать - был ли документ повторно взят в работу. Report печатается как из кода, так и пользователями по кнопке. Надо либо запретить печать, либо логировать, если отчет печатается второй раз. Но выводить отчет на экран отчет можно сколько угодно - вывод на экран не надо логировать или запрещать. Зачем нужно такое ограничение? Принтер стоит в другом отделе. На него идет печать из разных отделов, и сотрудники обрабатывают все бумажки, которые на нем выходят. Если отчет будет отправлен на принтер повторно, то документ начнут обрабатывать повторно. На какой именно принтер отчет был отправлен - неважно. Важно знать, что именно на принтер. 
				__________________ 
		
		
		
		
	Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вы же не сможете проконтролировать/отследить печать отчёта после того как он уже выведен на экран.  
		
		
		
		
		
		
		
	Может быть просто как-то визуально различать печатные версии, которые должны отправиться в работу, и версии тестовые/черновые, которые только посмотреть на экране. И программно не разрешать просто так повторно печатать рабочую версию. Или печатать слово КОПИЯ в случае повторного формирования. Менять поведение программы в зависимости от того какой канал вывода для отчёта выбран, мне кажется не очень логично. Я бы добавил на диалог отчёта дополнительный параметр, чтобы пользователь мог явно указать для чего он формирует отчёт. И все проверки тогда делать на основании этого параметра, а не на основании параметров печати.  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Можно было был в методах отчета fetch или run или print написать проверку типа if (element.printJobSettings().getTarget == PrintMedium::Printer) 
		
		
		
		
		
		
			Но эти методы срабатывают, если пользователь вывел отчет на экран. А когда пользователь после этого нажимает кнопку печати, то повторно эти методы не вызываются. 
				__________________ 
		
		
		
		
	Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от S.Kuskov
			 
 
			Вы же не сможете проконтролировать/отследить печать отчёта после того как он уже выведен на экран.  
		
	Может быть просто как-то визуально различать печатные версии, которые должны отправиться в работу, и версии тестовые/черновые, которые только посмотреть на экране. И программно не разрешать просто так повторно печатать рабочую версию. Или печатать слово КОПИЯ в случае повторного формирования. Менять поведение программы в зависимости от того какой канал вывода для отчёта выбран, мне кажется не очень логично. Я бы добавил на диалог отчёта дополнительный параметр, чтобы пользователь мог явно указать для чего он формирует отчёт. И все проверки тогда делать на основании этого параметра, а не на основании параметров печати. 
				__________________ 
		
		
		
		
	Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Если кому-то очень надо, то лазейку найдет всегда. Например, сделает скриншот с выведенного на экран репорта и отправит скриншот на принтер. И с этим вы уже ничего не сделаете. Здесь нужно понимать, в чем цель ограничения: исключить получение несанкционированной копии отчета для передачи его кому-то, или тривиальная экономия бумаги и ресурса принтера.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вы слишком все усложняете. В данном случае пользователи - это биороботы, которые не думают, и ничего не решают, и ни в чем не заинтересованы. Они просто могут ошибиться и повторно распечатать документ. 
		
		
		
		
		
		
			Документы не юридические, чисто для внутреннего пользования. У людей нет времени что-то анализировать и проверять. И искать выгоду. Они работают быстро и монотонно. И это не экономия бумаги. Просто повторно напечатанная бумажка вызывает сбои в работе людского конвейера. 
				__________________ 
		
		
		
		
	Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Сохраняйте факт печати для каждого документа в системе. В случае попытки повторной печати предпринимайте нужные вам действия: выводите предупреждение пользователю, либо жёстко блокируйте, либо печатайте документ с дополнительным маркером КОПИЯ
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А как поймать факт печати на принтер?
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Нашел место, где можно повеситься (в смысле отловить печать): форма SysPrintForm, метод closeOk
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			но там нет ссылки на сам отчет, насколько я понимаю?
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их.  | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			если в ClassFactory.createReportViewer() сразу после super() добавить  
		
		
		
		
		
		
			X++: if (ret.printJobSettings().getTarget() == PrintMedium::Screen)
    {
        ret.printJobSettings().fileName(_reportRun.name());
    }
				__________________ 
		
		
		
		
		
			-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 20.06.2019 в 14:54.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Ace of Database (5), gl00mie (3). | |
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Гениальный совет! И еще для случая, когда печатается сразу на принтер без предварительного просмотра, в том числе из кода, добавить в нужный отчет код if (element.printJobSettings().getTarget == PrintMedium::Printer). 
		
		
		
		
		
		
			А ваш совет использовать для случаях, когда печатается пользователем через предварительный просмотр. И внутри двух этих кусков кода вызывать один и тот же обработчик. Отчет печатается из многих мест Аксапты, из кода и пользователями вручную. 
				__________________ 
		
		
		
		
	Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/  | 
| 
	
 | 
| 
	
	 | 
	
		
  |