Почему нарушается порядок печати документов в 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

Многие технические специалисты, работающие с конфигурацией 1С:Управление торговлей 11, сталкиваются с «вечной» проблемой: при групповой печати комплектов документов (например, УПД, Счет на оплату и Реестр сертификатов) порядок выхода листов из принтера не соответствует порядку в предварительном просмотре. Ситуация осложняется тем, что при печати в PDF-файл всё отображается корректно, а на физическом устройстве документы «перемешиваются».

В этой статье мы подробно разберем причины возникновения этой коллизии и рассмотрим несколько эффективных способов решения — от настройки операционной системы до доработки программного кода.

Выясняем причину: почему документы «обгоняют» друг друга?

Проанализируем механику процесса. Когда 1С отправляет пакет документов на печать, она взаимодействует с диспетчером печати Windows (Spooler). Проблема кроется в асинхронной обработке заданий. По умолчанию Windows стремится начать печать как можно быстрее. Если в очереди оказывается тяжелый документ (например, УПД с логотипами и множеством строк) весом в 10 Мб и легкий (счет на оплату) весом в 50 Кб, диспетчер может завершить обработку легкого документа раньше и отправить его на печатающую головку первым, даже если он поступил в очередь вторым.

Ситуация усугубляется при работе через сервер терминалов (RDP), где пропускная способность канала и особенности перенаправления принтеров создают дополнительные задержки.

Способ 1. Настройка диспетчера печати Windows (Spooler)

Первым делом проанализируем настройки принтера на сервере. Это самый простой способ, не требующий изменения программного кода 1С. Нам необходимо заставить систему ждать, пока весь пакет документов будет полностью загружен в очередь, прежде чем начинать печать.

  1. Откроем «Панель управления», перейдем в раздел «Устройства и принтеры».
  2. Найдем целевой принтер, нажмем правую кнопку мыши и выберем «Свойства принтера».
  3. Перейдем на вкладку «Дополнительно» (Advanced).
  4. Найдем переключатель режимов печати. По умолчанию обычно выбрано «Начинать печать немедленно». Нам необходимо выбрать вариант «Начинать печать после помещения в очередь всей порции» (Start printing after last page is spooled).
  5. Нажмем «Применить» и проверим результат.

Важный нюанс: также рекомендуется отключить опцию «Дополнительные возможности печати» (Enable advanced printing features). Эти «возможности» часто включают оптимизацию порядка заданий, которая в нашем случае только мешает.

Способ 2. Использование объекта ПакетОтображаемыхДокументов

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

В типовых конфигурациях (УТ 11, ERP, КА) уже существует экспортная функция ПакетДокументов, которая должна собирать документы в пакет. Однако, как показывает практика, даже при использовании этого объекта платформа может генерировать несколько отдельных заданий в очередь печати Windows.

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

Способ 3. Слияние документов в один большой ТабличныйДокумент

Это самый надежный способ гарантировать очередность. Суть метода заключается в создании одного пустого табличного документа, в который последовательно «выводятся» все необходимые печатные формы. Поскольку в очередь печати уходит ровно одно задание, перемешивание страниц становится физически невозможно.

Разберем пример кода, реализующий этот алгоритм:


// Создаем результирующий табличный документ
ОбщийТабДок = Новый ТабличныйДокумент;
ОбщийТабДок.ИмяПринтера = "ИмяВашегоПринтера";

Для Каждого ТекущийДокумент Из МассивПечатныхФорм Цикл
    
    // Добавляем содержимое очередной печатной формы
    ОбщийТабДок.Вывести(ТекущийДокумент);
    
    // Вставляем разделитель страниц, чтобы каждый документ начинался с нового листа
    Если МассивПечатныхФорм.Индекс(ТекущийДокумент) <> МассивПечатныхФорм.Количество() - 1 Тогда
        ОбщийТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЕсли;
    
КонецЦикла;

// Отправляем на печать как единое задание
ОбщийТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

Используя метод Вывести() совместно с ВывестиГоризонтальныйРазделительСтраниц(), мы объединяем УПД, счет и реестр в один непрерывный поток данных. Для принтера это выглядит как один многостраничный документ.

Способ 4. Работа с драйверами (V3 vs V4)

Выясним, какую роль играют драйверы. В современных версиях Windows (Server 2012 и выше) активно внедряются драйверы Type 4 (Class Drivers). Они обеспечивают лучшую совместимость, но часто ведут себя непредсказуемо при высоконагруженной печати из 1С.

Опытным путем установлено, что использование классических драйверов Type 3 (PCL6 или PostScript) решает проблему очередности гораздо эффективнее. Посмотрите в свойствах принтера на вкладку «Дополнительно», какой тип драйвера используется. Если это «Class Driver», попробуйте заменить его на специфический драйвер от производителя версии V3.

Способ 5. Очистка кэша настроек печати

Иногда причина кроется в «памяти» 1С. Программа сохраняет настройки печати для каждого пользователя и каждого типа документа. В терминальной сессии имена принтеров могут меняться (например, «HP LaserJet (redirected 12)» превращается в «HP LaserJet (redirected 34)»).

Проанализируем ситуацию: если настройки для УПД запомнились с одним именем принтера, а для Счета — с другим, система может попытаться отправить их на разные экземпляры одного и того же устройства, что вызовет хаос. Рекомендуется выполнить очистку регистра сведений НастройкиПечатиПользователей или воспользоваться стандартной обработкой «Очистка настроек пользователя».

Способ 6. Промежуточная печать в PDF

Если ни один из вышеперечисленных методов не подходит из-за ограничений инфраструктуры, рассмотрим вариант с PDF-принтером. Как заметили участники обсуждения, при печати в PDF порядок всегда идеален. Это происходит потому, что виртуальный PDF-принтер — это программный процесс, который генерирует файл последовательно.

Алгоритм действий следующий:

  1. Программно сохраняем пакет документов в один временный PDF-файл.
  2. Используем внешнюю утилиту (например, SumatraPDF или Adobe Acrobat с ключами командной строки) для отправки этого файла на физический принтер.

Пример команды для печати через SumatraPDF:

sumatrapdf.exe -print-to-default -silent-print "путь_к_файлу.pdf"

Резюме

Подводя итог, отметим: если вы хотите решить проблему быстро и без изменения кода — начните с настройки спулера Windows («Начинать печать после помещения в очередь всей порции»). Если же вы ищете гарантированное решение «внутри» 1С, которое будет работать у всех пользователей независимо от настроек сервера — используйте слияние всех печатных форм в один ТабличныйДокумент.

← На главную