Генерация штрихкодов с помощью стандартных подсистем 1с для программистов

от автора

Привет всем! В данной статье предлагаю небольшой обзор возможностей актуальной библиотеки стандартных подсистем (БСП) на предмет формирования большинства существующих штрихкодов.

Для чего это нужно и чем может быть полезная эта статья? Поскольку, у нас в России сейчас активно наращивает обороты маркировка продукции (сигареты, обуви, текстиля и т.п), функционал формирования штрихкодов был включен в основу всех типовых конфигураций — БСП.

Основные возможности БСП инструментов разработчика «Генерация штрихкодов»

Базовой «входящей» серверной функцией-структурой для вывода штрих-кода является функция ПараметрыГенерацииШтрихкода() Экспорт

Выглядит она вот так:

Функция ПараметрыГенерацииШтрихкода() Экспорт  ПараметрыШтрихкода = Новый Структура; ПараметрыШтрихкода.Вставить("Ширина"            , 100); // Число ПараметрыШтрихкода.Вставить("Высота"            , 100); // Число ПараметрыШтрихкода.Вставить("ТипКода"           , 99);  // Число ПараметрыШтрихкода.Вставить("ОтображатьТекст"   , Истина); //Булево ПараметрыШтрихкода.Вставить("РазмерШрифта"      , 10); // Число ПараметрыШтрихкода.Вставить("УголПоворота"      , 0); // Число ПараметрыШтрихкода.Вставить("Штрихкод"          , ""); // Строка     ПараметрыШтрихкода.Вставить("ПрозрачныйФон"     , Истина); // Булево ПараметрыШтрихкода.Вставить("УровеньКоррекцииQR", 1); // Число (0 - L, 1 - M, 2 - Q, 3 - H) ПараметрыШтрихкода.Вставить("Масштабировать"  , Ложь); // Булево ПараметрыШтрихкода.Вставить("СохранятьПропорции"  , Ложь); // Булево ПараметрыШтрихкода.Вставить("ВертикальноеВыравнивание" , 1); // Число (1 - верх, 2 - центр, 3 - низ) ПараметрыШтрихкода.Вставить("GS1DatabarКоличествоСтрок", 2); // Число ПараметрыШтрихкода.Вставить("ТипВходныхДанных", 0); // Число (0 - Строка, 1 - Base64) ПараметрыШтрихкода.Вставить("УбратьЛишнийФон" , Ложь);  // Булево ПараметрыШтрихкода.Вставить("ЛоготипКартинка"); // Строка (base64 png)    ПараметрыШтрихкода.Вставить("ЛоготипРазмерПроцентОтШК"); // Число  Возврат ПараметрыШтрихкода;  КонецФункции

Обратите внимание на параметр структуры «ТипКода». Поддерживаются следующие типы кодов:

// 99 -  Авто выбор // 0 - EAN8 // 1 - EAN13 // 2 - EAN128 // 3 - Code39 // 4 - Code128 // 5 - Code16k // 6 - PDF417 // 7 - Standart (Industrial) 2 of 5 // 8 - Interleaved 2 of 5 // 9 - Code39 Расширение // 10 - Code93 // 11 - ITF14 // 12 - RSS14 // 14 - EAN13AddOn2 // 15 - EAN13AddOn5 // 16 - QR // 17 - GS1DataBarExpandedStacked // 18 - Datamatrix ASCII // 19 - Datamatrix BASE256 // 20 - Datamatrix TEXT // 21 - Datamatrix C40 // 22 - Datamatrix X12 // 23 - Datamatrix EDIFACT // 24 - Datamatrix GS1ASCII:

Далее, все достаточно просто — мы отправляем структуру параметров в серверную функцию ПодготовитьИзображениеШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода) через экспортную функцию ИзображениеШтрихкода(ПараметрыШтрихкода) Экспорт

