Пакетная печать в строго заданном порядке

В силу различных особенностей ПО, ОС, драйверов и т.д. порядок печати документов не всегда совпадает с порядком их отправки на печать.
Данный метод позволяет всегда получать на выходе нужный порядок документов.

В чем проблема?

Основная проблема хаотичного порядка печати — это произвольная отправка документов из очереди на печать. При печати одного документа его страницы всегда будут напечатаны в заданном порядке. Идея состоит в том, чтобы сформировать из печатных документов один документ и уже его отправить на печать.

Данная проблема уже обсуждалась, например, вот здесь. Но когда я столкнулся с этой проблемой, предложенные варианты либо не работали, либо не удовлетворяли.

Решение

Начиная с версии 8.3.3 платформы 1С реализован объект ПакетОтображаемыхДокументов, через который и реализована печать во всех современных типовых конфигурациях.

У этого объекта есть замечательная функция ЗаписатьФайлДляПечати(), которая позволяет весь пакет, с учетом порядка и копий отдельных документов, сохранить в PDF-файл. Остается лишь распечатать этот документ.

К сожалению, встроенные средства платформы позволяют только сохранять в PDF, но не читать их, а уж, тем более, печатать.

На помощь могут прийти различные консольные программы, которые позволят отправить файл на печать.

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

Вместо метода Напечатать вызываем ЗаписатьФайлДляПечати, сохраняем PDF во временный файл и отправляем на печать уже PDF:

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ПакетОтображаемыхДокументов.ЗаписатьФайлДляПечати(ИмяВременногоФайла);
КомпонентаПечатиPDF.Печать(ИмяВременногоФайла, "Пакет документов");

 

