Имя: Пароль:
1C
 
Как понять что принтер напечатал документ
0 DoNT
 
12.11.08
15:58
Задача такая: Имеется документ с печатной формой, нужно узнать печатался он или нет. Т.Е. не признак того выводилась ли на экран печатная форма или нет, а зафиксировать сам факт того что документ на принтер послан и успешно был  с него распечатан. Может кто сталкивался с такой задачей.
1 Sadovnikov
 
12.11.08
15:59
(0) Никак :(
2 Falcon
 
12.11.08
15:59
(0) поглядеть на лоток
3 DoNT
 
12.11.08
15:59
точно
4 Fragster
 
гуру
12.11.08
16:01
давай внятные имена документам при печати, а потом смотри лог сервера печати
5 DoNT
 
12.11.08
16:01
А можно поподробней про лоток. Я просто начинающий программер
6 Fragster
 
гуру
12.11.08
16:02
(5) бугагаг!
7 Господин ПЖ
 
12.11.08
16:03
рыдаю...
8 DoNT
 
12.11.08
16:05
А программно скриптами никак нельзя узнать
9 DoNT
 
12.11.08
16:08
у меня просто сетка большая под разными OS, не знаю что с лотками получится ли, а признак болжен быть однозначный
Все равно за идею спасибо.
10 AntiBuh
 
12.11.08
16:08
(5) гыыыыы
лоток аппаратная штука, программисты ими не занимаются
11 Молодой 1Снег
 
12.11.08
16:08
(5)+(8)Узнать "программно скриптами" есть ли в лотке распечатанный док? о_0  Хм... ща покурю...
12 YHVVH
 
12.11.08
16:09
посылай на печать документ печатай на нем случайное число , потом проси опертаора ввести это случайное число, если ввод будет праивльный значит он напечатан, если нет то не напечатан.
13 YHVVH
 
12.11.08
16:10
имхо (12) изврат но зато позволяет точно узнать что документ напечатан и принят юзвером
14 RomaH
 
naïve
12.11.08
16:10
сталкивался - решил так:
модальный диалог с вопросом пользователю "Докмент распечатан?" - "Да" "Нет"
15 TitanLuchs
 
12.11.08
16:10
(12) Операторы за такую фичу разорвут прога на фиг ))))))
16 YHVVH
 
12.11.08
16:12
(15) иногда жесткие меры требуются, например при таком вводе док помечается как напечатнный и больше не доступный для печати. типа не хрен бумагу перводить 100 раз :-) шутка кончено но иногда и правда требуется в разных целях.
17 Санта Клаус
 
12.11.08
16:13
мне вот интересно - зачем это все?
18 YHVVH
 
12.11.08
16:15
например задание на сборку печатется кладовщику, в этот момент после печати документ перводиться в статус исполняется. так вот лучше всего это делать после того как он получил из принтера этот листок.
19 Молодой 1Снег
 
12.11.08
16:15
(16) Как то делал нечто похожее. Только в моем случае, первый экземпляр дока печатался как обычно, а все последующие с пометкой "копия".
20 YHVVH
 
12.11.08
16:16
(19) ну или так тоже тема :-)
21 minele
 
12.11.08
16:18
по телефону или факсу, аськой, смс, просто NetMitting или чатом через сеть, почтой Notes Lotus, e-mail.
22 minele
 
12.11.08
16:19
шутка.
23 trdm
 
12.11.08
16:21
(0) купи вебкамеру, направь на принтер, и пусть транслирует картинку:)
24 DoNT
 
12.11.08
16:21
НУ а как он понимал что его второй раз печатают????
25 trdm
 
12.11.08
16:22
+(23) а что, вроде хорошая идея, главное дешево и соорудить плевое дело :)
26 Злой Бобр
 
12.11.08
16:22
(0) Если принтер поддерживает логи - тяни оттуда. Больше вариантов незнаю.
27 DoNT
 
