Как отправить печатные формы на конкретные принтеры и запомнить их выбор в 1С:Предприятии?

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

Нам часто требуется отправлять различные печатные формы на определенные принтеры, и при этом желательно, чтобы система запоминала наш выбор. Рассмотрим, как это можно реализовать в 1С:Предприятии, используя управляемые формы. Мы разберем программные способы отправки на заданный принтер, методы получения списка всех доступных принтеров, а также механизмы для сохранения этих настроек, что позволит нам создать гибкое и удобное решение для пользователей.

1. Программная отправка печатной формы на конкретный принтер

Основной и наиболее прямой способ направить табличный документ на определенный принтер — это использование свойства ИмяПринтера объекта ТабличныйДокумент. Это свойство позволяет нам указать строковое имя принтера, который известен в операционной системе. Если указанный принтер не существует или его имя не задано, печать будет произведена на принтер, установленный по умолчанию в системе. Это позволяет нам точно контролировать, на какое устройство будет выведен документ.

Давайте посмотрим на пример кода, который демонстрирует использование этого свойства:


ТабДок = ПолучитьМакетДокумента("Макет");
// Указываем полное имя принтера, как оно отображается в системе.
// Например, "HP LaserJet 6L" или "\\МойСерверПечати\Бухгалтерия_Принтер".
ТабДок.ИмяПринтера = "Имя_Вашего_Принтера";
ТабДок.Напечатать();

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

2. Получение списка доступных принтеров для выбора

Чтобы предоставить пользователю возможность выбора принтера из списка, нам необходимо программно получить список всех принтеров, установленных в операционной системе. В 1С:Предприятии это можно сделать несколькими способами, используя COM-объекты. Рассмотрим два наиболее распространенных метода, которые позволяют взаимодействовать с операционной системой для получения такой информации: через WScript.Network и через WMI (Windows Management Instrumentation).

2.1. Получение списка принтеров через WScript.Network

Этот метод позволяет нам взаимодействовать с сетевыми ресурсами, включая принтеры, через COM-объект WScript.Network. Мы можем использовать его метод EnumPrinterConnections() для получения списка подключенных принтеров. Этот подход относительно прост в реализации и часто используется для получения базовой информации о сетевых подключениях.

Разберем пример функции, которая возвращает список принтеров:


Функция ПолучитьСписокПринтеровЧерезWScriptNetwork()
    СписокПринтеров = Новый СписокЗначений;
    Попытка
        // Создаем COM-объект для работы с сетевыми ресурсами и принтерами
        Принтеры = Новый COMОбъект("WScript.Network");
        // Получаем коллекцию подключенных принтеров. Метод EnumPrinterConnections()
        // возвращает массив, где элементы идут парами: Порт, ИмяПринтера.
        Prn = Принтеры.EnumPrinterConnections();
        // Перебираем полученный массив, извлекая только имена принтеров.
        Для й = 0 По Prn.Count() - 1 Шаг 2 Цикл
            // Добавляем имя принтера в СписокЗначений, используя его как значение и представление
            СписокПринтеров.Добавить(Prn.Item(й + 1), Prn.Item(й + 1)); 
        КонецЦикла;
    Исключение
        // В случае ошибки выводим сообщение, что не удалось получить список принтеров
        Сообщить("Не удалось получить список принтеров через WScript.Network: " + ОписаниеОшибки());
    КонецПопытки;
    Возврат СписокПринтеров;
КонецФункции

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

2.2. Получение списка принтеров через WMI

Использование WMI (Windows Management Instrumentation) представляет собой более универсальный и мощный подход для получения системной информации, включая список принтеров. WMI предоставляет стандартизированный интерфейс для доступа к различным компонентам операционной системы. Мы можем получить объект winmgmts и выполнить к нему запрос, чтобы получить данные из класса Win32_Printer.

Давайте рассмотрим пример функции, использующей WMI:


Функция ПолучитьСписокПринтеровЧерезWMI()
    МассивПринтеров = Новый Массив;
    Попытка
        // Получаем сервис WMI для доступа к системной информации
        // Имперсонированный уровень безопасности (impersonationLevel=impersonate)
        // необходим для корректного выполнения запросов.
        ServiceSet = GetCOMObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
        // Выполняем SQL-подобный запрос для получения всех объектов класса Win32_Printer
        // Класс Win32_Printer содержит подробную информацию обо всех установленных принтерах.
        Выборка = ServiceSet.ExecQuery("SELECT * FROM Win32_Printer",,48);
        // Перебираем полученную выборку объектов и добавляем имена принтеров в массив
        Для Каждого objItem Из Выборка Цикл
            // objItem.Caption содержит понятное имя принтера, как оно отображается пользователю
            МассивПринтеров.Добавить(objItem.Caption);
        КонецЦикла;
    Исключение
        // В случае ошибки выводим сообщение об отсутствии доступа или другой проблеме
        Сообщить("Не удалось получить список принтеров через WMI: " + ОписаниеОшибки());
    КонецПопытки;
    Возврат МассивПринтеров;
КонецФункции

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

3. Сохранение настроек выбранного принтера

После того как пользователь выбрал принтер из списка, возникает задача запоминания этого выбора для будущих операций. Это значительно повышает удобство работы, избавляя пользователя от необходимости каждый раз выбирать одно и то же устройство. Мы можем использовать несколько подходов для сохранения настроек принтера, от стандартных механизмов платформы до создания собственных хранилищ.

3.1. Использование стандартных параметров страницы печатной формы

