Но на упаковках в большинстве случаях есть штрихкоды производителей. И можно попробовать использовать их.
Большинство штрихкодов производителей по оригинальным и приличным не оригинальным брендам - это каталожный номер детали. Но с небольшими дополнениями/изменениями. Есть, конечно, еще китай, но там своя песня. :)
Обычно не хватает каких-то символов или штрихкод содержит дополнительные "лишние" символы. Повлиять на считывание штрихкода сканером мы не можем, но можем изменить его обработку.
В статье сделана попытка систематизировать отличия штрихкода от каталожного номера, информация получена опытным путем, и буду благодарен за комментарии и дополнения. Плюс приведены фрагменты кода для автоматизации этих проверок на базе Альфа-авто, ред.5. (Для ред.4 потребует некоторых корректировок).
Первое, сделаем автоматическое формирование штрихкода, равному артикулу при записи номенклатуры:
// Если нет ещё штрих кода, то заполним его по Артикулу.
Если НЕ ЭтоГруппа Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихКоды.ШтрихКод
|ИЗ
| РегистрСведений.ШтрихКоды КАК ШтрихКоды
|ГДЕ
| ШтрихКоды.Объект = &Объект
| И ШтрихКоды.ШтрихКод = ПОДСТРОКА(&ШтрихКод, 1, 22)";
Запрос.УстановитьПараметр("Объект", Ссылка);
Запрос.УстановитьПараметр("ШтрихКод", Артикул);
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() ТОгда
// Ещё не записи, сделаем новую запись
Набор = РегистрыСведений.ШтрихКоды.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Значение = Ссылка;
Набор.Отбор.Объект.Использование = Истина;
Набор.Прочитать();
НоваяСтрока = Набор.Добавить();
НоваяСтрока.Запрет = Ложь;
НоваяСтрока.Объект = Ссылка;
НоваяСтрока.ЕдиницаИзмерения = ОсновнаяЕдиницаИзмерения;
НоваяСтрока.ШтрихКод = Артикул;
Набор.Записать();
КонецЕсли;
КонецЕсли;
Дальше, если штрих код, равный артикулу, не найден, то пробуем модифицировать его по различным вариантам и найти в нем каталожный номер детали. В Альфа-авто для этого в обработке ШтрихКоды необходимо модифицировать процедуру НайтиСтруктуруПоШтрихКоду().
Для запчастей Toyota, Suzuki и некоторых других в конце штрих кода обычно встречается дополнительный символ через два пробела: <8871006420 Q>, <531112B060 K> и др.
// Если в штрих коде есть два пробела и буква в конце, то убираем их. .
ЕстьПробелы = Найти(ШК," ");
Если ЕстьПробелы > 0 И ЕстьПробелы + 2 = СтрДлина(ШК) Тогда
СтуктураОбъект = НайтиСтруктуруПоШтрихКоду(Формат(Лев(ШК,СтрДлина(ШК)-3),"ЧГ=0"), флРугатьсяНаЗапрещенныйШтрихКод);
Тут же можно добавить добавление нового реально прочитанного штрихкода в базу:
СтуктураОбъект = НайтиСтруктуруПоШтрихКоду(Формат(Лев(ШК,Найти(ШК," T")),"ЧГ=0"), флРугатьсяНаЗапрещенныйШтрихКод);
Если ТипЗнч(СтуктураОбъект) = Тип("Структура") Тогда
// Нашли, изменим штирих код и вернём эту структуру.
Набор = РегистрыСведений.ШтрихКоды.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Значение = СтуктураОбъект.Объект;
Набор.Отбор.Объект.Использование = Истина;
Набор.Прочитать();
НовыйШтрихКод = Набор.Добавить();
НовыйШтрихКод.Объект = СтуктураОбъект.Объект;
Если ТипЗнч(СтуктураОбъект.Объект)=Тип("СправочникСсылка.Номенклатура") Тогда
НовыйШтрихКод.ЕдиницаИзмерения = СтуктураОбъект.Объект.ОсновнаяЕдиницаИзмерения;
КонецЕсли;
НовыйШтрихКод.ШтрихКод = ШК;
НовыйШтрихКод.Запрет= Ложь;
Набор.Записать();
Сообщить("Для номенклатуры '"+СтуктураОбъект.Объект.Артикул+"', "+СтуктураОбъект.Объект+
" добавлен новый штрих код '"+ШК+"'.");
Возврат СтуктураОбъект;
КонецЕсли;
Для Honda штрихкод полностью соответствует каталожному номеру с "-" и разделителями, но для удобства ввода и поиска"-" обычно убирают при заполнении номенклатуры. Плюс у некоторых производителей могут быть лишние дефисы в штрихкодах, поэтому проверим штрих код без дефисов:
// Если в штрих коде есть "-", то убираем их. .
Если Найти(ШК, "-") > 0 Тогда
СтуктураОбъект = НайтиСтруктуруПоШтрихКоду(Формат(СтрЗаменить(ШК,"-",""),"ЧГ=0"), флРугатьсяНаЗапрещенныйШтрихКод);
Встречаются штрихкоды с одним или двумя лишними нулями на конце. Также можно проверить без них:
// Если в конце один ноль, проверим без них:
Если Сред(ШК,СтрДлина(Шк),СтрДлина(Шк)) = "0" Тогда
СтуктураОбъект = НайтиСтруктуруПоШтрихКоду(Формат(Лев(ШК,СтрДлина(ШК)-1),"ЧГ=0"), флРугатьсяНаЗапрещенныйШтрихКод);
Для Cirtoen и, возможно, для всех PSA в штрихкоде на конце встречается -000, когда в каталожном номере -0000, встречаются лишние -С148 в конце номера:
Если Прав(ШК,4) = "-000" Тогда
СтуктураОбъект = НайтиСтруктуруПоШтрихКоду(ШК+"0", флРугатьсяНаЗапрещенныйШтрихКод);
Для Mitsubishi в конце бывает лишние " T" и через пробел число с двумя или треми лидирующими нулями <MF453033V T 001>, <MD339754 T 0001>, <MD050316 T 0005>. Так же "T" и количество может быть без пробелов или с одним пробелом. <MD339754T 0001>, <MD339754 T 0001>. Бывает в переди символ "P".
// Если в конце " T" и количество, то отрезаем его:
Если Найти(ШК," T") > 0 Тогда
СтуктураОбъект = НайтиСтруктуруПоШтрихКоду(Формат(Лев(ШК,Найти(ШК," T")),"ЧГ=0"), флРугатьсяНаЗапрещенныйШтрихКод);
Для Mitsubishi, Hyundai, Kia и некоторых других брендов число через различное количество пробелов (обычно это количество штук в упаковке): <MN195668 001>, <MF453019 0002> и т.д. Пробелов обычно больше двух, поэтому для отсечения таких символов можно ориентироваться на два пробела и выполнять эту проверку после остальных, чтобы не отсечь нужные символы.
Если Найти(ШК," ") > 0 Тогда
СтуктураОбъект = НайтиСтруктуруПоШтрихКоду(Формат(Лев(ШК,Найти(ШК," ")),"ЧГ=0"), флРугатьсяНаЗапрещенныйШтрихКод);
Ну и вариант, когда каталожный номер числовой и зашифрован обычным EAN13. В таком случае к штрихкоду добавляется 13-й контрольный символ, и надо проверить штрихкод без него:
// Если 13 символов, попробуем обрезать последний
Если СтрДлина(ШК) = 13 Тогда
СтуктураОбъект = НайтиСтруктуруПоШтрихКоду(Формат(Лев(ШК,12),"ЧГ=0"), флРугатьсяНаЗапрещенныйШтрихКод);
Так как штрихкод, равный каталожному номеру, может содержать любое количество символов, буквы и цифры, то для его печати (к примеру, для восстановления поврежденного ШК на упаковке или при разделении одной упаковки на несколько) использовать коды EAN13 не получится, и надо будет использовать Code128 или другие форматы, способные кодировать строки различной длины с буквами и цифрами.
К минусам данного метода можно отнести:
- При работе с различными брендами каталожные номера у разных производителей все-таки иногда пересекаются, что может привести к ошибкам. Тут можно добавить дополнительную проверку по бренду в случае нахождения нескольких одинаковых артикулов.
- В базе уже должны быть заполнены сканируемые номенклатурные позиции с каталожными номерами.
- На разных коробках у разных производителей штрихкоды находятся в разных местах, могут присутствовать другие штрихкоды, не содержащие в себе каталожного номера, что приводит к неудобству считывания штрихкодов.
- Мелкие детали (болты, гайки, шайбы, клипсы и т.д.) не имеют оригинальных коробок.
- Некоторые детали приходят по несколько штук в одной коробке, и их надо разделять.
К плюсам то, что нет необходимости оклеивать все детали, формировать и заносить штрихкоды в базу.