Как вывести векторный штрихкод EAN13 в табличный документ 1С 8.2?

Программист 1С v8.3 (Обычные формы)
← На главную

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

Проблема поддержки SVG в 1С 8.2

Прежде всего, проанализируем ситуацию: платформа 1С 8.2 не поддерживает формат SVG напрямую в объекте Картинка. Если вы попытаетесь загрузить файл .svg в ячейку табличного документа, платформа либо выдаст ошибку, либо не отобразит содержимое. Тем не менее, как показывает практика, добиться «векторного» качества (четких границ при любом увеличении) можно и в этой версии. Рассмотрим, какими методами это достигается.

Метод 1: Использование специализированных шрифтов (Barcode Fonts)

Одним из самых надежных способов получения векторного изображения в 1С 8.2 является использование шрифтов типа EAN13.ttf. Поскольку любой шрифт в Windows — это набор векторных кривых, при печати такой штрихкод будет иметь идеальную четкость.

Рассмотрим алгоритм реализации этого метода:

  1. Установка шрифта: Необходимо установить выбранный шрифт на сервер и на все рабочие станции, где будет выполняться печать.
  2. Подготовка строки: Просто написать цифры «123456789012» недостаточно. Формат EAN13 требует преобразования цифр в специальные символы (буквы верхнего и нижнего регистра), которые в шрифте выглядят как полосы разной ширины. Также необходимо программно рассчитать контрольный символ.
  3. Настройка макета: В макете табличного документа для соответствующей ячейки выбирается установленный шрифт штрихкода и задается необходимый размер.

Разберем пример функции для формирования управляющей строки (упрощенно):


Функция СформироватьСтрокуДляШрифтаEAN13(Знач Код)
    // Здесь должен быть алгоритм преобразования цифр 
    // в символы в соответствии со спецификацией шрифта.
    // Обычно это добавление стартовых/стоповых символов и разделителя.
    КонтрольныйСимвол = РассчитатьКонтрольныйСимволEAN13(Код);
    ПолныйКод = Код + КонтрольныйСимвол;
    
    Результат = ПреобразоватьВКодировкуШрифта(ПолныйКод);
    Возврат Результат;
КонецФункции

Метод 2: Использование векторного формата EMF

Хотя 1С 8.2 не дружит с SVG, она прекрасно понимает формат EMF (Windows Metafile). Это векторный формат, который сохраняет четкость при масштабировании в табличном документе. Если внешняя компонента (например, Zint или ActiveX) умеет сохранять результат в EMF, мы можем загрузить его в объект Картинка.

Выясним причину, почему это работает: объект Картинка в 1С является контейнером, который поддерживает стандартные Windows-метафайлы. Посмотрим на пример кода, который позволяет вывести такое изображение в макет:


Процедура ВывестиШтрихкодВМакет(ОбластьСтроки, ДанныеШтрихкода)
    // Предположим, внешняя компонента сформировала файл штрихкода во временной директории
    ПутьКФайлу = "C:\Temp\barcode.emf"; 
    
    // Создаем объект картинка из файла
    ВекторнаяКартинка = Новый Картинка(ПутьКФайлу);
    
    // Помещаем картинку в именованный рисунок в области табличного документа
    ОбластьСтроки.Рисунки.Штрихкод.Картинка = ВекторнаяКартинка;
КонецПроцедуры

Важно помнить, что при использовании Новый Картинка(ПутьКФайлу) платформа считывает содержимое файла и вставляет его в документ. Если файл в формате EMF, то при печати в PDF или на физический принтер качество будет максимально возможным.

Метод 3: Программное рисование штрихкода объектами «Рисунок»

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

Разберем по шагам, как это реализовать:

  1. Анализ кода: Преобразуем код EAN13 в последовательность двоичных данных (черная полоса / белая полоса) согласно стандарту.
  2. Цикл отрисовки: Для каждого элемента последовательности создаем тонкий вертикальный прямоугольник.
  3. Настройка свойств: Устанавливаем ЦветЛинии и ЦветФона в черный цвет для штрихов.

Посмотрим на пример логики отрисовки модуля:


// Пример добавления одного штриха в область
НовыйШтрих = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);
НовыйШтрих.Лево = ТекущаяПозиция;
НовыйШтрих.Верх = 2;
НовыйШтрих.Ширина = ШиринаМодуля;
НовыйШтрих.Высота = 15;
НовыйШтрих.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 0);
НовыйШтрих.ЦветФона = ЦветаСтиля.Черный;

Этот метод гарантирует стопроцентную векторность внутри самого mxl файла, так как штрихкод состоит из графических примитивов платформы.

Метод 4: Адаптация внешних компонент для работы через временные файлы

Часто разработчики используют внешние библиотеки (например, BarcodeLib или Zint). В 1С 8.2 удобнее всего работать через сохранение картинки во временный файл с последующей загрузкой. Даже если компонента выдает растр (PNG), при установке высокого разрешения (DPI) результат на печати будет сопоставим с вектором.

Проанализируем пример использования объекта Картинка, о котором упоминалось в обсуждении:


// Пример загрузки изображения из временного файла
ВрПутьКФайлу = ПолучитьИмяВременногоФайла("png");
// ... Здесь код вызова внешней компоненты, сохраняющей штрихкод в ВрПутьКФайлу ...

Если ФайлСуществует(ВрПутьКФайлу) Тогда
    // В 8.2 это основной способ передачи изображения в ячейку
    ОбластьСтроки.Области.ОбластьШтрихкода.Картинка = Новый Картинка(ВрПутьКФайлу);
КонецЕсли;

Важный нюанс: Чтобы штрихкод не размывался, при генерации растрового изображения (если не используется EMF) необходимо задавать размер картинки в пикселях в 3-4 раза больше, чем физический размер в макете. Тогда при печати плотность точек будет достаточной для четких линий.

Подведение итогов

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

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

← На главную