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

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

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

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

Поток = Новый ПотокВПамяти;
ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL);
ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();
ПараметрыПД.Хэш = ПолучитьХэшПечатнойФормы(ФайлДД);
ХешированиеДанных.Добавить(ФайлДД);
16 spectre1978
 
12.10.20
13:24
СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); - не может быть косяка здесь? Например в применении неразрывных пробелов...
17 leoway
 
12.10.20
13:58
(16) Точно  нет.
18 leoway
 
12.10.20
14:05
(15) Провел эксперимент переместил формирование функции на сервер. Хеш стал другой.
Походу это работа с потоком как-то работает иначе на клиенте и сервере.

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

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


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

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

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

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

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

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