Привет всем! В данной статье предлагаю небольшой обзор возможностей актуальной библиотеки стандартных подсистем (БСП) на предмет формирования большинства существующих штрихкодов.
Для чего это нужно и чем может быть полезная эта статья? Поскольку, у нас в России сейчас активно наращивает обороты маркировка продукции (сигареты, обуви, текстиля и т.п), функционал формирования штрихкодов был включен в основу всех типовых конфигураций - БСП.
Основные возможности БСП инструментов разработчика "Генерация штрихкодов"
Базовой "входящей" серверной функцией-структурой для вывода штрих-кода является функция ПараметрыГенерацииШтрихкода() Экспорт
Выглядит она вот так:
Функция ПараметрыГенерацииШтрихкода() Экспорт ПараметрыШтрихкода = Новый Структура; ПараметрыШтрихкода.Вставить("Ширина" , 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с, основой которой является библиотека стандартных подсистем. Спасибо за прочтение. В качестве благодарности, вы можете поддержать автора статьи любым желаемым способом
