Добрый день. Задача вроде стандартная - печатаем из 1С определенные наборы документов, но нужно чтобы после печати они собирались последовательно, в том порядке в котором их отправляли. На выходе же получаем "кашу" из разных документов в том порядке в котором они "понравились принтеру". Если между отправкой на печать сделать паузу 3-5 секунд как правило это существенно улучшает ситуацию, но полностью не избавляет. Кто-нибудь сталкивался с подобной проблемой? Как решали?
У меня печатается по такому принципу порядка 250 000 страниц в неделю, и неплохо уже много лет.
Алкашка - очень много сопроводительной документации на отгрузку.
Решение как вы написали, все на сервере в терминале
1) PDF принтер который печатает все в определенный каталог из 1С
2) в 1С сделана "кнопка" печати комплекта документов, куда входят все нужные документы в нужном порядке. Она посылает документы по одному на PDF принтер, а в финале создает cmd файл который обеспечивает сборку из отдельных PDF файлов - одного файла с комплектом документов. На этом же этапе прицепляются все необходимые сканированные документы.
3) Робот печати который запущен в 1С проверяет наличие cmd файлов в каталоге, затем проверяет что в файловой системе появились все нужные PDF файлы (вы не можете знать заранее время их появления, ведь PDF принтер выдает их не в реальном времени, а фоном)и запускает cmd файл на исполнение. При этом контролируется кол-во одновременно запущенных файлов на сборку комплектов (необходимо чтобы не занять все ресурсы сервера)
4) как итог получается 1 PDF = 1 комплект документов который у нас лежит в определенных папках (по пользователям) и запускается на печать сотрудниками в отделе распечатки, которые находятся поближе к складу, а не в офисе...
Решаемые задачи:
- не путаются документы никогда (есть ШК комплекта документов с версионированием)
- контроль что все комплекты распечатаны и они соответствуют версии в 1с
- минимальное время ожидания у операторов при запуске на печать комплекта документов
- все задачи по склейке отдельных PDF файлов в комплект происходят на RAM диске для максимального быстродействия
Минусы:
- нужно реализовывать кнопку "Печать комплекта", ну или обработку
- программировать алгоритм робота в 1С робота
- организационные затраты
Есть ещё один старенький вариант.
В свойствах принтера поставить "Печатать прямо на принтер".
В этом случае на принтере ни чего путаться не будет. Более того ни кто и влезть в очередь не сможет.
Из минусов: работает не со всеми дровами, ну и приложение, печатающее зависает до окончания процедуры печати
102.
Захаров_Николай
1229.05.14 23:27 Сейчас в теме
Я исследовал тему глубже и нашел еще пару моментов. За которые можно зацепиться.
1. C:\WINDOWS\System32\spool\PRINTERS\<Имя принетра> хранятся задания для печати. Эту папку можно изменить. Суть в том, что можно ее мониторить. Еще не исследовал глубже, но это уже можно сделать из 1С.
2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers Тут в реестре хранятся много информации. Но еще не изучал может ли это пригодится. По крайней мере все настройки принтера тут.
3. ВК написать не долго, но есть несколько противоречий на которые я наткнулся. Есть мнение что на уровне WinApi не получится перехватить функции сетевого принтера. Хотя если подумать этого быть не должно. Завтра проведу испытания и если все пройдет хорошо здесь будет dll изначально с одной функцией - получение статуса. Но потенциал большой можно даже обрабатывать статус конкретного задания и реагировать на него. Это полезно когда случится замятие или бумага кончится.
103.
Захаров_Николай
1230.05.14 00:05 Сейчас в теме
Если вот эта штука покажет задания сетевого принтера, то это будет Win и я ее запихну в dll. Сейчас она показывает задания того принтера, что выбран по умолчанию.
104.
Захаров_Николай
1230.05.14 11:13 Сейчас в теме
Сегодня потестил на работе на общем сетевом принтере. Замечательно работает. Мало того она еще чужие задачи мониторит.
Остается решить вопрос где должна лежать dll. По логике там где установлен сервер 1С, но там же должен быть и принтер.
По сути все. Остается создать dll. До вечера...
(104) Захаров_Николай, эээ Ну вообще 1С в терминале, сервер 1С к печати вообще отношения не имеет, сетевые принтеры через printserver подключены локально... поэтому я даже не знаю можно ли это где-то грамотно мониторить... но главное ведь не мониторить... главное рулить... т.е. не дать новому заданию записаться в указанную папку пока старое не "прочухалось"... а вот как определить что старое распечатано уже...
106.
Захаров_Николай
1230.05.14 16:36 Сейчас в теме
(105) comol, определить что старое распечаталось можно вызвав функцию из dll. Если вернуло 0 пускаем следующее. Если эту функцию вызывать рег заданием, которое выполняется на сервере. То нужно как-то подтягивать принтеры на этот сервер. В регистре добавить имя принтера, в случае если печать выводится не на один.
(107) smallbuk, Ну системные администраторы сказали что внимательно, сам я тут немного не в теме... Для меня принтсервер это "некая коробочка вроде хаба, у которой и нет никаких настроек". Что касается настроек принтера и печати в Windows проанализированы и опробованы все варианты.
А если попробовать перед запуском 1ски выполнить такую команду? Могу ошибаться, но мне кажется, что ключ -docompletefirst должен отключать печать более позднего задания, даже если оно раньше попало в очередь (очередь печати на принтере должна быть включена)
Топик явно развивается методом тыка, имхо все потому что изначально не очень четко проблема сформулирована: сбой последовательности печати из первого поста по ходу дела обрастает "мелкими" подробностями типа сервера терминалов, принт-сервера, нескольких лог.устройств на один физ.принтер, фоновым заданием и т.п.
Не серьезно, предлагаю вернуться в начало и правильно сформулировать задачу. Идеально - так чтобы мы могли повторить проблему у себя. Решится тогда на раз.
(109) mixa4, Да там особо описывать то нечего... везде где работает Windows spooler и принтер находится не в одной локальной сети с 1С эта проблема будет воспроизводиться... другое дело что не для всех это "проблема".
110.
Захаров_Николай
1201.06.14 21:30 Сейчас в теме
Нашел время только вечером в воскресенье. И создал ВК вот ссылка. ВК можно засунуть в хранилище значений и сохранить в обработке на случай если возникнут проблемы с ее расположением.
Принцип работы следующий. Есть периодический регистр в котором задачи для печати. Есть рег. задание которое проверяет каждые 15 сек статус выполнения задачи принтером (через эту ВК), если значение 0 значит можно посылать следующее. Кстати среднее время печати листа принтера 16 сек. оно может варьироваться от степени прогрева принтера, можно и 20 сек. выставить период.
Проверить компоненту можно следующим образом запускаете задания на печать и в диспетчере печати нажмите "Приостановить". Далее вызвать функцию ВК. Не стал заморачиваться с входящим параметром, сделал вывод на принтер по умолчанию. Если нужно выбирать принтер через WshNetwork то могу доделать. :)
я так понимаю вся фишка в этом... Если удастся получить статус завершения выполнения задания на печать принтером то по идее проблема решится, я, если честно, очень сомневался что даже при помощи ВК статус выполнения задания можно как то получить. Принтеры они ведь "умные" с собственной памятью и собственной ОС по сути...
119.
Захаров_Николай
1201.06.14 22:46 Сейчас в теме
(115) comol, Вообще ВК показывает не статус а количество заданий на печати. Статус я хотел использовать для последующего анализа задачи. Например вдруг бумага замялась или кончилась. Будет выводиться сообщение, можно e-mail админу послать. :)
Принтеры они ведь "умные" с собственной памятью и собственной ОС по сути...
Не такие они умные. :) Да у них есть ОС но какое отношение она имеет к делу? Есть драйвер который отражает положение дел у принтера. И в Windows есть служба которая с этим драйвером работает. Вот с ней и работает ВК. Даже не с API кстати. И уже от этой службы я получаю все данные о состоянии принтера.
А вообще забавный велосипед получился.
(122) Захаров_Николай, оно при этом вроде получается достаточно долго... т.е. что-то ждёт... но всё равно не последовательно, по крайней мере так говорят... притом говорят что только на один принтер так...
Коллеги, большое всем спасибо за решение вопроса.
В итоге остановился на печати через PDF:
1) Отдельный сеанс "Робот" который тупо читает файлы *.mxl из нужной папки и сохраняет их вы PDF. РОБОТ РАБОТАЕТ ПОД WIN 2008(!) под WIN 2013 - не катит.
Документы сохраняются Док.Показать() Док.ЗАписать() Док.Скрыть() Иначе не печатается ШК
2) При печати основной сеанс сохраняет документы в mxl вместо печати, запускает по соседству OLE сервер и передаёт ему строку с именами файлов (потому как освноной сеанс под WIN 2013)
3) Как только появляются файлы PDF они объединяются при помощи программы pdftk в 1
4) Этот файл посылается на печать при помощи Foxit Reader с остальными проблемы
Вот такое блин получилось "извращение", спасибо большое Захаров Николай (110) который так глубоко погрузился в тему... видимо чуть чуть где-то только не срослось..., cooler (51),
конечно serg_info (54) который достаточно давно предложил подобное кривое, но похоже единственно возможное решение, stormicon (78), который в принципе все мысли по делу предложил без лирики.. kasper (39), который первый натолкнул на мысль об едином документе, chaotic (108), который предложил решение возможно очень простое и рабочее, которое я уже просто не попробовал...
116.
Захаров_Николай
1201.06.14 22:30 Сейчас в теме
Кстати Cooler прав, можно анализировать папку в которую складываются файлы печати. Но отказался от этой затеи так как доступ к этой папке по умолчанию C:\WINDOWS\System32\spool\PRINTERS\<Имя принетра> и уже после spool с правами пользователя туда не зайдешь. А вот ВК мне понравилась тем что прав админа не нужно чтобы анализировать этот параметр.
доступ к этой папке по умолчанию C:\WINDOWS\System32\spool\PRINTERS\<Имя принетра> и уже после spool с правами пользователя туда не зайдешь.
Не собираюсь спорить, просто к сведению: по ссылке в том же сообщении (59) описан способ изменения расположения папки очереди печати, можно один раз выбрать и назначить доступную для пользователя с ограниченными правами.
А вот применение скрипта из (108) лично мне кажется весьма перспективным, не исключено, что MS сама предусмотрела решение проблемы автора ветки, только запрятала глубоко.
Подробно параметры скрипта описаны тут, осталось перевести и попробовать.
Спасибо, просмотр темы дал решение более банальной проблемы (дуплексной групповой печати одного вида документов) через предварительную выгрузку печатных форм в pdf-формат... Печатаем 1 раз в квартал, настройки 1С не помогали (при нечетном кол-ве страниц документа следующий документ начинался на обратной стороне листа)
1)Настройка(таблица) - что, куда и сколько коппий и по каким группировкам, с именами серверов печати и именами принтеров, не Айпишникоф(чтобы возможно было заменять принтера)
2) Таблица для Печати(История печати) складывать не в файловую систему, а в таблицу СУБД в поля Блоб (ПДФ, ШМЭДЭЭФ ))) ).
3) служба которая смотрит на настройки и на таблимцу для печати и печатает туда куда надо и то что надо, включая термопринтеры и тд и тп
Такая система 15 000 документов в день, в миниммум 6 листов на документ
под УТ 10.3 все нормально работало.
после перехода на УТ 11.4 появилась такая же проблема - УПД_шки и товарные накладные все в разброс. после печати (50 листов) надо сидеть и собрать пазл.
Проблема была тут поднята еще 4-5 лет назад, может что то изменилась за это время? )) уже 2019 год, без костылей как можно печатать нормально?
Все же Проблема есть и мне кажется в 1С.
Вот смотрите, имеем такой набор документов:
Если его печатать, то все хаотично выходят, а именно так, как если сохранить эти документы в файл, вот я сохранил их, они в таком порядке и сохранились.
Была очень похожая проблема с путаницей в очереди печати,
Принтер был через доменную службу печати, подключение принтера по IP не помогло.
причем все с одного компа все высылалось последовательно а на выходе мешанина. Долго ломал голову. помогло отключение винспулера в настройках принтера на компе с которого отправка.
в настройках принтера поставить галку "печатать на принтер напрямую"