Как устранить сброс настроек и размера бумаги при печати этикеток через RDP в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При совместном использовании обычного офисного принтера и принтера этикеток в терминальной сессии (RDP) пользователи 1С часто сталкиваются с неприятной ошибкой: после вывода документа на обычный принтер печать этикеток сбивается, а размер листа принудительно трансформируется в формат А4 с узкой областью печати. Выясним причины возникновения этой проблемы и разберем проверенные способы её решения как на уровне программного кода 1С, так и на уровне системного администрирования.

Почему возникает конфликт настроек печати в RDP

Проанализируем механику работы платформы 1С с принтерами в среде удаленных рабочих столов. Источником проблемы обычно выступает совокупность следующих факторов:

  1. Переопределение параметров через Easy Print: по умолчанию RDP-клиент использует универсальный драйвер перенаправления печати Microsoft Easy Print. Этот драйвер плохо обрабатывает нестандартные размеры носителей и при переключении устройств сбрасывает геометрию страницы на стандартный лист А4.
  2. Общий ключ параметров печати: если для разных печатных форм используется одно и то же или незаполненное свойство ИмяПараметровПечати, 1С сохраняет последние примененные настройки (включая поля, ориентацию и размер страницы принтера А4) в профиль текущего пользователя и применяет их к этикетке.
  3. Динамические имена перенаправленных принтеров: при каждом новом входе в терминал имя принтера дополняется номером сессии, например: Zebra (перенаправлено 2). Из-за этого платформа теряет связь с ранее сохраненными настройками конкретного устройства.

Способ 1. Разделение параметров печати в коде 1С

Разберем базовое программное решение. Чтобы настройки страницы офисных документов и ценников не перезаписывали друг друга, необходимо жестко разграничить свойство ИмяПараметровПечати для каждого типа табличного документа.

Посмотрим на пример установки уникальных ключей параметров печати для разных макетов:


// Для печати обычных документов на стандартный принтер
ТабДокА4.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_НакладнаяЛист";

// Для печати большой этикетки
ТабДокБЭ.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭтикеткаБольшая";

// Для печати малых ценников
ТабДокМЭ.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭтикеткаМалая";

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

Способ 2. Программное определение имени принтера в RDP-сессии

Поскольку имя перенаправленного принтера в терминале постоянно меняется из-за смены номера сеанса, зафиксируем правильный принтер программно через обращение к WMI перед формированием табличного документа. Рассмотрим функцию, которая находит актуальное имя перенаправленного принтера текущего пользователя:


Функция ПолучитьИмяПринтераВТерминале(ИмяБазовогоПринтера) Экспорт
    Попытка
        Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
        СервисWMI = Локатор.ConnectServer(".", "root\cimv2");
        СписокПринтеров = СервисWMI.ExecQuery("Select Name from Win32_Printer");
        
        Для Каждого Принтер Из СписокПринтеров Цикл
            Если Найти(Принтер.Name, ИмяБазовогоПринтера) > 0 Тогда
                Возврат Принтер.Name;
            КонецЕсли;
        КонецЦикла;
    Исключение
        Сообщить("Ошибка получения списка принтеров через WMI: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
    КонецПопытки;
    
    Возврат ИмяБазовогоПринтера;
КонецФункции

Теперь применим полученное имя к нашему табличному документу перед отправкой на печать:


ИмяПринтераЭтикеток = ПолучитьИмяПринтераВТерминале("Zebra");
Таб.ИмяПринтера = ИмяПринтераЭтикеток;

Способ 3. Жесткая программная фиксация геометрии страницы

Чтобы полностью исключить влияние драйвера офисного принтера на параметры этикетки, зададим физические размеры и нулевые поля непосредственно в свойствах объекта ТабличныйДокумент.

Рассмотрим пример кода:


Таб.РазмерСтраницы = "Custom";
Таб.ШиринаСтраницы = 58; // Ширина этикетки в миллиметрах
Таб.ВысотаСтраницы = 40; // Высота этикетки в миллиметрах

// Обнуляем поля документа
Таб.ПолеСверху = 0;
Таб.ПолеСнизу  = 0;
Таб.ПолеСлева  = 0;
Таб.ПолеСправа = 0;

Таб.АвтоМасштаб = Истина;

// Отправляем документ на печать сразу без вызова интерактивного диалога
Таб.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

Важный момент: свойства ШиринаСтраницы и ВысотаСтраницы отрабатывают корректно только тогда, когда для свойства РазмерСтраницы явно установлено значение "Custom".

Способ 4. Настройка групповых политик и драйверов на сервере

Если программных доработок недостаточно, скорректируем системные настройки терминального сервера:

  1. Отключение Easy Print: откроем редактор локальной групповой политики на сервере (команда gpedit.msc), перейдем по пути: Конфигурация компьютера → Административные шаблоны → Компоненты Windows → Службы удаленных рабочих столов → Узел сеансов удаленных рабочих столов → Перенаправление принтеров. Найдем параметр «Использовать в первую очередь драйвер принтера Easy Print для удаленных рабочих столов» и установим его в положение «Отключено».
  2. Установка нативных драйверов: установим на сервер терминалов и на рабочую станцию пользователя идентичные версии официальных драйверов для используемой модели принтера этикеток.
  3. Создание шаблона размера по умолчанию: в свойствах принтера на клиенте и сервере (вкладка «Дополнительно» → «Умолчания») создадим пользовательский формат этикетки с точными размерами в миллиметрах и назначим его форматом по умолчанию.
  4. Прямое сетевое подключение: наиболее надежным решением является подключение принтера этикеток к серверу через статический IP-адрес (Standard TCP/IP Port). Это навсегда избавит от проблем с суффиксами перенаправления RDP.
← На главную