12.11.08
16:23
и нужно это вовсе не для экономии бумаги, просто операторов много путаются они, а с признаком у них вся неразбериха закончится.
28 Эльниньо
 
12.11.08
16:23
Ввести новую должность в штат "Смотрящий за принтером". Ему журнал в зубы и заносит туда ручками запись о печати.
29 Torquader Darigha
 
12.11.08
16:24
Если пользователь хочет напечатать несколько экземпляров одного документа, то он при печати документа приоткрывает лоток бумаги, принтер говорит - ошибка. При закрытии повторяет лист ещё раз - а ксероксы вообще никто не отменял.
В ресторанных программах для отслеживания печати заказов на заказе печатается Штрих-код, и если человек берёт заказ с принтера, он проводит штрих-кодом возле сканера - тогда система знает, что заказ ушёл в исполнение.
P.S. если листок вышел из принтера это не означает, что документ ушёл в обработку, это означает, что листок вышел из принтера.
30 YHVVH
 
12.11.08
16:30
(29) это означает что он получил задания на сборку , не печатал же он его чтоб в туалет сходить с ним.
31 DoNT
 
12.11.08
16:30
Да не хочу я им повторную печать отменить, просто признак хочу поставить и все.
32 YHVVH
 
12.11.08
16:32
как говориться время пошло негры пошли собирать, и если честно мало волнует что с этим листком будет делать, получил расписался по 3.14ил собирать!
33 trdm
 
12.11.08
16:33
(0) "Имеется документ с печатной формой, нужно узнать печатался он или нет."
1. Запретить печать незаписанные документы.
2. Завести справочник "ЛогПечати" по кнопке "напечатать" писать в это лог документ и количество раз печати(инкрементарно).
3. поправить процедуру "ПриУдаленииДокумента", что-бы подчищались логи этого справочника...
Так пойдет?
34 DoNT
 
12.11.08
16:34
У пользователей в другой проге что то подобное реализовано,но там другой случай там на печать сразу пакет посылается и все признаки сразу раставляются. Т.е. обычной печати нет у документа(даже форму не показывает). Привыкли они.
35 YHVVH
 
12.11.08
16:38
да сделай проще просто при отправки на печачть счетки прибовляй в результате оригинал будет со счетчиком 1 напечатан , 2 - копия, 3 - уже задолбали печатать
:-)
36 Молодой 1Снег
 
12.11.08
16:41
(34) Если под другой прогой понимается 1С-ка, то там наверняка заюзано Напечатать(). Сделай также, а в сам док добавь реквизит Отпечатан и прибавляй к нему 1 при каждой печати.
37 trdm
 
12.11.08
16:42
(36) А при печати можифицировать документ - кошерно?
38 DoNT
 
12.11.08
16:43
Уважаемый(ая) trdm, мне все понятно, кроме кнопки "напечатать". Что делает эта кнопка выводит печ форму или непосредственно распечатывает. мне нужно чтобы возможность первого осталась, а по второму событию поставить признак.
39 foxey
 
12.11.08
16:45
(38) - А как ты узнаешь, напечатали ли печатную форму, что ты вывел на предпросмотр?
Напечатать(<?>);
Синтаксис:
Напечатать(<Флаг>)
Назначение:
Напечатать таблицу без предварительного просмотра (печать без открытия окна редактирования).
Параметры:
<Флаг> - необязательный параметр. Режим запроса диалога печати: 1 - запрашивать диалог печати (по умолчанию), 0 - не запрашивать.
Замечание:
Метод может использоваться при работе с таблицей в режиме ввода данных.
40 DoNT
 
12.11.08
16:45
Весь вопрос сводится к тому чтобы программно отловить момент печати
41 Молодой 1Снег
 
12.11.08
16:46
(37) низнаю, маладой ищо :)
42 trdm
 
12.11.08
16:46
trdm, он *-ый.
Имеется ввиду так кнопка, которая запускает процедуру печати. Она может называться как угодно, в зависимости от фантазий кодера...
43 trdm
 
