В процессе эксплуатации систем на базе «1С:Предприятие 8.3» системные администраторы и программисты часто сталкиваются с крайне неприятной проблемой: пользователи, активно перемещающиеся между различными рабочими местами (для них пригодится система удаленного администрирования рабочих мест и установки драйверов) или подключающиеся к терминальному серверу (RDP), жалуются на «прилипание» старого принтера. При попытке быстрой печати (например, по нажатию оранжевой кнопки «Печать» без вызова диалогового окна) документ упорно уходит на принтер, установленный на предыдущем компьютере, даже если текущий системный принтер по умолчанию настроен правильно. При этом стандартная чистка локального кэша 1С не приносит никаких результатов.
В этой статье мы подробно проанализируем, почему платформа ведет себя именно так, выясним физическое место хранения этих настроек и разберем несколько эффективных способов решения проблемы — как программных (для разработчиков), так и административных.
Многие ошибочно полагают, что параметры принтера сохраняются в локальных файлах профиля пользователя на жестком диске или в реестре Windows. На самом деле в современных версиях платформы 1С 8.3 настройки печати для каждого табличного документа сохраняются непосредственно в базе данных СУБД.
Проанализируем этот механизм изнутри:
ИмяПараметровПечати (поможет обработка для автоматической модификации свойств печатных форм). При формировании печатной формы разработчики присваивают этому свойству уникальный строковый идентификатор (например, "ПАРАМЕТРЫ_ПЕЧАТИ_РеализацияТоваровУслуг").ИмяПараметровПечати._SystemSettings (Хранилище системных настроек) под учетной записью текущего пользователя 1С. Ключ записи выглядит примерно так: Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_[ИмяПечатнойФормы].Поскольку настройки привязаны к пользователю внутри базы данных, миграция на другой физический компьютер или смена сессии RDP не сбрасывает эти параметры. Платформа считает, что сохраненный ранее принтер является приоритетным для данной печатной формы.
---
Если ваши пользователи постоянно мигрируют между рабочими станциями, мы можем принудительно разделить настройки печати для каждого физического компьютера. Для этого нужно модифицировать свойство ИмяПараметровПечати, добавив к нему уникальный суффикс текущего рабочего места.
Рассмотрим пример реализации этой логики. С помощью механизма расширений мы можем перехватить процедуру печати и динамически изменить имя параметров, привязав его к имени локального компьютера:
&НаСервере
Процедура ПередВыводомТабличногоДокумента(ТабличныйДокумент, ИмяФормы)
// Получаем имя текущего компьютера (клиента)
ИмяКомпьютераКлиента = ИмяКомпьютера();
// Проверяем, задано ли имя параметров печати в документе
Если ЗначениеЗаполнено(ТабличныйДокумент.ИмяПараметровПечати) Тогда
// Добавляем имя компьютера в качестве суффикса
ТабличныйДокумент.ИмяПараметровПечати = ТабличныйДокумент.ИмяПараметровПечати + "_" + ИмяКомпьютераКлиента;
КонецЕсли;
КонецПроцедуры
При таком подходе для пользователя «Иван» на Компьютере №1 будут действовать одни настройки печати (и принтер Компьютера №1), а при его переходе на Компьютер №2 платформа создаст и считает совершенно другую настройку. Конфликт «прилипания» старого принтера будет полностью исчерпан.
---
Если вам не требуется сохранять индивидуальные настройки полей, колонтитулов и принтеров для каждой формы, а нужно, чтобы 1С всегда отправляла документы строго на текущий принтер по умолчанию, установленный в Windows, можно принудительно очищать имя принтера в табличном документе.
Если свойству ИмяПринтера присвоить пустую строку, платформа проигнорирует кэшированные настройки из базы данных и обратится к операционной системе за дефолтным принтером. Посмотрим на пример кода:
// Перед отправкой табличного документа на печать принудительно очищаем имя принтера
ТабличныйДокумент.ИмяПринтера = "";
// Теперь 1С отправит документ на текущий принтер по умолчанию из настроек Windows
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Этот метод можно внедрить глобально для всей конфигурации через общий модуль печати в расширении, что избавит пользователей от необходимости совершать лишние клики в диалоговых окнах.
---
Если проблема носит единичный характер и вы не хотите вносить изменения в программный код, можно воспользоваться типовым функционалом очистки настроек пользователей, который присутствует в большинстве современных конфигураций на базе БСП (ERP, Комплексная автоматизация, Управление торговлей, Бухгалтерия предприятия).
Разберем по шагам, как очистить проблемные настройки:
После этой процедуры при первом нажатии кнопки «Печать» 1С заново обратится к операционной системе и подхватит актуальный системный принтер.
---
В крупных компаниях с клиент-серверной архитектурой ручная очистка настроек через интерфейс для сотен пользователей может оказаться слишком трудоемкой — для этого подойдёт инструмент принудительного завершения сеансов 1С. В этом случае системный администратор может выполнить очистку напрямую в СУБД Microsoft SQL Server или PostgreSQL.
Важно: Перед выполнением любых прямых манипуляций с базой данных на уровне СУБД обязательно сделайте резервную копию базы данных и завершите работу всех активных сеансов пользователей (поможет консоль управления сеансами и параметрами информационной базы 1С)!
Проанализируем структуру таблицы _SystemSettings — для этой задачи есть анализ структуры и объема таблиц СУБД для 1С. Нам необходимо удалить записи, отвечающие за кэширование параметров печати табличных документов. Выполните следующий SQL-запрос:
-- Удаление настроек печати для всех пользователей базы данных
DELETE FROM _SystemSettings
WHERE _ObjectKey LIKE '%НастройкиПечатиТабличногоДокумента%';
Если требуется сбросить настройки только для конкретного пользователя, вам потребуется сначала определить его внутренний уникальный идентификатор (UID) в таблице пользователей 1С и добавить соответствующее условие фильтрации _UserUUID в SQL-запрос.
---
Очень часто проблема «прилипания» усугубляется при работе пользователей на сервере терминалов. При каждом новом входе в RDP-сессию локальные принтеры пользователя пробрасываются заново, получая в операционной системе динамические имена со случайными номерами сессий (например, HP LaserJet (перенаправлено 2), а при следующем входе — HP LaserJet (перенаправлено 5)).
Платформа 1С запоминает точное имя принтера вместе с номером сессии в конце. Естественно, при новом входе старое имя (с номером сессии «2») становится недействительным, из-за чего 1С либо выдает ошибку печати, либо начинает хаотично отправлять документы на другие доступные принтеры.
Для минимизации подобных проблем рекомендуется выполнить следующие шаги:
TSPrint или Screwdrivers. Они создают в терминальной сессии один статический виртуальный принтер (например, TSPrint Default), имя которого никогда не меняется. Платформа 1С запоминает это имя один раз, а сама утилита на лету перенаправляет поток печати на физический принтер локального компьютера пользователя.Применяя предложенные методики динамического формирования имен параметров печати и правильной настройки терминального окружения, вы навсегда избавите пользователей от проблем с «неверным принтером по умолчанию» в 1С.