В современном мире штрих-коды печатают на всем, на чем только можно. Применительно к задачам 1С: Предприятия все чаще речь идет, например, о сопровождении штрих-кодами печатных форм документов.
Как это реализовать стандартными средствами без применения внешних компонент и т.д.?
Все помнят времена, когда основным стандартом штрихкодирования был EAN-8/EAN-13. Любой «начинающий специалист» знал, что после установки 1С: Предприятия 7.7 необходимо установить шрифт с названием Ean… (ean13, eangnivc или аналогичный). Если этого не сделать, в декларациях вместо штрих-кода отображались бы огромные цифры.
Данный шрифт позволял формировать штрих-коды самым прямым методом – написанием цифр с использованием специального шрифта.
Например, ряд цифр 1...9, шрифт EANGnivc.
Заметим, что «кодируемые» цифры отображаются под соответствующим кодом, т.е. каждый символ шрифта содержит «штрих» и «кодируемую» цифру.
Минусом применения стандарта EAN-13 становится крайне ограниченный набор кодируемых символов (фактически, только цифры). В этой связи применение его, например, для кодификации документооборота неэффективно.
Следующим поколением штрих-кодирования является стандарт Code128(EAN-128) (далее – Стандарт), который позволяет кодировать не только цифры, но и буквы латиницы.
Для печати кодов Стандарта также разработан специальный шрифт – Code128. Однако напечатать коды Стандарта с использованием данного шрифта значительно сложнее.
Во-первых, кодируемый набор цифр-букв теперь не печатается под штрих-кодом. Понятно, что эта проблема решается простой печатью кодируемого набора под кодом с использованием любого из обычных шрифтов, например Arial.
Во-вторых, для повышения отказоустойчивости Стандарт требует в состав штрихкода включать специальные контрольно-управляющие символы (печатаются шрифтом Code128).
Схема Code128:
Start |
1-й символ кода |
2-й символ кода |
. |
. |
. |
. |
n-й символ кода |
Контроль ный символ |
Stop |
Посмотрим, как это реализовать средствами встроенного языка 1С: Предприятие 7.7/8.
Для начала следует определиться с набором символов, которые будут использоваться при кодировании. Это может быть один из трех вариантов (т.н. групп кода):
Группа А – набор цифр, дополнительных символов и заглавных букв латинского алфавита
Группа B – набор цифр, дополнительных символов, заглавных и строчных букв латинского алфавита
Группа C – фактически, набор группы B с несколько иным кодированием.
В соответствии с выбранной группой формируется первый символ (Start) формируемого кода. Применительно Start’ы будут иметь следующие ASCII-коды:
Группа |
Код |
A |
203 |
B |
204 |
C |
205 |
Завершаться штрих-код должен Stop-символом, который независимо от группы имеет ASCII-код 206.
Осталось разобраться с принципом формирования контрольного символа.
Стандарт сообщает, что для расчета символа требуется:
- Коды всех символов помножить на весовой коэффициент (фактически, порядковый номер символа в коде, начиная с первого).
- Просуммировать полученные произведения и добавить к ним код Start’a (104-для A, 105 для B и 106 для C).
- Вычислить остаток от деления полученной суммы на 103.
Реализация в 1С осложняется разницей в несколько ином кодировании символов в Стандарте и шрифте. Для кода группы B для декодирования (определения кода для расчета суммы):
Код символа |
Стандарт |
0..31 |
64..95 (прибавление 64) |
От 32 |
От 0 (вычитание 32) |
Для кодирования (преобразования вычисленного остатка в код символа)
Стандарт |
Код символа |
0..94 |
32..126 (прибавление 32) |
От 95 |
От 105 (прибавление 100) |
Таким образом при формировании контрольного символа перед расчетом остатка от деления потребуется преобразовать коды символов кода. А затем полученный остаток преобразовать в код по иным правилам.
На встроенном языке 1С Предприятие 7/8 команда формирования штрихкода
ШК = Симв(204)+Наименование+КонтрСимв(Наименование)+Симв(206)
Текст функции КонтрСимв(Наименование) для 1С: Предприятие 7 и 8
//Для 7.х
Функция КонтрСимв(Наим)
Рез = 104;
Дл = СтрДлина(Наим);
Для Н=1 По Дл Цикл
Р = КодСимв(Лев(Наим,1));
Р = ?(Р>=32,Р-32,Р+64);
Рез = Рез+Р*Н;
Наим = Прав(Наим,СтрДлина(Наим)-1);
КонецЦикла;
Рез = Рез%103;
Рез = ?(Рез>94,Рез+100,Рез+32);
Возврат Симв(Рез);
КонецФункции
// Для 8.х
Функция КонтрСимв(Наим)
Рез = 104;
Дл = СтрДлина(Наим);
Для Н=1 По Дл Цикл
Р = КодСимвола(Лев(Наим,1));
Р = ?(Р>=32,Р-32,Р+64);
Рез = Рез+Р*Н;
Наим = Прав(Наим,СтрДлина(Наим)-1);
КонецЦикла;
Рез = Рез%103;
Рез = ?(Рез>94,Рез+100,Рез+32);
Возврат Символ(Рез);
КонецФункции
Литература
ГОСТ 30743-2001 - Автоматическая идентификация. Кодирование штриховое. Спецификация символики Code 128 (Код 128) http://www.g-ost.ru/6846.html