|
Изменился хэш при обновлении платформы 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. Возможно проблема в кодировке.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |