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