1С: Самвестимо. Победа над code 128.

Если вам так не нравятся клюшки, то почему вам так нравится снеговик?


Комментарии:
Если вы думаете, что на картинке наше отечественное убожество, какая-то провинциальная больничка, так - нет.
Там идеально ровный пол!
А яма просто на нем нарисована.
Зачем?
А зачем вы покупаете снеговика?
На самом деле, все просто и замечательно здорово придумано.
Это сделано в одной европейской клинике чтобы маленькие дети не носились как угорелые по коридорам.
Понимаете разницу в подходах к решению проблемы?
Сравните с нашими общеобразовательными школами, например.
Что там твориться на переменах, знаете?
Маркетплейс Беру.ру вынудил окончательно решить еще одну старую задачу - печать штрих-кода стандарта code 128 https://ru.wikipedia.org/wiki/Code_128
Вот тут немного моих восторгов про Беру - https://www.klerk.ru/buh/articles/49...omment__765766 и общее впечатление.
Но, как говорится, есть и хорошие новости.
Эти паразиты в Беру требуют на каждую коробку наклеить ярлык, который нужно и самим же сформировать и напечатать.
Открыть оригинал изображения (831x840, 245.43 Кб)
На ярлыке три штрих-кода (первый бестолковый, а третий вообще бессмысленный) и обязательный стандарт - code 128.
Не понятно, чего они так к нему прикопались - тот же С39 (значительно более простой стандарт) вполне подошел бы по своим возможностям для задач Беру.
А сканерам, тем вообще все равно какой стандарт штрих-кода - они их все читают одинаково.
Не самый плохой стандарт, кстати, этот code 128 и большой его плюс в том, что он может "печатать" не только цифры и символы (как Ean'ы, например), но и латинские буквы и даже строчные и прописные.
И еще он хорош тем, что достаточно компактный. "Многа букв" умещаются на маленькой площади. Это часто бывает критично, например, для упаковок лекарств - блистер или коробочка могут быть такими маленькими, что там не только Ean-13, а даже Ean-8 не куда воткнуть. Хотя там всего 7 значащих цифр.

Для печати штрих-кодов из 1С я пользуюсь специальными шрифтами.
Они доступны, спросите поисковик про нужный стандарт, он выдаст вам море ссылок.
Ean - шрифт лежит в каждом каталоге квартальной отчетности 1С - чтобы печатать штрих-код формы в левом верхнем углу.
С помощью этих шрифтов можно печатать штрих-коды из любого текстового и не только редактора.
И лидер здесь - C39. У него каждый символ как на клавиатуре, так же и в шрифте. Только надо стартовый и финишный символ добавить, чтобы сканер видел, где начало, где конец этого штрих-кода. У С39 это один и тот же символ - *.
Т.е. чтобы вывести на печать штрих-код типа С39, просто ставите шрифт и пишете *123456789* и он так и будет изображен. Такое изображение прекрасно считает любой сканер.
Совсем другое дело печать шрифтами Ean.
Во-первых, там есть контрольное число (последняя цифра), которая вычисляется по довольно заумному алгоритму, совершенно не понятно почему.
Во-вторых, одна и та же цифра в штрих-коде Ean печатается разными символами, в зависимости от того, где она находится. Там нельзя просто набирать цифры с клавиатуры, цифры вообще печатаются буквами и символами, а изображение получается в виде в т.ч. и цифр.

У Code 128 тоже есть контрольное число (трехзначное в общем случае).
Вычисляется оно достаточно легко (см. в описании в Википедии).
К коду стартового символа (103, 104 или 105) прибавляются произведения порядкового номера символа кода (1, 2, 3, 4, 5 ...) на порядковый номер символа в таблице кода. Остаток от деления полученной суммы на 103 и будет контрольным числом (т.е., контрольное число в code 128 от 0 до 102), которое изображается в штрих-коде символом у которого порядковый код в таблице символов равен контрольному числу.
Вроде, все легко и просто, но в чем и оказался тупик, который не позволял мне до вчерашнего дня печатать этот штрих-код.
Дело в следующем:
Например, напечатаем такой штрих-код: CATS RULIAT.
Коды символов дает выражение на встроенном языке КодСимв(Символ).
Вы и сами можете в этом убедиться - в своей рабочей базе (или любой другой) откройте Табло (меню Сервис-Табло). Здесь можно писать формулы на встроенном языке 1С, окно вычислит его и покажет. Пишем в табло руками или копипастим отсюда: КодСимв("") и подставляем в кавычки любой символ, какой найдете на клавиатуре или в оперативной памяти. Например, заглавную латинскую си - C.

У вас все получится, даже не сомневайтесь!
Составим таблицу кодов:
C - 67
A - 65
T - 84
S - 83
пробел - 32
R - 82
U - 85
L - 76
I - 73

Контрольная сумма равна 2859, а контрольное число (пишем в табло: 2859%103, получаем ответ -->) 78.
Пишем в табло Симв(110) и узнаём, что это .... барабанная дробь ... ТА-ДАМММ ... английская буква эн - n.
Получилось?
Ну, как же нет?
Контрольная сумма = 104 + 1*67 + 2*65 + 3*84 + 4*83 + 5*32 + 6*82 + 7*85 + 8*76 + 9*73 + 10*65 + 11*84
Вставьте эту строку в табло и оно вам быстренько подсчитает.
Или берите калькулятор.
Т.е. чтобы напечатать CATS RULIAT штрих-кодом системы code 128, вы должны выбрать шрифт Code 128

и набрать с клавиатуры строку МCATS RULIATnО
получится вот так, как у меня в обработке:

Вы можете сделать это в любой программе, в которой можно вводить текст и выбирать шрифт.
Хоть в 1С, хоть в ворде, экселе или даже в блокноте


Такой штрих-код уверенно считает любой сканер штрих-кодов.
Чтобы убедиться, что у меня правильное изображение (неверно сформированный штрих-код сканер не считает и выдаст ошибку), можно открыть любой онлайн генератор штрих-кодов и сравнить картинки.
Вот первый попавшийся: https://barcode.tec-it.com/ru/Code12...=CATS%20RULIAT
Выдал такую картинку:

Видите, расположение белых полос совпадает.
Если кто не в теме: сканеры штрих-кодов "смотрят" на белые полоски в штрих-коде, а не на черные.
Сканер вычисляет на изображении штрих-кода доли ширин белых полос и по их сочетанию, ищет такое же в таблице кодов соответствующей системы кодировки.
Именно доли, а не миллиметры, поэтому масштаб, сжатие - растяжение, наклоны, повороты, вид под углом не имеют для сканера никакого значения, т.к. при этом изменяется только абсолютное значение ширины, а относительное остается неизменным.
Если все так просто, то почему до этого никто не додумался до тебя?
©
Потому, что если все сделать так как написано выше, контрольное число будет вычислено не верно и символ, ему соответствующий будет задан с ошибкой. Такой штрих-код из-за неверного контрольного числа не считает ни один сканер. Все сканеры будут выдавать ошибку.
Вернемся еще раз в табло, уж оно-то не ошибается!

Такого символа даже на клавиатуре нет.
Это я пытаюсь коротко и наглядно показать тот глубокий тупик в котором находилась проблема до настоящего момента.
Казалось бы, все делаю по описанию стандарта, а получаю полную .... фигню и совершенно не понятно что с этим делать.
Ларчик открылся, как всегда просто.
Надо было просто посмотреть кодовую таблицу шрифта code 128.
Проще всего, это можно сделать в Word'е.
Идем в меню Вставка - Символ, выбираем шрифт и видим там вот такую картину:
Открыть оригинал изображения (953x760, 0.59 Мб)
Сейчас курсор стоит на последнем символе в таблице (дальше там пустые места, они другого цвета и все одинаковые), справа внизу показан код символа, слева внизу - описание.
Первое, что бросается в глаза - код 207. ???? НО! Согласно стандарта в шрифте только 107 символов:
Штриховой код Code 128 включает в себя 107 символов, из которых 103 символа данных, 3 стартовых и 1 остановочный (стоп) символ.
©Википедия
Код первого символа в этой таблице - 32.
Но 207-32 все равно заметно больше 107.
И еще, если коды начинаются с 32, то какой же символ соответствует контрольному числу меньше 32? Например, если оно оказалось равно 20? Или и вовсе 0?
Агата Кристи и Шерлок Холмс нервно курят в сторонке, время от времени, давая затянуться пляшущим человечкам, которые трутся вокруг них.
Ок.
Не буду больше вам морочить голову.
Там есть всего 4 правила пересчета:
  1. Если код числа меньше или равен 32, то на вычесть из него 32
  2. Если код символа больше 32, то надо прибавить к нему 64
    И, наоборот:
  3. Если код символа больше 94, то соответствующий ему символ имеет код +100
  4. Если код символа меньше или равен 94, то соответствующий ему символ имеет код +32

Умом эту логику понимать не нужно, нужно ее просто использовать.
Итак, контрольную сумму, по этим правилам, нужно вычислять следующим образом (скорректируем формулу выше с учетом правил):
Контрольная сумма = 104 + 1*(67-32) + 2*(65-32) + 3*(84-32) + 4*(83-32) + 5*(32-32) + 6*(82-32) + 7*(85-32) + 8*(76-32) + 9*(73-32) + 10*(65-32) + 11*(84-32)
Остаток от деления контрольной суммы на 103 даст Контрольное число - 78.
Ему соответствует символ с кодом 78+32 = 110
Одинесное Табло, как всегда, не даст соврать:
Стартовый (первый) и стоповый (последний) символ штрих кода формируются по этим же правилам: 104+100=204, 106+100=206.
Сколько нужно времени, чтобы написать такую обработку?

29 строк кода - это около минуты моего времени.
Я пользуюсь при формировании программного кода замечательным Телепатом великого автора Александра Орефкова, который по праву заслужил памятник при жизни.
И если когда-нибудь в светлой России будущего этот памятник будет установлен, я обязательно буду в этом участвовать в виде доната.
 

Подтвердите удаление записи