20 Comments

  1. saa@kuzov.org

    Подскажите, пожалуйста, те, кто пользовался этим «Пакетом»…

    Вот есть конфа (на БСП, но это не важно), веб-клиент.

    Есть печатная форма у документа, а есть где-то снаружи сделанный pdf-файл, прикрепленный к этому документу.

    Можно ли сделать команду «Печатать все» таким образом, чтобы в результирующий pdf для печати вывелся и табличный документ, и все страницы прикрепленного pdf’а?

    Reply
  2. saa@kuzov.org

    (1) из ИТС я знаю, что Режим пакетной печати предназначен для печати нескольких табличных документов

    Может можно как-то извернуться и встроенными средствами запихнуть pdf в табличный документ, а затем уже добавить его в пакет?

    Reply
  3. crazycat

    (2) К сожалению, встроенных средств для работы с PDF в 1С нет, есть возможность сохранения в PDF и все.

    В вашем случае есть несколько вариантов решения:

    1. Внешняя компонента печати PDF для браузера, я сейчас как раз занимаюсь ее разработкой;

    2. Конвертация PDF в картинки и размещение их в табличном документе для последующей печати;

    3. Вывод PDF в табличный документ — идея в том, чтобы все объекты PDF транслировать в объекты табличного документа (линии, надписи, картинки) — была мысль реализовать такое, но пока даже не знаю насколько это реально, буду пробовать.

    У первых двух методов решения есть недостатки, а вот 3-й вариант, кажется, наиболее универсальным и правильным.

    Reply
  4. crazycat

    (2) Я добавил версию внешней компоненты печати PDF для Веб-клиента (поддерживаются браузеры Firefox и Chrome), думаю, Вам должен подойти этот вариант. Вам нужно будет передавать файл с сервера на клиент, сохранять его во временный файл и вызывать печать через компоненту.

    Скоро добавлю возможность печати PDF из двоичных данных, чтобы не нужно было сохранять PDF перед печатью.

    Reply
  5. maxvcb

    (3) А как на счет использования командной строки?

    «Foxit Reader.exe» PdfFile /t PrinterName

    Reply
  6. crazycat

    (5) в публикации я упоминал про это, но меня этот вариант не удовлетворил, у компоненты есть преимущества, например:

    1. Скорость выполнения;

    2. Нет необходимости в дополнительном ПО;

    3. Компонента умеет выводить PDF из памяти, без сохранения файла на диск.

    Reply
  7. triviumfan

    Извините, но ведь прошло уже… «тысячелетие» в 1с.

    Достаточно просто воспользоваться https://its.1c.ru/db/metod8dev#content:5792:hdoc

    Статья от 08.08.2014

    Reply
  8. crazycat

    (7) а Вы читали статью? большой разницы нет как компонуются документы перед печатью и какими методами / объектами, в конечном итоге они отправляются на печать отдельными пакетами и дальше уже платформа 1с не контролирует процесс, проблема существует и я с ней столкнулся, при этом перед печатью документы компоновались как раз-таки через ПакетОтображаемыхДокументов, но в итоге печатались совсем не в том порядке, в каком они были в пакете.

    Reply
  9. triviumfan

    (8) Режим совместимости?

    https://its.1c.ru/db/v838doc#bookmark:dev:TI000001244


    ● Поведение метода ПакетОтображаемыхДокументов.Напечатать():

    ● Используется режим совместимости с версией 8.3.7 – каждый документ печатается в отдельном задании.

    ● Не используется режим совместимости:

    ● Для ОС Windows:

    ● создается одно задание на принтер;

    ● весь пакет выводится в один файл, имя которого запрашивается перед выводом.

    ● Для ОС Linux:

    ● если параметры печати всех документов в пакете совпадают – поведение совпадает с поведением в ОС Windows;

    ● если параметры различаются – каждый документ печатается в отдельном задании принтера.
    Reply
  10. crazycat

    (9) Режим совместимости отключен

    Reply
  11. scherbakovya

    Как решается вопрос двусторонней печати пакета документов? Т.е. если выкинуть пакет в pdf, а потом запустить двустороннюю печать, то следующий документ может распечататься на обратной стороне предыдущего?! Также как решен вопрос с разным количеством экземпляров разных документов пакета, т.е. одних нужно 3 копии других 2 и т.п.?

    Reply
  12. crazycat

    (11) С двусторонней печатью попробую, отпишусь. Что касается разного количества экземпляров для разных документов, то при выводе в PDF платформа уже делает несколько копий документов, следующих друг за другом в самом PDF, компонента лишь выводит готовый PDF.

    Reply
  13. scherbakovya

    (12) Насчет вывода в pdf нескольких копий все верно, я видел, но вот заметил одну интересную вещь. Если в ПФ использовать штрихкоды, то при выводе в pdf первая копия выводится отлично, а вот вторая и последующие копии (если их больше 2-х) выводятся с не верным штрихкодом (он размазан). С таким не сталкивались?

    Reply
  14. crazycat

    (13) нужно смотреть реализацию печати при выводе штрих-кода, возможно, печать происходит не средствами платформы

    Reply
  15. crazycat

    (11) двустороннюю печать реализую в ближайшее время, напишу, пока ее поддержки нет

    Reply
  16. scherbakovya

    (15)Как успехи с реализаций печати в двустороннем варианте?

    Еще заметил, что при печати большого количества документов иногда они выходят не по порядку.

    Reply
  17. user619273_alevtina

    Что с реализацией двусторонней печати?

    Reply
  18. skyadmin

    Я сделал с момощью расширения модуля УправлениеПечатьюКлиент

    Процедура РаспечататьТабличныеДокументы(ТабличныеДокументы, …..)

    ТабличныеДокументы это список значений, подменил в нем представления (добавил в начале нужные мне цифры)

    и отсортировал по представлению, а вместо

    //ПакетОтображаемыхДокументов = УправлениеПечатьюВызовСервера.ПакетДокументов(ТабличныеДокументы,
    // ОбъектыПечати, ПечататьКомплектами, КоличествоКопийКомплектов);
    //ПакетОтображаемыхДокументов.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
    

    сделал

    Для Сч = 1 По КоличествоКопийКомплектов Цикл
    Для Каждого Элемент Из ТабличныеДокументы Цикл
    ТабличныйДокумент = Элемент.Значение;
    ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
    КонецЦикла;
    КонецЦикла;
    
    Reply
  19. crazycat

    (18) спасибо за пример, в Вашем примере табличные документы отправляются на печать как отдельные задания, соответственно проблема с очередью печати сохраняется, т.к. «В силу различных особенностей ПО, ОС, драйверов и т.д. порядок печати документов не всегда совпадает с порядком их отправки на печать».

    Reply
  20. crazycat

    (17) День добрый!

    Извиняюсь за долгую реализацию, двусторонняя печать реализована.

    Если ещё актуально, просьба обновить компоненту и протестировать.

    Спасибо!

    Reply

Leave a Comment

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