Почему 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, то это легко учитывается функцией приведенной Выше.
Вы можете например считать сканером код в кодировке 39, те же 12 и более цифр, касса при этом воспримет и упакует первые 12. Что тогда делать программе? Поэтому программа оперирует адекватными данными хранящимися в кассе
Что вам мешает хранить 13 символов, а работать с оборудованием только с 12 из них.
Тем более что вы сейчас все переводите на InterBase, я может вообще буду забирать данные с сервера минуя ваш софт. Мне удобнее (как пользователю) работать с нормальным штрих-кодом, который я ввел. Это же удобнее и обьяснять продавщицам, которые работают с программой. Вам же никакой разницы. Храните 13 символов, но при использовании режьте до 12 и вперед работайте с кассами.
Цитата
другое дело если Вы работаете с EAN13, то это легко учитывается функцией приведенной Выше.
Согласитесь, что EAN13 и EAN8 гораздо более распростанены в розничной торговле в России, чем например код 39.
Если ВремШтрКод = Лев(ИтогШтрКод,12) Тогда //Если это EAN-13 то все ОК и строки совпадут
Возврат ИтогШтрКод;
Иначе
Возврат ВремШтрКод; //Это 100% не EAN-13
КонецЕсли;
А - кстати - 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 разрядов. ----------------------------