12.11.08
16:48
(40) блин, позови программиста, он тебе найдет точки входа....
Они разные, от тупого с кнопкой [Напечатать] и процедурой в теле модуля документа.
До всяких хитровывернутых подключенных внешних форм.
44 Torquader Darigha
 
12.11.08
16:50
Как вариант, сделать две кнопки - первая показывает форму с пустой областью печати, чтобы её не печатали, а вторая - печатает напрямую.
Но остаётся вопрос, что происходит с заданием на принтере - в Windows программа не может знать состояние принтера, если последний этого не хочет.
Конечно, в настройках принтера можно поставить "Печатать Напрямую На Принтер", тогда вероятность потери напечатанного документа будет минимальной.
45 trdm
 
12.11.08
16:52
(44) Ненапечатание в следствие неохоты принтера неработать нешоркает программиста.
46 dimm7310
 
12.11.08
16:52
Очень хорошая идея в (29) на счет штрихкода
47 Молодой 1Снег
 
12.11.08
16:53
(40) Тут 1Ска тебе не товарищ! Она отправляет док в спулер печати Windows, а что там с ним будет дальше ей пофиг. Спулер тоже не лучше, он отправит док в буфер принтера и тоже свободен. Да и принтер тоже не без греха - прогонит все свои механизмы печати, а в картридже уже давно тонера нет ;)
48 dimm7310
 
12.11.08
16:54
(44) Могут быть различные нюансы: зажевало бумагу, кончается тонер - короче нет полноценной распечатки
49 dimm7310
 
12.11.08
16:56
+(48) если только кому одному назначить полный доступ на печать (без ограничений), но это тоже не самый лучший способ,
мне про сканер штихкода идея понравилась
50 dimm7310
 
12.11.08
16:57
+(49) "полный доступ на печать (без ограничений)"  -- Это нас случай если нормально не распечаталось
51 DoNT
 
12.11.08
16:58
Две кнопки это классный вариант, но я жуткий формалист. А если пользователю захочется что то поменять на печ форме до печати, может дописать что или как, он меня всегда будет звать. Да и про возможность сохранить печ форму в каком- то фомате тоже можно, а дальше уже печатать.
52 АЛьФ
 
12.11.08
17:01
2(51) А еще пользователь может срисовать с экрана на бумажку, потом заново то же набить в Экселе и распечатать. Это тоже хочешь программно отслеживать?
53 lea_220400
 
12.11.08
17:03
(0) ПРОчитал ветку и ууууууулыбнуло
54 skunk
 
12.11.08
17:04
сделать лист бумаги бланком строгой отчетности... напичкать серийник и номер... выдовать под личную подпись заведующего филиалом или начальника департамента... в конце месяца последних заставить сдавать отчетность... сколько и куда бумаги ушло... испорченые листы прилагать к отчету
55 Garik-1980
 
12.11.08
17:06
strComputer = "имя компьютера"
strDomain = "домен"
strUser = "ИмяПользователя"
strPassword = "Пароль"

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
   "root\CIMV2", _
   strUser, _
   strPassword, _
   "MS_409", _
   "ntlmdomain:" + strDomain)

Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime")
Set dtmEndDate = CreateObject("WbemScripting.SWbemDateTime")
DateToCheck = CDate("06/11/2008")
dtmStartDate.SetVarDate DateToCheck, CONVERT_TO_LOCAL_TIME
dtmEndDate.SetVarDate DateToCheck + 1, CONVERT_TO_LOCAL_TIME

Set colLoggedEvents = objWMIService.ExecQuery _
   ("Select * from Win32_NTLogEvent Where Logfile = 'System' and TimeWritten >= '" _
   & dtmStartDate & "' and TimeWritten < '" & dtmEndDate & "'"  & " and SourceName = 'Print'" _
   & " and EventCode = 10" _
   & " and User = LIKE '%locUser%'")
