Как исправить сжатый по горизонтали штрихкод при печати этикеток и ценников в 1С?

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

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

В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько способов решения проблемы — от настройки драйвера до программного вмешательства в механизм генерации штрихкода.

Природа проблемы: почему штрихкод сужается?

Прежде чем приступать к коду, давайте поймем суть. Изображение штрихкода в 1С генерируется либо внешней компонентой (ActiveX), либо нативными средствами платформы (Native). Генерация происходит с определенным разрешением (обычно экранным, около 96 DPI), в то время как принтеры этикеток работают с разрешениями 203, 300 или 600 DPI.

Когда картинка, сгенерированная для экрана, передается на принтер, драйвер или платформа пытаются ее масштабировать. Если в свойствах картинки стоит "Сохранять пропорции", а область в макете узкая, штрихкод сожмется. Кроме того, сам генератор штрихкода часто добавляет белые поля (Quiet Zones) по бокам, которые "съедают" полезное место.

Способ 1. Настройка макета или конструктор печатных форм

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

Разберем действия по шагам:

  1. Откройте макет ценника или этикетки.
  2. Выделите рисунок штрихкода. Щелкните правой кнопкой мыши и перейдите в Свойства.
  3. Проверьте свойство Размещение (или "Положение"). Попробуйте установить значение Растянуть. Обратите внимание: если используется компонент 1С:Печать штрихкодов, настройки могут быть внутри контекстного меню самого объекта (ActiveX), а не в палитре свойств 1С.
  4. Критически важный момент: уберите галочку Пропорционально (если штрихкод вставлен как картинка, что часто встречается во внешних печатных формах). Это позволит растягивать его по ширине независимо от высоты.
  5. Увеличьте физический размер области штрихкода в макете. Как было замечено на практике, свойство "растягивать" иногда начинает работать только тогда, когда ширина объекта превышает определенный порог.

Если 1С выдает ошибку о том, что макет не помещается на страницу ("количество по горизонтали должно быть 0"), выполните настройку параметров страницы:

Способ 2. Программное масштабирование и удаление фона

Если настройки макета не помогают, и штрихкод генерируется слишком узким, нам придется вмешаться в код формирования печатной формы. Обычно это происходит в общем модуле или обработке печати этикеток (например, Обработки.ПечатьЭтикетокИЦенников).

Рассмотрим метод, который позволяет принудительно расширить штрихкод и убрать лишние белые поля, чтобы полоски занимали всё доступное пространство.

Удаление лишнего фона

В параметрах генерации штрихкода существует опция, позволяющая убрать белые отступы. Это заставляет сам штрихкод занять всю ширину картинки.

Найдем место в коде, где формируются ПараметрыШтрихкода, и добавим туда следующую строку:


// Вставляем параметр для нативной компоненты генерации
ПараметрыШтрихкода.Вставить("УбратьЛишнийФон", Истина);

После этого сгенерированная картинка не будет содержать пустых полей по краям, и при растягивании в макете (свойство Растягивать) она заполнит всю ширину ячейки полосами, а не пустотой.

Принудительное увеличение ширины через коэффициент

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

Идея заключается в следующем: мы будем искать в макете специальную метку (например, $ШиринаКартинкиШК*1.5) и, если находим её, умножать расчетную ширину штрихкода на указанное число.

Пример реализации функции подготовки параметров штрихкода:


