При разработке печатных форм в системе 1С:Предприятие 8.2 программисты часто сталкиваются с проблемой качества печати штрихкодов. Стандартные методы или компоненты могут выдавать растровое изображение, которое при масштабировании «размывается», что затрудняет считывание сканером. В более современных версиях платформы (8.3.10 и выше) появилась встроенная поддержка формата SVG, однако для версии 8.2 эта задача требует особого подхода. В этой статье мы разберем несколько эффективных способов реализации векторного штрихкода, учитывая специфику старой платформы.
Прежде всего, проанализируем ситуацию: платформа 1С 8.2 не поддерживает формат SVG напрямую в объекте Картинка. Если вы попытаетесь загрузить файл .svg в ячейку табличного документа, платформа либо выдаст ошибку, либо не отобразит содержимое. Тем не менее, как показывает практика, добиться «векторного» качества (четких границ при любом увеличении) можно и в этой версии. Рассмотрим, какими методами это достигается.
Одним из самых надежных способов получения векторного изображения в 1С 8.2 является использование шрифтов типа EAN13.ttf. Поскольку любой шрифт в Windows — это набор векторных кривых, при печати такой штрихкод будет иметь идеальную четкость.
Рассмотрим алгоритм реализации этого метода:
Разберем пример функции для формирования управляющей строки (упрощенно):
Функция СформироватьСтрокуДляШрифтаEAN13(Знач Код)
// Здесь должен быть алгоритм преобразования цифр
// в символы в соответствии со спецификацией шрифта.
// Обычно это добавление стартовых/стоповых символов и разделителя.
КонтрольныйСимвол = РассчитатьКонтрольныйСимволEAN13(Код);
ПолныйКод = Код + КонтрольныйСимвол;
Результат = ПреобразоватьВКодировкуШрифта(ПолныйКод);
Возврат Результат;
КонецФункции
Хотя 1С 8.2 не дружит с SVG, она прекрасно понимает формат EMF (Windows Metafile). Это векторный формат, который сохраняет четкость при масштабировании в табличном документе. Если внешняя компонента (например, Zint или ActiveX) умеет сохранять результат в EMF, мы можем загрузить его в объект Картинка.
Выясним причину, почему это работает: объект Картинка в 1С является контейнером, который поддерживает стандартные Windows-метафайлы. Посмотрим на пример кода, который позволяет вывести такое изображение в макет:
Процедура ВывестиШтрихкодВМакет(ОбластьСтроки, ДанныеШтрихкода)
// Предположим, внешняя компонента сформировала файл штрихкода во временной директории
ПутьКФайлу = "C:\Temp\barcode.emf";
// Создаем объект картинка из файла
ВекторнаяКартинка = Новый Картинка(ПутьКФайлу);
// Помещаем картинку в именованный рисунок в области табличного документа
ОбластьСтроки.Рисунки.Штрихкод.Картинка = ВекторнаяКартинка;
КонецПроцедуры
Важно помнить, что при использовании Новый Картинка(ПутьКФайлу) платформа считывает содержимое файла и вставляет его в документ. Если файл в формате EMF, то при печати в PDF или на физический принтер качество будет максимально возможным.
Если мы хотим избежать использования внешних файлов и шрифтов, проанализируем ситуацию с программным рисованием. В табличном документе можно создавать объекты типа Рисунок с типом ТипРисункаТабличногоДокумента.Прямоугольник.
Разберем по шагам, как это реализовать:
ЦветЛинии и ЦветФона в черный цвет для штрихов.Посмотрим на пример логики отрисовки модуля:
// Пример добавления одного штриха в область
НовыйШтрих = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);
НовыйШтрих.Лево = ТекущаяПозиция;
НовыйШтрих.Верх = 2;
НовыйШтрих.Ширина = ШиринаМодуля;
НовыйШтрих.Высота = 15;
НовыйШтрих.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 0);
НовыйШтрих.ЦветФона = ЦветаСтиля.Черный;
Этот метод гарантирует стопроцентную векторность внутри самого mxl файла, так как штрихкод состоит из графических примитивов платформы.
Часто разработчики используют внешние библиотеки (например, BarcodeLib или Zint). В 1С 8.2 удобнее всего работать через сохранение картинки во временный файл с последующей загрузкой. Даже если компонента выдает растр (PNG), при установке высокого разрешения (DPI) результат на печати будет сопоставим с вектором.
Проанализируем пример использования объекта Картинка, о котором упоминалось в обсуждении:
// Пример загрузки изображения из временного файла
ВрПутьКФайлу = ПолучитьИмяВременногоФайла("png");
// ... Здесь код вызова внешней компоненты, сохраняющей штрихкод в ВрПутьКФайлу ...
Если ФайлСуществует(ВрПутьКФайлу) Тогда
// В 8.2 это основной способ передачи изображения в ячейку
ОбластьСтроки.Области.ОбластьШтрихкода.Картинка = Новый Картинка(ВрПутьКФайлу);
КонецЕсли;
Важный нюанс: Чтобы штрихкод не размывался, при генерации растрового изображения (если не используется EMF) необходимо задавать размер картинки в пикселях в 3-4 раза больше, чем физический размер в макете. Тогда при печати плотность точек будет достаточной для четких линий.
Мы рассмотрели различные подходы к выводу векторного штрихкода в 1С 8.2. Выясним, какой метод выбрать:
Помните, что качество печати штрихкода напрямую влияет на скорость работы склада или магазина, поэтому выбор в пользу векторных методов или растра высокого разрешения является критически важным при разработке торговых систем на базе 1С 8.2.