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