Bug 1119

Summary: 1с 8.1 (8.1.9.57) При печати с указанием "Число копий" больше одной, печатается куча лишних копий.
Product: WINE@Etersoft Reporter: Dmitry Isakov <beltinc>
Component: Печать ; Диалог печатиAssignee: Виталий Перов <vitperov>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P5 CC: baraka, beltinc, lav, n-oberemko, saa, vitperov
Version: 1.0.8   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 437, 443, 777    

Description Dmitry Isakov 2008-02-02 09:58:20 MSK
Ошибка возникает из-за того, что 1с сама формирует запрошенное число копий, а потом wine добовляет в вывод ps тег NumOfCopies. 

Тестировал как бесплатные, так и коммерческие сборки WINE@Etersof на Debian, Ubuntu, и CentOS 5.1 - везде присудствует эта ошибка.

Для себя я проблему решил - прописал в исходниках wineps принудительно значение NumOfCopies = 1, но подобный костыль ломает печать из остальных приложений.
Comment 1 Vitaly Lipatov 2008-03-20 10:52:38 MSK
*** Bug 1423 has been marked as a duplicate of this bug. ***
Comment 2 Виталий Перов 2008-03-22 17:35:01 MSK
Трудно воспроизвести багу.
Пробую печатать в файл. В итоге только 1 раз, когда я выбирал 3 копии, программа показала: "печатаю 1/9...."
В остальных случаях пишет "печатаю 1/1...." независимо от числа копий. А в выходном файле всё нормально: столько страниц, сколько должно быть
Comment 3 Виталий Перов 2008-03-22 17:45:51 MSK
При дебаге обнаружил, что в одних случаях функция выдаёт:
trace:psdrv:PSDRV_MergeDevmodes Changing Copies to 3
а в других:
trace:psdrv:PSDRV_MergeDevmodes Changing Copies to 1

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

Changing Copies to... когда 3, а когда 1. Зависимость прослеживается плохо, но заметил, что при смене принтера это число 1.
Comment 4 Виталий Перов 2008-03-22 17:48:34 MSK
ага! Если открыть файл в текстовом редакторе, то можно найти строку:
mark {
 << /NumCopies 4 >> setpagedevice
} stopped cleartomark

т.е сам файл состоит из 4-х копий документа, да ещё и печатается 4 раза
Comment 5 Виталий Перов 2008-03-24 18:43:37 MSK
Проверил: сразу после смены принтера печатается столько страниц, сколько нужно
Comment 6 Виталий Перов 2008-03-24 19:47:13 MSK
стек вызова непосредственно перед изменением числа копий:
PSDRV_CreateDC -> PSDRV_MergeDevmodes
а в PSDRV_MergeDevmodes стоит комманда:
    dm1->dmPublic.u1.s1.dmCopies = dm2->dmPublic.u1.s1.dmCopies;
    TRACE("Changing Copies to %d\n", dm2->dmPublic.u1.s1.dmCopies);

как я понял PSDRV_CreateDC вызывается непосредственно из программы (т.к вызова этой функции из других я не нашёл)
Comment 7 Виталий Перов 2008-03-25 15:19:05 MSK
Нашёл примерное место ошибки:
в comdlg32/printdlg.c функция PRINTDLG_UpdatePrintDlgA
если не выполняется (а оно в данном случае не выполняется)
if (lppd->Flags & PD_USEDEVMODECOPIESANDCOLLATE)
то приложение само ответственно за печать нескольких копий. Выполняется:

	    if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED)
	        lppd->Flags |= PD_COLLATE;
            else
               lppd->Flags &= ~PD_COLLATE;
            lppd->nCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE);

Comment 8 Виталий Перов 2008-03-25 15:40:59 MSK
Ошибся в предыдущем сообщении
Если в lppd->Flags стоит бит PD_USEDEVMODECOPIESANDCOLLATE т.е выполняется условие
if (lppd->Flags & PD_USEDEVMODECOPIESANDCOLLATE)
это значит, что принтер не поддерживает печать нескольких копий, и приложение само ответственно за это.

В данном случае всё правильно: принтер поддерживает печать копий.
Скорее всего неправильно формируется сам документ
Comment 9 Пунанов Михаил 2008-03-26 14:07:37 MSK
Есть заявка по проблеме http://rt.etersoft.ru/Ticket/Display.html?id=5730 
Comment 10 Виталий Перов 2008-03-27 20:35:51 MSK
Разобрался со флагом PD_USEDEVMODECOPIESANDCOLLATE

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

Есть 2 переменные, в которых задаётся число копий:
- dmCopies в структуре DEVMODE - отвечает за драйвер принтера
- nCopies в структуре PRINTDLG - если я правильно понял, это количество копий, которе должно создать приложение

Получается, что если nCopies = Х, то приложение создаёт Х копий, а если ещё dmCopies = X, то драйвер эти Х копий повторяет Х раз. Получается Х^2.

Думаю надо просто проверять флаг PD_USEDEVMODECOPIESANDCOLLATE и, если он сброшен, то ставить dmCopies = 1
Comment 11 Виталий Перов 2008-03-27 21:25:33 MSK
Исправлено!
Патч лежит в /wine-etersoft-public/patches/check/comdlg32-printdlg-number_of_copies.patch
Comment 12 Семенов Александр Алексеевич 2008-03-28 10:01:39 MSK
Будет ли патч выложен в ближайшее время для общего доступа или его можно будет забирать только вместе с новой версией 1.0.9?
Comment 13 Vitaly Lipatov 2008-03-30 18:05:49 MSD
Будет обновлённая сборка бета-версии.
Comment 14 Виталий Перов 2008-10-08 19:22:11 MSD
*** Bug 2530 has been marked as a duplicate of this bug. ***