Работа в терминальном режиме часто приводит к проблемам с печатью, особенно когда у пользователей есть доступ к нескольким сетевым принтерам на разных площадках. Ошибки, при которых документы отправляются на чужой принтер, могут быть критичными для бизнес-процессов. Рассмотрим, как решить эту задачу программными методами для 1С 7.7 и 1С 8.3.
Основной подход заключается в том, чтобы не полагаться на настройки принтера «по умолчанию» в Windows, а принудительно указывать имя принтера в объекте ТабличныйДокумент непосредственно перед отправкой документа на печать. Для этого нам потребуется программно получить список всех доступных принтеров в сессии и выбрать нужный.
Разберем алгоритм, который позволяет реализовать автоматический выбор принтера без участия пользователя:
WScript.Network.ИмяПринтера объекта ТабличныйДокумент.РежимИспользованияДиалогаПечати.НеИспользовать.Для автоматизации этого процесса создадим вспомогательную функцию для получения списка принтеров и основной блок кода, который будет выполняться при печати.
// Функция для получения списка принтеров через COM-объект
Функция ПолучитьСписокПринтеров() Экспорт
ВыборПринтеров = Новый Массив;
принтеры = Новый COMОбъект("WScript.Network");
prn = принтеры.EnumPrinterConnections;
i = 0;
Пока i < prn.Count - 1 Цикл
ВыборПринтеров.Добавить(prn.Item(i + 1));
i = i + 2;
КонецЦикла;
Возврат ВыборПринтеров;
КонецФункции
// Основной блок для установки принтера перед печатью
ИмяПринтера = "";
ПринтерДляЯрлыков = "Название_Вашего_Принтера"; // Укажите фрагмент строки имени принтера
МассивПринтеров = ПолучитьСписокПринтеров();
Для каждого Стр Из МассивПринтеров Цикл
Если СтрНайти(Стр, ПринтерДляЯрлыков) <> 0 Тогда
ИмяПринтера = Стр;
Прервать;
КонецЕсли;
КонецЦикла;
Если ИмяПринтера <> "" Тогда
ТаблДок.ИмяПринтера = ИмяПринтера;
ТаблДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Иначе
ТаблДок.Показать();
ТаблДок.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
КонецЕсли;
В платформе 1С 7.7 задача решается аналогичным образом, однако для получения списка принтеров часто удобнее использовать внешнюю компоненту Formex.dll или классический объект WScript.Network. Рассмотрим пример использования WScript.Network в 7.7:
ВыборПринтеров = СоздатьОбъект("СписокЗначений");
принтеры = СоздатьОбъект("WScript.Network");
prn = принтеры.EnumPrinterConnections;
i = 0;
Пока i < prn.Count - 1 Цикл
ВыборПринтеров.ДобавитьЗначение(prn.Item(i + 1));
i = i + 2;
КонецЦикла;
После получения списка вы можете использовать метод ПараметрыСтраницы() у табличного документа, чтобы задать принтер, либо обратиться к системным настройкам печати текущего объекта.
Помимо программного кода, важно помнить о системных настройках:
РегистрСведений. В этом регистре вы можете хранить связку Пользователь + ТипПринтера (например, «Бухгалтерия», «Склад»).COM недостаточно, рассмотрите использование специализированных Native API компонентов, которые позволяют гибко управлять очередями печати без прямого взаимодействия с диалоговыми окнами Windows.Данный подход позволяет полностью исключить «человеческий фактор» при выборе принтера, так как система самостоятельно определяет, какой принтер доступен и закреплен за текущим рабочим местом или пользователем.