Главная 
 Каталог 
 Поддержка 
 Компания 
 Партнеры 
 1C:Франчайзинг 
 Карта сайта 

Задать вопрос
Часто задаваемые вопросы
Справочные материалы
Публикации


Поиск по сайту



Авторизация

Запомнить меня на этом компьютере
  Забыли свой пароль?
  Регистрация


Подписка

Изменение параметров





Hits 88249521
11243
Hosts 3942790
808
Visitors 19001297
1982

18


Поддержка / Форумы / Публичные форумы / Программное обеспечение / EAN8, EAN13, ITF14 vs on_ams.ert Серьезная проблема!!!!!

  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 придется перештриховывать. Кстате неплохо было бы эту проблему поместить в "Часто задаваемые вопросы". Мне кажется с этим столкнутся многие.







© 2000-2024 Версия-Т