For Each objEvent in colLoggedEvents
  Wscript.Echo "*----------------------------------------------------------------------------*"
   Wscript.Echo "Category: " & objEvent.Category & VBNewLine _
   & "Logfile: " & objEvent.logfile & VBNewLine _
   & "Computer Name: " & objEvent.ComputerName & VBNewLine _
   & "Event Code: " & objEvent.EventCode & VBNewLine _
   & "Message: " & objEvent.Message & VBNewLine _
   & "Record Number: " & objEvent.RecordNumber & VBNewLine _
   & "Source Name: " & objEvent.SourceName & VBNewLine _
   & "Date Written: " & objEvent.Data & VBNewLine _
   & "Time Written: " & objEvent.TimeWritten & VBNewLine _
   & "Event Type: " & objEvent.Type & VBNewLine _
   & "User: " & objEvent.User
Next
56 DoNT
 
12.11.08
17:07
ладно, варианты копирования документа отбросим, как и то в каком сотоянии принтер. Нужен лишь признак "послали докумен или нет".
57 Деметрио
 
12.11.08
17:08
+(54) за пронос своей бумаги расстреливать.
58 DoNT
 
12.11.08
17:09
О скриптики пошли, ща мы их потестим.
59 Garik-1980
 
12.11.08
17:39
Этот скрипт только список событий успешного завершения печати выводит.
60 Garik-1980
 
12.11.08
17:48
А вот если кто подскажет каким образом отобрать только события определенного пользователя...
61 Ковычки
 
12.11.08
18:01
все делается без единого скрипта
(39) непренужденно
62 Ковычки
 
12.11.08
18:02
(55) и умереть ? а с датетаймами обломишся при случае
а если и скриптовать, то все просче, все будет в одном месте и читай хоть через год
63 Torquader Darigha
 
12.11.08
18:03
Написать where ... and user='1S-user' не пробовали.
Также можно напрямую писать в порт.
Кроме того, если у вас HP скажет 1050, то если в нём кончился тонер, то принтер этого не заметит, и будет куча пустой бумаги.
(46) - эта идея была реализована в Штрих-М ресторан - фронт-офис, но скорее там была попытка реализации, так как это не заработало.
P.S. если ставить специальный принтер на термоленте, то у него есть возможность двустороннего управления из программы.
64 SERG73
 
12.11.08
18:17
Можно посылать сразу на принтер, без предпросмотра, вот пример:                
Если (Константа.Показывать=Да) ИЛИ (ПустоеЗначение(Константа.Показывать)=1)Тогда
  Таб.ТолькоПросмотр(1);
  Таб.Показать("Печать наряда на сборку","",1);
Иначе
  Таб.ПараметрыСтраницы(1,100,,,,,,,,1,,СтрПринтер);
  Таб.Напечатать(0);
КонецЕсли;

Счетчик печати можно организовать так - для каждой печатной формы генерится уникальный номер, например:
ИДДок = ЗначениеВСтрокуВнутр(Док) + Строка(НомерФормы);
который при печати заносится в специальный справочник вместе с документом, при печати проверяешь наличие его в справочнике, если есть - значит печать повторная. Можно счетчик добавить.
65 Ковычки
 
12.11.08
18:26
(64) а для Таб.Показать("Печать наряда на сборку","",1); кто будет считать ?
+ СтрПринтер="\\комьютервсемдающейбухши\самый задротный принтер на свете"
66 Euguln
 
12.11.08
18:27
А ещё можно совместить принтер и сканер, сканировать распечатанное. Или совместить принтер и сканер штрихкода, при каждой печати новый штрихкод назначать документу и в колонтиткуле печатать. :)))
67 Torquader Darigha
 
12.11.08
18:29
(65).
На чужом компьютере вообще сложно узнать, что напечаталось, а что нет.
Не факт, что на нём можно запустить WMI-запросы.
Поэтому (1) был прав, а всё остальное - это рассуждения на тему, если нельзя, но очень хочется.
68 Ковычки
 