Функция ИзображениеШтрихкода(ПараметрыШтрихкода) Экспорт  СистемнаяИнформация = Новый СистемнаяИнформация; ТипПлатформыКомпоненты = Строка(СистемнаяИнформация.ТипПлатформы);  ВнешняяКомпонента = ГенерацияШтрихкодаСерверПовтИсп.ПодключитьКомпонентуГенерацииИзображенияШтрихкода(ТипПлатформыКомпоненты);  Если ВнешняяКомпонента = Неопределено Тогда ТекстСообщения = НСтр("ru = 'Ошибка подключения внешней компоненты печати штрихкода.'"); ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка генерации штрихкода'",  ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,,  ТекстСообщения); ВызватьИсключение ТекстСообщения; КонецЕсли;  Возврат ПодготовитьИзображениеШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода);    КонецФункции

выглядит это так:

Функция ПодготовитьИзображениеШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода)  // Результат  РезультатОперации = Новый Структура(); РезультатОперации.Вставить("Результат", Ложь); РезультатОперации.Вставить("ДвоичныеДанные"); РезультатОперации.Вставить("Картинка");  // Зададим размер формируемой картинки. ШиринаШтрихкода = Окр(ПараметрыШтрихкода.Ширина); ВысотаШтрихкода = Окр(ПараметрыШтрихкода.Высота); Если ШиринаШтрихкода <= 0 Тогда ШиринаШтрихкода = 1 КонецЕсли; Если ВысотаШтрихкода <= 0 Тогда ВысотаШтрихкода = 1 КонецЕсли; ВнешняяКомпонента.Ширина = ШиринаШтрихкода; ВнешняяКомпонента.Высота = ВысотаШтрихкода; ВнешняяКомпонента.АвтоТип = Ложь;  ШтрихкодВрем = Строка(ПараметрыШтрихкода.Штрихкод); // Преобразуем явно в строку.  Если ПараметрыШтрихкода.ТипКода = 99 Тогда ВнешняяКомпонента.АвтоТип = Истина; Иначе ВнешняяКомпонента.АвтоТип = Ложь; ВнешняяКомпонента.ТипКода = ПараметрыШтрихкода.ТипКода; КонецЕсли;  Если ПараметрыШтрихкода.Свойство("ПрозрачныйФон") Тогда ВнешняяКомпонента.ПрозрачныйФон = ПараметрыШтрихкода.ПрозрачныйФон; КонецЕсли;  Если ПараметрыШтрихкода.Свойство("ТипВходныхДанных") Тогда ВнешняяКомпонента.ТипВходныхДанных = ПараметрыШтрихкода.ТипВходныхДанных; КонецЕсли;  Если ПараметрыШтрихкода.Свойство("GS1DatabarКоличествоСтрок") Тогда ВнешняяКомпонента.GS1DatabarКоличествоСтрок = ПараметрыШтрихкода.GS1DatabarКоличествоСтрок; КонецЕсли;  Если ПараметрыШтрихкода.Свойство("УбратьЛишнийФон") Тогда ВнешняяКомпонента.УбратьЛишнийФон = ПараметрыШтрихкода.УбратьЛишнийФон; КонецЕсли;  ВнешняяКомпонента.ОтображатьТекст = ПараметрыШтрихкода.ОтображатьТекст; // Формируем картинку штрихкода. ВнешняяКомпонента.ЗначениеКода = ШтрихкодВрем; // Угол поворота штрихкода. ВнешняяКомпонента.УголПоворота = ?(ПараметрыШтрихкода.Свойство("УголПоворота"), ПараметрыШтрихкода.УголПоворота, 0); // Уровень коррекции QR кода (L=0, M=1, Q=2, H=3). ВнешняяКомпонента.УровеньКоррекцииQR = ?(ПараметрыШтрихкода.Свойство("УровеньКоррекцииQR"), ПараметрыШтрихкода.УровеньКоррекцииQR, 1);  // Для обеспечения совместимости с предыдущими версиями БПО. Если Не ПараметрыШтрихкода.Свойство("Масштабировать") Или (ПараметрыШтрихкода.Свойство("Масштабировать") И ПараметрыШтрихкода.Масштабировать) Тогда  Если Не ПараметрыШтрихкода.Свойство("СохранятьПропорции") Или (ПараметрыШтрихкода.Свойство("СохранятьПропорции") И Не ПараметрыШтрихкода.СохранятьПропорции) Тогда // Если установленная нами ширина меньше минимально допустимой для этого штрихкода. Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода; КонецЕсли; // Если установленная нами высота меньше минимально допустимой для этого штрихкода. Если ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Тогда ВнешняяКомпонента.Высота = ВнешняяКомпонента.МинимальнаяВысотаКода; КонецЕсли; ИначеЕсли ПараметрыШтрихкода.Свойство("СохранятьПропорции") И ПараметрыШтрихкода.СохранятьПропорции Тогда Пока ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода  Или ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Цикл // Если установленная нами ширина меньше минимально допустимой для этого штрихкода. Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода; ВнешняяКомпонента.Высота = (ВнешняяКомпонента.МинимальнаяШиринаКода / Окр(ПараметрыШтрихкода.Ширина)) * Окр(ПараметрыШтрихкода.Высота); КонецЕсли; // Если установленная нами высота меньше минимально допустимой для этого штрихкода. Если ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Тогда ВнешняяКомпонента.Высота = ВнешняяКомпонента.МинимальнаяВысотаКода; ВнешняяКомпонента.Ширина = (ВнешняяКомпонента.МинимальнаяВысотаКода / Окр(ПараметрыШтрихкода.Высота)) * Окр(ПараметрыШтрихкода.Ширина); КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли;  // ВертикальноеВыравниваниеКода: 1 - по верхнему краю, 2 - по центру, 3 - по нижнему краю. Если ПараметрыШтрихкода.Свойство("ВертикальноеВыравнивание") И (ПараметрыШтрихкода.ВертикальноеВыравнивание > 0) Тогда ВнешняяКомпонента.ВертикальноеВыравниваниеКода = ПараметрыШтрихкода.ВертикальноеВыравнивание; КонецЕсли;  Если ПараметрыШтрихкода.Свойство("РазмерШрифта") И (ПараметрыШтрихкода.РазмерШрифта > 0)  И (ПараметрыШтрихкода.ОтображатьТекст) И (ВнешняяКомпонента.РазмерШрифта <> ПараметрыШтрихкода.РазмерШрифта) Тогда ВнешняяКомпонента.РазмерШрифта = ПараметрыШтрихкода.РазмерШрифта; КонецЕсли;  Если ПараметрыШтрихкода.Свойство("РазмерШрифта") И ПараметрыШтрихкода.РазмерШрифта > 0 И ПараметрыШтрихкода.Свойство("МонохромныйШрифт") Тогда Если ПараметрыШтрихкода.МонохромныйШрифт Тогда ВнешняяКомпонента.МаксимальныйРазмерШрифтаДляПринтеровНизкогоРазрешения = ПараметрыШтрихкода.РазмерШрифта + 1; Иначе ВнешняяКомпонента.МаксимальныйРазмерШрифтаДляПринтеровНизкогоРазрешения = -1; КонецЕсли; КонецЕсли;  Если ПараметрыШтрихкода.ТипКода = 16 Тогда // QR Если ПараметрыШтрихкода.Свойство("ЛоготипКартинка") И Не ПустаяСтрока(ПараметрыШтрихкода.ЛоготипКартинка) Тогда  ВнешняяКомпонента.ЛоготипКартинка = ПараметрыШтрихкода.ЛоготипКартинка; КонецЕсли; Если ПараметрыШтрихкода.Свойство("ЛоготипРазмерПроцентОтШК") И Не ПустаяСтрока(ПараметрыШтрихкода.ЛоготипРазмерПроцентОтШК) Тогда  ВнешняяКомпонента.ЛоготипРазмерПроцентОтШК = ПараметрыШтрихкода.ЛоготипРазмерПроцентОтШК; КонецЕсли; КонецЕсли;  // Сформируем картинку ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод(); РезультатОперации.Результат = ВнешняяКомпонента.Результат = 0; // Если картинка сформировалась. Если ДвоичныеДанныеКартинки <> Неопределено Тогда РезультатОперации.ДвоичныеДанные = ДвоичныеДанныеКартинки; РезультатОперации.Картинка = Новый Картинка(ДвоичныеДанныеКартинки); // Формируем из двоичных данных. КонецЕсли;  Возврат РезультатОперации;  КонецФункции

