1с формирует документ, изначально не известно какое число листов при печати будет создано. По умолчанию включена двусторонняя печать. Если у документа страниц > чем 2 и число копий >= 2, то происходит печать заданного числа копий документа с двусторонней печатью. Все хорошо. Если документ состоит из одной страницы и число копий >= 2, то печать идет с обоих сторон листа. Т.е. вместо двух отдельных листов, я получаю один с обеих сторон у этого документа две одинаковые страницы. В windows при этом все впорядке. Печатается две отдельные страницы.
wine-20080321-alt0.M40.2 libwine-20080321-alt0.M40.2 wine-etersoft-network-1.0.8-alt0.M40.7
(In reply to comment #1) > wine-20080321-alt0.M40.2 > libwine-20080321-alt0.M40.2 > wine-etersoft-network-1.0.8-alt0.M40.7 > Тоже самое с libwine-20080404-alt0.M40.2 wine-20080404-alt0.M40.2
Да, в данном случае, при печати в файл идёт описание двухсторонней печати: %%BeginFeature: *Duplex DuplexNoTumble <</Duplex true/Tumble false>>setpagedevice %%EndFeature При этом двусторонней печатью занимается сам принтер. Как я понял, он каждую вторую страницу должен переворачивать. Пробовал документ, состоящий из одной страницы, но число копий = 2, и документ из двух страниц, число копий = 1. Они имеют идентичную структуру
Возникла мысль: если документ состоит из 1 страницы, то просто отключать дуплекс. Думаю, что при этом ошибка останется: когда, например, документ имеет 3 страницы, а и число копий = 2, тогда первая страница второй копии может оказаться не на новом листе, а на предыдущем. Надо проверить, если так, то проблему надо решать другим способом
Существует 2 решения проблемы: 1) Вставлять после каждой копии команду (если такая вообще есть) принтеру о том, что следующую страницу надо печатать с нового листа. 2) При нечётном количестве страниц вставлять после каждой копии пустую страницу
(In reply to comment #5) > Существует 2 решения проблемы: > 1) Вставлять после каждой копии команду > (если такая вообще есть) принтеру о том, что > следующую страницу надо печатать с нового > листа. > 2) При нечётном количестве страниц > вставлять после каждой копии пустую > страницу > Что будет если еще ставить галку разобрать по копиям при нечетном числе страниц?
Странно как-то: Пробовал печатать в файл в Linux в OpenOffice получается следующее: PostScript, генерируемый OpenOffice и PostScript, генерируемый из 1С отличаются по формату, но тенденция остаётся: Пробовал документ, состоящий из одной страницы, но число копий = 2, и документ из двух страниц, число копий = 1. Они имеют идентичную структуру. Вот и получается, что ошибка и в ОpenOffice тоже
(In reply to comment #8) > Что будет если еще ставить галку разобрать > по копиям при нечетном числе страниц? > Имеется ввиду галка "Разбить" рядом с числом копий? Она везде стояла. А вообще, при количестве страниц 2 (две копии или 2 страницы), она не должна влиять, но надо проверить.
При 1 странице и 2-мя копиями, при включенном и при выключенном "разбить", выходные файлы получайтся абсолютно идентичными
Функции WINAPI позволяют только задавать начало/конец документа и начало/конец страницы. А такой комманды как "печатать следующую страницу с нового листа" не предусмотрено. Очень интересно как в этом случае поступает Windows, но проверить не получается.
Можно попробовать написать хак, который из диалога узнаёт, количество копий, есть ли двусторонняя печать. Надо ещё откуда-то брать количество страниц в документе. И тогда, если имеем нечётное число страниц, включена двусторанняя печать, и количество копий больше 1, тогда сразу после EndPage последней страницы каждого документа можно вставлять пустую страницу. Вообще, выглядит это совсем не красиво. Должен быть другой вариант, но я его пока не вижу
В OpenOffice на подобную проблему уже был заведён баг: http://www.openoffice.org/issues/show_bug.cgi?id=22304 Проблема до сих пор не решена.
Также http://www.openoffice.org/issues/show_bug.cgi?id=41583 http://www.openoffice.org/issues/show_bug.cgi?id=46953 К сожалению придётся признать, что без наличия устройства мы не сможем сделать никаких выводов о том, как это должно работать. Надо хотя бы поставить у нас аналогичные драйвера (какой принтер используется?) и проверить в Linux, а по возможности и в Windows.
(In reply to comment #14) > Также > http://www.openoffice.org/issues/show_bug.cgi?id=41583 > http://www.openoffice.org/issues/show_bug.cgi?id=46953 > > К сожалению придётся признать, что без > наличия устройства мы не сможем > сделать никаких выводов о том, как это > должно работать. > Надо хотя бы поставить у нас аналогичные > драйвера (какой принтер используется?) > и проверить в Linux, а по возможности и в Windows. > HP Laser Jet 1320
протестировали на OpenOffice с принтером HP Laser Jet 1320. Печатает всё нормально. В файл вставляется пустая страница. Получается, что если принтер не дуплексный, а выбрана дуплексная печать, то печатается не правильно. Если же OpenOffice определяет, что принтер дуплексный, то при нечётном количестве страниц вставляет пустую страницу в конце каждой копии.
Протестировали на 1С 8.0.18.2 - пустая страница не вставляется. Возможно ошибка в том, что 1С не может узнать о том, что принтер дуплексный. А возможно, что этим должна заниматься не 1С, а Windows/Wine
Как я заметил, в Windows для каждой модели принтера свой диалог. Если он не поддерживает дуплексную печать, то там нет соответствующей опции. А в Wine 1 диалог для всех принтеров, по мы можем выбрать дуплексную печать, хотя принтер на самом деле её не поддерживает
Пробовал посмотреть запрашивает ли 1С параметры принтера: Странно, но не запрашивает. Или запрашивает, но каким-то не известным мне способом
Описание такой же баги с Microsoft Word 97: http://support.microsoft.com/kb/196857/EN-US/
пробовал OpenOffice2.1 под Wine - тест не удался так, как ОО генерирует вторую копию не самостояетельно, а ставит принтеру количетсво копий = 2
пробовал OpenOffice2.4.0 под Wine : Печатаю 1 страницу, 2 экземпляра с дуплексом файл состоит из 3-страниц, только 2-я, которая должна быть пустой, тоже содержит текст.
А вообще, это мало о чём говорит, ведь ОpenOffice под Windows отличается от Линуксового. Надо проверить ту же самую версию OpenOffice в Windows. Если она будет нормально печатать (вставлять пустую страницу между копиями), то скорее всего вставкой пустой страницы должна заниматься Windows/Wine. Если же нормально печатать не будет, значит это была ошибка в OpenOffice. В предыдущем тесте ОpenOffice как-то определил, что надо вставлять пустую страницу (хоть и вставил не пустую). Значит можно предположить, что получение возможностей принтера в Wine работает нормально. Вообще это получение работает вызовом функции DeviceCapabilities(). 1C почему-то её не вызывает. Надо проверить вызывает ли её OpenOffice
Не удалось найти драйвера для HP Laser Jet 1320 под Win98 Попробовал печатать в 1С через Хerox DocuPrint 390HC, он тоже поддерживает дуплексную печать, к тому же генерирует файл в формате PostScript. В данном случае генерируется 2 страницы вместо 3-х.
Пробовал 1С81 на WinXP c драйвером для hp 1320, поддерживающим PostScript. В итоге в документе только 1 страница, но количество копий стоит 2. Странно как-то : в данном случае 1С не сама дублирует документ, а поручает это драйверу принтера, при этом всё должно печататься нормально
А вообще должен быть какой-то механизм, с помощью которого 1С определяет параметры принтера. Ведь в 1 случае она сама занимается дублированием документа, а в другом - поручает это драйверу принтера. Думаю вся проблема в том, что под Wine 1С не может определить поддерживает ли драйвер принтера создание нескольких копий, или же она определяет, что не поддерживает (хотя на самом деле принтер это поддерживает)
Подробнее проверил OpenOffice через Wine. Как уже говорилось, он вставляет пустую страницу. Только он, в отличие от 1С, вызывает функцию DeviceCapabilities, и определяет поддерживает ли принтер дуплексную печать
1C вызывает PSDRV_ExtDeviceMode() оттуда она может получать иформацию об установленном принтере.
Проверил 1С на WinXP: поставил несколько копий, дуплексную печать не ставил. В итоге 1С формирует документ, состоящий из 1 страницы и с указаным количеством копий. Т.е получается что 1С смотрит возможности принтера (скорее всего через PSDRV_ExtDeviceMode() ) и проверяет может ли он сам печатать несколько копий. Если да, то 1С сама не занимается дублированием, а перекладывает это на драйвер принтера. В Wine 1С всегда сама формирует нужное количество копий. Получается, что WINE возвращает неправильную информацию о возможностях принтера
PSDRV_ExtDeviceMode() первым делом получает данные о выбранном принтере из системы ( вызывает PSDRV_FindPrinterInfo() ). При этом флаги DM_COPIES и DM_DUPLEX выставлены, а DM_COLLATE сброшен (т.к Wine пока ещё не поддерживает этот режим). Появилось предположение, что 1С определяет, что DM_COLLATE сброшен, и решает, что ей надо самостоятельном формировать нужное количество копий. Предположение не подтвердилось. Если сразу после вызова PSDRV_FindPrinterInfo() принудительно выставить флаг DM_COLLATE, то ничего не изменится.
ещё существуе функция WINSPOOL_GetPrinterDriver(). Она выдаёт информацию о драйвере принтера. 1С ещё использует. Возможно как-раз через неё она получает характеристики принтера
WINSPOOL_GetPrinterDriver() записывает в определённый драйвер структуру, описывающую драйвер принтера. Структуры бывают разного уровня (В данном случае уровень 3). В этой структуре в основном содержатся пути к разным компонентам драйвера подробнее: http://msdn2.microsoft.com/en-us/library/ms535710(VS.85).aspx В частности путь к файлу с данными драйвера: c:\windows\system32\spool\drivers\win40\0\generic.ppd Данный каталог существует, однако файлов там нет!
дабавление туда файла от hp 1320 ничего не изменило
Маловероятно, что 1С напрямую вызывает GetPrinterDriver(). Эта функцию вызывает диалог печати
ещё вызывается функция GetDeviceCaps() она отвечает в основном за графические возможности принтера, но лучше посмотреть по-подробнее
Проверил: GetDeviceCaps() отвечает только за графические возможности принтера
Не вижу ничего лучшего, как попробовать вариант в <Комментарий #12> Есть 2 пути: 1) вставлять пустую страницу в функции PSDRV_EndPage() после конца каждого документа. Тут есть проблема: 1С сама формирует страницы, поэтому скорее всего не удастся узнать сколько страниц в документе 2) ждать конца документа. В этом случае при вызове функции PSDRV_EndDoc() уже будет известно количество страниц. Затем необходимо пробегаться по всему документу , вставлять в нужном месте пустые страницы и изменять номера последующих страниц. Здесь тоже есть проблемы: а) из функции PSDRV_EndDoc() известна только структура, относящаяся к драйверу принтера, а там всегда dmCopies = 1. Таким образом известно общее количество страниц, но неизвестно количество экземпляров документа. б) при выполнении PSDRV_StartPage и PSDRV_EndPage страницы записываются в spool коммандой WriteSpool16(). А редактировать их там уже намного сложнее
(In reply to comment #37) > Не вижу ничего лучшего, как попробовать > вариант в <Комментарий #12> С радостью потестируем.
Виталий лучше знает, но, похоже, к середине-концу июня сделает.
(In reply to comment #39) > Виталий лучше знает, но, похоже, к > середине-концу июня сделает. > К середине-концу июня, у нас клиент уже уйдет. Ошибка открыта 11.04, время решения ошибки 2 месяца. Это много.
Решили, что ещё пытаемся найти, почему 1С не понимает, что драйвер сам может тиражировать страницы. Если не получается, единственный вариант - блокировать выставление количества копий >1 в дуплексном режиме. Да, проблема актуальна и для 1C 7.7
Появилось возможное решение: 1С вызывает диалог печати, при этом заполняет структуру PrintStructures->lpPrintDlg. В частности указывает там флаг PD_USEDEVMODECOPIESANDCOLLATE, говоря о том, что приложение поддерживает самостоятельное формирование заданного числа копий. Проверил: структура PrintStructures->lpPrintDlg относистя только к опциям диалога печати и никак не меняется при смене принтера. Далее сам диалог печати определяет( по биту PD_USEDEVMODECOPIESANDCOLLATE), что 1С способна сама формировать заданное количество копий, поэтому для надёжности (а вдруг драйвер этого не поддерживает) возлагает это на 1С. А проблема в том, что двухстороннюю печать 1С правильно может осуществлять только посылая на принтер весь документ, и возлагая дублирование копий на драйвер принтера. Решением в данном случае является принудительная установка флага при двухсторонней печати PD_USEDEVMODECOPIESANDCOLLATE.
Вообще в Windows всё по-другому: Если принтер поддерживает формирование заданного количества копий и приложение это поддерживает, то формированием занимается принтер. В Wine - если приложение это поддерживает, то оно этим и занимается Думаю надо вызывать смотреть возможности принтера, и если он поддерживает формирование количества копий, то убирать флаг PD_USEDEVMODECOPIESANDCOLLATE.
Создал патч. Сейчас всё должно работать
(In reply to comment #44) > Создал патч. Сейчас всё должно работать > Виталий, огромное спасибо.