Функция шкПолучитьСтрокуШКПоДокументу(Док, ТекстОшибки = "", 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;
Возврат Результат;
КонецФункции //Хеш
В результаті на паперовому носії ШК - 011050514BA71C97EZAP1405008;
При відпрацювання обробки ШК - 0110505145480487EZAP1405008;
Чому різні CRC32 суми. Допоможіть розібратись. Дякую.
Конфа - "Альфа"
1С-8.2.17.143
! | Правила, п.3 |