При разработке внешних и встроенных печатных форм в «1С:Управление торговлей 11» часто возникает задача направлять вывод документа на определенный принтер в зависимости от условий (например, складские накладные отправлять сразу на складской принтер для всех сотрудников, кроме конкретного оператора). Однако разработчики сталкиваются с ситуацией, когда после изменения кода у пользователя продолжает выбираться старый принтер.
Разберем детально механизм работы параметров печати в платформе 1С:Предприятие, выясним причину такого поведения и рассмотрим способы корректной настройки вывода на печать.
Проанализируем типовой фрагмент кода, в котором возникает проблема:
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СЧЕТНАОПЛАТУ_ЗАДАНИЕНАОТБОР";
Если ИмяПользователя() <> "ИвановаИИ" Тогда
ТабличныйДокумент.ИмяПринтера = "Склад";
КонецЕсли;
Когда табличному документу назначается свойство ИмяПараметровПечати, платформа автоматически обращается к Хранилищу системных настроек текущего пользователя. Оттуда считываются все ранее сохраненные параметры: масштаб, ориентация страницы, поля, а также имя принтера, на который ранее производилась печать по данному ключу.
Если пользователь «ИвановаИИ» хотя бы один раз вывел этот документ на принтер «Склад», платформа намертво сохранила эту связку под указанным ключом параметров. При последующих запусках ветка Если пропускается, свойство ИмяПринтера не переопределяется, и платформа применяет сохраненное значение из параметров печати — то есть снова выводит документ на принтер «Склад».
Рассмотрим важное правило установки параметров печати: свойство ИмяПринтера должно заполняться строго после присвоения свойства ИмяПараметровПечати. Если сначала задать ИмяПринтера, а затем указать ИмяПараметровПечати, платформа при чтении ключа настроек из базы перезапишет ваше значение теми параметрами, которые были сохранены в профиле пользователя ранее.
Разберем по шагам практические варианты решения, которые позволяют гарантированно управлять выбором принтера.
Явный сброс принтера в системное значение по умолчанию:
Если для конкретного пользователя требуется системный принтер по умолчанию, необходимо явно очищать свойство ИмяПринтера в соответствующей ветке алгоритма:
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СЧЕТНАОПЛАТУ_ЗАДАНИЕНАОТБОР";
Если ИмяПользователя() <> "ИвановаИИ" Тогда
ТабличныйДокумент.ИмяПринтера = "Склад";
Иначе
ТабличныйДокумент.ИмяПринтера = "";
КонецЕсли;
Разделение ключей параметров печати по пользователям:
Чтобы индивидуальные настройки пользователей не пересекались и не переопределяли друг друга, рекомендуется формировать динамический ключ параметров печати:
Если ИмяПользователя() = "ИвановаИИ" Тогда
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СЧЕТНАОПЛАТУ_ОПЕРАТОР";
ТабличныйДокумент.ИмяПринтера = "";
Иначе
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СЧЕТНАОПЛАТУ_СКЛАД";
ТабличныйДокумент.ИмяПринтера = "Склад";
КонецЕсли;
Либо можно добавлять имя текущего пользователя прямо в суффикс ключа параметров печати: "ПАРАМЕТРЫ_ПЕЧАТИ_..." + "_" + ИмяПользователя().
Программная очистка сохраненных настроек:
Сбросить привязку сохраненного принтера для конкретного пользователя можно с помощью метода системного хранилища настроек:
КлючОбъекта = "Общее/ПараметрыПечати/ПАРАМЕТРЫ_ПЕЧАТИ_СЧЕТНАОПЛАТУ_ЗАДАНИЕНАОТБОР";
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, "", "ИвановаИИ");
После удаления записи платформа при следующем открытии печатной формы подставит системный принтер по умолчанию.
Интерактивный сброс через интерфейс 1С:
Пользователь может самостоятельно один раз выбрать нужный принтер в диалоге печати (например, через команду предварительного просмотра и настройки параметров страницы). Новое значение автоматически запишется в хранилище системных настроек для текущего ИмяПараметровПечати.
При настройке программной печати важно учитывать особенности окружения:
\\ServerName\PrinterName) в строгом соответствии с тем, как принтер зарегистрирован в операционной системе.(перенаправлено 2). Жестко прописанное статическое имя принтера в коде в таком случае не будет найдено, и документ уйдет на принтер по умолчанию.usr1cv8).