Найти тему

1с проверка ШтрихКода

В 1с нет проверки введения правильности ШтрихКода EAN13, который чаще всего используется. При ручном вводе и даже при копировании могут возникать ошибки, так можно ввести неполный ШтрихКод. Решил доработать, чтобы при вводе он проверялся, но только выскакивала ошибка, т.к. поле ввода это обязательно и если все время ждать ввода правильного ШтрихКода, а его нет, можно просто "зависнуть" программу.

Сам ШтрихКод находится в Регистры сведений - Штрихкоды

-2

Открываем

-3

Далее: Действия - Открыть модуль объекта записей

-4

Разворачиваем: Процедура ПередЗаписью(Отказ, Замещение)

-5

После данного кода всталяем свой код на проверку 13 символов в штрихкоде с типом EAN13. Другие штрихкоды нас не интересуют. Также добавим проверку на содержание букв, если штрихкод равен 13 символам:

-6
Для Каждого ТекущаяЗапись Из ЭтотОбъект Цикл
Если ТипЗнч(ТекущаяЗапись.Владелец) = Тип("СправочникСсылка.Номенклатура") И СокрЛП(ТекущаяЗапись.ТипШтрихКода)= "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;
КонецЕсли;

Если СуммаШтрихКода <> КонтрольноеЧисло Тогда
Сообщить("Контрольное число не правильное!!! Ожидается:" + СуммаШтрихКода);
КонецЕсли;
КонецЕсли;
КонецЦикла;

//амека проверка штрихкода