Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Изменился хэш при обновлении платформы 1С.

Изменился хэш при обновлении платформы 1С.
Я
   leoway
 
11.10.20 - 23:53
[B]Вопрос гуру 1С.[/B]
Реализовал в системе учет печатных форм (mxl) путем вычисления хэш-функции (MD5).
Все делал средствами 1С. Формирую печатную  форму, далее передаю ее в поток в двоичных данных, далее вычислю хэш.
После смены платформы 1С с 8.3.12 на 8.3.15 у [B][U]всех[/U][/B] ранее сохраненных печатных форм, при сравнении с вновь сформированных хэш стал другой. В чем может быть проблема?
Доп. комментарий: при обработке  печатной формы, параметры страницы не сохраняю. Если сравниваю два текста MXL документов, они одинаковы.
   Timon1405
 
1 - 12.10.20 - 00:03
что показывает сравнение mxl в hex-редакторе?
   Сияющий в темноте
 
2 - 12.10.20 - 00:24
поди же 1с внутрь пишет версию формата,и неудивительно,что она поменялась.
   Жан Пердежон
 
3 - 12.10.20 - 04:34
(0) сам себе злобный буратино: пихаешь в md5 закрытый формат, который постоянно меняется
   Провинциальный 1сник
 
4 - 12.10.20 - 06:41
Хэш документа гарантирует проверку неизменности документа. Но странно от него ждать одинаковости, если исходные документы разные на уровне потока битов. Если вы хотите, чтобы хэш гарантировал не побитовую точность, а лишь отображаемый документом контент - то хэш-функции нужно передавать некий "нормализованный" документ простого формата типа xml или текста, сформированный из исходного.
   spectre1978
 
5 - 12.10.20 - 06:45
(0) что значит два текста документов? Сравнивать надо два файла mxl между собой, например через командную строку можно вот так
fc /b 1.mxl 2.mxl
Так одинаковые?
   spectre1978
 
6 - 12.10.20 - 06:53
И да, никто не обещал что при смене платформы бинарники будут одни и те же. Строго говоря, 100% гарантии нет и в пределах одной платформы, потому что не исключено, например, что в какой-то записи используются только отдельные биты, а остальные, неиспользуемые - случайные, забыли обнулить. И будет файлик при каждом сохранении немножко отличаться, а может, и нет.
   leoway
 
7 - 12.10.20 - 09:40
(5) При сравнении двух файлов, файлы индентичны. Также сравнил их средствами 1С  2-ва mxl и через текстовый редактор - файлы интентичны.
(1) hex-редактором еще не смотрел.
(4) Начал склонятся к данной идеи.
(6) Не очень согласен с с этим высказыванием, т.к. механизм формирования печатной формы один и тот же в рамках одного сервера и платформы.
   Провинциальный 1сник
 
8 - 12.10.20 - 09:50
(7) "т.к. механизм формирования печатной формы один и тот же в рамках одного сервера и платформы"
В общем и целом, одинаковость не документируется и два табличных документа, заполненных одним и тем же алгоритмом и сохраненные, могут бинарно отличаться. Скажем, платформа может писать в файл какой-то УИД или отметку времени.
   leoway
 
9 - 12.10.20 - 11:28
(8) Безусловно. Сейчас проверил хэш сторонним ресурсом. Файлы до обновления платформы и после - индентичны.
Проблема пока больше в другом. Почему все файлы стали иметь другой хэш?
Не мог же поменяться механизм вычисления хэш функции в 1С при обновлении платформы?
Буду искать причину. В любом случае, спасибо за ответы.
   RomanYS
 
10 - 12.10.20 - 11:32
(9) Код вычисления хэша покажи
   leoway
 
11 - 12.10.20 - 12:54
(10) Предварительно удаляю настройки печати из табличного документа строкой:
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.Вывести(ИсхТабДокумент);

На вход функции передаю Табличный Документ.     

 Функция СохранитьДанныеПФ(ИсхТабДокумент, ПараметрыПечати, РежимРаботы, ОписаниеОшибки) Экспорт 
    
    //Очистим параметры печати пользователя

    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.Вывести(ИсхТабДокумент);    
    
    // 1. Передаем ПД на сервер

    Поток = Новый ПотокВПамяти;
    ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL);
    ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    
    // 2. Получить хэш

    ПараметрыПД.Хэш = ПолучитьХэшПечатнойФормы(ФайлДД);
....

