При совместном использовании обычного офисного принтера и принтера этикеток в терминальной сессии (RDP) пользователи 1С часто сталкиваются с неприятной ошибкой: после вывода документа на обычный принтер печать этикеток сбивается, а размер листа принудительно трансформируется в формат А4 с узкой областью печати. Выясним причины возникновения этой проблемы и разберем проверенные способы её решения как на уровне программного кода 1С, так и на уровне системного администрирования.
Проанализируем механику работы платформы 1С с принтерами в среде удаленных рабочих столов. Источником проблемы обычно выступает совокупность следующих факторов:
ИмяПараметровПечати, 1С сохраняет последние примененные настройки (включая поля, ориентацию и размер страницы принтера А4) в профиль текущего пользователя и применяет их к этикетке.Zebra (перенаправлено 2). Из-за этого платформа теряет связь с ранее сохраненными настройками конкретного устройства.Разберем базовое программное решение. Чтобы настройки страницы офисных документов и ценников не перезаписывали друг друга, необходимо жестко разграничить свойство ИмяПараметровПечати для каждого типа табличного документа.
Посмотрим на пример установки уникальных ключей параметров печати для разных макетов:
// Для печати обычных документов на стандартный принтер
ТабДокА4.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_НакладнаяЛист";
// Для печати большой этикетки
ТабДокБЭ.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭтикеткаБольшая";
// Для печати малых ценников
ТабДокМЭ.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭтикеткаМалая";
После однократной ручной настройки параметров страницы в режиме 1С:Предприятие для каждого макета платформа сохранит индивидуальные отступы и выбранный формат бумаги, не смешивая их между собой.
Поскольку имя перенаправленного принтера в терминале постоянно меняется из-за смены номера сеанса, зафиксируем правильный принтер программно через обращение к WMI перед формированием табличного документа. Рассмотрим функцию, которая находит актуальное имя перенаправленного принтера текущего пользователя:
Функция ПолучитьИмяПринтераВТерминале(ИмяБазовогоПринтера) Экспорт
Попытка
Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
СервисWMI = Локатор.ConnectServer(".", "root\cimv2");
СписокПринтеров = СервисWMI.ExecQuery("Select Name from Win32_Printer");
Для Каждого Принтер Из СписокПринтеров Цикл
Если Найти(Принтер.Name, ИмяБазовогоПринтера) > 0 Тогда
Возврат Принтер.Name;
КонецЕсли;
КонецЦикла;
Исключение
Сообщить("Ошибка получения списка принтеров через WMI: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Возврат ИмяБазовогоПринтера;
КонецФункции
Теперь применим полученное имя к нашему табличному документу перед отправкой на печать:
ИмяПринтераЭтикеток = ПолучитьИмяПринтераВТерминале("Zebra");
Таб.ИмяПринтера = ИмяПринтераЭтикеток;
Чтобы полностью исключить влияние драйвера офисного принтера на параметры этикетки, зададим физические размеры и нулевые поля непосредственно в свойствах объекта ТабличныйДокумент.
Рассмотрим пример кода:
Таб.РазмерСтраницы = "Custom";
Таб.ШиринаСтраницы = 58; // Ширина этикетки в миллиметрах
Таб.ВысотаСтраницы = 40; // Высота этикетки в миллиметрах
// Обнуляем поля документа
Таб.ПолеСверху = 0;
Таб.ПолеСнизу = 0;
Таб.ПолеСлева = 0;
Таб.ПолеСправа = 0;
Таб.АвтоМасштаб = Истина;
// Отправляем документ на печать сразу без вызова интерактивного диалога
Таб.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Важный момент: свойства ШиринаСтраницы и ВысотаСтраницы отрабатывают корректно только тогда, когда для свойства РазмерСтраницы явно установлено значение "Custom".
Если программных доработок недостаточно, скорректируем системные настройки терминального сервера:
gpedit.msc), перейдем по пути: Конфигурация компьютера → Административные шаблоны → Компоненты Windows → Службы удаленных рабочих столов → Узел сеансов удаленных рабочих столов → Перенаправление принтеров. Найдем параметр «Использовать в первую очередь драйвер принтера Easy Print для удаленных рабочих столов» и установим его в положение «Отключено».