В практике работы с 1С:Управление торговлей 10.3 (УТ 10) часто возникает ситуация, когда этикетки, которые вчера успешно сканировались, сегодня печатаются визуально так же, но сканер ШК наотрез отказывается их распознавать. Ситуация осложняется тем, что проблема проявляется именно при работе через терминальный сервер (RDP). Давайте подробно разберем причины этого явления и выясним, как вернуть работоспособность системы печати.
Проанализируем техническую сторону вопроса. Когда пользователь подключается к серверу через удаленный рабочий стол (RDP), его локальный принтер этикеток «пробрасывается» в сессию. По умолчанию современные версии Windows Server используют технологию Terminal Services Easy Print. Этот драйвер-посредник предназначен для упрощения жизни администраторам, так как он не требует установки драйверов каждого конкретного принтера на сервер.
Однако именно в этом удобстве кроется главная проблема для печати штрихкодов. Рассмотрим, как работает Easy Print: задание на печать из 1С преобразуется в формат XPS, передается на локальную машину и там уже пересчитывается драйвером физического принтера. В процессе этого многократного преобразования происходит микроскопическое искажение геометрических размеров элементов штрихкода.
Для обычного текста смещение в 0.1 мм незаметно, но для штрихкода (особенно стандарта EAN-13) это критично. Штрихкод состоит из чередующихся черных и белых полос строго определенной ширины. Если драйвер Easy Print при «растягивании» картинки под размер бумаги изменит ширину узкой линии, сканер не сможет вычислить контрольную сумму и не распознает код. Рассмотрим ситуацию: тонкая линия должна быть шириной ровно в 1 пиксель печатающей головки, но из-за масштабирования она превращается в 1.2 пикселя. Принтер округлит это значение, и пропорция будет нарушена.
Выясним еще одну скрытую причину — разницу в настройках масштабирования (DPI) на сервере и локальном ПК. Если на компьютере пользователя установлено масштабирование текста 125% или 150% (часто встречается на мониторах с высоким разрешением), то компонента 1CBarCode.dll, отвечающая за генерацию графического объекта штрихкода, может сформировать изображение с некорректным разрешением для проброшенного принтера.
Проанализируем этот момент подробнее: при передаче изображения через RDP-сессию система пытается подстроиться под настройки экрана. В результате объект Рисунок в макете этикетки 1С может быть либо «замылен» из-за антиалиасинга (сглаживания), либо его края станут нечеткими. Лазерный сканер крайне чувствителен к контрастности перехода «черное-белое». Если граница полосы становится серой, луч сканера рассеивается, и чтение не происходит.
Для решения проблемы нам необходимо полностью исключить влияние Easy Print. Разберем шаги по настройке:
Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Перенаправление принтеров. Здесь нужно включить опцию «Использовать в первую очередь драйвер принтера Easy Print Windows», установив значение Отключено.Local Port с указанием сетевого пути к принтеру (например, \\Имя_ПК\Имя_Принтера). Это обеспечит прямую передачу данных без промежуточных преобразований графики.Посмотрим на ситуацию, упомянутую в обсуждении: «поменяли бумагу». Это очень важный фактор. Разные партии термоэтикеток имеют разную чувствительность термослоя. Проанализируем настройки драйвера на локальном компьютере:
Если манипуляции с драйверами не помогли на 100%, стоит заглянуть в конфигуратор 1С. В УТ 10.3 этикетки формируются как табличный документ. Рассмотрим объект штрихкода на макете:
Найдите в свойствах объекта Штрихкод (тип Рисунок) параметр Сохранять пропорции. Иногда переключение этого флага помогает системе корректно вписать сформированную картинку в выделенную область печати без искажений. Также проверьте, какая версия компоненты 1CBarCode установлена. Старые версии (до 8.0.15.2) имели проблемы с отрисовкой на ОС Windows Server 2012 и выше.
Разберем пример того, как программно можно управлять параметрами печати, чтобы минимизировать влияние драйверов, хотя основные настройки производятся в макете:
// Пример обращения к свойствам области печати
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
РисунокШтрихкод = ОбластьМакета.Рисунки.Штрихкод;
// Установка типа штрихкода явно, если он сбивается
РисунокШтрихкод.Объект.ТипКода = 1; // EAN13
// Принудительное обновление для пересчета геометрии
РисунокШтрихкод.Объект.ТекстКода = "2000000000015";
Подводя итог, можно сказать, что «загадка» нечитаемого штрихкода в 90% случаев кроется в искажении пропорций графики при передаче через RDP. Отказ от виртуализации печати в пользу прямой работы с драйвером производителя — это единственный надежный способ обеспечить стабильную работу склада и торговой точки.