Функция ПолучитьХэшПечатнойФормы(ФайлДД) Экспорт   
    
        ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
    ХешированиеДанных.Добавить(ФайлДД);
    ХешСумма = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
    
    Возврат ХешСумма;
    
КонецФункции
   RomanYS
 
12 - 12.10.20 - 13:03
(11) Получается у тебя 3 подозрительных объекта: табдок, поток и сам хэш.
Первый ты вроде проверил, последний 1с сломать всё-таки не должна была. Остается проверить поток (ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();).
   leoway
 
13 - 12.10.20 - 13:05
(12) Отказаться от потока и перейти на работу с временным файлом?
   RomanYS
 
14 - 12.10.20 - 13:09
(13) для начала проверить. Ну и про сам mxl выше писали, если хэш должен подтверждать именно данные, то от оболочки mxl желательно отказаться
   lodger
 
15 - 12.10.20 - 13:18
где то в этих 5 строках зарыта собака.
Поток = Новый ПотокВПамяти;
ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL);
ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();
ПараметрыПД.Хэш = ПолучитьХэшПечатнойФормы(ФайлДД);
ХешированиеДанных.Добавить(ФайлДД);
   spectre1978
 
16 - 12.10.20 - 13:24
СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); - не может быть косяка здесь? Например в применении неразрывных пробелов...
   leoway
 
17 - 12.10.20 - 13:58
(16) Точно  нет.
   leoway
 
18 - 12.10.20 - 14:05
(15) Провел эксперимент переместил формирование функции на сервер. Хеш стал другой.
Походу это работа с потоком как-то работает иначе на клиенте и сервере.

// 1. Передаем ПД на сервер

Адрес = ПоместитьВоВременноеХранилище(ТабДокумент, Новый УникальныйИдентификатор());    

// 2. Получить хэш

ПараметрыПД.Хэш = лл_УправлениеПечатью2DСервер.ПолучитьХэшПечатнойФормыНаСервере(Адрес);


Функция ПолучитьХэшПечатнойФормыНаСервере(Адрес) Экспорт   
    
    ТабДокумент = ПолучитьИзВременногоХранилища(Адрес);
    
    Если НЕ ТипЗнч(ТабДокумент) = Тип("ТабличныйДокумент") Тогда
        Возврат "";
    КонецЕсли; 
    
    Поток = Новый ПотокВПамяти;
    ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL);
    ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    
    ХешСумма = ПолучитьХэш(ФайлДД);
    
    Возврат ХешСумма;
    
КонецФункции

Функция ПолучитьХэш(ФайлДД) Экспорт   
    
    ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
    ХешированиеДанных.Добавить(ФайлДД);
    ХешСумма = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
    
    Возврат ХешСумма;
    
КонецФункции
   leoway
 
19 - 12.10.20 - 14:22
Дополню предыдущую проверку. Хэш в потоке и через файл на сервере индентичны.
    Функция ПолучитьХэшПечатнойФормыНаСервере(Адрес) Экспорт   
    
    ТабДокумент = ПолучитьИзВременногоХранилища(Адрес);
    
    Если НЕ ТипЗнч(ТабДокумент) = Тип("ТабличныйДокумент") Тогда
        Возврат "";
    КонецЕсли; 
    
    //Вариант 1

    Поток = Новый ПотокВПамяти;
    ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL);
    ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    
    ХешСумма = ПолучитьХэш(ФайлДД);
    
    Сообщить("Хэш в потоке: " + ХешСумма);
    
    
    //Вариант 2

    ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
    ТабДокумент.Записать(ИмяФайла);
    
    ХешСумма = ПолучитьХэшФайл(ИмяФайла);
    
    УдалитьФайлы(ИмяФайла);
    
    Сообщить("Хэш через файл: " + ХешСумма);

    
    Возврат ХешСумма;
    
КонецФункции

Функция ПолучитьХэш(ФайлДД) Экспорт   
    
    ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
    ХешированиеДанных.Добавить(ФайлДД);
    ХешСумма = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
    
    Возврат ХешСумма;
    
КонецФункции

Функция ПолучитьХэшФайл(ИмяФайла) Экспорт   
    
    ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
    ХешированиеДанных.ДобавитьФайл(ИмяФайла);
    ХешСумма = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
    
    Возврат ХешСумма;
    
КонецФункции
   Franchiser
 
20 - 12.10.20 - 14:26
(18) проверь через hex.  Возможно проблема в кодировке.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.