При переходе на новые релизы платформы (в частности, при обновлении с версии 8.3.25 на 8.3.27) разработчики и администраторы нередко сталкиваются с непредвиденным поведением процедур пакетного вывода документов. Типичная ситуация: внешняя обработка или регламентное задание отправляет документы сразу на печать методом Напечатать(), однако процесс прерывается аварийным сообщением: «Ошибка при вызове метода контекста (Напечатать): Ошибка при получении характеристик принтера». При этом ручная печать того же самого документа через предварительный просмотр и системный диалог отрабатывает без каких-либо сбоев.
Разберем детально, почему возникает данная ошибка, как изменилось поведение платформы и какими способами можно скорректировать программный код и системные настройки.
Проанализируем механику работы платформы «1С:Предприятие» при обращении к подсистеме печати Windows:
ИмяПринтера было указано некорректное или несуществующее в операционной системе имя, 1С не прерывала выполнение кода, а неявно перенаправляла вывод на системный принтер по умолчанию. Начиная с версии 8.3.27, инициализация характеристик принтера выполняется строго: если переданное имя отсутствует среди доступных устройств текущего сеанса, метод Напечатать() вызывает исключение.HP LaserJet (перенаправлено 3). Если имя было сохранено жестко в константах, коде или персональных настройках, в новой сессии устройство с таким точным наименованием существовать уже не будет.ТабличныйДокумент задано свойство ИмяПараметровПечати, платформа восстанавливает параметры страницы и имя принтера, которые пользователь использовал в прошлый раз. Если ранее выбранный принтер был удален или переименован, обращение к устаревшим параметрам приведет к ошибке считывания характеристик.splwow64.exe. Зависание этого процесса или несовместимость версий драйверов также могут блокировать получение параметров принтера.Рассмотрим самое простое программное исправление. Если пакетная обработка должна отправлять задания на текущий основной принтер пользователя или терминального сервера, необходимо гарантировать, что свойство ИмяПринтера не содержит устаревших строковых значений. Достаточно явно очистить его перед отправкой на печать:
ТабличныйДокумент.ИмяПринтера = "";
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
При пустой строке в свойстве ИмяПринтера платформа 1С всегда опрашивает принтер, назначенный в операционной системе по умолчанию для текущего пользователя, что исключает обращение к несуществующему устройству.
Если в коде формирования отчета или печатной формы заполняется идентификатор настроек, платформа может принудительно подтягивать некорректное имя принтера из системного хранилища. Чтобы предотвратить применение сбойных параметров страницы и устройства, сбросим свойство ИмяПараметровПечати:
ТабличныйДокумент.ИмяПараметровПечати = "";
ТабличныйДокумент.ИмяПринтера = "";
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Проанализируем практический сценарий, когда в обработке предусмотрен выбор целевого принтера из списка, но устройство может оказаться временно недоступным или переименованным. Чтобы групповая печать не прерывалась аварийно посреди пачки документов, обернем прямой вызов в конструкцию обработки ошибок:
Попытка
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Исключение
// В случае сбоя сбрасываем привязку к конкретному принтеру
// и повторяем печать на принтер по умолчанию
ТабличныйДокумент.ИмяПринтера = "";
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецПопытки;
Разберем системные настройки, позволяющие избежать коллизий с именами принтеров в корпоративной сети:
\\server\printer. В этом случае имя принтера остается статичным и одинаковым для всех пользователей независимо от номера сессии.