12.11.08
18:33
(67) достойный ответ был в (4) но только он сам толком не понял о чем сказалЮ даже логов ненадо
69 Ковычки
 
12.11.08
18:34
хотя соглашусь, что самый-присамый верный (1)
70 SERG73
 
12.11.08
18:35
Приведу возможную процедуру выбора принтера:
Процедура ВыбПринтера()  
   сзПринтер  = СоздатьОбъект("СписокЗначений");
   //Получить список принтеров:
   wshNetwork = createObject("WScript.Network");
   oPrinters  = wshNetwork.EnumPrinterConnections();
   i = 0;
   While i < oPrinters.count() - 1 do
       сзПринтер.ДобавитьЗначение(СокрЛП(oPrinters.item(i + 1)));
       i = i + 2;
   enddo;                      
   ЗН = "";
   Если сзПринтер.ВыбратьЗначение(ЗН, "Выберите принтер") = 1 Тогда
       СтрПринтер = СокрЛП(ЗН);
   КонецЕсли;
КонецПроцедуры
71 Ковычки
 
12.11.08
18:36
(70) а где локальные брать ? и где брать джетдиректовские ?
72 Torquader Darigha
 
12.11.08
18:43
Кстати, в настройках принтера есть возможность сохранять задания после печати - потом нужно посмотреть, где они сохраняются и как их читать.
(70), а что стандартный выбор принтеров не прокатывает ?
73 SERG73
 
12.11.08
18:52
Похожая задача решена примерно так как описано выше.  Печать идет через внешнюю обработку, вызывается из журнала.  По каждому факту повторной печати автор пишет служебку. Вот такие пироги.
74 Злопчинский
 
12.11.08
20:51
резюмируем:
я так и не понял, могу я на своем компе узнать - успешно ли напечатался на расшаренный принтер на другом компе? где ведется лог успешных заданий печати! и прочее (Ковычки - сказал и молчит дальше)...
75 Злопчинский
 
12.11.08
20:52
(59) а подробнее чуть - что "считает" - успешные печати на локальный притер или на расшаренный тоже?
76 Ковычки
 
12.11.08
20:54
(74) лог ненужен, достаточно (4) и (72) почитать и выкинув ненужное - получить результат, без программирования.
(ну а при админских правах, скрипт из 10 строк и все инфа по всей сети у тебя в кармане)
77 Ковычки
 
12.11.08
20:56
(75) на всех, но он на первом же задании умрет
78 Ковычки
 
12.11.08
20:57
+(76) если хочется повозиться с вми ищи информацию о постояных получателях событий
79 Злопчинский
 
12.11.08
21:26
2 Ковычки: спсб, ибо я не спец в этих делах. Конспективно - где этот "лог сервера печати" (4) искать?
80 sam_sam
 
12.11.08
21:38
у меня была задача. Операторы из офиса посылали документы на печать на склад, у документа устанавливался признак распечатан. Кладовщик получая форму из принтера совал ее под сканер штрих кода, у документа устанавливался признак получен. Если с документом со статусом распечатан не производились никакие действия в течении 5 минут, он выделялся в журнале документов красным цветом и начинались разборки операторов с кладовщиками.
зы
на самом деле это только часть задачи.
81 Холст
 
12.11.08
23:06
(80) хорошо придумали, а какие другие части ?
82 Злопчинский
 
12.11.08
23:32
Да, это зачетное решение, спсб.
прикручу аналогичный подход к немного другому действию....
83 sam_sam
 
12.11.08
23:49
(81) это не я придумал это жизнь придумала. Складской учет + адресный склад + логистика. Еще статусы документов: собран, частично собран, не едет, возврат, частичный возврат. То есть комуникация офиса и склада посредством статусов документов. Учитывая что при этом меняется цвет строки журнала документов, этакое общение посредством цветов. я когда это придумывал использовал метод индейских костров. Индейцы чтобы передать информацию  разжигали костры которые давали дым разных цветов.
зы
а может и звиздеж, я про индейцев.
84 Ковычки
 
