Разберем частую задачу разработчиков 1С: как программно задать и сохранить имя принтера для нескольких печатных форм, чтобы пользователю не приходилось при каждой печати открывать предварительный просмотр и вручную выбирать нужное устройство. Проанализируем, почему стандартные подходы иногда не работают, и рассмотрим несколько эффективных решений этой проблемы.
На первый взгляд, решение кажется очевидным. Разработчик создает табличный документ, присваивает свойству ИмяПринтера нужное значение и устанавливает КлючПараметровПечати. Однако выясним причину, по которой при следующем открытии документа принтер снова сбрасывается или не сохраняется программно измененный.
Дело в том, что использование свойства КлючПараметровПечати действительно привязывает табличный документ к сохраненным настройкам пользователя. Эти настройки платформа сохраняет в системном хранилище по ключу вида "Общее/НастройкиПечатиТабличногоДокумента/ВашКлюч". Но проблема кроется во внутреннем устройстве платформы 1С:
Поэтому программное изменение свойства ИмяПринтера действует только на текущий сеанс печати, но не обновляет системное хранилище настроек.
Рассмотрим надежный обходной путь, который предложили участники форума. Суть метода заключается в том, чтобы не пытаться перебороть платформу, а сохранять нужный принтер в реквизитах самой обработки или документа, используя стандартные механизмы 1С.
Разберем по шагам, как это реализовать:
ИмяПринтера, тип данных — строка.Посмотрим на пример кода, который получает список принтеров Windows с использованием COM-объекта WMI:
// Открываем СОМ-соединение с WMI
Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
// Подключаемся к службе WMI
СлужбаWMI = Локатор.ConnectServer();
// Получаем коллекцию экземпляров класса принтеров
ПринтерыВСистеме = СлужбаWMI.InstancesOf("Win32_Printer");
// Заполним список принтеров, перебирая в цикле полученную коллекцию
Для Каждого Принтер Из ПринтерыВСистеме Цикл
ЭлементыФормы.ИмяПринтера.СписокВыбора.Добавить(Принтер.Name);
// Принтер, установленный "по умолчанию", можно запомнить сразу
Если Принтер.Default Тогда
ЭлементыФормы.ИмяПринтера.Значение = Принтер.Name;
КонецЕсли;
КонецЦикла;
Теперь рассмотрим, как выглядит процедура печати табличного документа с учетом выбранного пользователем принтера:
Процедура ПечатьДокумента(ТабДок, КоличествоКопий, ИмяПринтера) Экспорт
// Если принтер выбран, назначаем его табличному документу
Если НЕ ИмяПринтера = Неопределено Тогда
ТабДок.ИмяПринтера = ИмяПринтера;
КонецЕсли;
// Настраиваем параметры страницы
ТабДок.АвтоМасштаб = Истина;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
// Выводим на печать
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецПроцедуры
Благодаря этому подходу, пользователь один раз выбирает нужный принтер в поле на форме, 1С запоминает этот выбор в пользовательских настройках формы, и при последующих открытиях принтер подставляется автоматически.
Если вам необходимо принудительно обновить принтер для конкретной печатной формы (и конкретного ключа параметров), и вы не хотите выводить отдельный реквизит на форму, проанализируем еще один подход. Мы можем программно удалить старую сохраненную настройку платформы.
Для этого используется следующий код работы с объектом ХранилищеСистемныхНастроек:
КлючНастроек = "Общее/НастройкиПечатиТабличногоДокумента/КлючПараметровПечатиДляСохраненияНастроекМоегоТабДокумента";
// Удаляем старые настройки из хранилища
ХранилищеСистемныхНастроек.Удалить(КлючНастроек, "", ИмяПользователя);
// Теперь формируем новый табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.КлючПараметровПечати = "КлючПараметровПечатиДляСохраненияНастроекМоегоТабДокумента";
ТабДок.ИмяПринтера = "Новый нужный принтер";
// При первом выводе на печать платформа сама сохранит новые настройки с нашим принтером
Когда вы после такого удаления программно зададите принтер и выведете документ на печать, платформа 1С сгенерирует новую внутреннюю запись в хранилище. Эта новая запись уже будет содержать заданный вами принтер в качестве устройства по умолчанию для этого конкретного ключа.
При программном управлении маршрутизацией печати обратите внимание на следующие критические особенности:
\\ServerName\HP_LaserJet_Pro). Если имя не совпадет, 1С проигнорирует настройку и отправит документ на принтер по умолчанию.ХранилищеСистемныхНастроек (как описано во втором решении) является отличным инструментом для массового исправления проблемы у пользователей.УправлениеПечатью. В этих механизмах стандартное поведение платформы может быть переопределено, и выбранные принтеры могут сохраняться в пользовательских настройках самой БСП. Учитывайте это при разработке архитектуры печати.