Как настроить программную печать на разные сетевые принтеры в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе в платформе 1С 7.7 в терминальном режиме (например, на Windows Server) часто возникает задача отправки документов на разные сетевые принтеры в зависимости от реквизитов документа или логики бизнес-процесса. Однако стандартный метод ПараметрыСтраницы() с указанием имени устройства в 12-м параметре может работать нестабильно и отправлять задание на последне отпечатанный принтер или принтер по умолчанию.

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

Причины отправки печатных форм на «не тот» принтер

Рассмотрим, почему 1С 7.7 может игнорировать переданное в коде имя устройства:

  1. Кэширование настроек печати в реестре Windows. Платформа сохраняет параметры печати в ветке HKCU\Software\1C\1Cv7\7.7\<База>\V7\<Пользователь>\Moxel. Если для формы используется один и тот же ключ в методе Опции(), 1C 7.7 считывает сохраненное ранее имя принтера из реестра и переопределяет переданное значение.
  2. Ограничение на длину имени принтера. 12-й параметр метода ПараметрыСтраницы() корректно воспринимает сетевое имя устройства только в том случае, если длина строки (включая имя сервера) не превышает 31–32 символов.
  3. Неточное имя принтера в коде. Сетевые или RDP-перенаправленные принтеры в операционной системе могут иметь специфические имена с дефисами или системными идентификаторами. Регистр символов и точное соответствие имени имеют ключевое значение.

Способ 1. Использование пары методов Опции и ПараметрыСтраницы с уникальным ключом

Чтобы платформенный кэш не подставлял предыдущие настройки принтера, необходимо вызывать Опции() и ПараметрыСтраницы() строго парой, причем в 5-й параметр метода Опции() передавать уникальный идентификатор (например, с добавлением имени принтера или вида печатной формы).

Рассмотрим пример кода:


// Формируем уникальный ключ опций печати для каждого принтера
ИмяТекущийПринтер = "Har_Sklad";
Таб.Опции(0, 0, 0, 0, "ОпцииПечати_Реализация_" + ИмяТекущийПринтер);
Таб.ПараметрыСтраницы(1, , , , , , , , , 1, 1, ИмяТекущийПринтер);
Таб.Напечатать(0);

Способ 2. Динамическая смена принтера по умолчанию через WScript.Network

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

Пошагово разберем этот алгоритм:

  1. Получаем список всех подключенных принтеров в системе через метод EnumPrinterConnections().
  2. Находим точные имена нужных принтеров в массиве подключений.
  3. Устанавливаем требуемый принтер по умолчанию с помощью SetDefaultPrinter().
  4. Передаем параметры страницы и отправляем документ методом Напечатать(0).

Проанализируем пример получения списка доступных принтеров в текущем терминальном сеансе:


N = СоздатьОбъект("WScript.Network");
NetworkPrinters = N.EnumPrinterConnections();
Для Сч = 0 По NetworkPrinters.length - 1 Цикл
    Сообщить("Подключен сетевой принтер " + NetworkPrinters.Item(Сч) + " [" + NetworkPrinters.Item(Сч + 1) + "]");
    Сч = Сч + 1;
КонецЦикла;

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


Тз = СоздатьОбъект("ТаблицаЗначений");
Тз.НоваяКолонка("Итем");
Тз.НоваяКолонка("Имя");

N = СоздатьОбъект("WScript.Network");
NetworkPrinters = N.EnumPrinterConnections();

Для Сч = 0 По NetworkPrinters.length - 1 Цикл
    Тз.НоваяСтрока();
    Тз.Итем = NetworkPrinters.Item(Сч + 1);
    Тз.Имя  = СокрЛП(Строка(NetworkPrinters.Item(Сч + 1)));    
    Сч = Сч + 1;
КонецЦикла;

PrinterDef = "";
PrinterPrint = "";

Тз.ВыбратьСтроки();
Пока Тз.ПолучитьСтроку() = 1 Цикл
    Если Тз.Имя = "FS-C5150DN" Тогда
        PrinterDef = Тз.Итем;
    КонецЕсли;    
    Если Тз.Имя = "OSn_Sklad" Тогда
        PrinterPrint = Тз.Итем;
    КонецЕсли;    
КонецЦикла;

// Печать на первый принтер
Т1 = СоздатьОбъект("Таблица");
Т1.ВывестиСекцию("Шапка");
N.SetDefaultPrinter(PrinterPrint);
Т1.ПараметрыСтраницы(1, , , , , , , , , 1, , PrinterPrint);
Т1.Напечатать(0);

// Печать на второй принтер
Т2 = СоздатьОбъект("Таблица");
Т2.ВывестиСекцию("Шапка");
N.SetDefaultPrinter(PrinterDef);
Т2.ПараметрыСтраницы(1, , , , , , , , , 1, , PrinterDef);
Т2.Напечатать(0);

Рекомендации по настройке печати в терминальном сервере

Для предотвращения сбоев при печати из 1С 7.7 на серверах Windows Server соблюдайте следующие правила:

Используйте короткие имена принтеров. Называйте принтеры на сервере латинскими буквами без пробелов и спецсимволов, длиной не более 10–15 символов (например, HarSklad вместо Printer_Hartmann_Department_1).

Избегайте RDP-перенаправления для стационарных принтеров. Если печать выполняется на склады или в офисы, подключайте сетевые принтеры напрямую к серверу как локальные TCP/IP принтеры, чтобы их имена оставались статичными при любом входе пользователя в терминальный сеанс.

← На главную