Часто при разработке печатных форм этикеток в самописных или типовых конфигурациях 1С на управляемых формах возникает задача: необходимо растянуть генерируемый штрихкод до конца области рисунка в табличном документе. Разработчики перебирают свойства АвтоРазмер, устанавливают свойство макета РазмерКартинки = РазмерКартинки.Растянуть, отключают сохранение пропорций, но пустое пространство справа или слева все равно остается. Разберем по шагам, почему это происходит и как правильно решить данную задачу.
Проанализируем стандартный подход к формированию штрихкода с помощью компоненты AddIn.КартинкаШтрихкода.Barcode, который обычно применяется разработчиками:
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 30);
ПараметрыШтрихкода.Вставить("Высота", 30);
ПараметрыШтрихкода.Вставить("Штрихкод", ШК);
ПараметрыШтрихкода.Вставить("ТипКода", 4);
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("Масштабировать", Истина);
ПараметрыШтрихкода.Вставить("СохранятьПропорции", Ложь);
Картинка = ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Картинка;
Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
Иногда разработчики пытаются передать в компоненту точную ширину ячейки макета, например, используя конструкцию ВнешняяКомпонента.Ширина = Макет.Область("R1C1:R2C2").Ширина;. Однако даже при таких настройках картинка со штрихкодом увеличивается, но свободное пространство так и не заполняется до самых краев.
Посмотрим на алгоритм генерации изображений в самой внешней компоненте 1С. Компонента имеет жесткое ограничение на масштабирование. Это сделано специально, чтобы сгенерированный штрихкод оставался валидным и уверенно считывался любыми сканерами.
Любой линейный штрихкод состоит из черных и белых полос (модулей). Главное правило стандарта штрихкодирования: ширина минимального модуля всегда должна составлять строго целое число пикселей (1, 2, 3 и так далее).
Когда вы задаете ширину, компонента вычисляет максимально возможный размер штрихкода так, чтобы он влез в эту ширину. Рассмотрим пример: если ваш штрихкод логически состоит из 95 модулей (полос), а запрошенная ширина картинки составляет 200 пикселей, компонента при делении 200 на 95 поймет, что может выделить строго по 2 пикселя на каждый модуль (95 × 2 = 190 пикселей). Оставшиеся 10 пикселей компонента заполнить не сможет, так как она не умеет и не должна рисовать "полтора пикселя" (иначе толщина линий станет неравномерной). Это "лишнее" место останется пустым в виде белого отступа по краям.
Возникает соблазн обойти это ограничение средствами самого табличного документа 1С, установив свойство Рисунок.РазмерКартинки = РазмерКартинки.Растянуть или отключив СохранятьПропорции.
Сделав это, вы заставите графический движок 1С принудительно интерполировать (растянуть) картинку. На экране компьютера или листе бумаги код будет казаться идеально растянутым на всю ширину ячейки. Однако из-за графического искажения некоторые штрихи станут шире других. Физические лазерные сканеры перестанут распознавать такой штрихкод, так как будут нарушены строгие математические пропорции между толщинами линий.
Рассмотрим подробнее, как обойти это ограничение без потери читаемости штрихкода. Существует несколько эффективных подходов:
Метод сверхвысокого разрешения (High-Res генерация)
Чтобы минимизировать видимые отступы по краям, генерируйте картинку штрихкода очень большого размера. В структуру параметров необходимо передавать значения Ширина и Высота, многократно превышающие реальные габариты ячейки в макете (например, задайте ширину 1000 или 2000 пикселей).
При таких больших значениях неиспользуемый "остаток" пикселей от деления становится ничтожно малым (например, 3-4 пикселя из 2000), и штрихкод визуально занимает 99% площади. В настройках рисунка макета при этом обязательно используйте Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально. 1С просто сожмет эту идеальную большую картинку до нужных размеров ячейки при печати, сохранив все пропорции линий.
Ограничение типа штрихкода
Следует помнить, что штрихкоды форматов EAN-13 и EAN-8 имеют строго стандартизированный размер и пропорции. Их физически невозможно растянуть в произвольную длинную полосу. Если задача требует заполнения длинного и узкого пространства на этикетке, рекомендуем сменить формат на Code128 (в свойствах компоненты ВнешняяКомпонента.ТипКода = 4). Этот формат позволяет гораздо более гибко работать с размерами и длиной генерируемой полосы.
Отключение авторазмера
При использовании собственных алгоритмов расчета габаритов, убедитесь, что свойство компоненты АвтоРазмер установлено в значение Ложь:
ВнешняяКомпонента.АвтоТип = Ложь;
ВнешняяКомпонента.АвтоРазмер = Ложь;
Если оставить это свойство включенным, алгоритм генерации может проигнорировать переданные вами параметры ширины и высоты, сформировав картинку по зашитому внутреннему стандарту.
Применяя метод "сверхвысокого разрешения" в связке с пропорциональным сжатием табличного документа, мы решаем проблему пустого места и одновременно гарантируем стопроцентную считываемость напечатанных этикеток любым торговым оборудованием.