На главную страницу Версия-Т
VTSoft.ru

EAN8, EAN13, ITF14 vs on_ams.ert Серьезная проблема!!!!!


RSS
EAN8, EAN13, ITF14 vs on_ams.ert Серьезная проблема!!!!!
 
На лицо серьезная недоработка 1С-овцев. Суть в следующем:
Собираемся автоматизировать розничную сеть магазинов оснащенную (АМС100, 1с ТиС 932) в режиме on-line. Очень много товара, при чем штрих-этикированным по разным стандартам (EAN8, EAN13, ITF14). 1с ведет себя при скармливании этих разных штрих-кодов совсем не правильным образом. Попытаюсь порыться в on_ams.ert самостоятельно, но я не программер. Если сможете оказать любую помощь буду очень благодарен!!!
 
Цитата
Геннадий писал(а):
1с ведет себя при скармливании этих разных штрих-кодов совсем не правильным образом.


Что именно 1С делает неправильно? Что понимается под термином "скармливание"?
 
Ну для начала разберем как 1с ведет себя со штрих-кодом стандарта EAN8:
Берем пачку сигарет "Честерфилд". Там стоит штрих-код 46014405. Как видно это штрих-код стандарта EAN8. Теперь открываем карточку товара в 1с и считываем штрих-код (его ведь надо для начала внести в карточку). Он считывается и вносится как есть 46014405 (сейчас речь идет о месте товароведа, когда сканер подключен непосредственно к компьютеру). Теперь переходим на место кассира (когда сканер подключен к кассе) и считываем штрих-код. У вас ничего не выйдет, потому что 1с сообщит, что товар со штрих-кодом 0000460144059 (что-то в этом роде) не найден. А теперь посмотрим в обработку on_ams.ert в функцию ПолучитьПолныйШК :

Функция ПолучитьПолныйШК(Штрихкод)
ПолныйШК = "";
ДлинаШК = СтрДлина(Штрихкод);
Если ДлинаШК <= 7 Тогда

// EAN8
ВремШК = глДополнитьСтрокуЛ(Штрихкод, "0", 7);
Шк = глКонтрольныйСимволEAN(ВремШК, 8);
ПолныйШК = ВремШК + Шк;
Иначе

// EAN13
ВремШК = глДополнитьСтрокуЛ(Штрихкод, "0", 12);
Шк= глКонтрольныйСимволEAN(ВремШК, 13);
ПолныйШК = ВремШК + Шк;
КонецЕсли;

Возврат ПолныйШК;

КонецФункции // ПолучитьПолныйШК()

Вы видете? Уже ошибка : если длина кода больше 7 тогда 1с считает что это штрих-код стандарта EAN13, добивает его нулями до 12 цифр и высчитывает контрольную сумму, что не приемлемо. Естественно я внес изменения:

ДлинаШК = СтрДлина(Штрихкод);
Если ДлинаШК <= 8 Тогда

// EAN8
ВремШК = глДополнитьСтрокуЛ(Штрихкод, "", 8);
// Шк = глКонтрольныйСимволEAN(ВремШК, 8);
ПолныйШК = ВремШК;// + Шк;
___________________________________________________________

Теперь возмем пачку сигарет "Winston One" там вообще штрих-код 12-значный 0 12300 25397 0. С ним происходит такая же лабуда. А есть ещё упаковка канцелярского клея, который штрих-этикирован по стандарту ITF14 и имеет штри-код 2 46 07048 17112 1. Сдесь первая цифра 2 обозначает что это упаковка. С ним 1с извращается вообще сказочно. Она обрезает штрих-код до 12 цифр и выщитывает контрольную цифру. Вообщем я в этой обработке уже накрутил, навертел, так что сам запутался и зашел в тупик. Я не программер и приходится очень долго и мучительно доперать своими мозгами. Если вы сможете как-нибудь помочь мне в этом (например опубликовать исправленный кусок кода) буду очень признателен.
 
Ошибка программистов 1С была в том, что они посчитали, что компонента при запросе от ККМ обрезает контрольную цифру у всех EAN. Это не верно. Во первых, сама компонента ничего не обрезает. Она передает запрошенный ШК один в один, как его передала касса. Во вторых, касса передавая EAN-13 обрезает не контрольную цифру ШК именно этого типа, а все что больше 12 символов. Изначально, при разработке кассы, это было сделано для экономии ресурсов ККМ (в упакованном виде ШК занимает в кассе 6 байт). На тот момент автоматизация находилась в зачаточном состоянии, и предугадать всех последствий такого решения было сложно.

Что надо сделать в обработке. Приняв ШК от компоненты необходимо вычислить контрольную цифру только у того ШК, длина которого = 12. Но это тоже будет не совсем верно, т.к. узнать, что был считан именно EAN-13 невозможно. Сканер не передает тип считанного ШК, он передает только цепочку символов.
Еще одно решение, это хранить ШК в справочнике товаров 1С уже в обрезанном виде. Но при этом, если в конкретно взятой специфике торговли применяется много типов штрих-кодов, у которых длина более 13 символов), то возникнет другая проблема:
штрих-коды 1234567890123456 и
1234567890123478
в обрезанном состоянии будут одинаковыми, т.е. теряется уникальность штрих-кода. Такие товары надо будет перемаркировать.
 
Спасибо за внимание к моей проблеме. Вообщем я сделал так:
_________________________________________________________
Функция ПолучитьПолныйШК(Штрихкод)

ПолныйШК = "";

ДлинаШК = СтрДлина(Штрихкод);
Если ДлинаШК <= 8 Тогда

// EAN8
ВремШК = глДополнитьСтрокуЛ(Штрихкод, "", 8);
//Шк = глКонтрольныйСимволEAN(ВремШК, 8);
ПолныйШК = ВремШК;// + Шк;

ИначеЕсли ДлинаШК = 11 Тогда
ВремШК = глДополнитьСтрокуЛ(Штрихкод, "0", 12);
ПолныйШК = ВремШК;

Иначе

// EAN13
ВремШК = глДополнитьСтрокуЛ(Штрихкод, "", 12);
Шк = глКонтрольныйСимволEAN(ВремШК, 13);
ПолныйШК = ВремШК + Шк;
КонецЕсли;

Возврат ПолныйШК;

КонецФункции // ПолучитьПолныйШК()
____________________________________________________________

Может можно было сделать как-нибудь и по-красивше, но у меня вроде все работает. Тьфу-тьфу, чтобы не сглазить. Конечно товары с штрих кодом ITF 14 придется перештриховывать. Кстате неплохо было бы эту проблему поместить в "Часто задаваемые вопросы". Мне кажется с этим столкнутся многие.