Данная функция возвращает структуру РезультатОперации следующего содержания

РезультатОперации = Новый Структура(); РезультатОперации.Вставить("Результат", Ложь); // сработало или нет РезультатОперации.Вставить("ДвоичныеДанные");  // двоичные данные изображения штрихкода РезультатОперации.Вставить("Картинка");        // картинка

Так же, обратите внимание, что Внешняя компонента — основной объект для формирования «картинки» штрихкода, встроенный в ОбщийМакет.КомпонентаПечатиШтрихкодов конфигурации БСП. Получить его можно вот так:

СистемнаяИнформация = Новый СистемнаяИнформация; ТипПлатформыКомпоненты = Строка(СистемнаяИнформация.ТипПлатформы); ВнешняяКомпонента = ГенерацияШтрихкодаСерверПовтИсп.ПодключитьКомпонентуГенерацииИзображенияШтрихкода(ТипПлатформыКомпоненты);

Собственно, на этом базовых знаний достаточно, чтобы перейти от теории к практике — в следующем разделе привожу рабочий пример использования данного функционала.

Рабочий пример использования функционала БСП для формирования штрихкода

Здесь я привожу набор процедур и функций для формирования штрихкода:

&НаКлиенте Процедура Команда1(Команда)  СформироватьНаСервере();  КонецПроцедуры  &НаСервере Процедура СформироватьНаСервере()  Результат.Очистить();  ВремОбъект = РеквизитФормыВЗначение("Объект"); Макет = ВремОбъект.ПолучитьМакет("Макет");  Область = Макет.ПолучитьОбласть("Строка|Колонка"); Рисунок = Область.Рисунки.ШтрихКод;  Эталон = ВремОбъект.ПолучитьМакет("МакетДляОпределенияКоэффициентовЕдиницИзмерения");  КоличествоМиллиметровВПикселеВысота = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100; КоличествоМиллиметровВПикселеШирина = Эталон.Рисунки.Квадрат100Пикселей.Ширина / 100; ШиринаШтрихкода = Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселеШирина); ВысотаШтрихкода = Окр(Рисунок.Высота / КоличествоМиллиметровВПикселеВысота);  ВходныеДанные = "(01)04600822901507(11)161109(30)2434";  Картинка = ПолучитьШтрихкод(ШиринаШтрихкода, ВысотаШтрихкода, ВходныеДанные, 24);  // 24 - Datamatrix GS1ASCII  Рисунок.Картинка = Картинка; Результат.Вывести(Область);  КонецПроцедуры  &НаСервере Функция ПолучитьШтрихкод(ШиринаШтрихкода, ВысотаШтрихкода, ЗначШтрихкод, ЗначТипШтрихкода)  ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода(); ПараметрыШтрихкода.Ширина = ШиринаШтрихкода; ПараметрыШтрихкода.Высота = ВысотаШтрихкода; ПараметрыШтрихкода.ТипКода = ЗначТипШтрихкода; ПараметрыШтрихкода.Штрихкод = ЗначШтрихкод; ПараметрыШтрихкода.ПрозрачныйФон = Истина; ПараметрыШтрихкода.УровеньКоррекцииQR = 2; ПараметрыШтрихкода.ОтображатьТекст = Ложь; ПараметрыШтрихкода.Масштабировать = Истина; ПараметрыШтрихкода.СохранятьПропорции = Истина; ПараметрыШтрихкода.ВертикальноеВыравнивание  = 0;  ПараметрыШтрихкода.GS1DatabarКоличествоСтрок = 1; ПараметрыШтрихкода.ТипВходныхДанных = 0;  РезультатШтрихкод = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);  Возврат РезультатШтрихкод.Картинка;  КонецФункции

Заключение и выводы

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


ссылка на оригинал статьи https://habr.com/ru/post/705898/