В 1с нет проверки введения правильности ШтрихКода EAN13, который чаще всего используется. При ручном вводе и даже при копировании могут возникать ошибки, так можно ввести неполный ШтрихКод. Решил доработать, чтобы при вводе он проверялся, но только выскакивала ошибка, т.к. поле ввода это обязательно и если все время ждать ввода правильного ШтрихКода, а его нет, можно просто "зависнуть" программу.
Сам ШтрихКод находится в Регистры сведений - Штрихкоды
Открываем
Далее: Действия - Открыть модуль объекта записей
Разворачиваем: Процедура ПередЗаписью(Отказ, Замещение)
После данного кода всталяем свой код на проверку 13 символов в штрихкоде с типом EAN13. Другие штрихкоды нас не интересуют. Также добавим проверку на содержание букв, если штрихкод равен 13 символам:
Для Каждого ТекущаяЗапись Из ЭтотОбъект Цикл
Если ТипЗнч(ТекущаяЗапись.Владелец) = Тип("СправочникСсылка.Номенклатура") И СокрЛП(ТекущаяЗапись.ТипШтрихКода)= "EAN13" Тогда
ПШК = ТекущаяЗапись.ШтрихКод;
//проверяем длину
Если СтрДлина(СокрЛП(ПШК))<13 Тогда
Сообщить ("Длина ШтрихКода содержит:"+СтрДлина(СокрЛП(ПШК))+" символов, что меньше 13 !!!");
Прервать;
КонецЕсли;
//проверяем на наличие букв
ЭтоЧисло = Истина;
ДлинаСтроки = СтрДлина(ПШК);
Для А = 1 По ДлинаСтроки Цикл
стрСимвол = Лев(ПШК, 1);
ПШК = Сред(ПШК, 2);
Если Не (стрСимвол = "1" или стрСимвол = "2" или стрСимвол = "3" или стрСимвол = "4" или стрСимвол = "5"
или стрСимвол = "6" или стрСимвол = "7" или стрСимвол = "8" или стрСимвол = "9" или стрСимвол = "0") Тогда
ЭтоЧисло = Ложь;
Сообщить ("Штрихкод содержит буквы !!!");
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Далее проверяем сам штрихкод на правильность контрольной суммы. Исходим из того, что 13 цифра - контрольная, а для сравнения ее с правильностью слаживаем нечетные числа штрихкода с четными, умноженными на 3. Далле из полученной суммы берем последнее число. И если оно = 0, значит контрольная сумма должна быть 0 (а не 10).
ПШК = (ТекущаяЗапись.ШтрихКод);
КонтрольноеЧисло = Число(Сред(ПШК, 13, 1));
НечетЧисло = Число(Сред(ПШК, 1, 1)) + Число(Сред(ПШК, 3, 1)) + Число(Сред(ПШК, 5, 1)) + Число(Сред(ПШК, 7, 1)) + Число(Сред(ПШК, 9, 1)) + Число(Сред(ПШК, 11, 1));
ЧетЧисло = Число(Сред(ПШК, 2, 1)) + Число(Сред(ПШК, 4, 1)) + Число(Сред(ПШК, 6, 1)) + Число(Сред(ПШК, 8, 1)) + Число(Сред(ПШК, 10, 1)) + Число(Сред(ПШК, 12, 1));
КонтрольнаяСумма = (НечетЧисло)+ (ЧетЧисло*3);
ЧислоПроверки = Прав(КонтрольнаяСумма,1);
СуммаШтрихКода = 10 - Число(ЧислоПроверки);
Если СуммаШтрихКода = 10 Тогда СуммаШтрихКода = 0;
КонецЕсли;
Если СуммаШтрихКода <> КонтрольноеЧисло Тогда
Сообщить("Контрольное число не правильное!!! Ожидается:" + СуммаШтрихКода);
КонецЕсли;
Все. Теперь идет проверка, в случае ошибки - выдаст предупреждение и сохранит введенный ШтрихКод, что не позволит программе "зависнуть".
Ну и теперь весь код:
//амека проверка штрихкода
Для Каждого ТекущаяЗапись Из ЭтотОбъект Цикл
Если ТипЗнч(ТекущаяЗапись.Владелец) = Тип("СправочникСсылка.Номенклатура") И СокрЛП(ТекущаяЗапись.ТипШтрихКода)= "EAN13" Тогда
ПШК = ТекущаяЗапись.ШтрихКод;
//проверяем длину
Если СтрДлина(СокрЛП(ПШК))<13 Тогда
Сообщить ("Длина ШтрихКода содержит:"+СтрДлина(СокрЛП(ПШК))+" символов, что меньше 13 !!!");
Прервать;
КонецЕсли;
//проверяем на наличие букв
ЭтоЧисло = Истина;
ДлинаСтроки = СтрДлина(ПШК);
Для А = 1 По ДлинаСтроки Цикл
стрСимвол = Лев(ПШК, 1);
ПШК = Сред(ПШК, 2);
Если Не (стрСимвол = "1" или стрСимвол = "2" или стрСимвол = "3" или стрСимвол = "4" или стрСимвол = "5"
или стрСимвол = "6" или стрСимвол = "7" или стрСимвол = "8" или стрСимвол = "9" или стрСимвол = "0") Тогда
ЭтоЧисло = Ложь;
Сообщить ("Штрихкод содержит буквы !!!");
Прервать;
КонецЕсли;
КонецЦикла;
//получаем контрольное число четных и нечетных цифр штрихкода
ПШК = (ТекущаяЗапись.ШтрихКод);
КонтрольноеЧисло = Число(Сред(ПШК, 13, 1));
НечетЧисло = Число(Сред(ПШК, 1, 1)) + Число(Сред(ПШК, 3, 1)) + Число(Сред(ПШК, 5, 1)) + Число(Сред(ПШК, 7, 1)) + Число(Сред(ПШК, 9, 1)) + Число(Сред(ПШК, 11, 1));
ЧетЧисло = Число(Сред(ПШК, 2, 1)) + Число(Сред(ПШК, 4, 1)) + Число(Сред(ПШК, 6, 1)) + Число(Сред(ПШК, 8, 1)) + Число(Сред(ПШК, 10, 1)) + Число(Сред(ПШК, 12, 1));
КонтрольнаяСумма = (НечетЧисло)+ (ЧетЧисло*3);
ЧислоПроверки = Прав(КонтрольнаяСумма,1);
СуммаШтрихКода = 10 - Число(ЧислоПроверки);
Если СуммаШтрихКода = 10 Тогда СуммаШтрихКода = 0;
КонецЕсли;
Если СуммаШтрихКода <> КонтрольноеЧисло Тогда
Сообщить("Контрольное число не правильное!!! Ожидается:" + СуммаШтрихКода);
КонецЕсли;
КонецЕсли;
КонецЦикла;
//амека проверка штрихкода