Пример печати штрихкодов в табличном документе 1С:Предприятие предназначен для самостоятельной модификации и для последующего применения в режиме управляемого приложения. Ниже приведены примеры для EAN-13, GS1-128, QR-кода и других распространенныхформатов штрихкодов.
Пожалуйста, обратите внимание - пример рассчитан на работу с ПО StrokeScribe версии 4.0.4 или старше.
Подготовка макета для вывода штрихкода
1. Создайте новый отчет в конструкторе 1С:Предприятия 8.2 и дайте ему имя ОтчетШтрихкод(это имя будет использовано в модуле ниже).
2. Для отчета ОтчетШтрихкод создайте макет табличного документа под именем МакетШтрихкод.
3. В макете создайте область произвольного размера с именем ОбластьШтрихкод.
4. Поместите в область картинку (меню Таблица->Рисунки->Картинка) с размерами будущего штрихкода. В свойствах картинки укажите имя - РисунокШтрихкод.
В результате всех действий должен получиться макет отчета, похожий на показанный на рисунке:
Модуль отчета
Добавьте приведенный ниже код в модуль отчета. Самостоятельно смодифицируйте пользовательский интерфейс отчета для вызова обработчика команды. Данная реализация модуля создает единичный QR-код и легко модифицируется под создание нескольких штрихкодов разных форматов внутри одной области.
&НаСервере
Функция ДокНаСервере()
ТабДок = Новый ТабличныйДокумент;
Макет = Отчеты.ОтчетШтрихкод.ПолучитьМакет("МакетШтрихкод");
Область = Макет.ПолучитьОбласть("ОбластьШтрихкод");
//Обратите внимание на совпадение имен отчета, макета и области
в модуле и в дизайне
barcode = ПолучитьCOMОбъект("","STROKESCRIBE.StrokeScribeClass.1");
//Вы не забыли установить StrokeScribe?
ИмяФайла=ПолучитьИмяВременногоФайла("wmf");
//Временный файл во временном каталоге с расширением .wmf
barcode.Alphabet>=25;//QR CODE
barcode.Text="123ABCD";//Данные для штрихкода
код=barcode.SavePicture(ИмяФайла, 7, //7=WMF
100, //Ширина картинки штрихкода
100); //Высота штрихкода
Если код<>0 Тогда //Проверка результата генерации штрихкода
Сообщить(строка(код) + " - " + barcode.ErrorDescription);
Возврат Ложь;
КонецЕсли;
//Убедитесь в совпадении имени объекта рисунка здесь и в дизайне
рис=Область.Рисунки.РисунокШтрихкод;
рис.РазмерКартинки=РазмерКартинки.Пропорционально;
рис.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
//Вокруг штрихкода не должно быть рамки
рис.Картинка = Новый Картинка(ИмяФайла);//Загрузка картинки со штрихкодом
//Указывается то же имя файла, что и в SavePicture
ТабДок.Вывести(Область);
УдалитьФайлы(ИмяФайла);//Стереть временный файл с картинкой
Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ТабДок1=ДокНаСервере();
Если ТабДок1<>Ложь Тогда
ТабДок1.Показать();
КонецЕсли;
КонецПроцедуры
Результат работы данного модуля - таблица с внедренной картинкой QR Code. Для выбора формата штрихкода, укажите другую константу в свойстве Alphabet. Для наиболее распространенных форматов штрихкодов ниже приведены специализированные примеры.
Замечания по модулю отчета:
Для успешного выполнения вызова ПолучитьCOMОбъект() не забудьте установить ПО StrokeScribe. При работе в режиме клиент-сервер, ПО StrokeScribe должно быть установлено на сервере. На клиентских ПК установка StrokeScribe не требуется.
Вызов ПолучитьИмяВременногоФайла() требуется для получения произвольного имени промежуточного файла, в котором будет сохранено изображение штрихкода перед передачей его в табличный документ. Файл должен существовать до вызова ТабДок.Вывести(Область). После этого временный файл может быть удален. Если планируется создание нескольких штрихкодов в одной области, то для каждого штрихкода должен быть создан свой временный файл. Так как SavePictureсохраняет штрихкод в формате WMF, то создаваемому файлу присваивается соответствующее расширение.
При желании, может быть использовано и фиксированное имя файла, например: ИмяФайла="c:\temp\barcode.wmf". Разумеется, что папка "c:\temp" должна существовать и быть доступной для создания файлов.
Присваивание barcode.Alphabet= задает формат штрихкода. Константы типов штрихкодов доступны в документации. Примеры создания наиболее распространенных штрихкодов приведены ниже.
Данные, присваиваемые barcode.Text, зависят от формата штрихкода. Например, EAN-13 не может отображать буквы и имеет фиксированную длину, а CODE 128 не работает с кириллицей. Если StrokeScribe не может обработать строку, то в свойство Error будет записано ненулевое значение. В модуле используется упрощенная проверка ошибок - результат всех операций вместе помещается в переменную код: код=barcode.SavePicture().
Вызов SavePicture() сохраняет изображение штрихкода во временном файле. Указание 7 во втором параметре вызова SavePicture() создаст векторное масштабируемое изображение в формате WMF. В коммерческой версии StrokeScribe доступны также форматы JPG, PNG, GIF, BMP24 и EMF. Создание растровых изображений штрихкода не рекомендуется из-за большого объема данных и плохой приспособленности к масштабированию, но может применяться в случае, если тонкий клиент не поддерживает WMF.
В конструкции Если код<>0 проверяется результат сохранения картинки штрихкода в файле. Код будет ненулевым и в том случае, если указан несуществующий тип штрихкода или в свойство Textпосланы данные, не отображаемые штрихкодом выбранного типа. Текстовое пояснение к коду ошибки доступно в свойстве ErrorDescription. Результат каждой операции с объектом штрихкода можно дополнительно контролировать проверкой значения свойства Error.
Для вывода множества штрихкодов достаточно организовать циклическое присваивание Text=, Alphabet= (опционально) и обращение к методу SavePicture. Каждое обращение к SavePicture должно происходить с отдельным именем файла для каждого штрихкода внутри одной области до вызова ТабДок.Вывести(). После вывода области файлы могут быть удалены.
Примеры создания штрихкодов в отчете 1С 8.2
Ниже даны примеры создания некоторых распространенных форматов штрихкодов. Так как некоторые из форматов имеют дополнительные настройки, рекомендуем обратиться к страницам, ориентированным на определенный формат штрихкода (см. меню сайта слева) и к документации по свойствам StrokeScribe.
Пожалуйста, обратите внимание - версия 1С:Предприятия 8.2.12.96, на которой производилось тестирование, некорректно центрирует изображения WMF, сдвигая их вправо. Поэтому не рекомендуется уменьшать чистые зоны штрихкодов (свойства HBorderSize и QuietZone2D) во избежание потери части линий штрихкода.
EAN-13
Для вывода EAN-13, установите свойство Alphabet=3. В свойство Text запишите цифровой 12-значный код товара (или 13-значный, если известна контрольная сумма). Вычисление и проверка контрольной суммы выполняется автоматически. При передаче 13-значного кода с неверной контрольной суммой, соответствующий код ошибки будет выставлен в свойстве Error.
Смодифицируйте исходный текст модуля, как показано ниже:
barcode.Alphabet=3; //EAN13
barcode.Text="123456789012";
код=barcode.SavePicture(ИмяФайла, 7, 100, 60);
CODE 128
Штрихкод CODE 128 формируется при установке свойства Alphabet=5. В свойство Text можно записать любые символы ASCII, в том числе и управляющие коды. Обратите внимание - CODE 128 не поддерживает кириллицу. При записи недопустимых символов в свойство Text, в свойстве Error будет выставлен соответствующий код ошибки.
Смодифицируйте исходный текст модуля, как показано ниже:
barcode.Alphabet=5; //CODE128
barcode.Text="123ABC" + Символ(9) + "def";
код=barcode.SavePicture(ИмяФайла, 7, 100, 60);
Символ(9) - функция языка 1C - кодирует символ табуляции (ASCII TAB). Все нечитаемые символы отображаются, как * в подписи под штрихкодом. CODE 128 позволяет задать произвольный текст подписи, который будет выведен под штрихкодом вместо стандартного отображения закодированных данных:
barcode.Alphabet=5;
barcode.Text="123ABC" + Символ(9) + "def";
barcode.TextBelow="моя подпись";
ITF-14
Формат штрихкода ITF-14 задается установкой свойства Alphabet=7. В свойство Text запишите цифровой 13-значный цифровой код (или 14-значный, если известна контрольная сумма). Вычисление и проверка контрольной суммы выполняется автоматически. При передаче 14-значного кода с неверной контрольной суммой, соответствующий код ошибки будет выставлен в свойстве Error.
Смодифицируйте исходный текст модуля, как показано ниже:
barcode.Alphabet=7; //ITF14
barcode.Text="1234567890123";
barcode.ITF14BearerBox=1;
код=barcode.SavePicture(ИмяФайла, 7, 100, 30);
Свойство ITF14BearerBox выводит ITF-14 с прямоугольной рамкой, обычно присутствующей на штампах для гофрированной тары. Для вывода штрихкода только с горизонтальными защитными линиями, укажите ITF14BearerBox = 0.
GS1-128 (ранее EAN-128)
Для печати штрихкода GS1-128, установите свойство Alphabet=17. В свойство Text запишите последовательность данных и идентификаторов AI. Пример: идентификатор партии = 1234; масса брутто = 12345.6Кг; годность до 17/05/2001. Результирующая строка: "10" + "1234" + GS + "3301" + "123456" + "17" + "010517". Для ограничения параметров переменной длины используется ASCII GS (десятичный код 29).
Смодифицируйте исходный текст модуля, как показано ниже:
barcode.Alphabet=17; //EAN128
GS = Символ(29);
barcode.Text="10" + "1234" + GS + "3301" + "123456" + "17" + "010517";
barcode.ITF14BearerBox=1;
код=barcode.SavePicture(ИмяФайла, 7, 100, 30);
Большие объемы данных в формате GS1 можно хранить в двумерных штрихкодах GS1 DATAMATRIX.
Data Matrix
Формат штрихкода Data Matrix задается установкой свойства Alphabet=8. Data Matrix позволяет кодировать любые данные, включая двоичные. Передача кириллицы в кодовой странице CP1251 не разрешается стандартом, но фактически используется в штрихкодах Почты России и некоторых банков. Создание Data Matrix, содержащих ECI=22 допустимо, если достоверно известно, что сканирующее оборудование и считывающее ПО поддерживают ECI. Для распознавания Data Matrix с кириллицей на мобильных телефонах, требуется кодирование в UTF-8.
Смодифицируйте исходный текст модуля, как показано ниже:
barcode.Alphabet=8; //DATAMATRIX
barcode.Text="123abcDEF";
код=barcode.SavePicture(ИмяФайла, 7, 100, 100);
Aztec
Штрихкод Aztec задается установкой свойства Alphabet=33. Aztec позволяет кодировать любые данные, включая двоичные. Кириллица в кодовой странице CP1251, по установившейся практике, передается в режиме кодирования двоичных данных. Стандарт требует указания идентификатора ECI=22 перед использованием кириллицы, но тем не менее, не все современное оборудование и ПО поддерживают ECI. Распознавание Aztec не поддерживается почти всеми мобильными телефонами, за исключением специализированных моделей для складского применения.
Для печати кода Aztec, смодифицируйте исходный текст модуля, как показано ниже:
barcode.Alphabet=33; //AZTEC
barcode.Text="123ABcd";
код=barcode.SavePicture(ИмяФайла, 7, 100, 100);
QR Code
QR Code генерируется при установке свойства Alphabet=25. Данный формат позволяет кодировать текстовые и двоичные данные. Кодирование кириллицы для распознавания на мобильных телефонах должно осуществляться в кодировке UTF-8. Применение идентификаторов ECI должно осуществляться только при уверенности, что считывающее оборудование и ПО поддерживают индикацию ECI. Для изменения уровня коррекции ошибок используйте свойство QrECL.
Приведенный здесь пример предназначен для создания QR-кода для мобильных приложений. Большинство складских и офисных применений в России (при распознавании специализированными сканерами) требуют прямой передачи текста в кодовой странице CP1251. Для этого установите UTF8=0. Установка QrECL приведена здесь в качестве примера и не является обязательной.
barcode.Alphabet=25; //QRCODE
barcode.Text="кириллица";
barcode.UTF8=1;
barcode.QrECL=2;
код=barcode.SavePicture(ИмяФайла, 7, 100, 100);