// Примерный код внутри цикла обработки этикеток
Если ЗначениеЗаполнено(ЗначениеШтрихкода) Тогда
    ПараметрыШтрихкода = Новый Структура;
    
    // Рассчитываем базовую ширину исходя из размеров рисунка в макете
    // КоличествоМиллиметровВПикселе обычно около 0.264 (для 96 DPI)
    ПараметрыШтрихкода.Вставить("Ширина", Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселе));
    
    // --- НАЧАЛО ВСТАВКИ: Поиск коэффициента масштабирования в макете ---
    // Ищем текст вида $ШиринаКартинкиШК*1.4 в области макета
    ИскОбласть = СтруктураШаблона.МакетЭтикетки.НайтиТекст("$ШиринаКартинкиШК*", , , Ложь, , Ложь);
    
    Если ИскОбласть <> Неопределено Тогда
        // Извлекаем число после звездочки. Предполагаем, что текст метки - 18 символов + число
        ТекКоэффициентСтрока = СокрЛП(Сред(ИскОбласть.Текст, 19)); 
        ТекКоэффициент = Число(ТекКоэффициентСтрока);
        
        Если ТекКоэффициент > 0 Тогда
            // Умножаем ширину на найденный коэффициент
            ПараметрыШтрихкода.Ширина = Окр(ПараметрыШтрихкода.Ширина * ТекКоэффициент);
        КонецЕсли;
    КонецЕсли;
    // --- КОНЕЦ ВСТАВКИ ---

    // Обязательно убираем фон, чтобы растягивался полезный контент
    ПараметрыШтрихкода.Вставить("УбратьЛишнийФон", Истина);
    
    // Задаем остальные параметры
    ПараметрыШтрихкода.Вставить("Высота", Окр(Рисунок.Высота / КоличествоМиллиметровВПикселе));
    ПараметрыШтрихкода.Вставить("Штрихкод", ЗначениеШтрихкода);
    ПараметрыШтрихкода.Вставить("ТипКода", СтруктураШаблона.ТипКода); // Обычно 1 - EAN13
    ПараметрыШтрихкода.Вставить("ОтображатьТекст", СтруктураШаблона.ОтображатьТекст);
    
    // Генерируем картинку
    Рисунок.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
КонецЕсли;

Теперь, чтобы изменить ширину штрихкода, нам не нужно лезть в конфигуратор. Достаточно открыть макет этикетки в режиме "Предприятие" и где-нибудь в скрытой или невидимой области (или прямо в комментарии ячейки) написать текст: $ШиринаКартинкиШК*1.5. Код найдет эту метку и увеличит ширину генерируемого штрихкода в полтора раза.

Способ 3. Работа с картинкой после генерации

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


// После того как картинка сгенерирована и помещена в Рисунок
ИскОбласть = СтруктураШаблона.МакетЭтикетки.НайтиТекст("$ШиринаРисункаШК*", , , Ложь, , Ложь);

Если ИскОбласть <> Неопределено Тогда
    ТекКоэффициент = Число(СокрЛП(Сред(ИскОбласть.Текст, 18)));
    // Изменяем ширину самого элемента управления в табличном документе
    Рисунок.Ширина = Окр(Рисунок.Ширина * ТекКоэффициент);
КонецЕсли;

Этот метод работает как "зум" для картинки внутри ячейки.

Рекомендации по настройке драйвера принтера

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

  1. Отключите сглаживание (Dithering). В настройках драйвера (вкладка "Графика") выберите режим "Никакого" (None) или "Полутона" (Halftone) переключите в режим сплошного цвета. Штрихкод должен быть строго черно-белым.
  2. Избегайте масштаба "По ширине страницы". В диалоге печати 1С старайтесь использовать масштаб 100%. Если вы выбираете "По ширине страницы", а макет хотя бы на 1 пиксель шире бумаги, драйвер сожмет всё изображение, исказив штрихи.
  3. Проверьте разрешение. Если ваш принтер поддерживает 203 DPI, а в настройках стоит другое значение, штрихкод может "поплыть".

Итог

Для гарантированного решения проблемы "узкого" штрихкода лучше всего использовать комбинированный подход:

  1. В коде формирования включить параметр УбратьЛишнийФон.
  2. В свойствах рисунка на макете выставить режим Растянуть и отключить Пропорционально.
  3. При необходимости использовать программное умножение ширины (через коэффициент), чтобы сгенерированная картинка имела достаточное количество пикселей для четкой печати.
← На главную