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

AMCBase - поле штрих-код


RSS
AMCBase - поле штрих-код
 
Почему AMCBase не переносит штрих-код более 12 символов. Тоже самое и с другими продуктами. Только не надо говорить что 13-й символ контрольный. Вы же в EAN-8 не режете контрольный символ. И мне не интересно, что касса чего-то там не понимает. У меня штрих-код это УНИКАЛЬНОЕ значение в номенклатуре, в отличие от кода, наименования и т.д. И когда мне надо найти товар при получении данных товароучета я хочу пользоваться именно этим полем, но не могу, так как в AMCBase 12-ти символьный код, а в 1с 13-ти. Почему не хранить в AMCBase все 13 символов. При этом вы можете не импользовать 13-й символ. Но дайте мне право использовать его!
Тоже самое у Вас с OnlineServer. Зачем так ограничивать?[/b]
 
13 разряд ШК ЕАН13 - контрольный, зависящий однозначно от 12 основных разрядов, поэтому никто не лишает Вас права имея 12 разрядов основного кода добавить вычисленный 13-й разряд и использовать полноценный ШК в стандартных процедурах 1с.
 
Цитата
ping писал(а):
13 разряд ШК ЕАН13 - контрольный, зависящий однозначно от 12 основных разрядов, поэтому никто не лишает Вас права имея 12 разрядов основного кода добавить вычисленный 13-й разряд и использовать полноценный ШК в стандартных процедурах 1с.


Замечательно. Теперь я еще и котрольную цифру должен сам расчитывать. Зачем было ее вообще резать. Зачем доводить до потери информации, когда это можно не делать?
 
Программы работают с тем представлением штрих-кодов, с которым работают поддерживаемые ими кассы.
Для вычисления контрольной цифры EAN-13 воспользуйтесь этой функцией:

// Функция вычисляет контрольный символ кода EAN13
// дополняет им переданный параметр и возвращает сформированный EAN13
Функция СформировтьEAN13(ШтрКод) Экспорт
ШтрКод=СокрЛП(ШтрКод);
ШтрКод=Лев(ШтрКод,12);
ШтрКод=ДополнитьСтроку(ШтрКод,"0",12,1);
ШтрКод=Число(ШтрКод);
Четн = 0;
Нечетн = 0;
Для Индекс=1 По 6 Цикл
Четн=Четн+Сред(ШтрКод,2*Индекс,1);
КонецЦикла;
Четн=Четн*3;
Для Индекс=1 По 6 Цикл
Нечетн=Нечетн+Сред(ШтрКод,2*Индекс-1,1);
КонецЦикла;
КонтЦифра=(Четн+Нечетн)/10-Цел((Четн+Нечетн)/10);
КонтЦифра=10-Цел(КонтЦифра*10);
Если КонтЦифра=10 Тогда
КонтЦифра=0;
КонецЕсли;
Возврат Число(Строка(ШтрКод)+Строка(КонтЦифра));
КонецФункции

//Дополняет передаваемую строку Стр символами Чем до строки длиной Длина
//справа или слева в зависимости от значения переменной Режим (1-слева, 2-справа)
Функция ДополнитьСтроку(Стр,Чем,Длина,Режим=1) Экспорт
Добавить=Длина-СтрДлина(Стр);
Если Добавить>0 Тогда
Добавок="";
Для Сч = 1 По Добавить Цикл
Добавок=Добавок+Чем
КонецЦикла;
Возврат ?(Режим=1,Добавок+Стр,Стр+Добавок);
Иначе
Возврат Стр;
КонецЕсли;
КонецФункции
 
Александр, конечно спасибо за функцию, не придется самому писать, но все равно такое поведение программы я считаю не правильным. Программа работает с пользователем, что и как Вы делаете на железном уровне мне не интересно. Мое глубокое убежение то, что штрих-код должен храниться в программе в 13-ти символьном виде. Вам же для своей работы можно поместить урезанный код в переменную и работать с ней.
 
Цитата
AlexeyVt писал(а):
Мое глубокое убежение то, что штрих-код должен храниться в программе в 13-ти символьном виде


Ну почему же? Давайте разберемся. Кроме кода EAN13 существуют совершенно другие штриховые коды, и считать что код который Вы выгружаете в программу является кодом EAN-13 не есть правильно. Вы можете например считать сканером код в кодировке 39, те же 12 и более цифр, касса при этом воспримет и упакует первые 12. Что тогда делать программе? Поэтому программа оперирует адекватными данными хранящимися в кассе, другое дело если Вы работаете с EAN13, то это легко учитывается функцией приведенной Выше.
 
