Как исправить ошибку «Ошибка при получении характеристик принтера» при пакетной печати в 1С?

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

При переходе на новые релизы платформы (в частности, при обновлении с версии 8.3.25 на 8.3.27) разработчики и администраторы нередко сталкиваются с непредвиденным поведением процедур пакетного вывода документов. Типичная ситуация: внешняя обработка или регламентное задание отправляет документы сразу на печать методом Напечатать(), однако процесс прерывается аварийным сообщением: «Ошибка при вызове метода контекста (Напечатать): Ошибка при получении характеристик принтера». При этом ручная печать того же самого документа через предварительный просмотр и системный диалог отрабатывает без каких-либо сбоев.

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

Причины изменения поведения платформы в релизах 8.3.26 и 8.3.27

Проанализируем механику работы платформы «1С:Предприятие» при обращении к подсистеме печати Windows:

  1. Ужесточение проверки доступности устройства. В более ранних версиях (например, 8.3.25) платформа вела себя толерантно к ошибкам в реквизитах табличного документа. Если в свойстве ИмяПринтера было указано некорректное или несуществующее в операционной системе имя, 1С не прерывала выполнение кода, а неявно перенаправляла вывод на системный принтер по умолчанию. Начиная с версии 8.3.27, инициализация характеристик принтера выполняется строго: если переданное имя отсутствует среди доступных устройств текущего сеанса, метод Напечатать() вызывает исключение.
  2. Динамические имена принтеров в среде Remote Desktop (RDP). При работе пользователей на терминальном сервере часто используется перенаправление локальных принтеров клиента (RDP Redirection). При каждом новом входе пользователя служба терминалов добавляет к имени принтера динамический суффикс сеанса, например: HP LaserJet (перенаправлено 3). Если имя было сохранено жестко в константах, коде или персональных настройках, в новой сессии устройство с таким точным наименованием существовать уже не будет.
  3. Кэширование настроек печати в базе данных. Если у объекта ТабличныйДокумент задано свойство ИмяПараметровПечати, платформа восстанавливает параметры страницы и имя принтера, которые пользователь использовал в прошлый раз. Если ранее выбранный принтер был удален или переименован, обращение к устаревшим параметрам приведет к ошибке считывания характеристик.
  4. Проблемы разрядности и процесса splwow64. При работе 32-разрядного толстого или тонкого клиента 1С на 64-разрядной операционной системе вызовы к драйверам печати транслируются через системный процесс splwow64.exe. Зависание этого процесса или несовместимость версий драйверов также могут блокировать получение параметров принтера.

Способ 1. Очистка имени принтера для печати на устройство по умолчанию

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


ТабличныйДокумент.ИмяПринтера = "";
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

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

Способ 2. Сброс сохраненных пользовательских настроек печати

Если в коде формирования отчета или печатной формы заполняется идентификатор настроек, платформа может принудительно подтягивать некорректное имя принтера из системного хранилища. Чтобы предотвратить применение сбойных параметров страницы и устройства, сбросим свойство ИмяПараметровПечати:


ТабличныйДокумент.ИмяПараметровПечати = "";
ТабличныйДокумент.ИмяПринтера = "";
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

Способ 3. Безопасная печать с перехватом исключений (Fallback)

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


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

Способ 4. Административные меры для терминальных серверов (RDP)

Разберем системные настройки, позволяющие избежать коллизий с именами принтеров в корпоративной сети:

  1. Подключение принтеров через общие сетевые ресурсы (UNC). Если печать выполняется массово из терминальных сессий, надежнее всего отказаться от механизма Easy Print / RDP Redirection в пользу прямого сетевого подключения принтеров на самом сервере терминалов по TCP/IP или через путь вида \\server\printer. В этом случае имя принтера остается статичным и одинаковым для всех пользователей независимо от номера сессии.
  2. Очистка кэшированных настроек в базе 1С. Если ошибка воспроизводится только у отдельных учетных записей, очистим сохраненные настройки: перейдем в раздел «Администрирование» → «Настройки пользователей и прав» → «Пользователи», откроем карточку нужного сотрудника, перейдем в «Настройки» → «Прочие настройки», найдем пункт «Настройки печати табличных документов» и нажмем «Очистить».
  3. Проверка соответствия драйверов. Убедимся, что разрядность установленных драйверов принтера на сервере строго совпадает с разрядностью используемого клиента 1С (64-битный клиент требует наличия корректных 64-битных библиотек драйвера).
← На главную