В процессе ведения базы 1С пользователи нередко сталкиваются с ситуацией, когда штрихкоды товаров перестают считываться сканером или выдают ошибки при оформлении документов. Причинами могут быть как банальные опечатки операторов, так и сбои при импорте данных. Разберем подробно, какие форматы штрихкодов используются в типовых конфигурациях, по каким критериям определять их корректность и как автоматизировать проверку всей базы.
В типовой конфигурации 1С:Управление торговлей для штучных и упакованных товаров наиболее часто встречаются следующие форматы:
Если речь идет о стандартных товарах в розничной и оптовой торговле, в большинстве случаев валидации подлежат именно числовые коды EAN-8, UPC-A, EAN-13 и ITF-14.
Проанализируем типичные ошибки, из-за которых штрихкод становится невалидным:
0123456789012 преобразуется в 12 знаков вместо 13).Разберем по шагам, как построить логику проверки записей в регистре сведений ШтрихкодыНоменклатуры (в УТ 11) или Штрихкоды (в УТ 10.3):
В типовых конфигурациях 1С уже есть готовый расчет контрольного символа. Посмотрим на пример вызова встроенной функции конфигурации в модуле менеджера регистра сведений ШтрихкодыНоменклатуры:
ШтрихкодБазы = СокрЛП(Выборка.Штрихкод);
ДлинаКода = СтрДлина(ШтрихкодБазы);
Если ДлинаКода = 13 Тогда
ИсходнаяЧасть = Лев(ШтрихкодБазы, 12);
КонтрольныйСимвол = РегистрыСведений.ШтрихкодыНоменклатуры.КонтрольныйСимволEAN(ИсходнаяЧасть, 13);
Если Прав(ШтрихкодБазы, 1) <> КонтрольныйСимвол Тогда
// Зафиксирована ошибка контрольной суммы
КонецЕсли;
КонецЕсли;
Напишем фрагмент кода внешней обработки, который выбирает все штрихкоды из регистра и проверяет их на состав символов и правильность контрольной суммы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Номенклатура КАК Номенклатура,
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ТекущийШК = СокрЛП(Выборка.Штрихкод);
Длина = СтрДлина(ТекущийШК);
// Проверка 1: Длина кода
Если Не (Длина = 8 Или Длина = 12 Или Длина = 13 Или Длина = 14) Тогда
Сообщить("Неверная длина штрихкода: " + ТекущийШК + " у товара " + Выборка.Номенклатура);
Продолжить;
КонецЕсли;
// Проверка 2: Только цифры
Если Не СтроковыеФункцииКлиентСервер.ТолькоЦифры(ТекущийШК) Тогда
Сообщить("Штрихкод содержит нецифровые символы: " + ТекущийШК + " у товара " + Выборка.Номенклатура);
Продолжить;
КонецЕсли;
// Проверка 3: Контрольный символ
ИсходнаяЧасть = Лев(ТекущийШК, Длина - 1);
КонтрольнаяЦифра = РегистрыСведений.ШтрихкодыНоменклатуры.КонтрольныйСимволEAN(ИсходнаяЧасть, Длина);
Если Прав(ТекущийШК, 1) <> КонтрольнаяЦифра Тогда
Сообщить("Ошибка контрольного символа: " + ТекущийШК + " (ожидался " + КонтрольнаяЦифра + ")");
КонецЕсли;
КонецЦикла;
Важно помнить, что программная проверка подтверждает только синтаксическую корректность штрихкода. Никакой расчет контрольного символа не защитит от ситуации, когда правильный с точки зрения формата штрихкод от одного товара был ошибочно записан в карточку другого товара. Выявить такие ошибки можно только физической сверкой с помощью терминалов сбора данных (ТСД) при инвентаризации либо сопоставлением со сторонними каталогами (например, через сервис 1С:Номенклатура).