13.11.08
00:19
(79) да там просто, на принтерах выставляешь сохранять документы после печати и радуйся
А с поставщиком/получателем
где то так

set wshshell=CreateObject("wscript.shell")
call wshshell.run("%comspec% /c mofcomp -N:root\cimv2 %SystemRoot%\system32\Wbem\Wbemcons.mof&&pause",9,-1)
Computer="."
Set Service = GetObject("winmgmts:\\" & Computer & "\Root\CIMV2")
Set oFilter = Service.Get("__EventFilter").SpawnInstance_()
oFilter.Name = "MonPrnJobLog"
oFilter.QueryLanguage = "WQL"
oFilter.Query = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PrintJob'"
oFilter.Put_
Set oConsumer = Service.Get("LogFileEventConsumer").SpawnInstance_()
oConsumer.Name = "MonPrnJobLog"
oConsumer.FileName = "C:\MonPrn.txt"
oConsumer.Text = "Пользователь: %TargetInstance.Owner%, Компьютер: %TargetInstance.HostPrintQueue%, Принтер: %TargetInstance.Name%, Документ: %TargetInstance.Document%, Всего страниц: %TargetInstance.TotalPages%, Время печати:  %TargetInstance.TimeSubmitted%, Отпечатано страниц: %TargetInstance.PagesPrinted%"
oConsumer.Put_
Set oFilter = Service.Get("__EventFilter.Name='MonPrnJobLog'")
msgbox oConsumer.Text
Set oConsumer = Service.Get("LogFileEventConsumer.Name='MonPrnJobLog'")
Set oBinding = Service.Get("__FilterToConsumerBinding").SpawnInstance_()
oBinding.Filter = oFilter.Path_
oBinding.Consumer = oConsumer.Path_
oBinding.Put_


Чтобы удалить поставщика
85 Ковычки
 
13.11.08
00:20

Set objService = GetObject("winmgmts:\\.\Root\CIMV2")
Set objFilter = objService.ExecQuery("select * from __EventFilter")
for each c in objFilter
c.Delete_
next
Set objConsumer = objService.ExecQuery("select * from LogFileEventConsumer")
for each c in objConsumer
c.Delete_
next
86 КонецЦикла
 
13.11.08
00:30
(29) Так и делается обычно
А гланды через .опу - зачем?
87 КонецЦикла
 
13.11.08
00:37
(80) А если заказ вылез а его никто не поднес к сканеру? А если он вообще не вышел из принтера (сбой, замятие, вырубили эл/эн)?
У нас печатают заявки на складе сами себе, тупо работает конвейер + заявки выстраиваются по приоритетам
88 КонецЦикла
 
13.11.08
00:38
(79) Выложишь на инфостарт "свое" очередное исследование? :)
89 Злопчинский
 
13.11.08
03:11
(83) не ты первый - не ты последний... ;-)
на старой работе у мну аналогичная система года два вертелась по статусам заявок для общения между продажниками, складом и выпиской документов - с учетом того, что активно юзалась схема "заявки-заказы", причем под одну заявку от 5-6 поставщиков товар шел... и все это отслеживалось и отображалось...
.. и на текущей работе аналогичная система работает месяцев 9 уже...
90 Sserj
 
13.11.08
03:29
(0) Сам не использовала, но по памяти помню FormEx.dll ищи здесь http://dorex.ru/
Глобальный перехватчик ПриПечатиТаблицы
91 Злопчинский
 
13.11.08
03:39
(88) обязательно! как только будет доведено мною (если осилю ;-) до "промышленного" исполнения по принципу "взял и юзай" (или подробная пошаговая инструкция)
..
а почему "свое" - в кавычках... намек на что?
я где-то чужое за свое выдавал?
92 Злопчинский
 
13.11.08
03:40
(90) формекс не решает вопроса "был ли напечатан" документ.
в свое время Абрахамс выкладывал решение мониторинга очереди заданий на печать...
Ошибка? Это не ошибка, это системная функция.