Как программно сохранить имя принтера в параметрах печатной формы в 1С?

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

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

Почему не сохраняются настройки через КлючПараметровПечати?

На первый взгляд, решение кажется очевидным. Разработчик создает табличный документ, присваивает свойству ИмяПринтера нужное значение и устанавливает КлючПараметровПечати. Однако выясним причину, по которой при следующем открытии документа принтер снова сбрасывается или не сохраняется программно измененный.

Дело в том, что использование свойства КлючПараметровПечати действительно привязывает табличный документ к сохраненным настройкам пользователя. Эти настройки платформа сохраняет в системном хранилище по ключу вида "Общее/НастройкиПечатиТабличногоДокумента/ВашКлюч". Но проблема кроется во внутреннем устройстве платформы 1С:

  1. Эти параметры сохраняются в виде специального внутреннего объекта платформы.
  2. Вы не можете просто программно прочитать этот объект, изменить в нем свойство принтера и записать обратно.
  3. Платформа формирует и обновляет этот кэш-объект только при интерактивных действиях пользователя (например, при нажатии кнопки «ОК» в системном диалоге «Параметры страницы»).

Поэтому программное изменение свойства ИмяПринтера действует только на текущий сеанс печати, но не обновляет системное хранилище настроек.

Решение 1: Сохранение имени принтера в реквизитах формы

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

Разберем по шагам, как это реализовать:

  1. Создаем на форме поле ввода с именем ИмяПринтера, тип данных — строка.
  2. Включаем для этого реквизита стандартное сохранение данных формы (в свойствах формы устанавливаем флаг «Автоматическое сохранение данных в настройках»).
  3. Программно заполняем список выбора для этого поля доступными в операционной системе принтерами.
  4. При вызове процедуры печати программно передаем значение из этого поля в табличный документ.

Посмотрим на пример кода, который получает список принтеров Windows с использованием COM-объекта WMI:


// Открываем СОМ-соединение с WMI
Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");

// Подключаемся к службе WMI
СлужбаWMI = Локатор.ConnectServer();

// Получаем коллекцию экземпляров класса принтеров
ПринтерыВСистеме = СлужбаWMI.InstancesOf("Win32_Printer");

// Заполним список принтеров, перебирая в цикле полученную коллекцию
Для Каждого Принтер Из ПринтерыВСистеме Цикл
    ЭлементыФормы.ИмяПринтера.СписокВыбора.Добавить(Принтер.Name);
    
    // Принтер, установленный "по умолчанию", можно запомнить сразу
    Если Принтер.Default Тогда
        ЭлементыФормы.ИмяПринтера.Значение = Принтер.Name;
    КонецЕсли;
КонецЦикла;

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


Процедура ПечатьДокумента(ТабДок, КоличествоКопий, ИмяПринтера) Экспорт
    
    // Если принтер выбран, назначаем его табличному документу
    Если НЕ ИмяПринтера = Неопределено Тогда
        ТабДок.ИмяПринтера = ИмяПринтера; 
    КонецЕсли;
    
    // Настраиваем параметры страницы
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ПолеСверху = 0;
    ТабДок.ПолеСнизу = 0;
    ТабДок.ПолеСлева = 0;
    ТабДок.ПолеСправа = 0;
    
    // Выводим на печать
    ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
    
КонецПроцедуры

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

Решение 2: Программная очистка кэша системных настроек печати

Если вам необходимо принудительно обновить принтер для конкретной печатной формы (и конкретного ключа параметров), и вы не хотите выводить отдельный реквизит на форму, проанализируем еще один подход. Мы можем программно удалить старую сохраненную настройку платформы.

Для этого используется следующий код работы с объектом ХранилищеСистемныхНастроек:


КлючНастроек = "Общее/НастройкиПечатиТабличногоДокумента/КлючПараметровПечатиДляСохраненияНастроекМоегоТабДокумента";

// Удаляем старые настройки из хранилища
ХранилищеСистемныхНастроек.Удалить(КлючНастроек, "", ИмяПользователя);

// Теперь формируем новый табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.КлючПараметровПечати = "КлючПараметровПечатиДляСохраненияНастроекМоегоТабДокумента";
ТабДок.ИмяПринтера = "Новый нужный принтер";

// При первом выводе на печать платформа сама сохранит новые настройки с нашим принтером

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

Важные нюансы работы с именами принтеров

При программном управлении маршрутизацией печати обратите внимание на следующие критические особенности:

  1. Точное совпадение имен: Имя принтера в платформе 1С — это обычная текстовая строка. Она должна символ в символ совпадать с названием принтера в операционной системе Windows. Для сетевых принтеров имя обязательно должно включать полный сетевой путь (например, \\ServerName\HP_LaserJet_Pro). Если имя не совпадет, 1С проигнорирует настройку и отправит документ на принтер по умолчанию.
  2. Зависания при недоступности: Это очень частая проблема. Если в параметрах печати сохранен сетевой путь к принтеру, которого больше не существует в локальной сети, либо сервер печати временно недоступен, 1С может "зависать" на 30 и более секунд при каждом формировании табличного документа. Платформа пытается опросить недоступное устройство. В таких ситуациях программный сброс параметров через ХранилищеСистемныхНастроек (как описано во втором решении) является отличным инструментом для массового исправления проблемы у пользователей.
  3. Библиотека стандартных подсистем (БСП): Если вы работаете в современной конфигурации на базе БСП, вывод на печать обычно идет через общие формы подсистемы УправлениеПечатью. В этих механизмах стандартное поведение платформы может быть переопределено, и выбранные принтеры могут сохраняться в пользовательских настройках самой БСП. Учитывайте это при разработке архитектуры печати.
← На главную