В платформе 1С:Предприятие существуют встроенные механизмы для сохранения настроек печати. Когда пользователь открывает стандартную форму "Параметры страницы" (например, через предварительный просмотр печатной формы) и настраивает параметры печати (включая выбор принтера), а затем нажимает "ОК", эти настройки могут быть автоматически сохранены для данного пользователя и конкретной печатной формы. Этот механизм срабатывает "из коробки" и часто не требует дополнительного программирования, если мы хотим использовать его для каждого пользователя индивидуально. Платформа запоминает эти настройки в своих служебных данных, привязывая их к конкретному пользователю и метаданным печатной формы.

3.2. Хранение настроек в справочнике или регистре сведений

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

Разберем шаги по реализации такого подхода:

  1. Создайте регистр сведений: Нам понадобится регистр сведений (например, "НастройкиПечатиПринтеров") для хранения связок "что на какой принтер печатать". Этот регистр должен иметь следующие измерения:
    • Пользователь (ссылка на справочник "Пользователи" или "ФизическиеЛица"), чтобы настройки были индивидуальными.
    • ВидДокумента (перечисление, строка или ссылка на метаданные), чтобы указать, для какого типа печатной формы или документа применяется настройка.
    • Могут быть и другие измерения, например, Организация, Склад и т.д., в зависимости от требуемой детализации.
    И ресурс ИмяПринтера (строка), где будет храниться фактическое имя принтера.
  2. Считывайте настройки при формировании: При открытии формы документа или при формировании печатной формы, считывайте сохраненное имя принтера из этого регистра для текущего пользователя (и, возможно, вида документа или других измерений).
  3. Устанавливайте свойство ИмяПринтера: Полученное из регистра значение имени принтера устанавливайте в свойство ТабличныйДокумент.ИмяПринтера перед вызовом метода Напечатать().
  4. Предоставьте интерфейс для сохранения: Создайте отдельную форму настроек или добавьте элементы управления непосредственно в форму печати, чтобы пользователь мог выбрать принтер из списка (полученного методами, описанными выше) и сохранять этот выбор в регистре сведений. При сохранении необходимо обновлять соответствующую запись в регистре сведений.

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

4. Особенности печати через удаленный рабочий стол (RDP)

При работе в среде удаленного рабочего стола (RDP) могут возникнуть сложности с именами принтеров. Перенаправленные принтеры, то есть принтеры, установленные на локальной машине пользователя и доступные через RDP-сессию, часто получают дополнительные суффиксы в своих именах. Например, принтер с именем ZDesigner TLS 2824 может отображаться как ZDesigner TLS 2824 (перенаправлено 62). Число в скобках (62 в примере) может меняться при каждом новом сеансе RDP или даже при переподключении, что делает их имена нестабильными для программного использования.

Чтобы избежать этой проблемы и обеспечить стабильность при программной печати, мы настоятельно рекомендуем использовать сетевые принтеры, которые установлены непосредственно на сервере, а не перенаправлены через RDP. В этом случае имя принтера будет постоянным (например, \\KOMP2\ZDesigner TLS 2824), и его можно будет без проблем использовать в свойстве ТабличныйДокумент.ИмяПринтера. Это значительно упрощает автоматизацию печати и исключает ошибки, связанные с постоянно меняющимися именами перенаправленных принтеров.

5. Дополнительные параметры печати табличного документа

Помимо имени принтера, объект ТабличныйДокумент предоставляет нам широкие возможности для программной настройки других параметров печати. Это позволяет нам полностью автоматизировать процесс печати, контролируя практически все аспекты вывода документа, от количества копий до размеров полей и ориентации страницы. Такая детализация настроек дает разработчику полный контроль над конечным видом печатной формы.

Рассмотрим основные дополнительные параметры, которые вы можете настроить:

  1. КоличествоЭкземпляров: Это свойство позволяет нам задать число копий документа для печати. Устанавливается числовым значением. Например, ТабДок.КоличествоЭкземпляров = 3;.
  2. РазборПоКопиям: Управляет печатью комплектами. Если установить в Истина, документы будут печататься полными комплектами (например, 3 копии документа А, затем 3 копии документа Б). Если Ложь, то сначала все копии первой страницы, затем все копии второй и так далее. Например, ТабДок.РазборПоКопиям = Истина;.
  3. РазмерСтраницы: Определяет стандартный формат страницы (например, "A4", "Letter", "A3"). Для произвольного размера можно указать "Custom". Например, ТабДок.РазмерСтраницы = "A4";.
  4. ВысотаСтраницы, ШиринаСтраницы: Эти свойства используются в сочетании с РазмерСтраницы = "Custom" для задания произвольных размеров страницы в миллиметрах. Например, если нам нужен нестандартный размер, мы можем написать:
    
    ТабДок.РазмерСтраницы = "Custom";
    ТабДок.ШиринаСтраницы = 200; // 200 мм
    ТабДок.ВысотаСтраницы = 100; // 100 мм
    
  5. ПолеСверху, ПолеСлева, ПолеСнизу, ПолеСправа: Позволяют задать отступы от краев страницы в миллиметрах. Например, ТабДок.ПолеСверху = 10; (10 мм от верхнего края).
  6. ОриентацияСтраницы: Устанавливает ориентацию страницы — Портрет или Альбом. Например, ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Альбом;.
  7. Настройки колонтитулов: Свойства ВерхнийКолонтитул и НижнийКолонтитул позволяют программно задавать текст и параметры колонтитулов, а также их высоту. Это дает возможность динамически добавлять информацию в верхнюю и нижнюю части каждой страницы.

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

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

← На главную