Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отримати строку ШК по документу
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Работа с торговым оборудованием
djdf_crash
Доброго всім дня. Склалась ось така ситуація: Є обробка з допомогою якої звіряють документи по ШК (штрих коду). Документи вона знаходить, а от при виконанні фукції шкПолучитьСтрокуШКПоДокументу(), повертає значення не таке як має бути. Попрацювавши трішки з отладчиком, вияснилось, що не правильнго розраховується 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;
    Возврат Результат;
КонецФункции //Хеш


В результаті на паперовому носії ШК - 011050514BA71C97EZAP1405008;
При відпрацювання обробки ШК - 0110505145480487EZAP1405008;

Чому різні CRC32 суми. Допоможіть розібратись. Дякую.
Конфа - "Альфа"
1С-8.2.17.143


 ! 

Правила, п.3
 
Petre
Поясніть алгоритм дій.
Звідки береться на шк паперовому носії?
"Документи вона знаходить" означає, що обробка знаходить документи за шк на паперовому носії? Тоді навіщо генерувати шк "при відпрацювання обробки"?
djdf_crash
Цитата(Petre @ 24.07.14, 10:00) необходимо зарегистрироваться для просмотра ссылки
Поясніть алгоритм дій.
Звідки береться на шк паперовому носії?
"Документи вона знаходить" означає, що обробка знаходить документи за шк на паперовому носії? Тоді навіщо генерувати шк "при відпрацювання обробки"?


До нас приходять накладні з головного офіса, в електронному та паперовому вигляді. На паперовому вже існує ШК. Наскільки я розумію то бухгалтерія повинна звіряти їх в кінцці місяця. Повинно находити документ в базі та відповідно щоб був однаковий ШК. Структуру ШК можна побачити в функціях яких я скинув.
djdf_crash
Я так розумію мені ніхто не допоможе з CRC сумами по ШК 64000000.gif
Petre
Ну то запитайте у головному офісі алгоритм формування шк на друк.
Pepe
Має співпадати обробка формування штрих-кода та розшифровки. По-друге, треба перевірити систему формування та читання, їх багато (Code 39, Code128, EAN...) - мають співпадати. Сканер сам розпізнає систему кодування, але іноді налаштування сканера неправильно формує код (включено перевірку на CRC, деякі символи сканер може не траслювати, замінюючи їх іншими символами, особливо це стосуєть роздільників...). В блокноті подивіться код, який ви отримуєте без обробки від сканера.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.