Доброго всім дня. Склалась ось така ситуація: Є обробка з допомогою якої звіряють документи по ШК (штрих коду). Документи вона знаходить, а от при виконанні фукції шкПолучитьСтрокуШКПоДокументу(), повертає значення не таке як має бути. Попрацювавши трішки з отладчиком, вияснилось, що не правильнго розраховується CRC32HEX сума.
Функция шкПолучитьСтрокуШКПоДокументу(Док, ТекстОшибки = "", CRC32 = "", ДляПокупателя = Истина) Экспорт
ВидД = ТипЗнч(Док);
//версия алгоритма
VV = "01";
//вид документа
P = "";
Если ВидД = Тип("ДокументСсылка.РеализацияТоваров") Тогда
P = ?(ДляПокупателя, "1", "0");
ИначеЕсли ВидД = Тип("ДокументСсылка.ПоступлениеТоваров") Тогда
P = "1";
ИначеЕсли ВидД = Тип("ДокументСсылка.ЗаказНаряд") Тогда
P = "2";
ИначеЕсли ВидД = Тип("ДокументСсылка.ПеремещениеТоваровВПроизводство") Тогда
P = "3";
ИначеЕсли ВидД = Тип("ДокументСсылка.СписаниеТоваров") Тогда
P = "4";
ИначеЕсли ВидД = Тип("ДокументСсылка.ВводОстатковТоваров") Тогда
P = "6";
ИначеЕсли ВидД = Тип("ДокументСсылка.ИзвлечениеТоваровИзПроизводства") Тогда
P = "9";
КонецЕсли;
Если P = "" Тогда
Если ТекстОшибки <> "" Тогда
ТекстОшибки = ТекстОшибки + Символы.ПС;
КонецЕсли;
ТекстОшибки = ТекстОшибки + "Вид документа """ + Строка(ВидД) + """ не может быть обработан!";
Возврат 0;
КонецЕсли;
//DDMMYY - дата документа
Если ВидД = Тип("ДокументСсылка.ПоступлениеТоваров") Тогда
ДатаДок = Формат(Док.ВхДокНомер,"ДФ=dd.MM.yy");
Иначе
ДатаДок = Формат(Док.Дата,"ДФ=dd.MM.yy");
КонецЕсли;
DD = Сред(ДатаДок,1,2);
MM = Сред(ДатаДок,4,2);
YY = Сред(ДатаДок,7,2);
//C - CRC32, построенное по выбранным полям документа
//CRC32 = "";
CRC32HEX = "";
СимволРазделитель = ";";
Если дкДокументЕстьРеквизитШапки("Контрагент", Док.Метаданные().Имя) Тогда
ЕГРПОУ = СокрЛП(Док.Контрагент.ЕДРПОУ);
Иначе
ЕГРПОУ = "";
КонецЕсли;
Если ВидД = Тип("ДокументСсылка.РеализацияТоваров") Тогда
ЕГРПОУ = СокрЛП(Док.Организация.ЕДРПОУ); // т.о. когда это будет ПН там наша фирма будет Контрагент
КонецЕсли;
CRC32 = ЕГРПОУ + СимволРазделитель;
CRC32 = ДописатьТЧВСтрокуДляCRC32(Док, "Товары", CRC32);
Если ВидД = Тип("ДокументСсылка.ЗаказНаряд") Тогда
CRC32 = ДописатьТЧВСтрокуДляCRC32(Док, "Работы", CRC32);
КонецЕсли;
CRC32HEX = hex_(Число(шкХеш(CRC32)));
//N - номер документа
Если ВидД = Тип("ДокументСсылка.ПоступлениеТоваров") Тогда
N = шкТранслитерация(СокрЛП(Док.ВхДокНомер), "RUEN", ТекстОшибки);
Иначе
N = шкТранслитерация(СокрЛП(Док.Номер), "RUEN", ТекстОшибки);
КонецЕсли;
Если ТекстОшибки = "" Тогда
СтрокаШК = VV + P + DD + MM + YY + CRC32HEX + N;
Возврат СтрокаШК;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции // глПолучитьСтрокуШКПоДокументу
Функция шкХеш(СтрокаХэш) Экспорт
Строка_ = СокрЛП(Строка(СтрокаХэш)); //Получаем строку и убираем ведущие и ведомые пробелы
НачПозиция = 1; //Переменная начальной позиции блока
hash=0; //Переменная хеша;
M=33; //Переменная точности
ДлинаСтроки = СтрДлина(Строка_); //Получаем длину входной строки
//Организовываем цикл обработки по блокам из 10 символов
Пока НачПозиция <= ДлинаСтроки Цикл
СтрокаБлока = Сред(Строка_, НачПозиция, 10); //Получае блок
//Цикл получения хеша блока
Для к = 1 По СтрДлина(СтрокаБлока) Цикл
hash = M * hash + КодСимволаASCII(Сред(СтрокаБлока, к,1));
КонецЦикла;
hash = hash % 4294967296; //Остаток от деления определяет разрядность хеша (4294967296 - 4 байт,18446744073709551616 - 8 байт)
НачПозиция = НачПозиция + 10; //Начальная позиция следующего блока
КонецЦикла;
Результат = hash;
Возврат Результат;
КонецФункции //Хеш
! | Правила, п.3 |
Поясніть алгоритм дій.
Звідки береться на шк паперовому носії?
"Документи вона знаходить" означає, що обробка знаходить документи за шк на паперовому носії? Тоді навіщо генерувати шк "при відпрацювання обробки"?
Я так розумію мені ніхто не допоможе з CRC сумами по ШК
Ну то запитайте у головному офісі алгоритм формування шк на друк.
Має співпадати обробка формування штрих-кода та розшифровки. По-друге, треба перевірити систему формування та читання, їх багато (Code 39, Code128, EAN...) - мають співпадати. Сканер сам розпізнає систему кодування, але іноді налаштування сканера неправильно формує код (включено перевірку на CRC, деякі символи сканер може не траслювати, замінюючи їх іншими символами, особливо це стосуєть роздільників...). В блокноті подивіться код, який ви отримуєте без обробки від сканера.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua