При оформлении печатных форм этикеток, ценников и накладных в системе «1С:Предприятие» разработчики регулярно сталкиваются с капризным поведением графических компонентов штрихкодирования. Две наиболее частые проблемы — это самопроизвольный сброс размера шрифта подписи штрихкода до минимального (обычно до 6-го или 8-го размера) и превращение штрихкода в нечитаемое сплошное «черное пятно» при попытке развернуть его на 90 градусов.
В этой статье мы подробно проанализируем физические и программные причины возникновения этих неполадок, разберем по шагам их устранение как для старой ActiveX-компоненты 1С:Печать штрихкодов, так и для современной нативной компоненты из состава БСП/БПО, а также рассмотрим примеры кода для программного управления выводом.
Рассмотрим ситуацию: в макете вы визуально увеличиваете шрифт подписи штрихкода (например, до 12-го размера), все выглядит отлично, но при формировании реального табличного документа на экране или при отправке на печать шрифт упорно возвращается к крошечному базовому значению. Выясним основные причины такого поведения.
1. Ошибка выбора объекта в палитре свойств Конфигуратора
Когда мы кликаем по области штрихкода в макете, платформа по умолчанию открывает свойства графического контейнера — объекта типа Рисунок. Если изменять настройки шрифта в этой панели, мы меняем шрифт самого контейнера 1С, который никак не влияет на параметры отображения встроенного ActiveX-элемента. Чтобы добраться до истинных настроек отображения цифр, выполним следующие шаги:
2. Срабатывание автоматического масштабирования (Защита от обрезания текста)
В компоненте 1С:Печать штрихкодов реализован строгий защитный алгоритм контроля геометрических пропорций. Если физический размер рамки рисунка в макете слишком мал для того, чтобы в него физически поместились полосы штрихкода и крупный текст под ними, компонента принудительно сжимает шрифт до минимально допустимого размера (6–8 пунктов). Это делается для того, чтобы цифры гарантированно влезли в границы и не обрезались.
Решение проблемы: пропорционально увеличьте ширину и, особенно, высоту рамки рисунка штрихкода на макете. Освободив дополнительное пространство снизу, вы позволите компоненте отобразить настроенный крупный шрифт без автоматического сжатия.
Попытки переопределить свойства шрифта напрямую через присвоение значений, например:
ЭтикеткаОбласть.Рисунки.Штрихкод.Объект.Шрифт.Size = 10;
не принесут желаемого результата, поскольку свойство Шрифт у COM/ActiveX объектов возвращает интерфейс, закрытый для прямой перезаписи отдельных свойств из среды 1С.
Для корректного программного управления оформлением у объекта штрихкода существует специализированный метод УстановитьШрифт(). Разберем его синтаксис подробнее. Метод принимает следующие параметры:
Посмотрим на практический пример правильной программной установки параметров шрифта перед выводом области макета на печать:
// Получаем область макета, где расположен наш рисунок
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкода");
// Задаем значение штрихкода
ОбластьМакета.Рисунки.Штрихкод.Объект.Сообщение = "4601234567890";
// Настраиваем шрифт программно: шрифт Arial, размер 12, обычная толщина (400), без эффектов
ОбластьМакета.Рисунки.Штрихкод.Obj.УстановитьШрифт("Arial", 12, 400, Ложь, Ложь, Ложь);
// Выводим готовую область в результирующий табличный документ
ТабДокумент.Вывести(ОбластьМакета);
Технология ActiveX постепенно уходит в прошлое, так как она не поддерживается на x64-платформах сервера и тонкого клиента в средах Linux и macOS. В современных типовых конфигурациях 1С (УНФ, ERP, КА, УТ) генерация штрихкодов реализуется через нативную внешнюю компоненту AddIn.КартинкаШтрихкода.Barcode.
Эта компонента не встраивается как элемент управления, а генерирует бинарную картинку штрихкода в формате PNG/BMP, которая затем динамически помещается в обычный пустой рисунок на макете табличного документа.
При использовании нативного механизма размер шрифта задается через структуру параметров генерации. Проанализируем пример кода формирования качественного изображения штрихкода:
// 1. Инициализируем структуру параметров для генератора
ПараметрыГенерации = Новый Структура;
ПараметрыГенерации.Вставить("Ширина", 400); // в пикселях
ПараметрыГенерации.Вставить("Высота", 150); // в пикселях
ПараметрыГенерации.Вставить("ТипКода", 1); // EAN13
ПараметрыГенерации.Вставить("Штрихкод", "4601234567890");
ПараметрыГенерации.Вставить("ОтображатьТекст", Истина);
ПараметрыГенерации.Вставить("РазмерШрифта", 14); // точный размер текста под кодом
// 2. Получаем картинку штрихкода из компоненты генерации БСП
КартинкаШтрихкода = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыГенерации);
// 3. Выводим полученную картинку в область макета
ОбластьЭтикетки = Макет.ПолучитьОбласть("СтрокаЭтикетки");
ОбластьЭтикетки.Рисунки.ИзображениеШК.Картинка = КартинкаШтрихкода;
ТабДокумент.Вывести(ОбластьЭтикетки);
Если выводится этикетка малого физического размера (например, 30х20 мм или 58х40 мм), то при генерации картинки "пиксель-в-пиксель" текст под штрихами часто получается размытым и нечитаемым. Применим проверенную хитрость:
Перейдем ко второй важнейшей технической проблеме. При попытке развернуть штрихкод вертикально (передав параметр угла поворота 90 или 270 градусов во внешнюю компоненту), на печати вместо полос штрихкода выводится сплошная черная область.
Выясним физическую причину этого явления. Штрихкод критически чувствителен к дискретности растровой сетки. Каждая линия штрихкода должна занимать целое число пикселей при рендеринге на принтере. Когда штрихкод расположен стандартно (горизонтально), его полосы ориентированы вертикально, а ширина картинки отвечает за разрешение этих полос.
При повороте на 90 градусов вертикальные полосы укладываются горизонтально. То есть теперь высота исходной области рендеринга становится шириной, в которую должны уместиться все линии штрихкода. Если область рисунка в макете узкая по ширине (или вы передали компоненте слишком маленькую ширину для развернутого штрихкода), генератор пытается «ужать» толщину линий до значений меньше 1 пикселя. Из-за этого соседние черные линии сливаются, образуя сплошное черное пятно.
Пошаговое решение проблемы:
Проанализируем пример правильной подготовки параметров для вертикального штрихкода:
ПараметрыВертикальногоШК = Новый Структура;
// Меняем параметры местами: теперь ширина небольшая, а высота — максимальная
ПараметрыВертикальногоШК.Вставить("Ширина", 150);
ПараметрыВертикальногоШК.Вставить("Высота", 500);
ПараметрыВертикальногоШК.Вставить("УголПоворота", 90); // Поворот на 90 градусов
ПараметрыВертикальногоШК.Вставить("ТипКода", 1); // EAN13
ПараметрыВертикальногоШК.Вставить("Штрихкод", "4601234567890");
// Генерация изображения
КартинкаВертикальная = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыВертикальногоШК);
// Заполнение рисунка на макете
Область = Макет.ПолучитьОбласть("ВертикальныйШтрихкод");
Область.Рисунки.ПовернутыйШК.РазмерКартинки = РазмерКартинки.Пропорционально;
Область.Рисунки.ПовернутыйШК.Картинка = КартинкаВертикальная;
При таком подходе линии штрихкода будут отрисованы четко, без наложений, и код успешно считается любым складским сканером или терминалом сбора данных.