Как закрепить конкретный принтер за пользователем в 1С при работе в терминале?

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

Работа в терминальном режиме часто приводит к проблемам с печатью, особенно когда у пользователей есть доступ к нескольким сетевым принтерам на разных площадках. Ошибки, при которых документы отправляются на чужой принтер, могут быть критичными для бизнес-процессов. Рассмотрим, как решить эту задачу программными методами для 1С 7.7 и 1С 8.3.

Решение проблемы программным определением принтера

Основной подход заключается в том, чтобы не полагаться на настройки принтера «по умолчанию» в Windows, а принудительно указывать имя принтера в объекте ТабличныйДокумент непосредственно перед отправкой документа на печать. Для этого нам потребуется программно получить список всех доступных принтеров в сессии и выбрать нужный.

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

  1. Получаем список всех доступных принтеров в текущей сессии через WScript.Network.
  2. Ищем в этом списке строку, соответствующую названию нужного принтера.
  3. Присваиваем найденное имя свойству ИмяПринтера объекта ТабличныйДокумент.
  4. Выводим документ на печать с параметром РежимИспользованияДиалогаПечати.НеИспользовать.

Пример реализации кода для 1С 8.3

Для автоматизации этого процесса создадим вспомогательную функцию для получения списка принтеров и основной блок кода, который будет выполняться при печати.


// Функция для получения списка принтеров через COM-объект
Функция ПолучитьСписокПринтеров() Экспорт
    ВыборПринтеров = Новый Массив;
    принтеры = Новый COMОбъект("WScript.Network");
    prn = принтеры.EnumPrinterConnections;
    i = 0;
    Пока i < prn.Count - 1 Цикл
        ВыборПринтеров.Добавить(prn.Item(i + 1));
        i = i + 2;
    КонецЦикла;
    Возврат ВыборПринтеров;
КонецФункции

// Основной блок для установки принтера перед печатью
ИмяПринтера = "";
ПринтерДляЯрлыков = "Название_Вашего_Принтера"; // Укажите фрагмент строки имени принтера
МассивПринтеров = ПолучитьСписокПринтеров();

Для каждого Стр Из МассивПринтеров Цикл
    Если СтрНайти(Стр, ПринтерДляЯрлыков) <> 0 Тогда
        ИмяПринтера = Стр;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если ИмяПринтера <> "" Тогда
    ТаблДок.ИмяПринтера = ИмяПринтера;
    ТаблДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Иначе
    ТаблДок.Показать();
    ТаблДок.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
КонецЕсли;

Особенности реализации в 1С 7.7

В платформе 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;
КонецЦикла;

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

Рекомендации по администрированию

Помимо программного кода, важно помнить о системных настройках:

Данный подход позволяет полностью исключить «человеческий фактор» при выборе принтера, так как система самостоятельно определяет, какой принтер доступен и закреплен за текущим рабочим местом или пользователем.

← На главную