Штрихи к портрету…

Описываются принципы формирования одномерных штрих-кодов  стандарта Code128 в 1С стандартными средствами.
Приводятся примеры кода модулей для 1С: Предприятия 7.х/8.х

В современном мире штрих-коды печатают на всем, на чем только можно. Применительно к задачам 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.

 

Осталось разобраться с принципом формирования контрольного символа.

Стандарт сообщает, что для расчета символа требуется:

  1. Коды всех символов помножить на весовой коэффициент (фактически, порядковый номер символа в коде, начиная с первого).
  2. Просуммировать полученные произведения и добавить к ним код Start’a (104-для A, 105 для B и 106 для C).
  3. Вычислить остаток от деления полученной суммы на 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

6 Comments

  1. DoReMi

    Кто-нибудь нашел отличия между 7.7 и 8.х ? )

    Reply
  2. cassper

    (1) DoReMi,

    Возврат Симв(Рез);

    Возврат Символ(Рез);
    Reply
  3. DoReMi

    (2) cassper, точно! я к этой строке устал сравнивать 🙂

    Reply
  4. Sergey1CSpb

    Вообще-то, еще

    Р = КодСимв(Лев(Наим,1));

    и

     Р = КодСимвола(Лев(Наим,1));

    Кстати, строка формирования штрихкода в v8 должна выглядеть так:

    ШК = Символ(204)+Наименование+КонтрСимв(Наименование)+Символ(206)

    На самом деле, задача была реализована в 7.7. Ну чтобы не отпугивать читателей, сделал «трансляцию» в код 8-ки. По-идее, только этими двумя функциями синтаксис и должен отличаться.

    Честно скажу, 8-ю версию не проверял.

    Reply
  5. SlavaK

    Спасибо! Скачал в инете шрифт и использовал ваш код. Все работает! Проверял на 1С 8.3, УП. Запуск на тонком клиенте.

    Reply
  6. Sergey1CSpb

    (5) SlavaK, Спасибо за отзыв, коллега, хоть, увы, и без «лайка»))))).

    А «УП» это УТ, УПП, или еще что-то?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *