При разработке отчетов для торговых систем часто возникает задача визуализации штрихкода. Просто выгрузить цифры из регистра сведений недостаточно — кассиру или кладовщику необходимо видеть именно графические полосы для сканирования. В этой статье мы разберем несколько проверенных способов реализации этой задачи: от классического использования шрифтов до современных методов работы с компонентами.
Этот метод считается одним из самых быстрых в плане производительности, так как платформа 1С просто выводит текстовую строку, а специальный шрифт, установленный в операционной системе, отображает её как набор полос. Однако здесь есть важный нюанс: штрихкод нельзя вывести «как есть». Его нужно предварительно преобразовать (перекодировать), чтобы шрифт правильно отрисовал контрольные символы и разделители.
Рассмотрим алгоритм реализации. Сначала нам потребуется функция, которая преобразует стандартный 13-значный код (EAN13) в специальную последовательность символов.
&НаСервереБезКонтекста
Функция КодируемШтрихКод(Парам)
Если СтрДлина(Парам) <> 13 Тогда
Возврат "1234567890123"; // Заглушка при ошибке
КонецЕсли;
ПечШтрих = "";
Код = Парам;
Ф = Новый Массив(11);
Ф[1] = "000000"; // 0
Ф[2] = "001011"; // 1
Ф[3] = "001101"; // 2
Ф[4] = "001110"; // 3
Ф[5] = "010011"; // 4
Ф[6] = "011001"; // 5
Ф[7] = "011100"; // 6
Ф[8] = "010101"; // 7
Ф[9] = "010110"; // 8
Ф[10] = "011010"; // 9
Маска = "" + Лев(СокрЛП(Код), 1) + Ф[Число(Лев(СокрЛП(Код), 1)) + 1] + "222222";
Дл = СтрДлина(Код);
Для ИИ = 1 По Дл Цикл
Если ИИ = 1 Тогда
Стр1 = "" + Лев(СокрЛП(Код), 1);
Иначе // ИИ от 2 до 13
СимволМаски = Сред(Маска, ИИ, 1);
Если СимволМаски = "0" Тогда
Стр1 = Символ(65 + Сред(Код, ИИ, 1));
ИначеЕсли СимволМаски = "1" Тогда
Стр1 = Символ(75 + Сред(Код, ИИ, 1));
ИначеЕсли СимволМаски = "2" Тогда
Стр1 = Символ(97 + Сред(Код, ИИ, 1));
КонецЕсли;
КонецЕсли;
ПечШтрих = ПечШтрих + Стр1;
Если ИИ = 7 Тогда
ПечШтрих = ПечШтрих + "*"; // Центральный разделитель
ИначеЕсли ИИ = 13 Тогда
ПечШтрих = ПечШтрих + "+"; // Завершающий символ
КонецЕсли;
КонецЦикла;
Возврат ПечШтрих;
КонецФункции
Разберем по шагам, как вывести результат работы этой функции в макет:
ШтрихкодДляПечати).КодируемШтрихКод().Важное ограничение: данный способ требует установки шрифта на каждом компьютере, где будет формироваться или просматриваться отчет. Если пользователь откроет отчет без установленного шрифта, он увидит странный набор букв вместо штрихкода.
Если вы хотите избежать проблем с установкой шрифтов, проанализируем вариант с использованием официальной компоненты от 1С. Она позволяет вставлять в макет объект, который сам генерирует изображение штрихкода.
Для реализации этого метода выполните следующие действия:
РисунокШтрихкод).Проанализируем пример кода для управления этим объектом при выводе строки отчета:
// Получаем область из макета
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Обращаемся к рисунку-объекту в этой области
РисунокШтрихкод = ОбластьСтрока.Рисунки.РисунокШтрихкод;
// Настраиваем параметры объекта
РисунокШтрихкод.Объект.ТипКода = 1; // 1 соответствует EAN13
РисунокШтрихкод.Объект.ТекстКода = СтрокаТаблицы.Штрихкод;
РисунокШтрихкод.Объект.ОтображатьТекст = Истина;
РисунокШтрихкод.Объект.РазмерКрая = 0;
// Выводим область в табличный документ
ТабДок.Вывести(ОбластьСтрока);
Этот метод более универсален, так как компонента часто входит в состав типовых конфигураций (БСП) и позволяет работать с широким списком форматов, включая Code128, QR-коды и DataMatrix.
Выясним, как упростить задачу в новых версиях платформы. Начиная с версии 8.3.10, в 1С появился нативный механизм отрисовки штрихкодов без внешних компонент. Рассмотрим, как им воспользоваться:
Объект, через которое можно настраивать ТипКода и ТекстКода аналогично предыдущему способу.Преимущество этого метода: полная кроссплатформенность. Штрихкод будет корректно отображаться в веб-клиенте, на Linux-серверах и в мобильных приложениях, не требуя регистрации DLL-библиотек или установки шрифтов в систему.
Выяснив все нюансы, подведем итог:
ДвоичныеДанные в вычисляемое поле.Помните, что для корректного считывания сканером штрихкод должен иметь достаточный контраст и свободные зоны по бокам. При программном изменении размеров рисунка старайтесь сохранять пропорции, чтобы полосы не «слипались» при печати.