Цитата
admin писал(а):

Вы можете например считать сканером код в кодировке 39, те же 12 и более цифр, касса при этом воспримет и упакует первые 12. Что тогда делать программе? Поэтому программа оперирует адекватными данными хранящимися в кассе


Что вам мешает хранить 13 символов, а работать с оборудованием только с 12 из них.
Тем более что вы сейчас все переводите на InterBase, я может вообще буду забирать данные с сервера минуя ваш софт. Мне удобнее (как пользователю) работать с нормальным штрих-кодом, который я ввел. Это же удобнее и обьяснять продавщицам, которые работают с программой. Вам же никакой разницы. Храните 13 символов, но при использовании режьте до 12 и вперед работайте с кассами.

Цитата

другое дело если Вы работаете с EAN13, то это легко учитывается функцией приведенной Выше.

Согласитесь, что EAN13 и EAN8 гораздо более распростанены в розничной торговле в России, чем например код 39.
 
Вот моя версия функции СформировтьEAN13

Функция СформировтьEAN13(ШтрКод)

Если СтрДлина(ШтрКод) <> 12 Тогда //Отсекаем все ШК меньше 12 символов
Возврат ШтрКод;
КонецЕсли;

ВремШтрКод = ШтрКод; //Сохраняем ориг. ШК

ШтрКод=СокрЛП(ШтрКод);
ШтрКод=Лев(ШтрКод,12);

ШтрКод=ДополнитьСтроку(ШтрКод,"0",12,1);
ШтрКод=Число(ШтрКод); //Вот тут должны осекаться все ШК с нецифромыми символами
Четн = 0;
Нечетн = 0;

Для Индекс=1 По 6 Цикл
Четн=Четн+Сред(ШтрКод,2*Индекс,1);
КонецЦикла;

Четн=Четн*3;

Для Индекс=1 По 6 Цикл
Нечетн=Нечетн+Сред(ШтрКод,2*Индекс-1,1);
КонецЦикла;

КонтЦифра=(Четн+Нечетн)/10-Цел((Четн+Нечетн)/10);
КонтЦифра=10-Цел(КонтЦифра*10);

Если КонтЦифра=10 Тогда
КонтЦифра=0;
КонецЕсли;

ИтогШтрКод = Строка(ШтрКод)+Строка(КонтЦифра);

Если ВремШтрКод = Лев(ИтогШтрКод,12) Тогда //Если это EAN-13 то все ОК и строки совпадут
Возврат ИтогШтрКод;
Иначе
Возврат ВремШтрКод; //Это 100% не EAN-13
КонецЕсли;

КонецФункции
[/i]
 
А - кстати - 13-значное пространство оказалось тесновато.
EAN и UPC приняли решение о переходе к 2005 году на единую 14-значную систему кодирования...
Что по этому поводу может сказать Версия-Т? :wink:
 
Цитата
NiGMa писал(а):
А - кстати - 13-значное пространство оказалось тесновато.
EAN и UPC приняли решение о переходе к 2005 году на единую 14-значную систему кодирования...


А можно попросить ссылочку на первоисточник? :)
Ни на сайте Юнискан, ни на сайте EAN International я никаких упоминаний не нашел. :(
Единственное что мне на данный момент известно, что EAN перекроили структуру номеров EAN/UCC-13 c "7/5" на "9/3". Но это было еще 1998, а использование их началось в 2001.
 
На самом деле, именно на сайте ЮНИСКАН/EAN-Россия и есть:
Что такое Глобальный номер товара (GTIN)?
Вот цитата оттуда:
----------------------------
Глобальный номер товара GTIN (Global Trade Item Number, англ.) - это 14-разрядный международный номер товара, используемый в электронных каталогах и информационных системах.

С 1 января 2005 года Международная Ассоциация товарной нумерации (EAN International) и Американский Совет по единому коду (UCC) объединяются в единую систему EAN·UCC.
.......
Вот почему в системе EAN·UCC для хранения номера товара в компьютерных базах данных рекомендуется отводить специальное поле GTIN длиной 14 разрядов.

----------------------------
 
Спасибо за ссылку.
До 2005 года и мы перейдем на EAN/UCC-14. :)
 
Пожалуйста сбросьте мне и функцию

ДополнитьСтроку(ШтрКод,"0",12,1);

а то 1С такой не знает.

С уважением, Стас.

staslabs@narod.ru
 
Функция ДополнитьСтроку приведена немного выше в этой же теме (первое сообщение с функцией расчета контрольной цифры EAN-13). Это здесь.
 
Спасибо!!!

Вот я слепой то :shock: